diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2939-drm-amdgpu-remove-last_entry_used-from-the-VM-code.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2939-drm-amdgpu-remove-last_entry_used-from-the-VM-code.patch | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2939-drm-amdgpu-remove-last_entry_used-from-the-VM-code.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2939-drm-amdgpu-remove-last_entry_used-from-the-VM-code.patch new file mode 100644 index 00000000..ae1ced91 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2939-drm-amdgpu-remove-last_entry_used-from-the-VM-code.patch @@ -0,0 +1,160 @@ +From 027911abb0c20e412bb0937d52d6d81d40ac7524 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Thu, 30 Nov 2017 15:28:03 +0100 +Subject: [PATCH 2939/4131] drm/amdgpu: remove last_entry_used from the VM code +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Not needed any more. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Chunming Zhou <david1.zhou@amd.com> + + Conflicts: + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c + +Change-Id: If5341a8ac4bc643fd1470892db0e252a4e4c5993 +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 54 +++++++++++++++++++--------------- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 - + 2 files changed, 30 insertions(+), 25 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 3997b08..733caae 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -338,9 +338,6 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev, + to >= amdgpu_vm_num_entries(adev, level)) + return -EINVAL; + +- if (to > parent->last_entry_used) +- parent->last_entry_used = to; +- + ++level; + saddr = saddr & ((1 << shift) - 1); + eaddr = eaddr & ((1 << shift) - 1); +@@ -1193,16 +1190,19 @@ static int amdgpu_vm_update_pde(struct amdgpu_device *adev, + * + * Mark all PD level as invalid after an error. + */ +-static void amdgpu_vm_invalidate_level(struct amdgpu_vm *vm, +- struct amdgpu_vm_pt *parent) ++static void amdgpu_vm_invalidate_level(struct amdgpu_device *adev, ++ struct amdgpu_vm *vm, ++ struct amdgpu_vm_pt *parent, ++ unsigned level) + { +- unsigned pt_idx; ++ unsigned pt_idx, num_entries; + + /* + * Recurse into the subdirectories. This recursion is harmless because + * we only have a maximum of 5 layers. + */ +- for (pt_idx = 0; pt_idx <= parent->last_entry_used; ++pt_idx) { ++ num_entries = amdgpu_vm_num_entries(adev, level); ++ for (pt_idx = 0; pt_idx < num_entries; ++pt_idx) { + struct amdgpu_vm_pt *entry = &parent->entries[pt_idx]; + + if (!entry->base.bo) +@@ -1213,7 +1213,7 @@ static void amdgpu_vm_invalidate_level(struct amdgpu_vm *vm, + if (list_empty(&entry->base.vm_status)) + list_add(&entry->base.vm_status, &vm->relocated); + spin_unlock(&vm->status_lock); +- amdgpu_vm_invalidate_level(vm, entry); ++ amdgpu_vm_invalidate_level(adev, vm, entry, level + 1); + } + } + +@@ -1255,7 +1255,8 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev, + + r = amdgpu_vm_update_pde(adev, vm, pt, entry); + if (r) { +- amdgpu_vm_invalidate_level(vm, &vm->root); ++ amdgpu_vm_invalidate_level(adev, vm, ++ &vm->root, 0); + return r; + } + spin_lock(&vm->status_lock); +@@ -1658,7 +1659,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, + + error_free: + amdgpu_job_free(job); +- amdgpu_vm_invalidate_level(vm, &vm->root); ++ amdgpu_vm_invalidate_level(adev, vm, &vm->root, 0); + return r; + } + +@@ -2767,29 +2768,34 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, + /** + * amdgpu_vm_free_levels - free PD/PT levels + * +- * @level: PD/PT starting level to free ++ * @adev: amdgpu device structure ++ * @parent: PD/PT starting level to free ++ * @level: level of parent structure + * + * Free the page directory or page table level and all sub levels. + */ +-static void amdgpu_vm_free_levels(struct amdgpu_vm_pt *level) ++static void amdgpu_vm_free_levels(struct amdgpu_device *adev, ++ struct amdgpu_vm_pt *parent, ++ unsigned level) + { +- unsigned i; ++ unsigned i, num_entries = amdgpu_vm_num_entries(adev, level); + +- if (level->base.bo) { +- list_del(&level->base.bo_list); +- list_del(&level->base.vm_status); +- amdgpu_bo_unref(&level->base.bo->shadow); +- amdgpu_bo_unref(&level->base.bo); ++ if (parent->base.bo) { ++ list_del(&parent->base.bo_list); ++ list_del(&parent->base.vm_status); ++ amdgpu_bo_unref(&parent->base.bo->shadow); ++ amdgpu_bo_unref(&parent->base.bo); + } + +- if (level->entries) +- for (i = 0; i <= level->last_entry_used; i++) +- amdgpu_vm_free_levels(&level->entries[i]); ++ if (parent->entries) ++ for (i = 0; i < num_entries; i++) ++ amdgpu_vm_free_levels(adev, &parent->entries[i], ++ level + 1); + + #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) +- drm_free_large(level->entries); ++ drm_free_large(parent->entries); + #else +- kvfree(level->entries); ++ kvfree(parent->entries); + #endif + } + +@@ -2865,7 +2871,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) + if (r) { + dev_err(adev->dev, "Leaking page tables because BO reservation failed\n"); + } else { +- amdgpu_vm_free_levels(&vm->root); ++ amdgpu_vm_free_levels(adev, &vm->root, 0); + amdgpu_bo_unreserve(root); + } + amdgpu_bo_unref(&root); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +index b25b95c..6653278 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +@@ -146,7 +146,6 @@ struct amdgpu_vm_pt { + + /* array of page tables, one for each directory entry */ + struct amdgpu_vm_pt *entries; +- unsigned last_entry_used; + }; + + #define AMDGPU_VM_FAULT(pasid, addr) (((u64)(pasid) << 48) | (addr)) +-- +2.7.4 + |