drm/msm: use imported dmabuf's reservation object
This was always the intention, but somehow it was never wired up properly. Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
@@ -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,
|
struct drm_gem_object *msm_gem_new(struct drm_device *dev,
|
||||||
uint32_t size, uint32_t flags);
|
uint32_t size, uint32_t flags);
|
||||||
struct drm_gem_object *msm_gem_import(struct drm_device *dev,
|
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);
|
int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id);
|
||||||
void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id);
|
void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id);
|
||||||
|
@@ -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,
|
static int msm_gem_new_impl(struct drm_device *dev,
|
||||||
uint32_t size, uint32_t flags,
|
uint32_t size, uint32_t flags,
|
||||||
|
struct reservation_object *resv,
|
||||||
struct drm_gem_object **obj)
|
struct drm_gem_object **obj)
|
||||||
{
|
{
|
||||||
struct msm_drm_private *priv = dev->dev_private;
|
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->flags = flags;
|
||||||
|
|
||||||
|
if (resv) {
|
||||||
|
msm_obj->resv = resv;
|
||||||
|
} else {
|
||||||
msm_obj->resv = &msm_obj->_resv;
|
msm_obj->resv = &msm_obj->_resv;
|
||||||
reservation_object_init(msm_obj->resv);
|
reservation_object_init(msm_obj->resv);
|
||||||
|
}
|
||||||
|
|
||||||
INIT_LIST_HEAD(&msm_obj->submit_entry);
|
INIT_LIST_HEAD(&msm_obj->submit_entry);
|
||||||
list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
|
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);
|
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)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
@@ -666,10 +671,11 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct drm_gem_object *msm_gem_import(struct drm_device *dev,
|
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 msm_gem_object *msm_obj;
|
||||||
struct drm_gem_object *obj;
|
struct drm_gem_object *obj;
|
||||||
|
uint32_t size;
|
||||||
int ret, npages;
|
int ret, npages;
|
||||||
|
|
||||||
/* if we don't have IOMMU, don't bother pretending we can import: */
|
/* 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);
|
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)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@@ -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 drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
|
||||||
struct dma_buf_attachment *attach, struct sg_table *sg)
|
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)
|
int msm_gem_prime_pin(struct drm_gem_object *obj)
|
||||||
|
Reference in New Issue
Block a user