the pd/pt shadow bo will be used to backup page table, when gpu reset happens, we can restore the page table by them. Change-Id: I31eeb581f203d1db0654a48745ef4e64ed40ed9b Signed-off-by: Chunming Zhou <David1.Zhou at amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 +++ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 24 +++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 5dd98c1..af536fb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -870,6 +870,8 @@ struct amdgpu_ring { struct amdgpu_vm_pt { struct amdgpu_bo_list_entry entry; uint64_t addr; + struct amdgpu_bo_list_entry entry_shadow; + uint64_t addr_shadow; }; struct amdgpu_vm { @@ -890,6 +892,7 @@ struct amdgpu_vm { /* contains the page directory */ struct amdgpu_bo *page_directory; + struct amdgpu_bo *page_directory_shadow; unsigned max_pde_used; struct fence *page_directory_fence; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index d43bced..b149eb9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1307,9 +1307,10 @@ 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_list_entry *entry, *entry_shadow; struct amdgpu_bo *pt; + entry_shadow = &vm->page_tables[pt_idx].entry_shadow; entry = &vm->page_tables[pt_idx].entry; if (entry->robj) continue; @@ -1339,6 +1340,20 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, entry->tv.shared = true; entry->user_pages = NULL; vm->page_tables[pt_idx].addr = 0; + + r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, + AMDGPU_GPU_PAGE_SIZE, true, + AMDGPU_GEM_DOMAIN_GTT, + AMDGPU_GEM_CREATE_CPU_GTT_USWC, + NULL, resv, &pt); + if (r) + goto error_free; + entry_shadow->robj = pt; + entry_shadow->priority = 0; + entry_shadow->tv.bo = &entry_shadow->robj->tbo; + entry_shadow->tv.shared = true; + entry_shadow->user_pages = NULL; + vm->page_tables[pt_idx].addr_shadow = 0; } return 0; @@ -1530,6 +1545,13 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) if (r) goto error_free_page_directory; + r = amdgpu_bo_create(adev, pd_size, align, true, + AMDGPU_GEM_DOMAIN_GTT, + AMDGPU_GEM_CREATE_CPU_GTT_USWC, + NULL, NULL, &vm->page_directory_shadow); + if (r) + goto error_free_page_directory; + return 0; error_free_page_directory: -- 1.9.1