aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
diff options
context:
space:
mode:
authorChunming Zhou <David1.Zhou@amd.com>2016-08-04 01:59:32 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-16 10:42:53 -0400
commit1baa439fb2f4e586bf387cbbc515468ebb16e587 (patch)
tree3516837ffc5c5224ad4a2c1675c5078eab101a1b /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
parent14fd833efa3f13619623501de5e2221dfdab7f7f (diff)
drm/amdgpu: allocate shadow for pd/pt bo V2
The pd/pt shadow bo will be used to backup page table, when gpu reset happens, we can restore the page table by them. V2: Free shadow bo. Signed-off-by: Chunming Zhou <David1.Zhou@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 7f385e78a265..1a474fa1f441 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1328,7 +1328,8 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1328 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, 1328 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8,
1329 AMDGPU_GPU_PAGE_SIZE, true, 1329 AMDGPU_GPU_PAGE_SIZE, true,
1330 AMDGPU_GEM_DOMAIN_VRAM, 1330 AMDGPU_GEM_DOMAIN_VRAM,
1331 AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1331 AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
1332 AMDGPU_GEM_CREATE_SHADOW,
1332 NULL, resv, &pt); 1333 NULL, resv, &pt);
1333 if (r) 1334 if (r)
1334 goto error_free; 1335 goto error_free;
@@ -1527,7 +1528,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1527 1528
1528 r = amdgpu_bo_create(adev, pd_size, align, true, 1529 r = amdgpu_bo_create(adev, pd_size, align, true,
1529 AMDGPU_GEM_DOMAIN_VRAM, 1530 AMDGPU_GEM_DOMAIN_VRAM,
1530 AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1531 AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
1532 AMDGPU_GEM_CREATE_SHADOW,
1531 NULL, NULL, &vm->page_directory); 1533 NULL, NULL, &vm->page_directory);
1532 if (r) 1534 if (r)
1533 goto error_free_sched_entity; 1535 goto error_free_sched_entity;
@@ -1583,10 +1585,16 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1583 kfree(mapping); 1585 kfree(mapping);
1584 } 1586 }
1585 1587
1586 for (i = 0; i < amdgpu_vm_num_pdes(adev); i++) 1588 for (i = 0; i < amdgpu_vm_num_pdes(adev); i++) {
1589 if (vm->page_tables[i].entry.robj &&
1590 vm->page_tables[i].entry.robj->shadow)
1591 amdgpu_bo_unref(&vm->page_tables[i].entry.robj->shadow);
1587 amdgpu_bo_unref(&vm->page_tables[i].entry.robj); 1592 amdgpu_bo_unref(&vm->page_tables[i].entry.robj);
1593 }
1588 drm_free_large(vm->page_tables); 1594 drm_free_large(vm->page_tables);
1589 1595
1596 if (vm->page_directory->shadow)
1597 amdgpu_bo_unref(&vm->page_directory->shadow);
1590 amdgpu_bo_unref(&vm->page_directory); 1598 amdgpu_bo_unref(&vm->page_directory);
1591 fence_put(vm->page_directory_fence); 1599 fence_put(vm->page_directory_fence);
1592} 1600}