aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c32
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 */
1121static 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;