diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1861-drm-amdgpu-Fix-VM-clean-check-method.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1861-drm-amdgpu-Fix-VM-clean-check-method.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1861-drm-amdgpu-Fix-VM-clean-check-method.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1861-drm-amdgpu-Fix-VM-clean-check-method.patch new file mode 100644 index 00000000..1025e427 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1861-drm-amdgpu-Fix-VM-clean-check-method.patch @@ -0,0 +1,77 @@ +From 95d639351f2b4379d3fb39b00ab97ea0a92a9549 Mon Sep 17 00:00:00 2001 +From: Trigger Huang <Trigger.Huang@amd.com> +Date: Tue, 30 Apr 2019 22:00:31 +0800 +Subject: [PATCH 1861/2940] drm/amdgpu: Fix VM clean check method +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +amdgpu_vm_make_compute is used to turn a GFX VM into a compute VM, +the prerequisite is this VM is clean. Let's check if some page tables +are already filled , while not check if some mapping is already made. + +Signed-off-by: Trigger Huang <Trigger.Huang@amd.com> +Reviewed-by: Christian König <christian.koenig@amd.com> +Signed-off-by: Chaudhary Amit Kumar <Chaudharyamit.Kumar@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 36 +++++++++++++++++++++++--- + 1 file changed, 33 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 776ba87ac779..2ca2dbaf7e3a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -2725,6 +2725,37 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, + return r; + } + ++/** ++ * amdgpu_vm_check_clean_reserved - check if a VM is clean ++ * ++ * @adev: amdgpu_device pointer ++ * @vm: the VM to check ++ * ++ * check all entries of the root PD, if any subsequent PDs are allocated, ++ * it means there are page table creating and filling, and is no a clean ++ * VM ++ * ++ * Returns: ++ * 0 if this VM is clean ++ */ ++static int amdgpu_vm_check_clean_reserved(struct amdgpu_device *adev, ++ struct amdgpu_vm *vm) ++{ ++ enum amdgpu_vm_level root = adev->vm_manager.root_level; ++ unsigned int entries = amdgpu_vm_num_entries(adev, root); ++ unsigned int i = 0; ++ ++ if (!(vm->root.entries)) ++ return 0; ++ ++ for (i = 0; i < entries; i++) { ++ if (vm->root.entries[i].base.bo) ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ + /** + * amdgpu_vm_make_compute - Turn a GFX VM into a compute VM + * +@@ -2756,10 +2787,9 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm) + return r; + + /* Sanity checks */ +- if (!RB_EMPTY_ROOT(&vm->va.rb_root) || vm->root.entries) { +- r = -EINVAL; ++ r = amdgpu_vm_check_clean_reserved(adev, vm); ++ if (r) + goto error; +- } + + /* Check if PD needs to be reinitialized and do it before + * changing any other state, in case it fails. +-- +2.17.1 + |