diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 |
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(¶ms, pde, pt, 1, 0, AMDGPU_PTE_VALID); | 1135 | params.func(¶ms, 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 | ||
139 | struct amdgpu_vm_pt { | 139 | struct 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; |