drm/msm: Implement mmap as GEM object function
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(). v2: * rebase onto latest upstream * remove declaration of msm_gem_mmap_obj() from msm_fbdev.c Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://lore.kernel.org/r/20210706084753.8194-1-tzimmermann@suse.de [squash in missing VM_DONTEXPAND flag] Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
840d10b64d
commit
510410bfc0
@ -1030,17 +1030,7 @@ static const struct drm_ioctl_desc msm_ioctls[] = {
|
|||||||
DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM_RENDER_ALLOW),
|
DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM_RENDER_ALLOW),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct file_operations fops = {
|
DEFINE_DRM_GEM_FOPS(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,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct drm_driver msm_driver = {
|
static const struct drm_driver msm_driver = {
|
||||||
.driver_features = DRIVER_GEM |
|
.driver_features = DRIVER_GEM |
|
||||||
@ -1060,7 +1050,7 @@ static const struct drm_driver msm_driver = {
|
|||||||
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
|
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
|
||||||
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
|
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
|
||||||
.gem_prime_import_sg_table = msm_gem_prime_import_sg_table,
|
.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
|
#ifdef CONFIG_DEBUG_FS
|
||||||
.debugfs_init = msm_debugfs_init,
|
.debugfs_init = msm_debugfs_init,
|
||||||
#endif
|
#endif
|
||||||
|
@ -309,7 +309,6 @@ void msm_gem_shrinker_cleanup(struct drm_device *dev);
|
|||||||
struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj);
|
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);
|
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);
|
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 drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
|
||||||
struct dma_buf_attachment *attach, struct sg_table *sg);
|
struct dma_buf_attachment *attach, struct sg_table *sg);
|
||||||
int msm_gem_prime_pin(struct drm_gem_object *obj);
|
int msm_gem_prime_pin(struct drm_gem_object *obj);
|
||||||
|
@ -8,13 +8,12 @@
|
|||||||
#include <drm/drm_crtc.h>
|
#include <drm/drm_crtc.h>
|
||||||
#include <drm/drm_fb_helper.h>
|
#include <drm/drm_fb_helper.h>
|
||||||
#include <drm/drm_fourcc.h>
|
#include <drm/drm_fourcc.h>
|
||||||
|
#include <drm/drm_prime.h>
|
||||||
|
|
||||||
#include "msm_drv.h"
|
#include "msm_drv.h"
|
||||||
#include "msm_gem.h"
|
#include "msm_gem.h"
|
||||||
#include "msm_kms.h"
|
#include "msm_kms.h"
|
||||||
|
|
||||||
extern int msm_gem_mmap_obj(struct drm_gem_object *obj,
|
|
||||||
struct vm_area_struct *vma);
|
|
||||||
static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma);
|
static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -48,15 +47,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 drm_fb_helper *helper = (struct drm_fb_helper *)info->par;
|
||||||
struct msm_fbdev *fbdev = to_msm_fbdev(helper);
|
struct msm_fbdev *fbdev = to_msm_fbdev(helper);
|
||||||
struct drm_gem_object *bo = msm_framebuffer_bo(fbdev->fb, 0);
|
struct drm_gem_object *bo = msm_framebuffer_bo(fbdev->fb, 0);
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
ret = drm_gem_mmap_obj(bo, bo->size, vma);
|
return drm_gem_prime_mmap(bo, vma);
|
||||||
if (ret) {
|
|
||||||
pr_err("%s:drm_gem_mmap_obj fail\n", __func__);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return msm_gem_mmap_obj(bo, vma);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int msm_fbdev_create(struct drm_fb_helper *helper,
|
static int msm_fbdev_create(struct drm_fb_helper *helper,
|
||||||
|
@ -217,31 +217,6 @@ static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot)
|
|||||||
return prot;
|
return prot;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
|
||||||
vma->vm_page_prot = msm_gem_pgprot(msm_obj, 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)
|
static vm_fault_t msm_gem_fault(struct vm_fault *vmf)
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma = vmf->vma;
|
struct vm_area_struct *vma = vmf->vma;
|
||||||
@ -1077,6 +1052,17 @@ void msm_gem_free_object(struct drm_gem_object *obj)
|
|||||||
kfree(msm_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 | VM_DONTEXPAND;
|
||||||
|
vma->vm_page_prot = msm_gem_pgprot(msm_obj, vm_get_page_prot(vma->vm_flags));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* convenience method to construct a GEM buffer object, and userspace handle */
|
/* convenience method to construct a GEM buffer object, and userspace handle */
|
||||||
int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
|
int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
|
||||||
uint32_t size, uint32_t flags, uint32_t *handle,
|
uint32_t size, uint32_t flags, uint32_t *handle,
|
||||||
@ -1114,6 +1100,7 @@ static const struct drm_gem_object_funcs msm_gem_object_funcs = {
|
|||||||
.get_sg_table = msm_gem_prime_get_sg_table,
|
.get_sg_table = msm_gem_prime_get_sg_table,
|
||||||
.vmap = msm_gem_prime_vmap,
|
.vmap = msm_gem_prime_vmap,
|
||||||
.vunmap = msm_gem_prime_vunmap,
|
.vunmap = msm_gem_prime_vunmap,
|
||||||
|
.mmap = msm_gem_object_mmap,
|
||||||
.vm_ops = &vm_ops,
|
.vm_ops = &vm_ops,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -106,9 +106,6 @@ struct msm_gem_object {
|
|||||||
};
|
};
|
||||||
#define to_msm_bo(x) container_of(x, struct msm_gem_object, base)
|
#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);
|
uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);
|
||||||
int msm_gem_get_iova(struct drm_gem_object *obj,
|
int msm_gem_get_iova(struct drm_gem_object *obj,
|
||||||
struct msm_gem_address_space *aspace, uint64_t *iova);
|
struct msm_gem_address_space *aspace, uint64_t *iova);
|
||||||
|
@ -39,17 +39,6 @@ void msm_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map)
|
|||||||
msm_gem_put_vaddr(obj);
|
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 drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
|
||||||
struct dma_buf_attachment *attach, struct sg_table *sg)
|
struct dma_buf_attachment *attach, struct sg_table *sg)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user