diff options
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch')
-rw-r--r-- | meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0919-drm-amdgpu-rework-amdgpu_cs_find_mapping.patch b/meta-v1000/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-v1000/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 + |