drm/sprd: use prime dma-buf to convert fd and gem handle
authorJoonyoung Shim <jy0922.shim@samsung.com>
Thu, 10 Dec 2015 10:10:52 +0000 (19:10 +0900)
committerJoonyoung Shim <jy0922.shim@samsung.com>
Wed, 13 Jan 2016 01:29:25 +0000 (10:29 +0900)
The sprd drm driver used specific functions to convert fd and gem handle
but they don't support some mechanism of prime dma-buf functions like
reusing of handle exported already, so use prime dma-buf functions.

Change-Id: Ieb591944015bfab0cb15cc21d714f70bffe4b18c
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
drivers/gpu/drm/sprd/sprd_drm_drv.c
drivers/gpu/drm/sprd/sprd_drm_gem.c
drivers/gpu/drm/sprd/sprd_drm_gem.h

index b51851f..4f75743 100644 (file)
@@ -638,11 +638,14 @@ static struct drm_driver sprd_drm_driver = {
        .dumb_create            = sprd_drm_gem_dumb_create,
        .dumb_map_offset        = sprd_drm_gem_dumb_map_offset,
        .dumb_destroy           = sprd_drm_gem_dumb_destroy,
-       .prime_handle_to_fd     = sprd_drm_gem_prime_handle_to_fd,
-       .prime_fd_to_handle     = sprd_drm_gem_prime_fd_to_handle,
+       .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
+       .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
 #ifdef CONFIG_DRM_SPRD_DMABUF
        .gem_prime_export       = sprd_dmabuf_prime_export,
        .gem_prime_import       = sprd_dmabuf_prime_import,
+#else
+       .gem_prime_export       = sprd_prime_export,
+       .gem_prime_import       = sprd_prime_import,
 #endif
        .ioctls                 = sprd_ioctls,
        .fops                   = &sprd_drm_driver_fops,
index a2a3c9c..cb555b2 100755 (executable)
@@ -485,61 +485,42 @@ int sprd_drm_gem_create_index_ioctl(struct drm_device *dev, void *data,
        return 0;
 }
 
-int sprd_drm_gem_prime_handle_to_fd(struct drm_device *dev,
-               struct drm_file *file_priv, uint32_t handle,
-               uint32_t flags, int *prime_fd)
+struct dma_buf *sprd_prime_export(struct drm_device *dev,
+                                 struct drm_gem_object *obj, int flags)
 {
-       int ret = 0;
-       struct sprd_drm_gem_obj *sprd_gem_obj;
-       struct drm_gem_object *obj;
-       struct sprd_drm_gem_buf *buf;
-       struct sprd_drm_private *private;
-
-       if (!handle) {
-               DRM_ERROR("%s: Handle to fd failed. Null handle\n", __func__);
-               return -EINVAL;
-       }
-
-       obj = drm_gem_object_lookup(dev, file_priv, handle);
-       if (!obj) {
-               DRM_ERROR("failed to lookup gem object.\n");
-               return -EINVAL;
-       }
-
-       private = dev->dev_private;
-       sprd_gem_obj = to_sprd_gem_obj(obj);
-       buf = sprd_gem_obj->buffer;
-       *prime_fd = ion_share_dma_buf_fd(private->sprd_drm_ion_client,
-                                       buf->ion_handle);
-       drm_gem_object_unreference(obj);
+       struct sprd_drm_private *private = dev->dev_private;
+       struct sprd_drm_gem_obj *sprd_gem_obj = to_sprd_gem_obj(obj);
+       struct sprd_drm_gem_buf *buf = sprd_gem_obj->buffer;
+       struct dma_buf *dmabuf;
 
-       if (*prime_fd == -EINVAL) {
-               prime_fd = NULL;
-               return -EINVAL;
-       }
+       dmabuf = ion_share_dma_buf(private->sprd_drm_ion_client,
+                                  buf->ion_handle);
+       if (IS_ERR(dmabuf))
+               pr_err("%s: dmabuf is error and dmabuf is %p!\n",
+                               __func__, dmabuf);
 
-       return ret;
+       return dmabuf;
 }
 
-int sprd_drm_gem_prime_fd_to_handle(struct drm_device *dev,
-               struct drm_file *file_priv, int prime_fd, uint32_t *handle)
+struct drm_gem_object *sprd_prime_import(struct drm_device *dev,
+                                        struct dma_buf *dma_buf)
 {
        struct ion_handle *ion_handle;
        struct sprd_drm_gem_obj *sprd_gem_obj;
        unsigned long size;
        struct sprd_drm_gem_buf *buf = NULL;
        unsigned int i = 0, nr_pages = 0, heap_id;
-       int ret = 0, gem_handle;
+       int ret = 0;
        struct sprd_drm_private *private;
        struct scatterlist *sg = NULL;
        struct drm_gem_object *obj;
        unsigned long sgt_size;
 
        private = dev->dev_private;
-       ion_handle = ion_import_dma_buf(private->sprd_drm_ion_client, prime_fd);
+       ion_handle = get_ion_handle_from_dmabuf(private->sprd_drm_ion_client, dma_buf);
        if (IS_ERR_OR_NULL(ion_handle)) {
                DRM_ERROR("Unable to import dmabuf\n");
-               return -EINVAL;
+               return ERR_PTR(-EINVAL);
        }
 
        ion_handle_get_size(private->sprd_drm_ion_client,
@@ -629,14 +610,7 @@ int sprd_drm_gem_prime_fd_to_handle(struct drm_device *dev,
        DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n",
                (unsigned long)buf->dma_addr, buf->size);
 
-       ret = sprd_drm_gem_handle_create(&sprd_gem_obj->base, file_priv,
-                                       &gem_handle);
-       if (ret) {
-               sprd_drm_gem_destroy(sprd_gem_obj);
-               return ret;
-       }
-       *handle = gem_handle;
-       return 0;
+       return obj;
 
 err_buf:
        buf->dma_addr = (dma_addr_t)NULL;
@@ -652,7 +626,7 @@ err_fini_buf:
 err:
        ion_free(private->sprd_drm_ion_client, ion_handle);
 
-       return ret;
+       return ERR_PTR(ret);
 }
 
 void *sprd_drm_gem_get_dma_addr(struct drm_device *dev,
index 7c1a22a..750bdf0 100644 (file)
@@ -117,13 +117,11 @@ int sprd_drm_gem_create_ioctl(struct drm_device *dev, void *data,
 int sprd_drm_gem_create_index_ioctl(struct drm_device *dev, void *data,
                                struct drm_file *file_priv);
 
-int sprd_drm_gem_prime_handle_to_fd(struct drm_device *dev,
-               struct drm_file *file_priv, uint32_t handle, uint32_t flags,
-               int *prime_fd);
-
-int sprd_drm_gem_prime_fd_to_handle(struct drm_device *dev,
-               struct drm_file *file_priv, int prime_fd, uint32_t *handle);
+struct dma_buf *sprd_prime_export(struct drm_device *dev,
+                                 struct drm_gem_object *obj, int flags);
 
+struct drm_gem_object *sprd_prime_import(struct drm_device *dev,
+                                        struct dma_buf *dma_buf);
 
 /*
  * get dma address from gem handle and this function could be used for