aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3814-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3814-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3814-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch127
1 files changed, 127 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3814-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3814-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch
new file mode 100644
index 00000000..67e9c42e
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3814-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch
@@ -0,0 +1,127 @@
+From 3534633c662a355455085b75a7117c9cbcefc7a6 Mon Sep 17 00:00:00 2001
+From: Oak Zeng <Oak.Zeng@amd.com>
+Date: Wed, 29 Aug 2018 12:33:52 -0500
+Subject: [PATCH 3814/4256] drm/amdgpu: Set pasid for compute vm (v2)
+
+To make a amdgpu vm to a compute vm, the old pasid will be freed and
+replaced with a pasid managed by kfd. Kfd can't reuse original pasid
+allocated by amdgpu because kfd uses different pasid policy with amdgpu.
+For example, all graphic devices share one same pasid in a process.
+
+v2: rebase (Alex)
+
+Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 40 +++++++++++++++++--
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 +-
+ 3 files changed, 38 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index 8288cd965f8e..92af06fa011a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -1059,7 +1059,7 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
+ return -EINVAL;
+
+ /* Convert VM into a compute VM */
+- ret = amdgpu_vm_make_compute(adev, avm);
++ ret = amdgpu_vm_make_compute(adev, avm, pasid);
+ if (ret)
+ return ret;
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+index 26ca609c1c20..05c6ef31bb06 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -2830,7 +2830,7 @@ static int amdgpu_vm_check_clean_reserved(struct amdgpu_device *adev,
+ * Returns:
+ * 0 for success, -errno for errors.
+ */
+-int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
++int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned int pasid)
+ {
+ bool pte_support_ats = (adev->asic_type == CHIP_RAVEN);
+ int r;
+@@ -2842,7 +2842,21 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
+ /* Sanity checks */
+ r = amdgpu_vm_check_clean_reserved(adev, vm);
+ if (r)
+- goto error;
++ goto unreserve_bo;
++
++ if (pasid) {
++ unsigned long flags;
++
++ spin_lock_irqsave(&adev->vm_manager.pasid_lock, flags);
++ r = idr_alloc(&adev->vm_manager.pasid_idr, vm, pasid, pasid + 1,
++ GFP_ATOMIC);
++ spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
++
++ if (r == -ENOSPC)
++ goto unreserve_bo;
++ r = 0;
++ }
++
+
+ /* Check if PD needs to be reinitialized and do it before
+ * changing any other state, in case it fails.
+@@ -2851,7 +2865,7 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
+ vm->pte_support_ats = pte_support_ats;
+ r = amdgpu_vm_clear_bo(adev, vm, vm->root.base.bo, false);
+ if (r)
+- goto error;
++ goto free_idr;
+ }
+
+ /* Update VM state */
+@@ -2876,12 +2890,30 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
+ idr_remove(&adev->vm_manager.pasid_idr, vm->pasid);
+ spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
+
++ /* Free the original amdgpu allocated pasid
++ * Will be replaced with kfd allocated pasid
++ */
++ amdgpu_pasid_free(vm->pasid);
+ vm->pasid = 0;
+ }
+
+ /* Free the shadow bo for compute VM */
+ amdgpu_bo_unref(&vm->root.base.bo->shadow);
+-error:
++
++ if (pasid)
++ vm->pasid = pasid;
++
++ goto unreserve_bo;
++
++free_idr:
++ if (pasid) {
++ unsigned long flags;
++
++ spin_lock_irqsave(&adev->vm_manager.pasid_lock, flags);
++ idr_remove(&adev->vm_manager.pasid_idr, pasid);
++ spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
++ }
++unreserve_bo:
+ amdgpu_bo_unreserve(vm->root.base.bo);
+ return r;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+index 0593978812ce..4dbbe1b6b413 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+@@ -355,7 +355,7 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev);
+ long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout);
+ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ int vm_context, unsigned int pasid);
+-int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm);
++int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned int pasid);
+ void amdgpu_vm_release_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm);
+ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm);
+ void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm,
+--
+2.17.1
+