drm/exynos: support mmap from dma-buf
authorJoonyoung Shim <jy0922.shim@samsung.com>
Tue, 22 Dec 2015 00:50:10 +0000 (09:50 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 14 Dec 2016 04:49:04 +0000 (13:49 +0900)
This allows exported dma-bufs to be mapped in exynos drm.

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
[jy0922.shim: Be backported from upstream but not posted]

drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
drivers/gpu/drm/exynos/exynos_drm_gem.c
drivers/gpu/drm/exynos/exynos_drm_gem.h

index 69cdd69..7374922 100644 (file)
@@ -173,7 +173,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 void *exynos_gem_dmabuf_vmap(struct dma_buf *dmabuf)
index 03fdd21..a3d0979 100644 (file)
@@ -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);
+}
index 223a36f..e97d5ed 100644 (file)
@@ -147,6 +147,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);