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