aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c43
1 files changed, 29 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 2b077ccec181..9f189ab07cdd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -805,7 +805,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
805{ 805{
806 struct amdgpu_device *adev = dev->dev_private; 806 struct amdgpu_device *adev = dev->dev_private;
807 struct amdgpu_fpriv *fpriv; 807 struct amdgpu_fpriv *fpriv;
808 int r; 808 int r, pasid;
809 809
810 file_priv->driver_priv = NULL; 810 file_priv->driver_priv = NULL;
811 811
@@ -819,28 +819,25 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
819 goto out_suspend; 819 goto out_suspend;
820 } 820 }
821 821
822 r = amdgpu_vm_init(adev, &fpriv->vm, 822 pasid = amdgpu_pasid_alloc(16);
823 AMDGPU_VM_CONTEXT_GFX, 0); 823 if (pasid < 0) {
824 if (r) { 824 dev_warn(adev->dev, "No more PASIDs available!");
825 kfree(fpriv); 825 pasid = 0;
826 goto out_suspend;
827 } 826 }
827 r = amdgpu_vm_init(adev, &fpriv->vm, AMDGPU_VM_CONTEXT_GFX, pasid);
828 if (r)
829 goto error_pasid;
828 830
829 fpriv->prt_va = amdgpu_vm_bo_add(adev, &fpriv->vm, NULL); 831 fpriv->prt_va = amdgpu_vm_bo_add(adev, &fpriv->vm, NULL);
830 if (!fpriv->prt_va) { 832 if (!fpriv->prt_va) {
831 r = -ENOMEM; 833 r = -ENOMEM;
832 amdgpu_vm_fini(adev, &fpriv->vm); 834 goto error_vm;
833 kfree(fpriv);
834 goto out_suspend;
835 } 835 }
836 836
837 if (amdgpu_sriov_vf(adev)) { 837 if (amdgpu_sriov_vf(adev)) {
838 r = amdgpu_map_static_csa(adev, &fpriv->vm, &fpriv->csa_va); 838 r = amdgpu_map_static_csa(adev, &fpriv->vm, &fpriv->csa_va);
839 if (r) { 839 if (r)
840 amdgpu_vm_fini(adev, &fpriv->vm); 840 goto error_vm;
841 kfree(fpriv);
842 goto out_suspend;
843 }
844 } 841 }
845 842
846 mutex_init(&fpriv->bo_list_lock); 843 mutex_init(&fpriv->bo_list_lock);
@@ -849,6 +846,16 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
849 amdgpu_ctx_mgr_init(&fpriv->ctx_mgr); 846 amdgpu_ctx_mgr_init(&fpriv->ctx_mgr);
850 847
851 file_priv->driver_priv = fpriv; 848 file_priv->driver_priv = fpriv;
849 goto out_suspend;
850
851error_vm:
852 amdgpu_vm_fini(adev, &fpriv->vm);
853
854error_pasid:
855 if (pasid)
856 amdgpu_pasid_free(pasid);
857
858 kfree(fpriv);
852 859
853out_suspend: 860out_suspend:
854 pm_runtime_mark_last_busy(dev->dev); 861 pm_runtime_mark_last_busy(dev->dev);
@@ -871,6 +878,8 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
871 struct amdgpu_device *adev = dev->dev_private; 878 struct amdgpu_device *adev = dev->dev_private;
872 struct amdgpu_fpriv *fpriv = file_priv->driver_priv; 879 struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
873 struct amdgpu_bo_list *list; 880 struct amdgpu_bo_list *list;
881 struct amdgpu_bo *pd;
882 unsigned int pasid;
874 int handle; 883 int handle;
875 884
876 if (!fpriv) 885 if (!fpriv)
@@ -895,7 +904,13 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
895 amdgpu_bo_unreserve(adev->virt.csa_obj); 904 amdgpu_bo_unreserve(adev->virt.csa_obj);
896 } 905 }
897 906
907 pasid = fpriv->vm.pasid;
908 pd = amdgpu_bo_ref(fpriv->vm.root.base.bo);
909
898 amdgpu_vm_fini(adev, &fpriv->vm); 910 amdgpu_vm_fini(adev, &fpriv->vm);
911 if (pasid)
912 amdgpu_pasid_free_delayed(pd->tbo.resv, pasid);
913 amdgpu_bo_unref(&pd);
899 914
900 idr_for_each_entry(&fpriv->bo_list_handles, list, handle) 915 idr_for_each_entry(&fpriv->bo_list_handles, list, handle)
901 amdgpu_bo_list_free(list); 916 amdgpu_bo_list_free(list);