aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/gpu/drm/radeon/radeon.h23
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c44
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_vm.c492
5 files changed, 269 insertions, 295 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 644d922990ef..c31e3c2c1b3a 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -857,17 +857,22 @@ struct radeon_mec {
857#define R600_PTE_READABLE (1 << 5) 857#define R600_PTE_READABLE (1 << 5)
858#define R600_PTE_WRITEABLE (1 << 6) 858#define R600_PTE_WRITEABLE (1 << 6)
859 859
860struct radeon_vm_pt {
861 struct radeon_bo *bo;
862 uint64_t addr;
863};
864
860struct radeon_vm { 865struct radeon_vm {
861 struct list_head list;
862 struct list_head va; 866 struct list_head va;
863 unsigned id; 867 unsigned id;
864 868
865 /* contains the page directory */ 869 /* contains the page directory */
866 struct radeon_sa_bo *page_directory; 870 struct radeon_bo *page_directory;
867 uint64_t pd_gpu_addr; 871 uint64_t pd_gpu_addr;
872 unsigned max_pde_used;
868 873
869 /* array of page tables, one for each page directory entry */ 874 /* array of page tables, one for each page directory entry */
870 struct radeon_sa_bo **page_tables; 875 struct radeon_vm_pt *page_tables;
871 876
872 struct mutex mutex; 877 struct mutex mutex;
873 /* last fence for cs using this vm */ 878 /* last fence for cs using this vm */
@@ -880,9 +885,7 @@ struct radeon_vm {
880 885
881struct radeon_vm_manager { 886struct radeon_vm_manager {
882 struct mutex lock; 887 struct mutex lock;
883 struct list_head lru_vm;
884 struct radeon_fence *active[RADEON_NUM_VM]; 888 struct radeon_fence *active[RADEON_NUM_VM];
885 struct radeon_sa_manager sa_manager;
886 uint32_t max_pfn; 889 uint32_t max_pfn;
887 /* number of VMIDs */ 890 /* number of VMIDs */
888 unsigned nvm; 891 unsigned nvm;
@@ -1011,6 +1014,7 @@ struct radeon_cs_parser {
1011 unsigned nrelocs; 1014 unsigned nrelocs;
1012 struct radeon_cs_reloc *relocs; 1015 struct radeon_cs_reloc *relocs;
1013 struct radeon_cs_reloc **relocs_ptr; 1016 struct radeon_cs_reloc **relocs_ptr;
1017 struct radeon_bo_list *vm_bos;
1014 struct list_head validated; 1018 struct list_head validated;
1015 unsigned dma_reloc_idx; 1019 unsigned dma_reloc_idx;
1016 /* indices of various chunks */ 1020 /* indices of various chunks */
@@ -2798,10 +2802,11 @@ extern void radeon_program_register_sequence(struct radeon_device *rdev,
2798 */ 2802 */
2799int radeon_vm_manager_init(struct radeon_device *rdev); 2803int radeon_vm_manager_init(struct radeon_device *rdev);
2800void radeon_vm_manager_fini(struct radeon_device *rdev); 2804void radeon_vm_manager_fini(struct radeon_device *rdev);
2801void radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm); 2805int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm);
2802void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm); 2806void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm);
2803int radeon_vm_alloc_pt(struct radeon_device *rdev, struct radeon_vm *vm); 2807struct radeon_bo_list *radeon_vm_get_bos(struct radeon_device *rdev,
2804void radeon_vm_add_to_lru(struct radeon_device *rdev, struct radeon_vm *vm); 2808 struct radeon_vm *vm,
2809 struct list_head *head);
2805struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev, 2810struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
2806 struct radeon_vm *vm, int ring); 2811 struct radeon_vm *vm, int ring);
2807void radeon_vm_flush(struct radeon_device *rdev, 2812void radeon_vm_flush(struct radeon_device *rdev,
@@ -2811,6 +2816,8 @@ void radeon_vm_fence(struct radeon_device *rdev,
2811 struct radeon_vm *vm, 2816 struct radeon_vm *vm,
2812 struct radeon_fence *fence); 2817 struct radeon_fence *fence);
2813uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr); 2818uint64_t radeon_vm_map_gart(struct radeon_device *rdev, uint64_t addr);
2819int radeon_vm_update_page_directory(struct radeon_device *rdev,
2820 struct radeon_vm *vm);
2814int radeon_vm_bo_update(struct radeon_device *rdev, 2821int radeon_vm_bo_update(struct radeon_device *rdev,
2815 struct radeon_vm *vm, 2822 struct radeon_vm *vm,
2816 struct radeon_bo *bo, 2823 struct radeon_bo *bo,
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