aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/msm_gem.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 0a38c5b1a799..2e5c987f7f2c 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -324,12 +324,8 @@ int msm_gem_get_iova_locked(struct drm_gem_object *obj,
324 if (IS_ERR(pages)) 324 if (IS_ERR(pages))
325 return PTR_ERR(pages); 325 return PTR_ERR(pages);
326 326
327 if (iommu_present(&platform_bus_type)) { 327 ret = msm_gem_map_vma(priv->aspace[id], &msm_obj->domain[id],
328 ret = msm_gem_map_vma(priv->aspace[id], &msm_obj->domain[id], 328 msm_obj->sgt, obj->size >> PAGE_SHIFT);
329 msm_obj->sgt, obj->size >> PAGE_SHIFT);
330 } else {
331 msm_obj->domain[id].iova = physaddr(obj);
332 }
333 } 329 }
334 330
335 if (!ret) 331 if (!ret)
@@ -765,7 +761,6 @@ static int msm_gem_new_impl(struct drm_device *dev,
765{ 761{
766 struct msm_drm_private *priv = dev->dev_private; 762 struct msm_drm_private *priv = dev->dev_private;
767 struct msm_gem_object *msm_obj; 763 struct msm_gem_object *msm_obj;
768 bool use_vram = false;
769 764
770 WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 765 WARN_ON(!mutex_is_locked(&dev->struct_mutex));
771 766
@@ -780,21 +775,10 @@ static int msm_gem_new_impl(struct drm_device *dev,
780 return -EINVAL; 775 return -EINVAL;
781 } 776 }
782 777
783 if (!iommu_present(&platform_bus_type))
784 use_vram = true;
785 else if ((flags & MSM_BO_STOLEN) && priv->vram.size)
786 use_vram = true;
787
788 if (WARN_ON(use_vram && !priv->vram.size))
789 return -EINVAL;
790
791 msm_obj = kzalloc(sizeof(*msm_obj), GFP_KERNEL); 778 msm_obj = kzalloc(sizeof(*msm_obj), GFP_KERNEL);
792 if (!msm_obj) 779 if (!msm_obj)
793 return -ENOMEM; 780 return -ENOMEM;
794 781
795 if (use_vram)
796 msm_obj->vram_node = &msm_obj->domain[0].node;
797
798 msm_obj->flags = flags; 782 msm_obj->flags = flags;
799 msm_obj->madv = MSM_MADV_WILLNEED; 783 msm_obj->madv = MSM_MADV_WILLNEED;
800 784
@@ -816,13 +800,23 @@ static int msm_gem_new_impl(struct drm_device *dev,
816struct drm_gem_object *msm_gem_new(struct drm_device *dev, 800struct drm_gem_object *msm_gem_new(struct drm_device *dev,
817 uint32_t size, uint32_t flags) 801 uint32_t size, uint32_t flags)
818{ 802{
803 struct msm_drm_private *priv = dev->dev_private;
819 struct drm_gem_object *obj = NULL; 804 struct drm_gem_object *obj = NULL;
805 bool use_vram = false;
820 int ret; 806 int ret;
821 807
822 WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 808 WARN_ON(!mutex_is_locked(&dev->struct_mutex));
823 809
824 size = PAGE_ALIGN(size); 810 size = PAGE_ALIGN(size);
825 811
812 if (!iommu_present(&platform_bus_type))
813 use_vram = true;
814 else if ((flags & MSM_BO_STOLEN) && priv->vram.size)
815 use_vram = true;
816
817 if (WARN_ON(use_vram && !priv->vram.size))
818 return ERR_PTR(-EINVAL);
819
826 /* Disallow zero sized objects as they make the underlying 820 /* Disallow zero sized objects as they make the underlying
827 * infrastructure grumpy 821 * infrastructure grumpy
828 */ 822 */
@@ -833,12 +827,24 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev,
833 if (ret) 827 if (ret)
834 goto fail; 828 goto fail;
835 829
836 if (use_pages(obj)) { 830 if (use_vram) {
831 struct msm_gem_object *msm_obj = to_msm_bo(obj);
832 struct page **pages;
833
834 msm_obj->vram_node = &msm_obj->domain[0].node;
835 drm_gem_private_object_init(dev, obj, size);
836
837 msm_obj->pages = get_pages(obj);
838 pages = get_pages(obj);
839 if (IS_ERR(pages)) {
840 ret = PTR_ERR(pages);
841 goto fail;
842 }
843 msm_obj->domain[0].iova = physaddr(obj);
844 } else {
837 ret = drm_gem_object_init(dev, obj, size); 845 ret = drm_gem_object_init(dev, obj, size);
838 if (ret) 846 if (ret)
839 goto fail; 847 goto fail;
840 } else {
841 drm_gem_private_object_init(dev, obj, size);
842 } 848 }
843 849
844 return obj; 850 return obj;