drm: Pass dma-buf as argument to gem_prime_import_sg_table
authorMaarten Lankhorst <maarten.lankhorst@canonical.com>
Thu, 9 Jan 2014 10:03:14 +0000 (11:03 +0100)
committerMaarten Lankhorst <maarten.lankhorst@canonical.com>
Tue, 30 Sep 2014 12:04:00 +0000 (14:04 +0200)
Allows importing dma_reservation_objects from a dma-buf.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
12 files changed:
drivers/gpu/drm/drm_gem_cma_helper.c
drivers/gpu/drm/drm_prime.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_gem_prime.c
drivers/gpu/drm/nouveau/nouveau_gem.h
drivers/gpu/drm/nouveau/nouveau_prime.c
drivers/gpu/drm/qxl/qxl_drv.h
drivers/gpu/drm/qxl/qxl_prime.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_prime.c
include/drm/drmP.h
include/drm/drm_gem_cma_helper.h

index e467e67af6e7111c69b96cb792380b5727500650..0316310e2cc47400703418ea324e381cc65f8c8b 100644 (file)
@@ -316,7 +316,8 @@ out:
 EXPORT_SYMBOL_GPL(drm_gem_cma_prime_get_sg_table);
 
 struct drm_gem_object *
-drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,
+drm_gem_cma_prime_import_sg_table(struct drm_device *dev,
+                                 struct dma_buf_attachment *attach,
                                  struct sg_table *sgt)
 {
        struct drm_gem_cma_object *cma_obj;
@@ -325,14 +326,14 @@ drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,
                return ERR_PTR(-EINVAL);
 
        /* Create a CMA GEM buffer. */
-       cma_obj = __drm_gem_cma_create(dev, size);
+       cma_obj = __drm_gem_cma_create(dev, attach->dmabuf->size);
        if (IS_ERR(cma_obj))
                return ERR_CAST(cma_obj);
 
        cma_obj->paddr = sg_dma_address(sgt->sgl);
        cma_obj->sgt = sgt;
 
-       DRM_DEBUG_PRIME("dma_addr = %pad, size = %zu\n", &cma_obj->paddr, size);
+       DRM_DEBUG_PRIME("dma_addr = %pad, size = %zu\n", &cma_obj->paddr, attach->dmabuf->size);
 
        return &cma_obj->base;
 }
index 7826de9da2761f32ac6fa4f2f177ede8681cd18d..78ca30808422fc56c67acb4659f38f06a555b1db 100644 (file)
@@ -525,7 +525,7 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
                goto fail_detach;
        }
 
-       obj = dev->driver->gem_prime_import_sg_table(dev, dma_buf->size, sgt);
+       obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt);
        if (IS_ERR(obj)) {
                ret = PTR_ERR(obj);
                goto fail_unmap;
index afaafd42dee739e44b7dd541eb1323defd2da5e7..67f9d0a2332c28b9983d7fe29000f907ffcd87f5 100644 (file)
@@ -171,7 +171,7 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj);
 void *msm_gem_prime_vmap(struct drm_gem_object *obj);
 void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
 struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
-               size_t size, struct sg_table *sg);
+               struct dma_buf_attachment *attach, struct sg_table *sg);
 int msm_gem_prime_pin(struct drm_gem_object *obj);
 void msm_gem_prime_unpin(struct drm_gem_object *obj);
 void *msm_gem_vaddr_locked(struct drm_gem_object *obj);
index d48f9fc5129bfbd1b8d8b60842c7272f72eadc5f..ad772fe36115f69c47aaca1f1caa2c2356a8bd01 100644 (file)
@@ -18,6 +18,7 @@
 #include "msm_drv.h"
 #include "msm_gem.h"
 
+#include <linux/dma-buf.h>
 
 struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj)
 {
@@ -37,9 +38,9 @@ void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 }
 
 struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
-               size_t size, struct sg_table *sg)
+               struct dma_buf_attachment *attach, struct sg_table *sg)
 {
-       return msm_gem_import(dev, size, sg);
+       return msm_gem_import(dev, attach->dmabuf->size, sg);
 }
 
 int msm_gem_prime_pin(struct drm_gem_object *obj)
index ddab762d81fef78d269729aa8c906934ef9e1d3b..e4049faca780453f07dccbf034950a8215fa786e 100644 (file)
@@ -39,7 +39,7 @@ struct reservation_object *nouveau_gem_prime_res_obj(struct drm_gem_object *);
 extern void nouveau_gem_prime_unpin(struct drm_gem_object *);
 extern struct sg_table *nouveau_gem_prime_get_sg_table(struct drm_gem_object *);
 extern struct drm_gem_object *nouveau_gem_prime_import_sg_table(
-       struct drm_device *, size_t size, struct sg_table *);
+       struct drm_device *, struct dma_buf_attachment *, struct sg_table *);
 extern void *nouveau_gem_prime_vmap(struct drm_gem_object *);
 extern void nouveau_gem_prime_vunmap(struct drm_gem_object *, void *);
 
index 1f51008e4d26e4511a6260d606ca515ed025d160..2215cdba587d9cbb475ad39dac98725277e513b0 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include <drm/drmP.h>
+#include <linux/dma-buf.h>
 
 #include "nouveau_drm.h"
 #include "nouveau_gem.h"
@@ -56,7 +57,7 @@ void nouveau_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 }
 
 struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,
-                                                        size_t size,
+                                                        struct dma_buf_attachment *attach,
                                                         struct sg_table *sg)
 {
        struct nouveau_bo *nvbo;
@@ -65,7 +66,7 @@ struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,
 
        flags = TTM_PL_FLAG_TT;
 
-       ret = nouveau_bo_new(dev, size, 0, flags, 0, 0,
+       ret = nouveau_bo_new(dev, attach->dmabuf->size, 0, flags, 0, 0,
                             sg, &nvbo);
        if (ret)
                return ERR_PTR(ret);
index ff0772728eb05c3eb3656c036aa1148c119087f8..7c6cafe21f5f5fd2b354c8d34494fff51fc84d3b 100644 (file)
@@ -537,7 +537,7 @@ int qxl_gem_prime_pin(struct drm_gem_object *obj);
 void qxl_gem_prime_unpin(struct drm_gem_object *obj);
 struct sg_table *qxl_gem_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *qxl_gem_prime_import_sg_table(
-       struct drm_device *dev, size_t size,
+       struct drm_device *dev, struct dma_buf_attachment *attach,
        struct sg_table *sgt);
 void *qxl_gem_prime_vmap(struct drm_gem_object *obj);
 void qxl_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
index ba0689c728e88fc2fa627fe0cf37d30ca8c50284..3d031b50a8fd13dd8203f4de284ecedbb95ecbcc 100644 (file)
@@ -46,7 +46,7 @@ struct sg_table *qxl_gem_prime_get_sg_table(struct drm_gem_object *obj)
 }
 
 struct drm_gem_object *qxl_gem_prime_import_sg_table(
-       struct drm_device *dev, size_t size,
+       struct drm_device *dev, struct dma_buf_attachment *attach,
        struct sg_table *table)
 {
        WARN_ONCE(1, "not implemented");
index de108427a19745246bb171f5ce714702384426e8..69c6a835bcd5598e46dea006b83891336eddb67a 100644 (file)
@@ -135,7 +135,7 @@ int radeon_mode_dumb_create(struct drm_file *file_priv,
                            struct drm_mode_create_dumb *args);
 struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
-                                                       size_t size,
+                                                       struct dma_buf_attachment *,
                                                        struct sg_table *sg);
 int radeon_gem_prime_pin(struct drm_gem_object *obj);
 void radeon_gem_prime_unpin(struct drm_gem_object *obj);
index d5414d42e44bf743fa289557af93bc5f02702b97..171daf7fc483073f0f425624725610388c4092f6 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "radeon.h"
 #include <drm/radeon_drm.h>
+#include <linux/dma-buf.h>
 
 struct sg_table *radeon_gem_prime_get_sg_table(struct drm_gem_object *obj)
 {
@@ -57,14 +58,14 @@ void radeon_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 }
 
 struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
-                                                       size_t size,
+                                                       struct dma_buf_attachment *attach,
                                                        struct sg_table *sg)
 {
        struct radeon_device *rdev = dev->dev_private;
        struct radeon_bo *bo;
        int ret;
 
-       ret = radeon_bo_create(rdev, size, PAGE_SIZE, false,
+       ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
                               RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
        if (ret)
                return ERR_PTR(ret);
index d2c2b7f3a4e253bfafbb3fca355c13ba574d5208..53ed87698a74e0e4ae121e75607d74645456525a 100644 (file)
@@ -87,6 +87,7 @@ struct drm_gem_object;
 struct device_node;
 struct videomode;
 struct reservation_object;
+struct dma_buf_attachment;
 
 /*
  * 4 debug categories are defined:
@@ -570,7 +571,8 @@ struct drm_driver {
                                struct drm_gem_object *obj);
        struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj);
        struct drm_gem_object *(*gem_prime_import_sg_table)(
-                               struct drm_device *dev, size_t size,
+                               struct drm_device *dev,
+                               struct dma_buf_attachment *attach,
                                struct sg_table *sgt);
        void *(*gem_prime_vmap)(struct drm_gem_object *obj);
        void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
index 42f11f3a8d39c1945b0be16d6380cd9bb9b979dc..2ff35f3de9c5b9520587daca98f2c4d67b17bab4 100644 (file)
@@ -45,7 +45,8 @@ void drm_gem_cma_describe(struct drm_gem_cma_object *obj, struct seq_file *m);
 
 struct sg_table *drm_gem_cma_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *
-drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,
+drm_gem_cma_prime_import_sg_table(struct drm_device *dev,
+                                 struct dma_buf_attachment *attach,
                                  struct sg_table *sgt);
 int drm_gem_cma_prime_mmap(struct drm_gem_object *obj,
                           struct vm_area_struct *vma);