diff options
author | Christian König <christian.koenig@amd.com> | 2014-11-27 08:48:43 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-12-03 14:26:48 -0500 |
commit | 44c4bd21bdc88683724faa598c4a63bde7628b11 (patch) | |
tree | 2bcae413f8b48fe6069c577dc7ee7798dc87c998 | |
parent | 1d0c094201bd4cae03118a1dfcb45516bb6a3ec7 (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.c | 28 |
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 | */ |
801 | static void radeon_vm_update_ptes(struct radeon_device *rdev, | 801 | static 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); |