diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4193-drm-amdgpu-always-allocate-a-PASIDs-for-each-VM-v2.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4193-drm-amdgpu-always-allocate-a-PASIDs-for-each-VM-v2.patch | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4193-drm-amdgpu-always-allocate-a-PASIDs-for-each-VM-v2.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4193-drm-amdgpu-always-allocate-a-PASIDs-for-each-VM-v2.patch new file mode 100644 index 00000000..92f9b303 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4193-drm-amdgpu-always-allocate-a-PASIDs-for-each-VM-v2.patch @@ -0,0 +1,119 @@ +From fd7dbf22505881b9b994ac984dc888698e42479a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Fri, 5 Jan 2018 14:17:08 +0100 +Subject: [PATCH 4193/5725] drm/amdgpu: always allocate a PASIDs for each VM v2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Start to always allocate a pasid for each VM. + +v2: use dev_warn when we run out of PASIDs + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Chunming Zhou <david1.zhou@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> + +Conflicts: + drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c + +Change-Id: Ibf02af359ed52d625677b45b98e174ea3e566aef +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 43 ++++++++++++++++++++++----------- + 1 file 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 a57cc20..efbed62 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +@@ -875,7 +875,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) + { + struct amdgpu_device *adev = dev->dev_private; + struct amdgpu_fpriv *fpriv; +- int r; ++ int r, pasid; + + file_priv->driver_priv = NULL; + +@@ -889,28 +889,25 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) + goto out_suspend; + } + +- r = amdgpu_vm_init(adev, &fpriv->vm, +- AMDGPU_VM_CONTEXT_GFX, 0); +- if (r) { +- kfree(fpriv); +- goto out_suspend; ++ pasid = amdgpu_pasid_alloc(16); ++ if (pasid < 0) { ++ dev_warn(adev->dev, "No more PASIDs available!"); ++ pasid = 0; + } ++ r = amdgpu_vm_init(adev, &fpriv->vm, AMDGPU_VM_CONTEXT_GFX, pasid); ++ if (r) ++ goto error_pasid; + + fpriv->prt_va = amdgpu_vm_bo_add(adev, &fpriv->vm, NULL); + if (!fpriv->prt_va) { + r = -ENOMEM; +- amdgpu_vm_fini(adev, &fpriv->vm); +- kfree(fpriv); +- goto out_suspend; ++ goto error_vm; + } + + if (amdgpu_sriov_vf(adev)) { + r = amdgpu_map_static_csa(adev, &fpriv->vm, &fpriv->csa_va); +- if (r) { +- amdgpu_vm_fini(adev, &fpriv->vm); +- kfree(fpriv); +- goto out_suspend; +- } ++ if (r) ++ goto error_vm; + } + + mutex_init(&fpriv->bo_list_lock); +@@ -921,6 +918,16 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) + amdgpu_ctx_mgr_init(&fpriv->ctx_mgr); + + file_priv->driver_priv = fpriv; ++ goto out_suspend; ++ ++error_vm: ++ amdgpu_vm_fini(adev, &fpriv->vm); ++ ++error_pasid: ++ if (pasid) ++ amdgpu_pasid_free(pasid); ++ ++ kfree(fpriv); + + out_suspend: + pm_runtime_mark_last_busy(dev->dev); +@@ -944,6 +951,8 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev, + struct amdgpu_fpriv *fpriv = file_priv->driver_priv; + struct amdgpu_bo_list *list; + struct amdgpu_sem *sem; ++ struct amdgpu_bo *pd; ++ unsigned int pasid; + int handle; + + if (!fpriv) +@@ -968,7 +977,13 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev, + amdgpu_bo_unreserve(adev->virt.csa_obj); + } + ++ pasid = fpriv->vm.pasid; ++ pd = amdgpu_bo_ref(fpriv->vm.root.base.bo); ++ + amdgpu_vm_fini(adev, &fpriv->vm); ++ if (pasid) ++ amdgpu_pasid_free_delayed(pd->tbo.resv, pasid); ++ amdgpu_bo_unref(&pd); + + idr_for_each_entry(&fpriv->bo_list_handles, list, handle) + amdgpu_bo_list_free(list); +-- +2.7.4 + |