This was always the intention, but somehow it was never wired up
properly.

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
 drivers/gpu/drm/msm/msm_drv.h       |  2 +-
 drivers/gpu/drm/msm/msm_gem.c       | 18 ++++++++++++------
 drivers/gpu/drm/msm/msm_gem_prime.c |  2 +-
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index dfd8c8b..fed3869 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -208,7 +208,7 @@ int msm_gem_new_handle(struct drm_device *dev, struct 
drm_file *file,
 struct drm_gem_object *msm_gem_new(struct drm_device *dev,
                uint32_t size, uint32_t flags);
 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
-               uint32_t size, struct sg_table *sgt);
+               struct dma_buf *dmabuf, struct sg_table *sgt);

 int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id);
 void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id);
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index ef03ee7..09e2190 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -584,6 +584,7 @@ int msm_gem_new_handle(struct drm_device *dev, struct 
drm_file *file,

 static int msm_gem_new_impl(struct drm_device *dev,
                uint32_t size, uint32_t flags,
+               struct reservation_object *resv,
                struct drm_gem_object **obj)
 {
        struct msm_drm_private *priv = dev->dev_private;
@@ -623,8 +624,12 @@ static int msm_gem_new_impl(struct drm_device *dev,

        msm_obj->flags = flags;

-       msm_obj->resv = &msm_obj->_resv;
-       reservation_object_init(msm_obj->resv);
+       if (resv) {
+               msm_obj->resv = resv;
+       } else {
+               msm_obj->resv = &msm_obj->_resv;
+               reservation_object_init(msm_obj->resv);
+       }

        INIT_LIST_HEAD(&msm_obj->submit_entry);
        list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
@@ -644,7 +649,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev,

        size = PAGE_ALIGN(size);

-       ret = msm_gem_new_impl(dev, size, flags, &obj);
+       ret = msm_gem_new_impl(dev, size, flags, NULL, &obj);
        if (ret)
                goto fail;

@@ -666,10 +671,11 @@ fail:
 }

 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
-               uint32_t size, struct sg_table *sgt)
+               struct dma_buf *dmabuf, struct sg_table *sgt)
 {
        struct msm_gem_object *msm_obj;
        struct drm_gem_object *obj;
+       uint32_t size;
        int ret, npages;

        /* if we don't have IOMMU, don't bother pretending we can import: */
@@ -678,9 +684,9 @@ struct drm_gem_object *msm_gem_import(struct drm_device 
*dev,
                return ERR_PTR(-EINVAL);
        }

-       size = PAGE_ALIGN(size);
+       size = PAGE_ALIGN(dmabuf->size);

-       ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj);
+       ret = msm_gem_new_impl(dev, size, MSM_BO_WC, dmabuf->resv, &obj);
        if (ret)
                goto fail;

diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c 
b/drivers/gpu/drm/msm/msm_gem_prime.c
index 121975b..6b90890 100644
--- a/drivers/gpu/drm/msm/msm_gem_prime.c
+++ b/drivers/gpu/drm/msm/msm_gem_prime.c
@@ -55,7 +55,7 @@ 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 dma_buf_attachment *attach, struct sg_table *sg)
 {
-       return msm_gem_import(dev, attach->dmabuf->size, sg);
+       return msm_gem_import(dev, attach->dmabuf, sg);
 }

 int msm_gem_prime_pin(struct drm_gem_object *obj)
-- 
2.5.0

Reply via email to