aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5247-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5247-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5247-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch215
1 files changed, 215 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5247-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5247-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch
new file mode 100644
index 00000000..b37d8e29
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5247-drm-amdgpu-Set-pasid-for-compute-vm-v2.patch
@@ -0,0 +1,215 @@
+From 7eeed48a4d8bf8209279e843748e950a4b12a6ef 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 5247/5725] 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)
+
+Change-Id: I39a27154841cf46b47c4c62d04617bfed6b2fd3e
+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>
+Signed-off-by: Raveendra Talabattula <raveendra.talabattula@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 8 ++---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 10 +++----
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 38 +++++++++++++++++++++---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 +-
+ drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4 +--
+ drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 4 +--
+ 6 files changed, 48 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index cb0588d..23ac8a6 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -168,11 +168,11 @@ uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd);
+ })
+
+ /* GPUVM API */
+-int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm,
+- void **process_info,
+- struct dma_fence **ef);
++int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, unsigned int pasid,
++ void **vm, void **process_info,
++ struct dma_fence **ef);
+ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
+- struct file *filp,
++ struct file *filp, unsigned int pasid,
+ void **vm, void **process_info,
+ struct dma_fence **ef);
+ void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index 02d9ae7d2..0b73606 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -1048,8 +1048,8 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info,
+ return ret;
+ }
+
+-int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm,
+- void **process_info,
++int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, unsigned int pasid,
++ void **vm, void **process_info,
+ struct dma_fence **ef)
+ {
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+@@ -1061,7 +1061,7 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm,
+ return -ENOMEM;
+
+ /* Initialize AMDGPU part of the VM */
+- ret = amdgpu_vm_init(adev, new_vm, AMDGPU_VM_CONTEXT_COMPUTE, 0);
++ ret = amdgpu_vm_init(adev, new_vm, AMDGPU_VM_CONTEXT_COMPUTE, pasid);
+ if (ret) {
+ pr_err("Failed init vm ret %d\n", ret);
+ goto amdgpu_vm_init_fail;
+@@ -1084,7 +1084,7 @@ int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm,
+ }
+
+ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
+- struct file *filp,
++ struct file *filp, unsigned int pasid,
+ void **vm, void **process_info,
+ struct dma_fence **ef)
+ {
+@@ -1099,7 +1099,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 99ef1e9..66436e8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -2765,7 +2765,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ * 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;
+@@ -2777,7 +2777,20 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
+ /* Sanity checks */
+ if (!RB_EMPTY_ROOT(&vm->va.rb_root) || vm->root.entries) {
+ r = -EINVAL;
+- 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
+@@ -2788,7 +2801,7 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
+ adev->vm_manager.root_level,
+ pte_support_ats);
+ if (r)
+- goto error;
++ goto free_idr;
+ }
+
+ /* Update VM state */
+@@ -2807,13 +2820,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 fd8da1d..58ed2d9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+@@ -295,7 +295,7 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev);
+ void amdgpu_vm_manager_fini(struct amdgpu_device *adev);
+ 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_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm);
+ bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev,
+ unsigned int pasid);
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+index 735c96a..da67302 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+@@ -727,11 +727,11 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
+
+ if (drm_file)
+ ret = dev->kfd2kgd->acquire_process_vm(
+- dev->kgd, drm_file,
++ dev->kgd, drm_file, p->pasid,
+ &pdd->vm, &p->kgd_process_info, &p->ef);
+ else
+ ret = dev->kfd2kgd->create_process_vm(
+- dev->kgd, &pdd->vm, &p->kgd_process_info, &p->ef);
++ dev->kgd, p->pasid, &pdd->vm, &p->kgd_process_info, &p->ef);
+ if (ret) {
+ pr_err("Failed to create process VM object\n");
+ return ret;
+diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+index e81fdbc..da7c6f5 100644
+--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+@@ -267,10 +267,10 @@ struct kfd2kgd_calls {
+
+ uint32_t (*get_max_engine_clock_in_mhz)(struct kgd_dev *kgd);
+
+- int (*create_process_vm)(struct kgd_dev *kgd, void **vm,
++ int (*create_process_vm)(struct kgd_dev *kgd, unsigned int pasid, void **vm,
+ void **process_info, struct dma_fence **ef);
+ int (*acquire_process_vm)(struct kgd_dev *kgd, struct file *filp,
+- void **vm, void **process_info,
++ unsigned int pasid, void **vm, void **process_info,
+ struct dma_fence **ef);
+ void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
+
+--
+2.7.4
+