diff options
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.patch | 215 |
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 + |