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
14*8c30eeccSDanilo 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;
23*8c30eeccSDanilo 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  */
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  */
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  */
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  */
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  */
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), \
1704a83c26aSDanilo Krummrich 	.prime_handle_to_fd	= drm_gem_prime_handle_to_fd, \
1714a83c26aSDanilo Krummrich 	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle, \
1724a83c26aSDanilo Krummrich 	.gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table, \
1734a83c26aSDanilo Krummrich 	.gem_prime_mmap		= drm_gem_prime_mmap
1744a83c26aSDanilo Krummrich 
1754a83c26aSDanilo Krummrich /**
1764a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS - DMA GEM driver operations
1774a83c26aSDanilo Krummrich  *
1784a83c26aSDanilo Krummrich  * This macro provides a shortcut for setting the default GEM operations in the
1794a83c26aSDanilo Krummrich  * &drm_driver structure.
1804a83c26aSDanilo Krummrich  *
1814a83c26aSDanilo Krummrich  * Drivers that come with their own implementation of
1824a83c26aSDanilo Krummrich  * &struct drm_driver.dumb_create should use
1834a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead. Use
1844a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS if possible. Drivers that require a virtual address
1854a83c26aSDanilo Krummrich  * on imported buffers should use DRM_GEM_DMA_DRIVER_OPS_VMAP instead.
1864a83c26aSDanilo Krummrich  */
1874a83c26aSDanilo Krummrich #define DRM_GEM_DMA_DRIVER_OPS \
1884a83c26aSDanilo Krummrich 	DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE(drm_gem_dma_dumb_create)
1894a83c26aSDanilo Krummrich 
1904a83c26aSDanilo Krummrich /**
1914a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE - DMA GEM driver operations
1924a83c26aSDanilo Krummrich  *                                                ensuring a virtual address
1934a83c26aSDanilo Krummrich  *                                                on the buffer
1944a83c26aSDanilo Krummrich  * @dumb_create_func: callback function for .dumb_create
1954a83c26aSDanilo Krummrich  *
1964a83c26aSDanilo Krummrich  * This macro provides a shortcut for setting the default GEM operations in the
1974a83c26aSDanilo Krummrich  * &drm_driver structure for drivers that need the virtual address also on
1984a83c26aSDanilo Krummrich  * imported buffers.
1994a83c26aSDanilo Krummrich  *
2004a83c26aSDanilo Krummrich  * This macro is a variant of DRM_GEM_DMA_DRIVER_OPS_VMAP for drivers that
2014a83c26aSDanilo Krummrich  * override the default implementation of &struct drm_driver.dumb_create. Use
2024a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a
2034a83c26aSDanilo Krummrich  * virtual address on imported buffers should use
2044a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_WITH_DUMB_CREATE() instead.
2054a83c26aSDanilo Krummrich  */
2064a83c26aSDanilo Krummrich #define DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(dumb_create_func) \
2074a83c26aSDanilo Krummrich 	.dumb_create		= dumb_create_func, \
2084a83c26aSDanilo Krummrich 	.prime_handle_to_fd	= drm_gem_prime_handle_to_fd, \
2094a83c26aSDanilo Krummrich 	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle, \
2104a83c26aSDanilo Krummrich 	.gem_prime_import_sg_table = drm_gem_dma_prime_import_sg_table_vmap, \
2114a83c26aSDanilo Krummrich 	.gem_prime_mmap		= drm_gem_prime_mmap
2124a83c26aSDanilo Krummrich 
2134a83c26aSDanilo Krummrich /**
2144a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP - DMA GEM driver operations ensuring a virtual
2154a83c26aSDanilo Krummrich  *                               address on the buffer
2164a83c26aSDanilo Krummrich  *
2174a83c26aSDanilo Krummrich  * This macro provides a shortcut for setting the default GEM operations in the
2184a83c26aSDanilo Krummrich  * &drm_driver structure for drivers that need the virtual address also on
2194a83c26aSDanilo Krummrich  * imported buffers.
2204a83c26aSDanilo Krummrich  *
2214a83c26aSDanilo Krummrich  * Drivers that come with their own implementation of
2224a83c26aSDanilo Krummrich  * &struct drm_driver.dumb_create should use
2234a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE() instead. Use
2244a83c26aSDanilo Krummrich  * DRM_GEM_DMA_DRIVER_OPS_VMAP if possible. Drivers that do not require a
2254a83c26aSDanilo Krummrich  * virtual address on imported buffers should use DRM_GEM_DMA_DRIVER_OPS
2264a83c26aSDanilo Krummrich  * instead.
2274a83c26aSDanilo Krummrich  */
2284a83c26aSDanilo Krummrich #define DRM_GEM_DMA_DRIVER_OPS_VMAP \
2294a83c26aSDanilo Krummrich 	DRM_GEM_DMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(drm_gem_dma_dumb_create)
2304a83c26aSDanilo Krummrich 
2314a83c26aSDanilo Krummrich struct drm_gem_object *
2324a83c26aSDanilo Krummrich drm_gem_dma_prime_import_sg_table_vmap(struct drm_device *drm,
2334a83c26aSDanilo Krummrich 				       struct dma_buf_attachment *attach,
2344a83c26aSDanilo Krummrich 				       struct sg_table *sgt);
2354a83c26aSDanilo Krummrich 
2364a83c26aSDanilo Krummrich /*
2374a83c26aSDanilo Krummrich  * File ops
2384a83c26aSDanilo Krummrich  */
2394a83c26aSDanilo Krummrich 
2404a83c26aSDanilo Krummrich #ifndef CONFIG_MMU
2414a83c26aSDanilo Krummrich unsigned long drm_gem_dma_get_unmapped_area(struct file *filp,
2424a83c26aSDanilo Krummrich 					    unsigned long addr,
2434a83c26aSDanilo Krummrich 					    unsigned long len,
2444a83c26aSDanilo Krummrich 					    unsigned long pgoff,
2454a83c26aSDanilo Krummrich 					    unsigned long flags);
2464a83c26aSDanilo Krummrich #define DRM_GEM_DMA_UNMAPPED_AREA_FOPS \
2474a83c26aSDanilo Krummrich 	.get_unmapped_area	= drm_gem_dma_get_unmapped_area,
2484a83c26aSDanilo Krummrich #else
2494a83c26aSDanilo Krummrich #define DRM_GEM_DMA_UNMAPPED_AREA_FOPS
2504a83c26aSDanilo Krummrich #endif
2514a83c26aSDanilo Krummrich 
2524a83c26aSDanilo Krummrich /**
2534a83c26aSDanilo Krummrich  * DEFINE_DRM_GEM_DMA_FOPS() - macro to generate file operations for DMA drivers
2544a83c26aSDanilo Krummrich  * @name: name for the generated structure
2554a83c26aSDanilo Krummrich  *
2564a83c26aSDanilo Krummrich  * This macro autogenerates a suitable &struct file_operations for DMA based
2574a83c26aSDanilo Krummrich  * drivers, which can be assigned to &drm_driver.fops. Note that this structure
2584a83c26aSDanilo Krummrich  * cannot be shared between drivers, because it contains a reference to the
2594a83c26aSDanilo Krummrich  * current module using THIS_MODULE.
2604a83c26aSDanilo Krummrich  *
2614a83c26aSDanilo Krummrich  * Note that the declaration is already marked as static - if you need a
2624a83c26aSDanilo Krummrich  * non-static version of this you're probably doing it wrong and will break the
2634a83c26aSDanilo Krummrich  * THIS_MODULE reference by accident.
2644a83c26aSDanilo Krummrich  */
2654a83c26aSDanilo Krummrich #define DEFINE_DRM_GEM_DMA_FOPS(name) \
2664a83c26aSDanilo Krummrich 	static const struct file_operations name = {\
2674a83c26aSDanilo Krummrich 		.owner		= THIS_MODULE,\
2684a83c26aSDanilo Krummrich 		.open		= drm_open,\
2694a83c26aSDanilo Krummrich 		.release	= drm_release,\
2704a83c26aSDanilo Krummrich 		.unlocked_ioctl	= drm_ioctl,\
2714a83c26aSDanilo Krummrich 		.compat_ioctl	= drm_compat_ioctl,\
2724a83c26aSDanilo Krummrich 		.poll		= drm_poll,\
2734a83c26aSDanilo Krummrich 		.read		= drm_read,\
2744a83c26aSDanilo Krummrich 		.llseek		= noop_llseek,\
2754a83c26aSDanilo Krummrich 		.mmap		= drm_gem_mmap,\
2764a83c26aSDanilo Krummrich 		DRM_GEM_DMA_UNMAPPED_AREA_FOPS \
2774a83c26aSDanilo Krummrich 	}
2784a83c26aSDanilo Krummrich 
2794a83c26aSDanilo Krummrich #endif /* __DRM_GEM_DMA_HELPER_H__ */
280