diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 43 |
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 | |||
851 | error_vm: | ||
852 | amdgpu_vm_fini(adev, &fpriv->vm); | ||
853 | |||
854 | error_pasid: | ||
855 | if (pasid) | ||
856 | amdgpu_pasid_free(pasid); | ||
857 | |||
858 | kfree(fpriv); | ||
852 | 859 | ||
853 | out_suspend: | 860 | out_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); |