Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
4a83c26a DK |
2 | #ifndef __DRM_GEM_DMA_HELPER_H__ |
3 | #define __DRM_GEM_DMA_HELPER_H__ | |
b9d47450 | 4 | |
785cabaa SR |
5 | #include <drm/drm_file.h> |
6 | #include <drm/drm_ioctl.h> | |
d9fc9413 | 7 | #include <drm/drm_gem.h> |
740c22ae | 8 | |
785cabaa SR |
9 | struct drm_mode_create_dumb; |
10 | ||
d7883f87 | 11 | /** |
4a83c26a | 12 | * struct drm_gem_dma_object - GEM object backed by DMA memory allocations |
d7883f87 | 13 | * @base: base GEM object |
8c30eecc | 14 | * @dma_addr: DMA address of the backing memory |
998fb1a0 LD |
15 | * @sgt: scatter/gather table for imported PRIME buffers. The table can have |
16 | * more than one entry but they are guaranteed to have contiguous | |
17 | * DMA addresses. | |
d7883f87 | 18 | * @vaddr: kernel virtual address of the backing memory |
cf8ccbc7 | 19 | * @map_noncoherent: if true, the GEM object is backed by non-coherent memory |
d7883f87 | 20 | */ |
4a83c26a | 21 | struct drm_gem_dma_object { |
b9d47450 | 22 | struct drm_gem_object base; |
8c30eecc | 23 | dma_addr_t dma_addr; |
71d7282a LP |
24 | struct sg_table *sgt; |
25 | ||
4a83c26a | 26 | /* For objects with DMA memory allocated by GEM DMA */ |
b9d47450 | 27 | void *vaddr; |
cf8ccbc7 PC |
28 | |
29 | bool map_noncoherent; | |
b9d47450 SH |
30 | }; |
31 | ||
4a83c26a DK |
32 | #define to_drm_gem_dma_obj(gem_obj) \ |
33 | container_of(gem_obj, struct drm_gem_dma_object, base) | |
b9d47450 | 34 | |
4a83c26a | 35 | struct drm_gem_dma_object *drm_gem_dma_create(struct drm_device *drm, |
d7883f87 | 36 | size_t size); |
4a83c26a DK |
37 | void drm_gem_dma_free(struct drm_gem_dma_object *dma_obj); |
38 | void drm_gem_dma_print_info(const struct drm_gem_dma_object *dma_obj, | |
e580ea25 | 39 | struct drm_printer *p, unsigned int indent); |
4a83c26a DK |
40 | struct sg_table *drm_gem_dma_get_sg_table(struct drm_gem_dma_object *dma_obj); |
41 | int drm_gem_dma_vmap(struct drm_gem_dma_object *dma_obj, | |
7938f421 | 42 | struct iosys_map *map); |
4a83c26a | 43 | int drm_gem_dma_mmap(struct drm_gem_dma_object *dma_obj, struct vm_area_struct *vma); |
b9d47450 | 44 | |
4a83c26a | 45 | extern const struct vm_operations_struct drm_gem_dma_vm_ops; |
b9d47450 | 46 | |
05b1de51 TZ |
47 | /* |
48 | * GEM object functions | |
49 | */ | |
50 | ||
51 | /** | |
4a83c26a | 52 | * drm_gem_dma_object_free - GEM object function for drm_gem_dma_free() |
05b1de51 TZ |
53 | * @obj: GEM object to free |
54 | * | |
4a83c26a | 55 | * This function wraps drm_gem_dma_free_object(). Drivers that employ the DMA helpers |
05b1de51 TZ |
56 | * should use it as their &drm_gem_object_funcs.free handler. |
57 | */ | |
4a83c26a | 58 | static inline void drm_gem_dma_object_free(struct drm_gem_object *obj) |
05b1de51 | 59 | { |
4a83c26a | 60 | struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); |
e580ea25 | 61 | |
4a83c26a | 62 | drm_gem_dma_free(dma_obj); |
05b1de51 TZ |
63 | } |
64 | ||
65 | /** | |
4a83c26a | 66 | * drm_gem_dma_object_print_info() - Print &drm_gem_dma_object info for debugfs |
05b1de51 TZ |
67 | * @p: DRM printer |
68 | * @indent: Tab indentation level | |
69 | * @obj: GEM object | |
70 | * | |
4a83c26a | 71 | * This function wraps drm_gem_dma_print_info(). Drivers that employ the DMA helpers |
05b1de51 TZ |
72 | * should use this function as their &drm_gem_object_funcs.print_info handler. |
73 | */ | |
4a83c26a | 74 | static inline void drm_gem_dma_object_print_info(struct drm_printer *p, unsigned int indent, |
05b1de51 TZ |
75 | const struct drm_gem_object *obj) |
76 | { | |
4a83c26a | 77 | const struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); |
e580ea25 | 78 | |
4a83c26a | 79 | drm_gem_dma_print_info(dma_obj, p, indent); |
05b1de51 TZ |
80 | } |
81 | ||
82 | /** | |
4a83c26a | 83 | * drm_gem_dma_object_get_sg_table - GEM object function for drm_gem_dma_get_sg_table() |
05b1de51 TZ |
84 | * @obj: GEM object |
85 | * | |
4a83c26a | 86 | * This function wraps drm_gem_dma_get_sg_table(). Drivers that employ the DMA helpers should |
05b1de51 TZ |
87 | * use it as their &drm_gem_object_funcs.get_sg_table handler. |
88 | * | |
89 | * Returns: | |
90 | * A pointer to the scatter/gather table of pinned pages or NULL on failure. | |
91 | */ | |
4a83c26a | 92 | static inline struct sg_table *drm_gem_dma_object_get_sg_table(struct drm_gem_object *obj) |
05b1de51 | 93 | { |
4a83c26a | 94 | struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); |
e580ea25 | 95 | |
4a83c26a | 96 | return drm_gem_dma_get_sg_table(dma_obj); |
05b1de51 TZ |
97 | } |
98 | ||
99 | /* | |
4a83c26a | 100 | * drm_gem_dma_object_vmap - GEM object function for drm_gem_dma_vmap() |
05b1de51 | 101 | * @obj: GEM object |
4a83c26a | 102 | * @map: Returns the kernel virtual address of the DMA GEM object's backing store. |
05b1de51 | 103 | * |
4a83c26a | 104 | * This function wraps drm_gem_dma_vmap(). Drivers that employ the DMA helpers should |
05b1de51 TZ |
105 | * use it as their &drm_gem_object_funcs.vmap handler. |
106 | * | |
107 | * Returns: | |
108 | * 0 on success or a negative error code on failure. | |
109 | */ | |
4a83c26a | 110 | static inline int drm_gem_dma_object_vmap(struct drm_gem_object *obj, |
7938f421 | 111 | struct iosys_map *map) |
05b1de51 | 112 | { |
4a83c26a | 113 | struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); |
e580ea25 | 114 | |
4a83c26a | 115 | return drm_gem_dma_vmap(dma_obj, map); |
05b1de51 TZ |
116 | } |
117 | ||
118 | /** | |
4a83c26a | 119 | * drm_gem_dma_object_mmap - GEM object function for drm_gem_dma_mmap() |
05b1de51 TZ |
120 | * @obj: GEM object |
121 | * @vma: VMA for the area to be mapped | |
122 | * | |
4a83c26a | 123 | * This function wraps drm_gem_dma_mmap(). Drivers that employ the dma helpers should |
05b1de51 TZ |
124 | * use it as their &drm_gem_object_funcs.mmap handler. |
125 | * | |
126 | * Returns: | |
127 | * 0 on success or a negative error code on failure. | |
128 | */ | |
4a83c26a | 129 | static inline int drm_gem_dma_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) |
05b1de51 | 130 | { |
4a83c26a | 131 | struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj); |
e580ea25 | 132 | |
4a83c26a | 133 | return drm_gem_dma_mmap(dma_obj, vma); |
05b1de51 TZ |
134 | } |
135 | ||
d0c4e34d TZ |
136 | /* |
137 | * Driver ops | |
138 | */ | |
139 | ||
140 | /* create memory region for DRM framebuffer */ | |
4a83c26a | 141 | int drm_gem_dma_dumb_create_internal(struct drm_file *file_priv, |
d0c4e34d TZ |
142 | struct drm_device *drm, |
143 | struct drm_mode_create_dumb *args); | |
144 | ||
145 | /* create memory region for DRM framebuffer */ | |
4a83c26a | 146 | int drm_gem_dma_dumb_create(struct drm_file *file_priv, |
d0c4e34d TZ |
147 | struct drm_device *drm, |
148 | struct drm_mode_create_dumb *args); | |
149 | ||
78467dc5 | 150 | struct drm_gem_object * |
4a83c26a | 151 | drm_gem_dma_prime_import_sg_table(struct drm_device *dev, |
b5e9c1a2 | 152 | struct dma_buf_attachment *attach, |
78467dc5 | 153 | struct sg_table *sgt); |
78467dc5 | 154 | |
654bf12b | 155 | /** |
4a83c26a | 156 | * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE - DMA GEM driver operations |
654bf12b TZ |
157 | * @dumb_create_func: callback function for .dumb_create |
158 | * | |
159 | * This macro provides a shortcut for setting the default GEM operations in the | |
160 | * &drm_driver structure. | |
161 | * | |
4a83c26a | 162 | * This macro is a variant of DRM_GEM_DMA_DRIVER_OPS for drivers that |
654bf12b | 163 | * override the default implementation of &struct rm_driver.dumb_create. Use |
4a83c26a | 164 | * DRM_GEM_DMA_DRIVER_OPS if possible. Drivers that require a virtual address |
654bf12b | 165 | * on imported buffers should use |
4a83c26a | 166 | * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE() instead. |
654bf12b | 167 | */ |
4a83c26a | 168 | #define DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(dumb_create_func) \ |
654bf12b TZ |
169 | .dumb_create = (dumb_create_func), \ |
170 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, \ | |
171 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, \ | |
4a83c26a | 172 | .gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table, \ |
f5ca8eb6 | 173 | .gem_prime_mmap = drm_gem_prime_mmap |
654bf12b TZ |
174 | |
175 | /** | |
4a83c26a | 176 | * DRM_GEM_DMA_DRIVER_OPS - DMA GEM driver operations |
654bf12b TZ |
177 | * |
178 | * This macro provides a shortcut for setting the default GEM operations in the | |
179 | * &drm_driver structure. | |
180 | * | |
181 | * Drivers that come with their own implementation of | |
182 | * &struct drm_driver.dumb_create should use | |
4a83c26a DK |
183 | * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead. Use |
184 | * DRM_GEM_DMA_DRIVER_OPS if possible. Drivers that require a virtual address | |
185 | * on imported buffers should use DRM_GEM_DMA_DRIVER_OPS_VMAP instead. | |
654bf12b | 186 | */ |
4a83c26a DK |
187 | #define DRM_GEM_DMA_DRIVER_OPS \ |
188 | DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(drm_gem_dma_dumb_create) | |
654bf12b | 189 | |
b9068cde | 190 | /** |
4a83c26a | 191 | * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE - DMA GEM driver operations |
06d66201 TZ |
192 | * ensuring a virtual address |
193 | * on the buffer | |
194 | * @dumb_create_func: callback function for .dumb_create | |
b9068cde NT |
195 | * |
196 | * This macro provides a shortcut for setting the default GEM operations in the | |
197 | * &drm_driver structure for drivers that need the virtual address also on | |
198 | * imported buffers. | |
06d66201 | 199 | * |
4a83c26a | 200 | * This macro is a variant of DRM_GEM_DMA_DRIVER_OPS_VMAP for drivers that |
654bf12b | 201 | * override the default implementation of &struct drm_driver.dumb_create. Use |
4a83c26a | 202 | * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a |
654bf12b | 203 | * virtual address on imported buffers should use |
4a83c26a | 204 | * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead. |
b9068cde | 205 | */ |
4a83c26a | 206 | #define DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(dumb_create_func) \ |
654bf12b | 207 | .dumb_create = dumb_create_func, \ |
b9068cde NT |
208 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, \ |
209 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, \ | |
4a83c26a | 210 | .gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table_vmap, \ |
b9068cde NT |
211 | .gem_prime_mmap = drm_gem_prime_mmap |
212 | ||
06d66201 | 213 | /** |
4a83c26a | 214 | * DRM_GEM_DMA_DRIVER_OPS_VMAP - DMA GEM driver operations ensuring a virtual |
06d66201 TZ |
215 | * address on the buffer |
216 | * | |
217 | * This macro provides a shortcut for setting the default GEM operations in the | |
218 | * &drm_driver structure for drivers that need the virtual address also on | |
219 | * imported buffers. | |
220 | * | |
221 | * Drivers that come with their own implementation of | |
222 | * &struct drm_driver.dumb_create should use | |
4a83c26a DK |
223 | * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE() instead. Use |
224 | * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a | |
225 | * virtual address on imported buffers should use DRM_GEM_DMA_DRIVER_OPS | |
654bf12b | 226 | * instead. |
06d66201 | 227 | */ |
4a83c26a DK |
228 | #define DRM_GEM_DMA_DRIVER_OPS_VMAP \ |
229 | DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(drm_gem_dma_dumb_create) | |
06d66201 | 230 | |
b9068cde | 231 | struct drm_gem_object * |
4a83c26a | 232 | drm_gem_dma_prime_import_sg_table_vmap(struct drm_device *drm, |
b9068cde NT |
233 | struct dma_buf_attachment *attach, |
234 | struct sg_table *sgt); | |
235 | ||
d0c4e34d TZ |
236 | /* |
237 | * File ops | |
238 | */ | |
239 | ||
240 | #ifndef CONFIG_MMU | |
4a83c26a | 241 | unsigned long drm_gem_dma_get_unmapped_area(struct file *filp, |
d0c4e34d TZ |
242 | unsigned long addr, |
243 | unsigned long len, | |
244 | unsigned long pgoff, | |
245 | unsigned long flags); | |
4a83c26a DK |
246 | #define DRM_GEM_DMA_UNMAPPED_AREA_FOPS \ |
247 | .get_unmapped_area = drm_gem_dma_get_unmapped_area, | |
d0c4e34d | 248 | #else |
4a83c26a | 249 | #define DRM_GEM_DMA_UNMAPPED_AREA_FOPS |
d0c4e34d TZ |
250 | #endif |
251 | ||
252 | /** | |
4a83c26a | 253 | * DEFINE_DRM_GEM_DMA_FOPS() - macro to generate file operations for DMA drivers |
d0c4e34d TZ |
254 | * @name: name for the generated structure |
255 | * | |
4a83c26a | 256 | * This macro autogenerates a suitable &struct file_operations for DMA based |
d0c4e34d TZ |
257 | * drivers, which can be assigned to &drm_driver.fops. Note that this structure |
258 | * cannot be shared between drivers, because it contains a reference to the | |
259 | * current module using THIS_MODULE. | |
260 | * | |
261 | * Note that the declaration is already marked as static - if you need a | |
262 | * non-static version of this you're probably doing it wrong and will break the | |
263 | * THIS_MODULE reference by accident. | |
264 | */ | |
4a83c26a | 265 | #define DEFINE_DRM_GEM_DMA_FOPS(name) \ |
d0c4e34d TZ |
266 | static const struct file_operations name = {\ |
267 | .owner = THIS_MODULE,\ | |
268 | .open = drm_open,\ | |
269 | .release = drm_release,\ | |
270 | .unlocked_ioctl = drm_ioctl,\ | |
271 | .compat_ioctl = drm_compat_ioctl,\ | |
272 | .poll = drm_poll,\ | |
273 | .read = drm_read,\ | |
274 | .llseek = noop_llseek,\ | |
275 | .mmap = drm_gem_mmap,\ | |
4a83c26a | 276 | DRM_GEM_DMA_UNMAPPED_AREA_FOPS \ |
d0c4e34d TZ |
277 | } |
278 | ||
4a83c26a | 279 | #endif /* __DRM_GEM_DMA_HELPER_H__ */ |