Am 08.07.21 um 14:04 schrieb Thomas Zimmermann: > ping for review Nevermind, there's a newer version of this patch at https://lore.kernel.org/dri-devel/20210706084753.8194-1-tzimmermann@suse.de/ Best regards Thomas > > Am 24.06.21 um 11:03 schrieb Thomas Zimmermann: >> Moving the driver-specific mmap code into a GEM object function allows >> for using DRM helpers for various mmap callbacks. >> >> The respective msm functions are being removed. The file_operations >> structure fops is now being created by the helper macro >> DEFINE_DRM_GEM_FOPS(). >> >> Signed-off-by: Thomas Zimmermann >> --- >>   drivers/gpu/drm/msm/msm_drv.c       | 14 +----- >>   drivers/gpu/drm/msm/msm_drv.h       |  1 - >>   drivers/gpu/drm/msm/msm_fbdev.c     | 10 +---- >>   drivers/gpu/drm/msm/msm_gem.c       | 67 ++++++++++++----------------- >>   drivers/gpu/drm/msm/msm_gem.h       |  3 -- >>   drivers/gpu/drm/msm/msm_gem_prime.c | 11 ----- >>   6 files changed, 31 insertions(+), 75 deletions(-) >> >> diff --git a/drivers/gpu/drm/msm/msm_drv.c >> b/drivers/gpu/drm/msm/msm_drv.c >> index fe7d17cd35ec..f62eaedfc0d7 100644 >> --- a/drivers/gpu/drm/msm/msm_drv.c >> +++ b/drivers/gpu/drm/msm/msm_drv.c >> @@ -985,17 +985,7 @@ static const struct drm_ioctl_desc msm_ioctls[] = { >>       DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, >> msm_ioctl_submitqueue_query, DRM_RENDER_ALLOW), >>   }; >> -static const struct file_operations fops = { >> -    .owner              = THIS_MODULE, >> -    .open               = drm_open, >> -    .release            = drm_release, >> -    .unlocked_ioctl     = drm_ioctl, >> -    .compat_ioctl       = drm_compat_ioctl, >> -    .poll               = drm_poll, >> -    .read               = drm_read, >> -    .llseek             = no_llseek, >> -    .mmap               = msm_gem_mmap, >> -}; >> +DEFINE_DRM_GEM_FOPS(fops); >>   static const struct drm_driver msm_driver = { >>       .driver_features    = DRIVER_GEM | >> @@ -1015,7 +1005,7 @@ static const struct drm_driver msm_driver = { >>       .prime_handle_to_fd = drm_gem_prime_handle_to_fd, >>       .prime_fd_to_handle = drm_gem_prime_fd_to_handle, >>       .gem_prime_import_sg_table = msm_gem_prime_import_sg_table, >> -    .gem_prime_mmap     = msm_gem_prime_mmap, >> +    .gem_prime_mmap     = drm_gem_prime_mmap, >>   #ifdef CONFIG_DEBUG_FS >>       .debugfs_init       = msm_debugfs_init, >>   #endif >> diff --git a/drivers/gpu/drm/msm/msm_drv.h >> b/drivers/gpu/drm/msm/msm_drv.h >> index 2668941df529..8f1e0d7c8bbb 100644 >> --- a/drivers/gpu/drm/msm/msm_drv.h >> +++ b/drivers/gpu/drm/msm/msm_drv.h >> @@ -300,7 +300,6 @@ void msm_gem_shrinker_cleanup(struct drm_device >> *dev); >>   struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object >> *obj); >>   int msm_gem_prime_vmap(struct drm_gem_object *obj, struct >> dma_buf_map *map); >>   void msm_gem_prime_vunmap(struct drm_gem_object *obj, struct >> dma_buf_map *map); >> -int msm_gem_prime_mmap(struct drm_gem_object *obj, struct >> vm_area_struct *vma); >>   struct drm_gem_object *msm_gem_prime_import_sg_table(struct >> drm_device *dev, >>           struct dma_buf_attachment *attach, struct sg_table *sg); >>   int msm_gem_prime_pin(struct drm_gem_object *obj); >> diff --git a/drivers/gpu/drm/msm/msm_fbdev.c >> b/drivers/gpu/drm/msm/msm_fbdev.c >> index 227404077e39..07225907fd2d 100644 >> --- a/drivers/gpu/drm/msm/msm_fbdev.c >> +++ b/drivers/gpu/drm/msm/msm_fbdev.c >> @@ -8,6 +8,7 @@ >>   #include >>   #include >>   #include >> +#include >>   #include "msm_drv.h" >>   #include "msm_gem.h" >> @@ -48,15 +49,8 @@ static int msm_fbdev_mmap(struct fb_info *info, >> struct vm_area_struct *vma) >>       struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par; >>       struct msm_fbdev *fbdev = to_msm_fbdev(helper); >>       struct drm_gem_object *bo = msm_framebuffer_bo(fbdev->fb, 0); >> -    int ret = 0; >> -    ret = drm_gem_mmap_obj(bo, bo->size, vma); >> -    if (ret) { >> -        pr_err("%s:drm_gem_mmap_obj fail\n", __func__); >> -        return ret; >> -    } >> - >> -    return msm_gem_mmap_obj(bo, vma); >> +    return drm_gem_prime_mmap(bo, vma); >>   } >>   static int msm_fbdev_create(struct drm_fb_helper *helper, >> diff --git a/drivers/gpu/drm/msm/msm_gem.c >> b/drivers/gpu/drm/msm/msm_gem.c >> index b61f5466e522..71d835bc575d 100644 >> --- a/drivers/gpu/drm/msm/msm_gem.c >> +++ b/drivers/gpu/drm/msm/msm_gem.c >> @@ -211,46 +211,6 @@ void msm_gem_put_pages(struct drm_gem_object *obj) >>       msm_gem_unlock(obj); >>   } >> -int msm_gem_mmap_obj(struct drm_gem_object *obj, >> -        struct vm_area_struct *vma) >> -{ >> -    struct msm_gem_object *msm_obj = to_msm_bo(obj); >> - >> -    vma->vm_flags &= ~VM_PFNMAP; >> -    vma->vm_flags |= VM_MIXEDMAP; >> - >> -    if (msm_obj->flags & MSM_BO_WC) { >> -        vma->vm_page_prot = >> pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); >> -    } else if (msm_obj->flags & MSM_BO_UNCACHED) { >> -        vma->vm_page_prot = >> pgprot_noncached(vm_get_page_prot(vma->vm_flags)); >> -    } else { >> -        /* >> -         * Shunt off cached objs to shmem file so they have their own >> -         * address_space (so unmap_mapping_range does what we want, >> -         * in particular in the case of mmap'd dmabufs) >> -         */ >> -        vma->vm_pgoff = 0; >> -        vma_set_file(vma, obj->filp); >> - >> -        vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); >> -    } >> - >> -    return 0; >> -} >> - >> -int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma) >> -{ >> -    int ret; >> - >> -    ret = drm_gem_mmap(filp, vma); >> -    if (ret) { >> -        DBG("mmap failed: %d", ret); >> -        return ret; >> -    } >> - >> -    return msm_gem_mmap_obj(vma->vm_private_data, vma); >> -} >> - >>   static vm_fault_t msm_gem_fault(struct vm_fault *vmf) >>   { >>       struct vm_area_struct *vma = vmf->vma; >> @@ -1119,6 +1079,32 @@ void msm_gem_free_object(struct drm_gem_object >> *obj) >>       kfree(msm_obj); >>   } >> +static int msm_gem_object_mmap(struct drm_gem_object *obj, struct >> vm_area_struct *vma) >> +{ >> +    struct msm_gem_object *msm_obj = to_msm_bo(obj); >> + >> +    vma->vm_flags &= ~VM_PFNMAP; >> +    vma->vm_flags |= VM_MIXEDMAP; >> + >> +    if (msm_obj->flags & MSM_BO_WC) { >> +        vma->vm_page_prot = >> pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); >> +    } else if (msm_obj->flags & MSM_BO_UNCACHED) { >> +        vma->vm_page_prot = >> pgprot_noncached(vm_get_page_prot(vma->vm_flags)); >> +    } else { >> +        /* >> +         * Shunt off cached objs to shmem file so they have their own >> +         * address_space (so unmap_mapping_range does what we want, >> +         * in particular in the case of mmap'd dmabufs) >> +         */ >> +        vma->vm_pgoff = 0; >> +        vma_set_file(vma, obj->filp); >> + >> +        vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); >> +    } >> + >> +    return 0; >> +} >> + >>   /* convenience method to construct a GEM buffer object, and >> userspace handle */ >>   int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file, >>           uint32_t size, uint32_t flags, uint32_t *handle, >> @@ -1156,6 +1142,7 @@ static const struct drm_gem_object_funcs >> msm_gem_object_funcs = { >>       .get_sg_table = msm_gem_prime_get_sg_table, >>       .vmap = msm_gem_prime_vmap, >>       .vunmap = msm_gem_prime_vunmap, >> +    .mmap = msm_gem_object_mmap, >>       .vm_ops = &vm_ops, >>   }; >> diff --git a/drivers/gpu/drm/msm/msm_gem.h >> b/drivers/gpu/drm/msm/msm_gem.h >> index 03e2cc2a2ce1..8508163088a9 100644 >> --- a/drivers/gpu/drm/msm/msm_gem.h >> +++ b/drivers/gpu/drm/msm/msm_gem.h >> @@ -112,9 +112,6 @@ struct msm_gem_object { >>   }; >>   #define to_msm_bo(x) container_of(x, struct msm_gem_object, base) >> -int msm_gem_mmap_obj(struct drm_gem_object *obj, >> -            struct vm_area_struct *vma); >> -int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma); >>   uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj); >>   int msm_gem_get_iova(struct drm_gem_object *obj, >>           struct msm_gem_address_space *aspace, uint64_t *iova); >> diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c >> b/drivers/gpu/drm/msm/msm_gem_prime.c >> index 9880348a4dc7..fc94e061d6a7 100644 >> --- a/drivers/gpu/drm/msm/msm_gem_prime.c >> +++ b/drivers/gpu/drm/msm/msm_gem_prime.c >> @@ -39,17 +39,6 @@ void msm_gem_prime_vunmap(struct drm_gem_object >> *obj, struct dma_buf_map *map) >>       msm_gem_put_vaddr(obj); >>   } >> -int msm_gem_prime_mmap(struct drm_gem_object *obj, struct >> vm_area_struct *vma) >> -{ >> -    int ret; >> - >> -    ret = drm_gem_mmap_obj(obj, obj->size, vma); >> -    if (ret < 0) >> -        return ret; >> - >> -    return msm_gem_mmap_obj(vma->vm_private_data, vma); >> -} >> - >>   struct drm_gem_object *msm_gem_prime_import_sg_table(struct >> drm_device *dev, >>           struct dma_buf_attachment *attach, struct sg_table *sg) >>   { >> > -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Maxfeldstr. 5, 90409 Nürnberg, Germany (HRB 36809, AG Nürnberg) Geschäftsführer: Felix Imendörffer