xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.h (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: i915_memcpy.h,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
2 
3 /* SPDX-License-Identifier: MIT */
4 /*
5  * Copyright © 2019 Intel Corporation
6  */
7 
8 #ifndef __I915_MEMCPY_H__
9 #define __I915_MEMCPY_H__
10 
11 #include <linux/types.h>
12 
13 struct drm_i915_private;
14 
15 void i915_memcpy_init_early(struct drm_i915_private *i915);
16 
17 bool i915_memcpy_from_wc(void *dst, const void *src, unsigned long len);
18 void i915_unaligned_memcpy_from_wc(void *dst, void *src, unsigned long len);
19 
20 /* The movntdqa instructions used for memcpy-from-wc require 16-byte alignment,
21  * as well as SSE4.1 support. i915_memcpy_from_wc() will report if it cannot
22  * perform the operation. To check beforehand, pass in the parameters to
23  * to i915_can_memcpy_from_wc() - since we only care about the low 4 bits,
24  * you only need to pass in the minor offsets, page-aligned pointers are
25  * always valid.
26  *
27  * For just checking for SSE4.1, in the foreknowledge that the future use
28  * will be correctly aligned, just use i915_has_memcpy_from_wc().
29  */
30 #define i915_can_memcpy_from_wc(dst, src, len) \
31 	i915_memcpy_from_wc((void *)((unsigned long)(dst) | (unsigned long)(src) | (len)), NULL, 0)
32 
33 #define i915_has_memcpy_from_wc() \
34 	i915_memcpy_from_wc(NULL, NULL, 0)
35 
36 #endif /* __I915_MEMCPY_H__ */
37