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