aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2939-drm-amdgpu-remove-last_entry_used-from-the-VM-code.patch
diff options
context:
space:
mode:
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.patch160
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
+