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