diff options
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0922-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch')
-rw-r--r-- | meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0922-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0922-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0922-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch new file mode 100644 index 00000000..aa5d4569 --- /dev/null +++ b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0922-drm-amdgpu-split-VM-PD-and-PT-handling-during-CS.patch @@ -0,0 +1,197 @@ +From d76f79165642a0051037d980518f9248f762d07e 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 0922/1050] 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> +Reviewed-by: Chunming Zhou <david1.zhou@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 10 +++++--- + 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 | 45 ++++++++++++++++++++------------- + 4 files changed, 51 insertions(+), 29 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index fbfad7e..b21b09c 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -984,10 +984,11 @@ struct amdgpu_vm_manager { + void amdgpu_vm_manager_fini(struct amdgpu_device *adev); + int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm); + void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); +-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, +@@ -1257,6 +1258,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 cf5f3b7..c08fdb9 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 f2f4582..92a21f6 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +@@ -448,6 +448,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; +@@ -460,14 +461,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); +@@ -497,10 +502,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 6b3f4b9..43e96c5 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -75,39 +75,50 @@ 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; +- } + + /* add the vm page table to the list */ +- list[0].robj = vm->page_directory; +- list[0].prefered_domains = AMDGPU_GEM_DOMAIN_VRAM; +- list[0].allowed_domains = AMDGPU_GEM_DOMAIN_VRAM; +- list[0].priority = 0; +- list[0].tv.bo = &vm->page_directory->tbo; +- 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; + +-- +1.9.1 + |