aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch212
1 files changed, 212 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch
new file mode 100644
index 00000000..5f462695
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch
@@ -0,0 +1,212 @@
+From c7f6d5bc8e6e31660db22c165109a1e378f867a5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Wed, 16 Aug 2017 11:13:48 +0200
+Subject: [PATCH 0868/4131] drm/amdgpu: add support for per VM BOs v2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Per VM BOs are handled like VM PDs and PTs. They are always valid and don't
+need to be specified in the BO lists.
+
+v2: validate PDs/PTs first
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 79 ++++++++++++++++++++++++----------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 5 ++-
+ 3 files changed, 60 insertions(+), 26 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index a2f7a70..ac0826c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -826,7 +826,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+
+ }
+
+- r = amdgpu_vm_clear_moved(adev, vm, &p->job->sync);
++ r = amdgpu_vm_handle_moved(adev, vm, &p->job->sync);
+
+ if (amdgpu_vm_debug && p->bo_list) {
+ /* Invalidate all BOs to test for userspace bugs */
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+index 64d0123..e73fd988 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -189,14 +189,18 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ spin_unlock(&glob->lru_lock);
+ }
+
+- if (vm->use_cpu_for_update) {
++ if (bo->tbo.type == ttm_bo_type_kernel &&
++ vm->use_cpu_for_update) {
+ r = amdgpu_bo_kmap(bo, NULL);
+ if (r)
+ return r;
+ }
+
+ spin_lock(&vm->status_lock);
+- list_move(&bo_base->vm_status, &vm->relocated);
++ if (bo->tbo.type != ttm_bo_type_kernel)
++ list_move(&bo_base->vm_status, &vm->moved);
++ else
++ list_move(&bo_base->vm_status, &vm->relocated);
+ }
+ spin_unlock(&vm->status_lock);
+
+@@ -2002,20 +2006,23 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
+ }
+
+ /**
+- * amdgpu_vm_clear_moved - clear moved BOs in the PT
++ * amdgpu_vm_handle_moved - handle moved BOs in the PT
+ *
+ * @adev: amdgpu_device pointer
+ * @vm: requested vm
++ * @sync: sync object to add fences to
+ *
+- * Make sure all moved BOs are cleared in the PT.
++ * Make sure all BOs which are moved are updated in the PTs.
+ * Returns 0 for success.
+ *
+- * PTs have to be reserved and mutex must be locked!
++ * PTs have to be reserved!
+ */
+-int amdgpu_vm_clear_moved(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+- struct amdgpu_sync *sync)
++int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
++ struct amdgpu_vm *vm,
++ struct amdgpu_sync *sync)
+ {
+ struct amdgpu_bo_va *bo_va = NULL;
++ bool clear;
+ int r = 0;
+
+ spin_lock(&vm->status_lock);
+@@ -2024,7 +2031,10 @@ int amdgpu_vm_clear_moved(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ struct amdgpu_bo_va, base.vm_status);
+ spin_unlock(&vm->status_lock);
+
+- r = amdgpu_vm_bo_update(adev, bo_va, true);
++ /* Per VM BOs never need to bo cleared in the page tables */
++ clear = bo_va->base.bo->tbo.resv != vm->root.base.bo->tbo.resv;
++
++ r = amdgpu_vm_bo_update(adev, bo_va, clear);
+ if (r)
+ return r;
+
+@@ -2076,6 +2086,37 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,
+ return bo_va;
+ }
+
++
++/**
++ * amdgpu_vm_bo_insert_mapping - insert a new mapping
++ *
++ * @adev: amdgpu_device pointer
++ * @bo_va: bo_va to store the address
++ * @mapping: the mapping to insert
++ *
++ * Insert a new mapping into all structures.
++ */
++static void amdgpu_vm_bo_insert_map(struct amdgpu_device *adev,
++ struct amdgpu_bo_va *bo_va,
++ struct amdgpu_bo_va_mapping *mapping)
++{
++ struct amdgpu_vm *vm = bo_va->base.vm;
++ struct amdgpu_bo *bo = bo_va->base.bo;
++
++ list_add(&mapping->list, &bo_va->invalids);
++ amdgpu_vm_it_insert(mapping, &vm->va);
++
++ if (mapping->flags & AMDGPU_PTE_PRT)
++ amdgpu_vm_prt_get(adev);
++
++ if (bo && bo->tbo.resv == vm->root.base.bo->tbo.resv) {
++ spin_lock(&vm->status_lock);
++ list_move(&bo_va->base.vm_status, &vm->moved);
++ spin_unlock(&vm->status_lock);
++ }
++ trace_amdgpu_vm_bo_map(bo_va, mapping);
++}
++
+ /**
+ * amdgpu_vm_bo_map - map bo inside a vm
+ *
+@@ -2127,18 +2168,12 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
+ if (!mapping)
+ return -ENOMEM;
+
+- INIT_LIST_HEAD(&mapping->list);
+ mapping->start = saddr;
+ mapping->last = eaddr;
+ mapping->offset = offset;
+ mapping->flags = flags;
+
+- list_add(&mapping->list, &bo_va->invalids);
+- amdgpu_vm_it_insert(mapping, &vm->va);
+-
+- if (flags & AMDGPU_PTE_PRT)
+- amdgpu_vm_prt_get(adev);
+- trace_amdgpu_vm_bo_map(bo_va, mapping);
++ amdgpu_vm_bo_insert_map(adev, bo_va, mapping);
+
+ return 0;
+ }
+@@ -2165,7 +2200,6 @@ int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev,
+ {
+ struct amdgpu_bo_va_mapping *mapping;
+ struct amdgpu_bo *bo = bo_va->base.bo;
+- struct amdgpu_vm *vm = bo_va->base.vm;
+ uint64_t eaddr;
+ int r;
+
+@@ -2199,12 +2233,7 @@ int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev,
+ mapping->offset = offset;
+ mapping->flags = flags;
+
+- list_add(&mapping->list, &bo_va->invalids);
+- amdgpu_vm_it_insert(mapping, &vm->va);
+-
+- if (flags & AMDGPU_PTE_PRT)
+- amdgpu_vm_prt_get(adev);
+- trace_amdgpu_vm_bo_map(bo_va, mapping);
++ amdgpu_vm_bo_insert_map(adev, bo_va, mapping);
+
+ return 0;
+ }
+@@ -2419,7 +2448,11 @@ void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev,
+ bo_base->moved = true;
+ if (evicted && bo->tbo.resv == vm->root.base.bo->tbo.resv) {
+ spin_lock(&bo_base->vm->status_lock);
+- list_move(&bo_base->vm_status, &vm->evicted);
++ if (bo->tbo.type == ttm_bo_type_kernel)
++ list_move(&bo_base->vm_status, &vm->evicted);
++ else
++ list_move_tail(&bo_base->vm_status,
++ &vm->evicted);
+ spin_unlock(&bo_base->vm->status_lock);
+ continue;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+index 427a8c7..03fdf9b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+@@ -249,8 +249,9 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev,
+ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
+ struct amdgpu_vm *vm,
+ struct dma_fence **fence);
+-int amdgpu_vm_clear_moved(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+- struct amdgpu_sync *sync);
++int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
++ struct amdgpu_vm *vm,
++ struct amdgpu_sync *sync);
+ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
+ struct amdgpu_bo_va *bo_va,
+ bool clear);
+--
+2.7.4
+