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