aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_cs.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2014-02-20 07:42:17 -0500
committerChristian König <christian.koenig@amd.com>2014-03-03 05:26:08 -0500
commit6d2f2944e95e504a7d33385eeeb9bb7fcca72592 (patch)
treef0791130732e6ad0df0bcc4fa005b8913abdf3d9 /drivers/gpu/drm/radeon/radeon_cs.c
parentfa68834342e992dcb58e6dd7d9dbe05c6b6b27d9 (diff)
drm/radeon: use normal BOs for the page tables v4
No need to make it more complicated than necessary, just allocate the page tables as normal BO and flush whenever the address change. v2: update comments and function name v3: squash bug fixes, page directory and tables patch v4: rebased on Mareks changes Signed-off-by: Christian König <christian.koenig@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cs.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index f92df2e8ebdd..420c28dd6a1c 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -168,6 +168,10 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
168 168
169 radeon_cs_buckets_get_list(&buckets, &p->validated); 169 radeon_cs_buckets_get_list(&buckets, &p->validated);
170 170
171 if (p->cs_flags & RADEON_CS_USE_VM)
172 p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm,
173 &p->validated);
174
171 return radeon_bo_list_validate(p->rdev, &p->ticket, &p->validated, p->ring); 175 return radeon_bo_list_validate(p->rdev, &p->ticket, &p->validated, p->ring);
172} 176}
173 177
@@ -401,6 +405,7 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error, bo
401 kfree(parser->track); 405 kfree(parser->track);
402 kfree(parser->relocs); 406 kfree(parser->relocs);
403 kfree(parser->relocs_ptr); 407 kfree(parser->relocs_ptr);
408 kfree(parser->vm_bos);
404 for (i = 0; i < parser->nchunks; i++) 409 for (i = 0; i < parser->nchunks; i++)
405 drm_free_large(parser->chunks[i].kdata); 410 drm_free_large(parser->chunks[i].kdata);
406 kfree(parser->chunks); 411 kfree(parser->chunks);
@@ -440,24 +445,32 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
440 return r; 445 return r;
441} 446}
442 447
443static int radeon_bo_vm_update_pte(struct radeon_cs_parser *parser, 448static int radeon_bo_vm_update_pte(struct radeon_cs_parser *p,
444 struct radeon_vm *vm) 449 struct radeon_vm *vm)
445{ 450{
446 struct radeon_device *rdev = parser->rdev; 451 struct radeon_device *rdev = p->rdev;
447 struct radeon_bo_list *lobj; 452 int i, r;
448 struct radeon_bo *bo;
449 int r;
450 453
451 r = radeon_vm_bo_update(rdev, vm, rdev->ring_tmp_bo.bo, &rdev->ring_tmp_bo.bo->tbo.mem); 454 r = radeon_vm_update_page_directory(rdev, vm);
452 if (r) { 455 if (r)
453 return r; 456 return r;
454 } 457
455 list_for_each_entry(lobj, &parser->validated, tv.head) { 458 r = radeon_vm_bo_update(rdev, vm, rdev->ring_tmp_bo.bo,
456 bo = lobj->bo; 459 &rdev->ring_tmp_bo.bo->tbo.mem);
457 r = radeon_vm_bo_update(parser->rdev, vm, bo, &bo->tbo.mem); 460 if (r)
458 if (r) { 461 return r;
462
463 for (i = 0; i < p->nrelocs; i++) {
464 struct radeon_bo *bo;
465
466 /* ignore duplicates */
467 if (p->relocs_ptr[i] != &p->relocs[i])
468 continue;
469
470 bo = p->relocs[i].robj;
471 r = radeon_vm_bo_update(rdev, vm, bo, &bo->tbo.mem);
472 if (r)
459 return r; 473 return r;
460 }
461 } 474 }
462 return 0; 475 return 0;
463} 476}
@@ -491,10 +504,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
491 504
492 mutex_lock(&rdev->vm_manager.lock); 505 mutex_lock(&rdev->vm_manager.lock);
493 mutex_lock(&vm->mutex); 506 mutex_lock(&vm->mutex);
494 r = radeon_vm_alloc_pt(rdev, vm);
495 if (r) {
496 goto out;
497 }
498 r = radeon_bo_vm_update_pte(parser, vm); 507 r = radeon_bo_vm_update_pte(parser, vm);
499 if (r) { 508 if (r) {
500 goto out; 509 goto out;
@@ -512,7 +521,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
512 } 521 }
513 522
514out: 523out:
515 radeon_vm_add_to_lru(rdev, vm);
516 mutex_unlock(&vm->mutex); 524 mutex_unlock(&vm->mutex);
517 mutex_unlock(&rdev->vm_manager.lock); 525 mutex_unlock(&rdev->vm_manager.lock);
518 return r; 526 return r;