diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 92c34e4290a8..e793a7855bb3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -1113,6 +1113,22 @@ static int amdgpu_vm_wait_pd(struct amdgpu_device *adev, struct amdgpu_vm *vm, | |||
1113 | return r; | 1113 | return r; |
1114 | } | 1114 | } |
1115 | 1115 | ||
1116 | /** | ||
1117 | * amdgpu_vm_update_func - helper to call update function | ||
1118 | * | ||
1119 | * Calls the update function for both the given BO as well as its shadow. | ||
1120 | */ | ||
1121 | static void amdgpu_vm_update_func(struct amdgpu_pte_update_params *params, | ||
1122 | struct amdgpu_bo *bo, | ||
1123 | uint64_t pe, uint64_t addr, | ||
1124 | unsigned count, uint32_t incr, | ||
1125 | uint64_t flags) | ||
1126 | { | ||
1127 | if (bo->shadow) | ||
1128 | params->func(params, bo->shadow, pe, addr, count, incr, flags); | ||
1129 | params->func(params, bo, pe, addr, count, incr, flags); | ||
1130 | } | ||
1131 | |||
1116 | /* | 1132 | /* |
1117 | * amdgpu_vm_update_pde - update a single level in the hierarchy | 1133 | * amdgpu_vm_update_pde - update a single level in the hierarchy |
1118 | * | 1134 | * |
@@ -1142,9 +1158,7 @@ static void amdgpu_vm_update_pde(struct amdgpu_pte_update_params *params, | |||
1142 | level += params->adev->vm_manager.root_level; | 1158 | level += params->adev->vm_manager.root_level; |
1143 | amdgpu_gmc_get_pde_for_bo(entry->base.bo, level, &pt, &flags); | 1159 | amdgpu_gmc_get_pde_for_bo(entry->base.bo, level, &pt, &flags); |
1144 | pde = (entry - parent->entries) * 8; | 1160 | pde = (entry - parent->entries) * 8; |
1145 | if (bo->shadow) | 1161 | amdgpu_vm_update_func(params, bo, pde, pt, 1, 0, flags); |
1146 | params->func(params, bo->shadow, pde, pt, 1, 0, flags); | ||
1147 | params->func(params, bo, pde, pt, 1, 0, flags); | ||
1148 | } | 1162 | } |
1149 | 1163 | ||
1150 | /* | 1164 | /* |
@@ -1351,9 +1365,7 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p, | |||
1351 | amdgpu_gmc_get_vm_pde(p->adev, AMDGPU_VM_PDB0, &dst, &flags); | 1365 | amdgpu_gmc_get_vm_pde(p->adev, AMDGPU_VM_PDB0, &dst, &flags); |
1352 | 1366 | ||
1353 | pde = (entry - parent->entries) * 8; | 1367 | pde = (entry - parent->entries) * 8; |
1354 | if (parent->base.bo->shadow) | 1368 | amdgpu_vm_update_func(p, parent->base.bo, pde, dst, 1, 0, flags); |
1355 | p->func(p, parent->base.bo->shadow, pde, dst, 1, 0, flags); | ||
1356 | p->func(p, parent->base.bo, pde, dst, 1, 0, flags); | ||
1357 | } | 1369 | } |
1358 | 1370 | ||
1359 | /** | 1371 | /** |
@@ -1403,11 +1415,9 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params, | |||
1403 | 1415 | ||
1404 | pt = entry->base.bo; | 1416 | pt = entry->base.bo; |
1405 | pe_start = (addr & mask) * 8; | 1417 | pe_start = (addr & mask) * 8; |
1406 | if (pt->shadow) | 1418 | amdgpu_vm_update_func(params, pt, pe_start, dst, nptes, |
1407 | params->func(params, pt->shadow, pe_start, dst, nptes, | 1419 | AMDGPU_GPU_PAGE_SIZE, flags); |
1408 | AMDGPU_GPU_PAGE_SIZE, flags); | 1420 | |
1409 | params->func(params, pt, pe_start, dst, nptes, | ||
1410 | AMDGPU_GPU_PAGE_SIZE, flags); | ||
1411 | } | 1421 | } |
1412 | 1422 | ||
1413 | return 0; | 1423 | return 0; |