From: Joonyoung Shim Date: Tue, 22 Dec 2015 00:50:10 +0000 (+0900) Subject: drm/exynos: support mmap from dma-buf X-Git-Tag: submit/tizen/20160405.082219~53 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a564a0f5ca18be06da1f820db69cf9f23441c5df;p=platform%2Fkernel%2Flinux-exynos.git drm/exynos: support mmap from dma-buf This allows exported dma-bufs to be mapped in exynos drm. Signed-off-by: Joonyoung Shim [jy0922.shim: Be backported from upstream but not posted] Change-Id: Ic3bf3153707e2e57c1d930487428b6a83b96d658 --- diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index cd485c091b30..0bb4c9dd87ac 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c @@ -165,7 +165,18 @@ static void exynos_gem_dmabuf_kunmap(struct dma_buf *dma_buf, static int exynos_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma) { - return -ENOTTY; + + struct drm_gem_object *obj = dma_buf->priv; + struct drm_device *dev = obj->dev; + int ret; + + mutex_lock(&dev->struct_mutex); + ret = drm_gem_mmap_obj(obj, obj->size, vma); + mutex_unlock(&dev->struct_mutex); + if (ret < 0) + return ret; + + return exynos_drm_gem_mmap_obj(obj, vma); } static struct dma_buf_ops exynos_dmabuf_ops = { diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 81fb8a5d6ae7..a1c573990294 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -622,20 +622,12 @@ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) return convert_to_vm_err_msg(ret); } -int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) +int exynos_drm_gem_mmap_obj(struct drm_gem_object *obj, + struct vm_area_struct *vma) { - struct exynos_drm_gem_obj *exynos_gem_obj; - struct drm_gem_object *obj; + struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj); int ret; - /* set vm_area_struct. */ - ret = drm_gem_mmap(filp, vma); - if (ret < 0) { - DRM_ERROR("failed to mmap.\n"); - return ret; - } - - obj = vma->vm_private_data; exynos_gem_obj = to_exynos_gem_obj(obj); ret = check_gem_flags(exynos_gem_obj->flags); @@ -655,3 +647,20 @@ err_close_vm: return ret; } + +int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) +{ + struct drm_gem_object *obj; + int ret; + + /* set vm_area_struct. */ + ret = drm_gem_mmap(filp, vma); + if (ret < 0) { + DRM_ERROR("failed to mmap.\n"); + return ret; + } + + obj = vma->vm_private_data; + + return exynos_drm_gem_mmap_obj(obj, vma); +} diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index 8c9f84b6af21..9ae862ec3bff 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h @@ -148,6 +148,9 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, /* page fault handler and mmap fault address(virtual) to physical memory. */ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); +int exynos_drm_gem_mmap_obj(struct drm_gem_object *obj, + struct vm_area_struct *vma); + /* set vm_flags and we can change the vm attribute to other one at here. */ int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);