aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>2015-08-14 14:08:40 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-08-17 16:51:23 -0400
commit05906dec7d7daf197b9b773295c95ad6b9af2a5a (patch)
tree3459b59ade856c84a50539a894edc237bf7636da
parentb325a789c7e6554a14fae3c2310ee22fa4ca7cf6 (diff)
drm/amdgpu: wait on page directory changes. v2
Pagetables can be moved and therefore the page directory update can be necessary for the current cs even if none of the the bo's are moved. In that scenario there is no fence between the sdma0 and gfx ring, so we add one. v2 (chk): rebased Signed-off-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c6
3 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 68beb40e283b..2fc58e658986 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -982,6 +982,7 @@ struct amdgpu_vm {
982 /* contains the page directory */ 982 /* contains the page directory */
983 struct amdgpu_bo *page_directory; 983 struct amdgpu_bo *page_directory;
984 unsigned max_pde_used; 984 unsigned max_pde_used;
985 struct fence *page_directory_fence;
985 986
986 /* array of page tables, one for each page directory entry */ 987 /* array of page tables, one for each page directory entry */
987 struct amdgpu_vm_pt *page_tables; 988 struct amdgpu_vm_pt *page_tables;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 11edac725210..e4424b4db5d3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -551,6 +551,10 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p,
551 if (r) 551 if (r)
552 return r; 552 return r;
553 553
554 r = amdgpu_sync_fence(adev, &p->ibs[0].sync, vm->page_directory_fence);
555 if (r)
556 return r;
557
554 r = amdgpu_vm_clear_freed(adev, vm); 558 r = amdgpu_vm_clear_freed(adev, vm);
555 if (r) 559 if (r)
556 return r; 560 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 2fc909f5d710..a78a206e176e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -495,7 +495,10 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
495 &fence); 495 &fence);
496 if (r) 496 if (r)
497 goto error_free; 497 goto error_free;
498
498 amdgpu_bo_fence(pd, fence, true); 499 amdgpu_bo_fence(pd, fence, true);
500 fence_put(vm->page_directory_fence);
501 vm->page_directory_fence = fence_get(fence);
499 fence_put(fence); 502 fence_put(fence);
500 } 503 }
501 504
@@ -1291,6 +1294,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1291 return -ENOMEM; 1294 return -ENOMEM;
1292 } 1295 }
1293 1296
1297 vm->page_directory_fence = NULL;
1298
1294 r = amdgpu_bo_create(adev, pd_size, align, true, 1299 r = amdgpu_bo_create(adev, pd_size, align, true,
1295 AMDGPU_GEM_DOMAIN_VRAM, 0, 1300 AMDGPU_GEM_DOMAIN_VRAM, 0,
1296 NULL, &vm->page_directory); 1301 NULL, &vm->page_directory);
@@ -1339,6 +1344,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1339 kfree(vm->page_tables); 1344 kfree(vm->page_tables);
1340 1345
1341 amdgpu_bo_unref(&vm->page_directory); 1346 amdgpu_bo_unref(&vm->page_directory);
1347 fence_put(vm->page_directory_fence);
1342 1348
1343 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 1349 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
1344 amdgpu_fence_unref(&vm->ids[i].flushed_updates); 1350 amdgpu_fence_unref(&vm->ids[i].flushed_updates);