diff options
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 48 |
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, | |||
| 816 | struct drm_gem_object *msm_gem_new(struct drm_device *dev, | 800 | struct 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; |
