diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0032-drm-amdgpu-keep-the-PTs-validation-list-in-the-VM-v2.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0032-drm-amdgpu-keep-the-PTs-validation-list-in-the-VM-v2.patch | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0032-drm-amdgpu-keep-the-PTs-validation-list-in-the-VM-v2.patch b/common/recipes-kernel/linux/files/0032-drm-amdgpu-keep-the-PTs-validation-list-in-the-VM-v2.patch new file mode 100644 index 00000000..e7f774f3 --- /dev/null +++ b/common/recipes-kernel/linux/files/0032-drm-amdgpu-keep-the-PTs-validation-list-in-the-VM-v2.patch @@ -0,0 +1,240 @@ +From 7e593951bf930179ca0d28269536c58361f5fa34 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Fri, 11 Dec 2015 21:01:23 +0100 +Subject: [PATCH 0032/1110] drm/amdgpu: keep the PTs validation list in the VM + v2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This avoids allocating it on the fly. + +v2: fix grammar in comment + +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> +Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 9 +++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 7 +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 9 +----- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 57 +++++++++++++++------------------ + 4 files changed, 31 insertions(+), 51 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 638b089..41bee9e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -916,8 +916,9 @@ struct amdgpu_ring { + #define AMDGPU_VM_FAULT_STOP_ALWAYS 2 + + struct amdgpu_vm_pt { +- struct amdgpu_bo *bo; +- uint64_t addr; ++ struct amdgpu_bo_list_entry entry; ++ uint64_t addr; ++ + }; + + struct amdgpu_vm_id { +@@ -989,8 +990,7 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_bos(struct amdgpu_device *adev, + 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); ++void 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, +@@ -1261,7 +1261,6 @@ struct amdgpu_cs_parser { + 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 1ff138e..850f2ab 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +@@ -419,11 +419,7 @@ 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; +- } ++ amdgpu_vm_get_pt_bos(&fpriv->vm, &duplicates); + + r = amdgpu_cs_list_validate(p->adev, &fpriv->vm, &p->validated); + if (r) +@@ -506,7 +502,6 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo + if (parser->bo_list) + amdgpu_bo_list_put(parser->bo_list); + +- drm_free_large(parser->vm_bos); + for (i = 0; i < parser->nchunks; i++) + drm_free_large(parser->chunks[i].kdata); + kfree(parser->chunks); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +index b1d44ce..8eb4b68 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +@@ -448,7 +448,6 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, + struct amdgpu_bo_va *bo_va, uint32_t operation) + { + 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; +@@ -469,12 +468,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, + if (r) + goto error_print; + +- vm_bos = amdgpu_vm_get_pt_bos(bo_va->vm, &duplicates); +- if (!vm_bos) { +- r = -ENOMEM; +- goto error_unreserve; +- } +- ++ amdgpu_vm_get_pt_bos(bo_va->vm, &duplicates); + list_for_each_entry(entry, &list, head) { + domain = amdgpu_mem_type_to_domain(entry->bo->mem.mem_type); + /* if anything is swapped out don't swap it in here, +@@ -503,7 +497,6 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, + + error_unreserve: + ttm_eu_backoff_reservation(&ticket, &list); +- drm_free_large(vm_bos); + + error_print: + if (r && r != -ERESTARTSYS) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 396ab85..e83d4f1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -97,26 +97,18 @@ void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, + } + + /** +-+ * amdgpu_vm_get_bos - add the vm BOs to a validation list +-+ * +-+ * @vm: vm providing the BOs ++ * amdgpu_vm_get_bos - add the vm BOs to a duplicates 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_pt_bos(struct amdgpu_vm *vm, +- struct list_head *duplicates) ++ * Add the page directory to the BO duplicates list ++ * for command submission. + ++ */ ++void 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 + 1, +- sizeof(struct amdgpu_bo_list_entry)); +- if (!list) +- return NULL; +- } ++ unsigned i; + + /* add the vm page table to the list */ + list[0].robj = vm->page_directory; +@@ -127,20 +119,14 @@ struct amdgpu_bo_list_entry *amdgpu_vm_get_pt_bos(struct amdgpu_vm *vm, + list[0].tv.shared = true; + list_add(&list[0].tv.head, validated); + +- for (i = 0, idx = 0; i <= vm->max_pde_used; i++) { +- if (!vm->page_tables[i].bo) ++ for (i = 0; i <= vm->max_pde_used; ++i) { ++ struct amdgpu_bo_list_entry *entry = &vm->page_tables[i].entry; ++ ++ if (!entry->robj) + continue; + +- list[idx].robj = vm->page_tables[i].bo; +- list[idx].prefered_domains = AMDGPU_GEM_DOMAIN_VRAM; +- list[idx].allowed_domains = AMDGPU_GEM_DOMAIN_VRAM; +- list[idx].priority = 0; +- list[idx].tv.bo = &list[idx].robj->tbo; +- list[idx].tv.shared = true; +- list_add(&list[idx++].tv.head, duplicates); ++ list_add(&entry->tv.head, duplicates); + } +- +- return list; + } + + /** +@@ -483,7 +469,7 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, + + /* walk over the address space and update the page directory */ + for (pt_idx = 0; pt_idx <= vm->max_pde_used; ++pt_idx) { +- struct amdgpu_bo *bo = vm->page_tables[pt_idx].bo; ++ struct amdgpu_bo *bo = vm->page_tables[pt_idx].entry.robj; + uint64_t pde, pt; + + if (bo == NULL) +@@ -660,7 +646,7 @@ static int amdgpu_vm_update_ptes(struct amdgpu_device *adev, + /* walk over the address space and update the page tables */ + for (addr = start; addr < end; ) { + uint64_t pt_idx = addr >> amdgpu_vm_block_size; +- struct amdgpu_bo *pt = vm->page_tables[pt_idx].bo; ++ struct amdgpu_bo *pt = vm->page_tables[pt_idx].entry.robj; + unsigned nptes; + uint64_t pte; + int r; +@@ -1092,9 +1078,11 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, + /* walk over the address space and allocate the page tables */ + for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) { + struct reservation_object *resv = vm->page_directory->tbo.resv; ++ struct amdgpu_bo_list_entry *entry; + struct amdgpu_bo *pt; + +- if (vm->page_tables[pt_idx].bo) ++ entry = &vm->page_tables[pt_idx].entry; ++ if (entry->robj) + continue; + + r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, +@@ -1116,8 +1104,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, + goto error_free; + } + ++ entry->robj = pt; ++ entry->prefered_domains = AMDGPU_GEM_DOMAIN_VRAM; ++ entry->allowed_domains = AMDGPU_GEM_DOMAIN_VRAM; ++ entry->priority = 0; ++ entry->tv.bo = &entry->robj->tbo; ++ entry->tv.shared = true; + vm->page_tables[pt_idx].addr = 0; +- vm->page_tables[pt_idx].bo = pt; + } + + return 0; +@@ -1347,7 +1340,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) + } + + for (i = 0; i < amdgpu_vm_num_pdes(adev); i++) +- amdgpu_bo_unref(&vm->page_tables[i].bo); ++ amdgpu_bo_unref(&vm->page_tables[i].entry.robj); + drm_free_large(vm->page_tables); + + amdgpu_bo_unref(&vm->page_directory); +-- +2.7.4 + |