xref: /linux/include/drm/drm_gem_dma_helper.h (revision 71e801b9)
14a83c26aSDanilo Krummrich /* SPDX-License-Identifier: GPL-2.0 */
24a83c26aSDanilo Krummrich #ifndef __DRM_GEM_DMA_HELPER_H__
34a83c26aSDanilo Krummrich #define __DRM_GEM_DMA_HELPER_H__
44a83c26aSDanilo Krummrich 
54a83c26aSDanilo Krummrich #include <drm/drm_file.h>
64a83c26aSDanilo Krummrich #include <drm/drm_ioctl.h>
74a83c26aSDanilo Krummrich #include <drm/drm_gem.h>
84a83c26aSDanilo Krummrich 
94a83c26aSDanilo Krummrich struct drm_mode_create_dumb;
104a83c26aSDanilo Krummrich 
114a83c26aSDanilo Krummrich /**
124a83c26aSDanilo Krummrich  * struct drm_gem_dma_object - GEM object backed by DMA memory allocations
134a83c26aSDanilo Krummrich  * @base: base GEM object
148c30eeccSDanilo Krummrich  * @dma_addr: DMA address of the backing memory
154a83c26aSDanilo Krummrich  * @sgt: scatter/gather table for imported PRIME buffers. The table can have
164a83c26aSDanilo Krummrich  *       more than one entry but they are guaranteed to have contiguous
174a83c26aSDanilo Krummrich  *       DMA addresses.
184a83c26aSDanilo Krummrich  * @vaddr: kernel virtual address of the backing memory
194a83c26aSDanilo Krummrich  * @map_noncoherent: if true, the GEM object is backed by non-coherent memory
204a83c26aSDanilo Krummrich  */
214a83c26aSDanilo Krummrich struct drm_gem_dma_object {
224a83c26aSDanilo Krummrich 	struct drm_gem_object base;
238c30eeccSDanilo Krummrich 	dma_addr_t dma_addr;
244a83c26aSDanilo Krummrich 	struct sg_table *sgt;
254a83c26aSDanilo Krummrich 
264a83c26aSDanilo Krummrich 	/* For objects with DMA memory allocated by GEM DMA */
274a83c26aSDanilo Krummrich 	void *vaddr;
284a83c26aSDanilo Krummrich 
294a83c26aSDanilo Krummrich 	bool map_noncoherent;
304a83c26aSDanilo Krummrich };
314a83c26aSDanilo Krummrich 
324a83c26aSDanilo Krummrich #define to_drm_gem_dma_obj(gem_obj) \
334a83c26aSDanilo Krummrich 	container_of(gem_obj, struct drm_gem_dma_object, base)
344a83c26aSDanilo Krummrich 
354a83c26aSDanilo Krummrich struct drm_gem_dma_object *drm_gem_dma_create(struct drm_device *drm,
364a83c26aSDanilo Krummrich 					      size_t size);
374a83c26aSDanilo Krummrich void drm_gem_dma_free(struct drm_gem_dma_object *dma_obj);
384a83c26aSDanilo Krummrich void drm_gem_dma_print_info(const struct drm_gem_dma_object *dma_obj,
394a83c26aSDanilo Krummrich 			    struct drm_printer *p, unsigned int indent);
404a83c26aSDanilo Krummrich struct sg_table *drm_gem_dma_get_sg_table(struct drm_gem_dma_object *dma_obj);
414a83c26aSDanilo Krummrich int drm_gem_dma_vmap(struct drm_gem_dma_object *dma_obj,
424a83c26aSDanilo Krummrich 		     struct iosys_map *map);
434a83c26aSDanilo Krummrich int drm_gem_dma_mmap(struct drm_gem_dma_object *dma_obj, struct vm_area_struct *vma);
444a83c26aSDanilo Krummrich 
454a83c26aSDanilo Krummrich extern const struct vm_operations_struct drm_gem_dma_vm_ops;
464a83c26aSDanilo Krummrich 
474a83c26aSDanilo Krummrich /*
484a83c26aSDanilo Krummrich  * GEM object functions
494a83c26aSDanilo Krummrich  */
504a83c26aSDanilo Krummrich 
514a83c26aSDanilo Krummrich /**
524a83c26aSDanilo Krummrich  * drm_gem_dma_object_free - GEM object function for drm_gem_dma_free()
534a83c26aSDanilo Krummrich  * @obj: GEM object to free
544a83c26aSDanilo Krummrich  *
554a83c26aSDanilo Krummrich  * This function wraps drm_gem_dma_free_object(). Drivers that employ the DMA helpers
564a83c26aSDanilo Krummrich  * should use it as their &drm_gem_object_funcs.free handler.
574a83c26aSDanilo Krummrich  */
drm_gem_dma_object_free(struct drm_gem_object * obj)584a83c26aSDanilo Krummrich static inline void drm_gem_dma_object_free(struct drm_gem_object *obj)
594a83c26aSDanilo Krummrich {
604a83c26aSDanilo Krummrich 	struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
614a83c26aSDanilo Krummrich 
624a83c26aSDanilo Krummrich 	drm_gem_dma_free(dma_obj);
634a83c26aSDanilo Krummrich }
644a83c26aSDanilo Krummrich 
654a83c26aSDanilo Krummrich /**
664a83c26aSDanilo Krummrich  * drm_gem_dma_object_print_info() - Print &drm_gem_dma_object info for debugfs
674a83c26aSDanilo Krummrich  * @p: DRM printer
684a83c26aSDanilo Krummrich  * @indent: Tab indentation level
694a83c26aSDanilo Krummrich  * @obj: GEM object
704a83c26aSDanilo Krummrich  *
714a83c26aSDanilo Krummrich  * This function wraps drm_gem_dma_print_info(). Drivers that employ the DMA helpers
724a83c26aSDanilo Krummrich  * should use this function as their &drm_gem_object_funcs.print_info handler.
734a83c26aSDanilo Krummrich  */
drm_gem_dma_object_print_info(struct drm_printer * p,unsigned int indent,const struct drm_gem_object * obj)744a83c26aSDanilo Krummrich static inline void drm_gem_dma_object_print_info(struct drm_printer *p, unsigned int indent,
754a83c26aSDanilo Krummrich 						 const struct drm_gem_object *obj)
764a83c26aSDanilo Krummrich {
774a83c26aSDanilo Krummrich 	const struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
784a83c26aSDanilo Krummrich 
794a83c26aSDanilo Krummrich 	drm_gem_dma_print_info(dma_obj, p, indent);
804a83c26aSDanilo Krummrich }
814a83c26aSDanilo Krummrich 
824a83c26aSDanilo Krummrich /**
834a83c26aSDanilo Krummrich  * drm_gem_dma_object_get_sg_table - GEM object function for drm_gem_dma_get_sg_table()
844a83c26aSDanilo Krummrich  * @obj: GEM object
854a83c26aSDanilo Krummrich  *
864a83c26aSDanilo Krummrich  * This function wraps drm_gem_dma_get_sg_table(). Drivers that employ the DMA helpers should
874a83c26aSDanilo Krummrich  * use it as their &drm_gem_object_funcs.get_sg_table handler.
884a83c26aSDanilo Krummrich  *
894a83c26aSDanilo Krummrich  * Returns:
904a83c26aSDanilo Krummrich  * A pointer to the scatter/gather table of pinned pages or NULL on failure.
914a83c26aSDanilo Krummrich  */
drm_gem_dma_object_get_sg_table(struct drm_gem_object * obj)924a83c26aSDanilo Krummrich static inline struct sg_table *drm_gem_dma_object_get_sg_table(struct drm_gem_object *obj)
934a83c26aSDanilo Krummrich {
944a83c26aSDanilo Krummrich 	struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
954a83c26aSDanilo Krummrich 
964a83c26aSDanilo Krummrich 	return drm_gem_dma_get_sg_table(dma_obj);
974a83c26aSDanilo Krummrich }
984a83c26aSDanilo Krummrich 
994a83c26aSDanilo Krummrich /*
1004a83c26aSDanilo Krummrich  * drm_gem_dma_object_vmap - GEM object function for drm_gem_dma_vmap()
1014a83c26aSDanilo Krummrich  * @obj: GEM object
1024a83c26aSDanilo Krummrich  * @map: Returns the kernel virtual address of the DMA GEM object's backing store.
1034a83c26aSDanilo Krummrich  *
1044a83c26aSDanilo Krummrich  * This function wraps drm_gem_dma_vmap(). Drivers that employ the DMA helpers should
1054a83c26aSDanilo Krummrich  * use it as their &drm_gem_object_funcs.vmap handler.
1064a83c26aSDanilo Krummrich  *
1074a83c26aSDanilo Krummrich  * Returns:
1084a83c26aSDanilo Krummrich  * 0 on success or a negative error code on failure.
1094a83c26aSDanilo Krummrich  */
drm_gem_dma_object_vmap(struct drm_gem_object * obj,struct iosys_map * map)1104a83c26aSDanilo Krummrich static inline int drm_gem_dma_object_vmap(struct drm_gem_object *obj,
1114a83c26aSDanilo Krummrich 					  struct iosys_map *map)
1124a83c26aSDanilo Krummrich {
1134a83c26aSDanilo Krummrich 	struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
1144a83c26aSDanilo Krummrich 
1154a83c26aSDanilo Krummrich 	return drm_gem_dma_vmap(dma_obj, map);
1164a83c26aSDanilo Krummrich }
1174a83c26aSDanilo Krummrich 
1184a83c26aSDanilo Krummrich /**
1194a83c26aSDanilo Krummrich  * drm_gem_dma_object_mmap - GEM object function for drm_gem_dma_mmap()
1204a83c26aSDanilo Krummrich  * @obj: GEM object
1214a83c26aSDanilo Krummrich  * @vma: VMA for the area to be mapped
1224a83c26aSDanilo Krummrich  *
1234a83c26aSDanilo Krummrich  * This function wraps drm_gem_dma_mmap(). Drivers that employ the dma helpers should
1244a83c26aSDanilo Krummrich  * use it as their &drm_gem_object_funcs.mmap handler.
1254a83c26aSDanilo Krummrich  *
1264a83c26aSDanilo Krummrich  * Returns:
1274a83c26aSDanilo Krummrich  * 0 on success or a negative error code on failure.
1284a83c26aSDanilo Krummrich  */
drm_gem_dma_object_mmap(struct drm_gem_object * obj,struct vm_area_struct * vma)1294a83c26aSDanilo Krummrich static inline int drm_gem_dma_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
1304a83c26aSDanilo Krummrich {
1314a83c26aSDanilo Krummrich 	struct drm_gem_dma_object *dma_obj = to_drm_gem_dma_obj(obj);
1324a83c26aSDanilo Krummrich 
1334a83c26aSDanilo Krummrich 	return drm_gem_dma_mmap(dma_obj, vma);
1344a83c26aSDanilo Krummrich }
1354a83c26aSDanilo Krummrich 
1364a83c26aSDanilo Krummrich /*
1374a83c26aSDanilo Krummrich  * Driver ops
1384a83c26aSDanilo Krummrich  */
1394a83c26aSDanilo Krummrich 
1404a83c26aSDanilo Krummrich /* create memory region for DRM framebuffer */
1414a83c26aSDanilo Krummrich int drm_gem_dma_dumb_create_internal(struct drm_file *file_priv,
1424a83c26aSDanilo Krummrich 				     struct drm_device *drm,
1434a83c26aSDanilo Krummrich 				     struct drm_mode_create_dumb *args);
1444a83c26aSDanilo Krummrich 
1454a83c26aSDanilo Krummrich /* create memory region for DRM framebuffer */
1464a83c26aSDanilo Krummrich int drm_gem_dma_dumb_create(struct drm_file *file_priv,
1474a83c26aSDanilo Krummrich 			    struct drm_device *drm,
1484a83c26aSDanilo Krummrich 			    struct drm_mode_create_dumb *args);
1494a83c26aSDanilo Krummrich 
1504a83c26aSDanilo Krummrich struct drm_gem_object *
1514a83c26aSDanilo Krummrich drm_gem_dma_prime_import_sg_table(struct drm_device *dev,
1524a83c26aSDanilo Krummrich 				  struct dma_buf_attachment *attach,
1534a83c26aSDanilo Krummrich 				  struct sg_table *sgt);
1544a83c26aSDanilo Krummrich 
1554a83c26aSDanilo Krummrich /**
1564a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE - DMA GEM driver operations
1574a83c26aSDanilo Krummrich  * @dumb_create_func: callback function for .dumb_create
1584a83c26aSDanilo Krummrich  *
1594a83c26aSDanilo Krummrich  * This macro provides a shortcut for setting the default GEM operations in the
1604a83c26aSDanilo Krummrich  * &drm_driver structure.
1614a83c26aSDanilo Krummrich  *
1624a83c26aSDanilo Krummrich  * This macro is a variant of DRM_GEM_DMA_DRIVER_OPS for drivers that
1634a83c26aSDanilo Krummrich  * override the default implementation of &struct rm_driver.dumb_create. Use
1644a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS if possible. Drivers that require a virtual address
1654a83c26aSDanilo Krummrich  * on imported buffers should use
1664a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE() instead.
1674a83c26aSDanilo Krummrich  */
1684a83c26aSDanilo Krummrich #define DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(dumb_create_func) \
1694a83c26aSDanilo Krummrich 	.dumb_create		   = (dumb_create_func), \
1700adec227SThomas Zimmermann 	.gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table
1714a83c26aSDanilo Krummrich 
1724a83c26aSDanilo Krummrich /**
1734a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS - DMA GEM driver operations
1744a83c26aSDanilo Krummrich  *
1754a83c26aSDanilo Krummrich  * This macro provides a shortcut for setting the default GEM operations in the
1764a83c26aSDanilo Krummrich  * &drm_driver structure.
1774a83c26aSDanilo Krummrich  *
1784a83c26aSDanilo Krummrich  * Drivers that come with their own implementation of
1794a83c26aSDanilo Krummrich  * &struct drm_driver.dumb_create should use
1804a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead. Use
1814a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS if possible. Drivers that require a virtual address
1824a83c26aSDanilo Krummrich  * on imported buffers should use DRM_GEM_DMA_DRIVER_OPS_VMAP instead.
1834a83c26aSDanilo Krummrich  */
1844a83c26aSDanilo Krummrich #define DRM_GEM_DMA_DRIVER_OPS \
1854a83c26aSDanilo Krummrich 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(drm_gem_dma_dumb_create)
1864a83c26aSDanilo Krummrich 
1874a83c26aSDanilo Krummrich /**
1884a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE - DMA GEM driver operations
1894a83c26aSDanilo Krummrich  *                                                ensuring a virtual address
1904a83c26aSDanilo Krummrich  *                                                on the buffer
1914a83c26aSDanilo Krummrich  * @dumb_create_func: callback function for .dumb_create
1924a83c26aSDanilo Krummrich  *
1934a83c26aSDanilo Krummrich  * This macro provides a shortcut for setting the default GEM operations in the
1944a83c26aSDanilo Krummrich  * &drm_driver structure for drivers that need the virtual address also on
1954a83c26aSDanilo Krummrich  * imported buffers.
1964a83c26aSDanilo Krummrich  *
1974a83c26aSDanilo Krummrich  * This macro is a variant of DRM_GEM_DMA_DRIVER_OPS_VMAP for drivers that
1984a83c26aSDanilo Krummrich  * override the default implementation of &struct drm_driver.dumb_create. Use
1994a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a
2004a83c26aSDanilo Krummrich  * virtual address on imported buffers should use
2014a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead.
2024a83c26aSDanilo Krummrich  */
2034a83c26aSDanilo Krummrich #define DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(dumb_create_func) \
204*71e801b9SThomas Zimmermann 	.dumb_create		   = (dumb_create_func), \
2050adec227SThomas Zimmermann 	.gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table_vmap
2064a83c26aSDanilo Krummrich 
2074a83c26aSDanilo Krummrich /**
2084a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP - DMA GEM driver operations ensuring a virtual
2094a83c26aSDanilo Krummrich  *                               address on the buffer
2104a83c26aSDanilo Krummrich  *
2114a83c26aSDanilo Krummrich  * This macro provides a shortcut for setting the default GEM operations in the
2124a83c26aSDanilo Krummrich  * &drm_driver structure for drivers that need the virtual address also on
2134a83c26aSDanilo Krummrich  * imported buffers.
2144a83c26aSDanilo Krummrich  *
2154a83c26aSDanilo Krummrich  * Drivers that come with their own implementation of
2164a83c26aSDanilo Krummrich  * &struct drm_driver.dumb_create should use
2174a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE() instead. Use
2184a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a
2194a83c26aSDanilo Krummrich  * virtual address on imported buffers should use DRM_GEM_DMA_DRIVER_OPS
2204a83c26aSDanilo Krummrich  * instead.
2214a83c26aSDanilo Krummrich  */
2224a83c26aSDanilo Krummrich #define DRM_GEM_DMA_DRIVER_OPS_VMAP \
2234a83c26aSDanilo Krummrich 	DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(drm_gem_dma_dumb_create)
2244a83c26aSDanilo Krummrich 
2254a83c26aSDanilo Krummrich struct drm_gem_object *
2264a83c26aSDanilo Krummrich drm_gem_dma_prime_import_sg_table_vmap(struct drm_device *drm,
2274a83c26aSDanilo Krummrich 				       struct dma_buf_attachment *attach,
2284a83c26aSDanilo Krummrich 				       struct sg_table *sgt);
2294a83c26aSDanilo Krummrich 
2304a83c26aSDanilo Krummrich /*
2314a83c26aSDanilo Krummrich  * File ops
2324a83c26aSDanilo Krummrich  */
2334a83c26aSDanilo Krummrich 
2344a83c26aSDanilo Krummrich #ifndef CONFIG_MMU
2354a83c26aSDanilo Krummrich unsigned long drm_gem_dma_get_unmapped_area(struct file *filp,
2364a83c26aSDanilo Krummrich 					    unsigned long addr,
2374a83c26aSDanilo Krummrich 					    unsigned long len,
2384a83c26aSDanilo Krummrich 					    unsigned long pgoff,
2394a83c26aSDanilo Krummrich 					    unsigned long flags);
2404a83c26aSDanilo Krummrich #define DRM_GEM_DMA_UNMAPPED_AREA_FOPS \
2414a83c26aSDanilo Krummrich 	.get_unmapped_area	= drm_gem_dma_get_unmapped_area,
2424a83c26aSDanilo Krummrich #else
2434a83c26aSDanilo Krummrich #define DRM_GEM_DMA_UNMAPPED_AREA_FOPS
2444a83c26aSDanilo Krummrich #endif
2454a83c26aSDanilo Krummrich 
2464a83c26aSDanilo Krummrich /**
2474a83c26aSDanilo Krummrich  * DEFINE_DRM_GEM_DMA_FOPS() - macro to generate file operations for DMA drivers
2484a83c26aSDanilo Krummrich  * @name: name for the generated structure
2494a83c26aSDanilo Krummrich  *
2504a83c26aSDanilo Krummrich  * This macro autogenerates a suitable &struct file_operations for DMA based
2514a83c26aSDanilo Krummrich  * drivers, which can be assigned to &drm_driver.fops. Note that this structure
2524a83c26aSDanilo Krummrich  * cannot be shared between drivers, because it contains a reference to the
2534a83c26aSDanilo Krummrich  * current module using THIS_MODULE.
2544a83c26aSDanilo Krummrich  *
2554a83c26aSDanilo Krummrich  * Note that the declaration is already marked as static - if you need a
2564a83c26aSDanilo Krummrich  * non-static version of this you're probably doing it wrong and will break the
2574a83c26aSDanilo Krummrich  * THIS_MODULE reference by accident.
2584a83c26aSDanilo Krummrich  */
2594a83c26aSDanilo Krummrich #define DEFINE_DRM_GEM_DMA_FOPS(name) \
2604a83c26aSDanilo Krummrich 	static const struct file_operations name = {\
2614a83c26aSDanilo Krummrich 		.owner		= THIS_MODULE,\
2624a83c26aSDanilo Krummrich 		.open		= drm_open,\
2634a83c26aSDanilo Krummrich 		.release	= drm_release,\
2644a83c26aSDanilo Krummrich 		.unlocked_ioctl	= drm_ioctl,\
2654a83c26aSDanilo Krummrich 		.compat_ioctl	= drm_compat_ioctl,\
2664a83c26aSDanilo Krummrich 		.poll		= drm_poll,\
2674a83c26aSDanilo Krummrich 		.read		= drm_read,\
2684a83c26aSDanilo Krummrich 		.llseek		= noop_llseek,\
2694a83c26aSDanilo Krummrich 		.mmap		= drm_gem_mmap,\
2704a83c26aSDanilo Krummrich 		DRM_GEM_DMA_UNMAPPED_AREA_FOPS \
2714a83c26aSDanilo Krummrich 	}
2724a83c26aSDanilo Krummrich 
2734a83c26aSDanilo Krummrich #endif /* __DRM_GEM_DMA_HELPER_H__ */
274