diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0031-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0031-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0031-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch b/common/recipes-kernel/linux/files/0031-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch new file mode 100644 index 00000000..4f646fee --- /dev/null +++ b/common/recipes-kernel/linux/files/0031-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch @@ -0,0 +1,190 @@ +From e80b9ea2005233764ff7bac3ed1ef49732bdaa05 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Fri, 11 Dec 2015 15:16:32 +0100 +Subject: [PATCH 0031/1110] drm/amdgpu: split VM PD and PT handling during CS +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This way we avoid the extra allocation for the page directory entry. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 6 +++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 9 ++++++-- + drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 16 +++++++++----- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 39 ++++++++++++++++++++++++--------- + 4 files changed, 52 insertions(+), 18 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 1447a5e..638b089 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -986,6 +986,11 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev, + struct amdgpu_vm *vm, + struct list_head *validated, + struct list_head *duplicates); ++void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, ++ struct list_head *validated, ++ struct amdgpu_bo_list_entry *entry); ++struct amdgpu_bo_list_entry *amdgpu_vm_get_pt_bos(struct amdgpu_vm *vm, ++ struct list_head *duplicates); + int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, + struct amdgpu_sync *sync); + void amdgpu_vm_flush(struct amdgpu_ring *ring, +@@ -1255,6 +1260,7 @@ struct amdgpu_cs_parser { + unsigned nchunks; + struct amdgpu_cs_chunk *chunks; + /* relocations */ ++ struct amdgpu_bo_list_entry vm_pd; + struct amdgpu_bo_list_entry *vm_bos; + struct list_head validated; + struct fence *fence; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +index 1d52144..1ff138e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +@@ -407,8 +407,7 @@ static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p) + } + + INIT_LIST_HEAD(&duplicates); +- p->vm_bos = amdgpu_vm_get_bos(p->adev, &fpriv->vm, +- &p->validated, &duplicates); ++ amdgpu_vm_get_pd_bo(&fpriv->vm, &p->validated, &p->vm_pd); + + if (p->uf.bo) + list_add(&p->uf_entry.tv.head, &p->validated); +@@ -420,6 +419,12 @@ static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p) + if (unlikely(r != 0)) + goto error_reserve; + ++ p->vm_bos = amdgpu_vm_get_pt_bos(&fpriv->vm, &duplicates); ++ if (!p->vm_bos) { ++ r = -ENOMEM; ++ goto error_validate; ++ } ++ + r = amdgpu_cs_list_validate(p->adev, &fpriv->vm, &p->validated); + if (r) + goto error_validate; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +index df0444f..b1d44ce 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +@@ -449,6 +449,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, + { + struct ttm_validate_buffer tv, *entry; + struct amdgpu_bo_list_entry *vm_bos; ++ struct amdgpu_bo_list_entry vm_pd; + struct ww_acquire_ctx ticket; + struct list_head list, duplicates; + unsigned domain; +@@ -461,14 +462,18 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, + tv.shared = true; + list_add(&tv.head, &list); + +- vm_bos = amdgpu_vm_get_bos(adev, bo_va->vm, &list, &duplicates); +- if (!vm_bos) +- return; ++ amdgpu_vm_get_pd_bo(bo_va->vm, &list, &vm_pd); + + /* Provide duplicates to avoid -EALREADY */ + r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates); + if (r) +- goto error_free; ++ goto error_print; ++ ++ vm_bos = amdgpu_vm_get_pt_bos(bo_va->vm, &duplicates); ++ if (!vm_bos) { ++ r = -ENOMEM; ++ goto error_unreserve; ++ } + + list_for_each_entry(entry, &list, head) { + domain = amdgpu_mem_type_to_domain(entry->bo->mem.mem_type); +@@ -498,10 +503,9 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, + + error_unreserve: + ttm_eu_backoff_reservation(&ticket, &list); +- +-error_free: + drm_free_large(vm_bos); + ++error_print: + if (r && r != -ERESTARTSYS) + DRM_ERROR("Couldn't update BO_VA (%d)\n", r); + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 3c3404f..396ab85 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -75,27 +75,46 @@ static unsigned amdgpu_vm_directory_size(struct amdgpu_device *adev) + } + + /** +- * amdgpu_vm_get_bos - add the vm BOs to a validation list +- * ++ * amdgpu_vm_get_pd_bo - add the VM PD to a validation list + * @vm: vm providing the BOs + * @validated: head of validation list ++ * @entry: entry to add ++ * ++ * Add the page directory to the list of BOs to ++ * validate for command submission. ++ */ ++void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, ++ struct list_head *validated, ++ struct amdgpu_bo_list_entry *entry) ++{ ++ entry->robj = vm->page_directory; ++ entry->prefered_domains = AMDGPU_GEM_DOMAIN_VRAM; ++ entry->allowed_domains = AMDGPU_GEM_DOMAIN_VRAM; ++ entry->priority = 0; ++ entry->tv.bo = &vm->page_directory->tbo; ++ entry->tv.shared = true; ++ list_add(&entry->tv.head, validated); ++} ++ ++/** +++ * amdgpu_vm_get_bos - add the vm BOs to a validation list +++ * +++ * @vm: vm providing the BOs + * @duplicates: head of duplicates list + +- * + * Add the page directory to the list of BOs to + * validate for command submission (cayman+). + */ +-struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev, +- struct amdgpu_vm *vm, +- struct list_head *validated, +- struct list_head *duplicates) ++struct amdgpu_bo_list_entry *amdgpu_vm_get_pt_bos(struct amdgpu_vm *vm, ++ struct list_head *duplicates) ++ + { + struct amdgpu_bo_list_entry *list; + unsigned i, idx; + +- list = drm_malloc_ab(vm->max_pde_used + 2, ++ list = drm_malloc_ab(vm->max_pde_used + 1, + sizeof(struct amdgpu_bo_list_entry)); +- if (!list) { ++ if (!list) + return NULL; + } + +@@ -108,7 +127,7 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev, + list[0].tv.shared = true; + list_add(&list[0].tv.head, validated); + +- for (i = 0, idx = 1; i <= vm->max_pde_used; i++) { ++ for (i = 0, idx = 0; i <= vm->max_pde_used; i++) { + if (!vm->page_tables[i].bo) + continue; + +-- +2.7.4 + |