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 | 2 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 7b4a0cf..4b3c6d2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -869,6 +869,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 { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 38c80ea..aedd1cb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1331,9 +1331,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; @@ -1341,7 +1342,8 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, AMDGPU_GPU_PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_CREATE_NO_CPU_ACCESS, + AMDGPU_GEM_CREATE_NO_CPU_ACCESS | + AMDGPU_GEM_CREATE_SHADOW, NULL, resv, &pt); if (r) goto error_free; @@ -1363,6 +1365,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, entry->tv.shared = true; entry->user_pages = NULL; vm->page_tables[pt_idx].addr = 0; + + entry_shadow->robj = pt->shadow; + 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; @@ -1540,7 +1549,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) r = amdgpu_bo_create(adev, pd_size, align, true, AMDGPU_GEM_DOMAIN_VRAM, - AMDGPU_GEM_CREATE_NO_CPU_ACCESS, + AMDGPU_GEM_CREATE_NO_CPU_ACCESS | + AMDGPU_GEM_CREATE_SHADOW, NULL, NULL, &vm->page_directory); if (r) goto error_free_sched_entity; -- 1.9.1