aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch171
1 files changed, 171 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch
new file mode 100644
index 00000000..38d7481f
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch
@@ -0,0 +1,171 @@
+From 2f4f497c39529ae8b3737ccb650d22e7663c2302 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Wed, 6 Sep 2017 16:55:16 +0200
+Subject: [PATCH 0919/4131] drm/amdgpu: rework amdgpu_cs_find_mapping
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Use the VM instead of the BO list to find the BO for a virtual address.
+
+This fixes UVD/VCE in physical mode with VM local BOs.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Acked-by: Leo Liu <leo.liu@amd.com>
+
+ Conflicts:
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+
+Change-Id: I009dc1b89b32962f2fcdc4c9c6a3b93fc85a584c
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 42 +++++++-----------------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 17 ++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 ++
+ 4 files changed, 30 insertions(+), 32 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index b6e536a..1794324 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -1492,46 +1492,24 @@ int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
+ uint64_t addr, struct amdgpu_bo **bo,
+ struct amdgpu_bo_va_mapping **map)
+ {
++ struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
++ struct amdgpu_vm *vm = &fpriv->vm;
+ struct amdgpu_bo_va_mapping *mapping;
+- unsigned i;
+ int r;
+
+- if (!parser->bo_list)
+- return 0;
+-
+ addr /= AMDGPU_GPU_PAGE_SIZE;
+
+- for (i = 0; i < parser->bo_list->num_entries; i++) {
+- struct amdgpu_bo_list_entry *lobj;
+-
+- lobj = &parser->bo_list->array[i];
+- if (!lobj->bo_va || amdgpu_ttm_adev(lobj->bo_va->base.bo->tbo.bdev) != parser->adev)
+- continue;
+-
+- list_for_each_entry(mapping, &lobj->bo_va->valids, list) {
+- if (mapping->start > addr ||
+- addr > mapping->last)
+- continue;
+-
+- *bo = lobj->bo_va->base.bo;
+- *map = mapping;
+- goto found;
+- }
+-
+- list_for_each_entry(mapping, &lobj->bo_va->invalids, list) {
+- if (mapping->start > addr ||
+- addr > mapping->last)
+- continue;
++ mapping = amdgpu_vm_bo_lookup_mapping(vm, addr);
++ if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
++ return -EINVAL;
+
+- *bo = lobj->bo_va->base.bo;
+- *map = mapping;
+- goto found;
+- }
+- }
++ *bo = mapping->bo_va->base.bo;
++ *map = mapping;
+
+- return -EINVAL;
++ /* Double check that the BO is reserved by this CS */
++ if (READ_ONCE((*bo)->tbo.resv->lock.ctx) != &parser->ticket)
++ return -EINVAL;
+
+-found:
+ r = amdgpu_ttm_bind(&(*bo)->tbo, &(*bo)->tbo.mem);
+ if (unlikely(r))
+ return r;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+index 62132ca..6d27585 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+@@ -35,6 +35,7 @@
+
+ /* bo virtual addresses in a vm */
+ struct amdgpu_bo_va_mapping {
++ struct amdgpu_bo_va *bo_va;
+ struct list_head list;
+ struct rb_node rb;
+ uint64_t start;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+index efa8136..0b62a33 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -2103,6 +2103,7 @@ static void amdgpu_vm_bo_insert_map(struct amdgpu_device *adev,
+ struct amdgpu_vm *vm = bo_va->base.vm;
+ struct amdgpu_bo *bo = bo_va->base.bo;
+
++ mapping->bo_va = bo_va;
+ list_add(&mapping->list, &bo_va->invalids);
+ amdgpu_vm_it_insert(mapping, &vm->va);
+
+@@ -2280,6 +2281,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
+
+ list_del(&mapping->list);
+ amdgpu_vm_it_remove(mapping, &vm->va);
++ mapping->bo_va = NULL;
+ trace_amdgpu_vm_bo_unmap(bo_va, mapping);
+
+ if (valid)
+@@ -2365,6 +2367,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
+ if (tmp->last > eaddr)
+ tmp->last = eaddr;
+
++ tmp->bo_va = NULL;
+ list_add(&tmp->list, &vm->freed);
+ trace_amdgpu_vm_bo_unmap(NULL, tmp);
+ }
+@@ -2391,6 +2394,19 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
+ }
+
+ /**
++ * amdgpu_vm_bo_lookup_mapping - find mapping by address
++ *
++ * @vm: the requested VM
++ *
++ * Find a mapping by it's address.
++ */
++struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
++ uint64_t addr)
++{
++ return amdgpu_vm_it_iter_first(&vm->va, addr, addr);
++}
++
++/**
+ * amdgpu_vm_bo_rmv - remove a bo to a specific vm
+ *
+ * @adev: amdgpu_device pointer
+@@ -2415,6 +2431,7 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
+ list_for_each_entry_safe(mapping, next, &bo_va->valids, list) {
+ list_del(&mapping->list);
+ amdgpu_vm_it_remove(mapping, &vm->va);
++ mapping->bo_va = NULL;
+ trace_amdgpu_vm_bo_unmap(bo_va, mapping);
+ list_add(&mapping->list, &vm->freed);
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+index 03fdf9b..862b846 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+@@ -276,6 +276,8 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
+ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
+ struct amdgpu_vm *vm,
+ uint64_t saddr, uint64_t size);
++struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
++ uint64_t addr);
+ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
+ struct amdgpu_bo_va *bo_va);
+ void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev,
+--
+2.7.4
+