aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2014-11-27 08:48:43 -0500
committerAlex Deucher <alexander.deucher@amd.com>2014-12-03 14:26:48 -0500
commit44c4bd21bdc88683724faa598c4a63bde7628b11 (patch)
tree2bcae413f8b48fe6069c577dc7ee7798dc87c998
parent1d0c094201bd4cae03118a1dfcb45516bb6a3ec7 (diff)
drm/radeon: fence PT updates as shared
The BO_VA contains everything necessary. Signed-off-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon_vm.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 0423e297a42a..6bc3821522a1 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -798,11 +798,11 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev,
798 * 798 *
799 * Global and local mutex must be locked! 799 * Global and local mutex must be locked!
800 */ 800 */
801static void radeon_vm_update_ptes(struct radeon_device *rdev, 801static int radeon_vm_update_ptes(struct radeon_device *rdev,
802 struct radeon_vm *vm, 802 struct radeon_vm *vm,
803 struct radeon_ib *ib, 803 struct radeon_ib *ib,
804 uint64_t start, uint64_t end, 804 uint64_t start, uint64_t end,
805 uint64_t dst, uint32_t flags) 805 uint64_t dst, uint32_t flags)
806{ 806{
807 uint64_t mask = RADEON_VM_PTE_COUNT - 1; 807 uint64_t mask = RADEON_VM_PTE_COUNT - 1;
808 uint64_t last_pte = ~0, last_dst = ~0; 808 uint64_t last_pte = ~0, last_dst = ~0;
@@ -815,8 +815,12 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
815 struct radeon_bo *pt = vm->page_tables[pt_idx].bo; 815 struct radeon_bo *pt = vm->page_tables[pt_idx].bo;
816 unsigned nptes; 816 unsigned nptes;
817 uint64_t pte; 817 uint64_t pte;
818 int r;
818 819
819 radeon_sync_resv(rdev, &ib->sync, pt->tbo.resv, true); 820 radeon_sync_resv(rdev, &ib->sync, pt->tbo.resv, true);
821 r = reservation_object_reserve_shared(pt->tbo.resv);
822 if (r)
823 return r;
820 824
821 if ((addr & ~mask) == (end & ~mask)) 825 if ((addr & ~mask) == (end & ~mask))
822 nptes = end - addr; 826 nptes = end - addr;
@@ -850,6 +854,8 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
850 last_pte + 8 * count, 854 last_pte + 8 * count,
851 last_dst, flags); 855 last_dst, flags);
852 } 856 }
857
858 return 0;
853} 859}
854 860
855/** 861/**
@@ -874,7 +880,7 @@ static void radeon_vm_fence_pts(struct radeon_vm *vm,
874 end >>= radeon_vm_block_size; 880 end >>= radeon_vm_block_size;
875 881
876 for (i = start; i <= end; ++i) 882 for (i = start; i <= end; ++i)
877 radeon_bo_fence(vm->page_tables[i].bo, fence, false); 883 radeon_bo_fence(vm->page_tables[i].bo, fence, true);
878} 884}
879 885
880/** 886/**
@@ -983,9 +989,13 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
983 radeon_sync_fence(&ib.sync, vm->ids[i].last_id_use); 989 radeon_sync_fence(&ib.sync, vm->ids[i].last_id_use);
984 } 990 }
985 991
986 radeon_vm_update_ptes(rdev, vm, &ib, bo_va->it.start, 992 r = radeon_vm_update_ptes(rdev, vm, &ib, bo_va->it.start,
987 bo_va->it.last + 1, addr, 993 bo_va->it.last + 1, addr,
988 radeon_vm_page_flags(bo_va->flags)); 994 radeon_vm_page_flags(bo_va->flags));
995 if (r) {
996 radeon_ib_free(rdev, &ib);
997 return r;
998 }
989 999
990 radeon_asic_vm_pad_ib(rdev, &ib); 1000 radeon_asic_vm_pad_ib(rdev, &ib);
991 WARN_ON(ib.length_dw > ndw); 1001 WARN_ON(ib.length_dw > ndw);