aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h2
2 files changed, 5 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 25fdcba5681c..9e6cf130f832 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -383,7 +383,6 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
383 spin_lock(&vm->status_lock); 383 spin_lock(&vm->status_lock);
384 list_add(&entry->base.vm_status, &vm->relocated); 384 list_add(&entry->base.vm_status, &vm->relocated);
385 spin_unlock(&vm->status_lock); 385 spin_unlock(&vm->status_lock);
386 entry->addr = 0;
387 } 386 }
388 387
389 if (level < adev->vm_manager.num_level) { 388 if (level < adev->vm_manager.num_level) {
@@ -1125,15 +1124,12 @@ static int amdgpu_vm_update_pde(struct amdgpu_device *adev,
1125 pt = amdgpu_bo_gpu_offset(bo); 1124 pt = amdgpu_bo_gpu_offset(bo);
1126 pt = amdgpu_gart_get_vm_pde(adev, pt); 1125 pt = amdgpu_gart_get_vm_pde(adev, pt);
1127 /* Don't update huge pages here */ 1126 /* Don't update huge pages here */
1128 if (entry->addr & AMDGPU_PDE_PTE || 1127 if (entry->huge) {
1129 entry->addr == (pt | AMDGPU_PTE_VALID)) {
1130 if (!vm->use_cpu_for_update) 1128 if (!vm->use_cpu_for_update)
1131 amdgpu_job_free(job); 1129 amdgpu_job_free(job);
1132 return 0; 1130 return 0;
1133 } 1131 }
1134 1132
1135 entry->addr = pt | AMDGPU_PTE_VALID;
1136
1137 if (shadow) { 1133 if (shadow) {
1138 pde = shadow_addr + (entry - parent->entries) * 8; 1134 pde = shadow_addr + (entry - parent->entries) * 8;
1139 params.func(&params, pde, pt, 1, 0, AMDGPU_PTE_VALID); 1135 params.func(&params, pde, pt, 1, 0, AMDGPU_PTE_VALID);
@@ -1199,7 +1195,6 @@ static void amdgpu_vm_invalidate_level(struct amdgpu_device *adev,
1199 if (!entry->base.bo) 1195 if (!entry->base.bo)
1200 continue; 1196 continue;
1201 1197
1202 entry->addr = ~0ULL;
1203 spin_lock(&vm->status_lock); 1198 spin_lock(&vm->status_lock);
1204 if (list_empty(&entry->base.vm_status)) 1199 if (list_empty(&entry->base.vm_status))
1205 list_add(&entry->base.vm_status, &vm->relocated); 1200 list_add(&entry->base.vm_status, &vm->relocated);
@@ -1332,10 +1327,10 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p,
1332 flags |= AMDGPU_PDE_PTE; 1327 flags |= AMDGPU_PDE_PTE;
1333 } 1328 }
1334 1329
1335 if (entry->addr == (dst | flags)) 1330 if (!entry->huge && !(flags & AMDGPU_PDE_PTE))
1336 return; 1331 return;
1337 1332
1338 entry->addr = (dst | flags); 1333 entry->huge = !!(flags & AMDGPU_PDE_PTE);
1339 1334
1340 if (use_cpu_update) { 1335 if (use_cpu_update) {
1341 /* In case a huge page is replaced with a system 1336 /* In case a huge page is replaced with a system
@@ -1409,7 +1404,7 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
1409 amdgpu_vm_handle_huge_pages(params, entry, parent, 1404 amdgpu_vm_handle_huge_pages(params, entry, parent,
1410 nptes, dst, flags); 1405 nptes, dst, flags);
1411 /* We don't need to update PTEs for huge pages */ 1406 /* We don't need to update PTEs for huge pages */
1412 if (entry->addr & AMDGPU_PDE_PTE) 1407 if (entry->huge)
1413 continue; 1408 continue;
1414 1409
1415 pt = entry->base.bo; 1410 pt = entry->base.bo;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index 2f1d0c8c093a..e52bf980669f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -138,7 +138,7 @@ struct amdgpu_vm_bo_base {
138 138
139struct amdgpu_vm_pt { 139struct amdgpu_vm_pt {
140 struct amdgpu_vm_bo_base base; 140 struct amdgpu_vm_bo_base base;
141 uint64_t addr; 141 bool huge;
142 142
143 /* array of page tables, one for each directory entry */ 143 /* array of page tables, one for each directory entry */
144 struct amdgpu_vm_pt *entries; 144 struct amdgpu_vm_pt *entries;