Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

Rob Clark 79f0e202 fde5de6c

+14 -8
+1 -1
drivers/gpu/drm/msm/msm_drv.h
··· 208 208 struct drm_gem_object *msm_gem_new(struct drm_device *dev, 209 209 uint32_t size, uint32_t flags); 210 210 struct drm_gem_object *msm_gem_import(struct drm_device *dev, 211 - uint32_t size, struct sg_table *sgt); 211 + struct dma_buf *dmabuf, struct sg_table *sgt); 212 212 213 213 int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id); 214 214 void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id);
+12 -6
drivers/gpu/drm/msm/msm_gem.c
··· 584 584 585 585 static int msm_gem_new_impl(struct drm_device *dev, 586 586 uint32_t size, uint32_t flags, 587 + struct reservation_object *resv, 587 588 struct drm_gem_object **obj) 588 589 { 589 590 struct msm_drm_private *priv = dev->dev_private; ··· 624 623 625 624 msm_obj->flags = flags; 626 625 627 - msm_obj->resv = &msm_obj->_resv; 628 - reservation_object_init(msm_obj->resv); 626 + if (resv) { 627 + msm_obj->resv = resv; 628 + } else { 629 + msm_obj->resv = &msm_obj->_resv; 630 + reservation_object_init(msm_obj->resv); 631 + } 629 632 630 633 INIT_LIST_HEAD(&msm_obj->submit_entry); 631 634 list_add_tail(&msm_obj->mm_list, &priv->inactive_list); ··· 649 644 650 645 size = PAGE_ALIGN(size); 651 646 652 - ret = msm_gem_new_impl(dev, size, flags, &obj); 647 + ret = msm_gem_new_impl(dev, size, flags, NULL, &obj); 653 648 if (ret) 654 649 goto fail; 655 650 ··· 671 666 } 672 667 673 668 struct drm_gem_object *msm_gem_import(struct drm_device *dev, 674 - uint32_t size, struct sg_table *sgt) 669 + struct dma_buf *dmabuf, struct sg_table *sgt) 675 670 { 676 671 struct msm_gem_object *msm_obj; 677 672 struct drm_gem_object *obj; 673 + uint32_t size; 678 674 int ret, npages; 679 675 680 676 /* if we don't have IOMMU, don't bother pretending we can import: */ ··· 684 678 return ERR_PTR(-EINVAL); 685 679 } 686 680 687 - size = PAGE_ALIGN(size); 681 + size = PAGE_ALIGN(dmabuf->size); 688 682 689 - ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj); 683 + ret = msm_gem_new_impl(dev, size, MSM_BO_WC, dmabuf->resv, &obj); 690 684 if (ret) 691 685 goto fail; 692 686
+1 -1
drivers/gpu/drm/msm/msm_gem_prime.c
··· 55 55 struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, 56 56 struct dma_buf_attachment *attach, struct sg_table *sg) 57 57 { 58 - return msm_gem_import(dev, attach->dmabuf->size, sg); 58 + return msm_gem_import(dev, attach->dmabuf, sg); 59 59 } 60 60 61 61 int msm_gem_prime_pin(struct drm_gem_object *obj)