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