diff options
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch')
-rw-r--r-- | meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0868-drm-amdgpu-add-support-for-per-VM-BOs-v2.patch b/meta-v1000/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-v1000/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 + |