diff options
author | Christian König <deathsimple@vodafone.de> | 2012-08-09 10:21:08 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2012-09-20 13:10:39 -0400 |
commit | ee60e29f1dc650bf2239b757038973ef32f10878 (patch) | |
tree | f69c0ce143536212dd12690f4da87221af922e5b /drivers/gpu/drm/radeon/radeon.h | |
parent | 9b40e5d8427f12567749978f66e86e5e8fced5ab (diff) |
drm/radeon: rework VMID handling
Move binding onto the ring, simplifying handling a bit.
Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon.h')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 320355de9c54..617ca45734de 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -253,6 +253,22 @@ static inline struct radeon_fence *radeon_fence_later(struct radeon_fence *a, | |||
253 | } | 253 | } |
254 | } | 254 | } |
255 | 255 | ||
256 | static inline bool radeon_fence_is_earlier(struct radeon_fence *a, | ||
257 | struct radeon_fence *b) | ||
258 | { | ||
259 | if (!a) { | ||
260 | return false; | ||
261 | } | ||
262 | |||
263 | if (!b) { | ||
264 | return true; | ||
265 | } | ||
266 | |||
267 | BUG_ON(a->ring != b->ring); | ||
268 | |||
269 | return a->seq < b->seq; | ||
270 | } | ||
271 | |||
256 | /* | 272 | /* |
257 | * Tiling registers | 273 | * Tiling registers |
258 | */ | 274 | */ |
@@ -628,10 +644,13 @@ struct radeon_ring { | |||
628 | /* | 644 | /* |
629 | * VM | 645 | * VM |
630 | */ | 646 | */ |
647 | |||
648 | #define RADEON_NUM_VM 16 | ||
649 | |||
631 | struct radeon_vm { | 650 | struct radeon_vm { |
632 | struct list_head list; | 651 | struct list_head list; |
633 | struct list_head va; | 652 | struct list_head va; |
634 | int id; | 653 | unsigned id; |
635 | unsigned last_pfn; | 654 | unsigned last_pfn; |
636 | u64 pt_gpu_addr; | 655 | u64 pt_gpu_addr; |
637 | u64 *pt; | 656 | u64 *pt; |
@@ -646,7 +665,7 @@ struct radeon_vm { | |||
646 | struct radeon_vm_manager { | 665 | struct radeon_vm_manager { |
647 | struct mutex lock; | 666 | struct mutex lock; |
648 | struct list_head lru_vm; | 667 | struct list_head lru_vm; |
649 | uint32_t use_bitmap; | 668 | struct radeon_fence *active[RADEON_NUM_VM]; |
650 | struct radeon_sa_manager sa_manager; | 669 | struct radeon_sa_manager sa_manager; |
651 | uint32_t max_pfn; | 670 | uint32_t max_pfn; |
652 | /* number of VMIDs */ | 671 | /* number of VMIDs */ |
@@ -1117,7 +1136,6 @@ struct radeon_asic { | |||
1117 | struct { | 1136 | struct { |
1118 | int (*init)(struct radeon_device *rdev); | 1137 | int (*init)(struct radeon_device *rdev); |
1119 | void (*fini)(struct radeon_device *rdev); | 1138 | void (*fini)(struct radeon_device *rdev); |
1120 | int (*bind)(struct radeon_device *rdev, struct radeon_vm *vm, int id); | ||
1121 | uint32_t (*page_flags)(struct radeon_device *rdev, | 1139 | uint32_t (*page_flags)(struct radeon_device *rdev, |
1122 | struct radeon_vm *vm, | 1140 | struct radeon_vm *vm, |
1123 | uint32_t flags); | 1141 | uint32_t flags); |
@@ -1734,7 +1752,6 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); | |||
1734 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p)) | 1752 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p)) |
1735 | #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) | 1753 | #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) |
1736 | #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) | 1754 | #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) |
1737 | #define radeon_asic_vm_bind(rdev, v, id) (rdev)->asic->vm.bind((rdev), (v), (id)) | ||
1738 | #define radeon_asic_vm_page_flags(rdev, v, flags) (rdev)->asic->vm.page_flags((rdev), (v), (flags)) | 1755 | #define radeon_asic_vm_page_flags(rdev, v, flags) (rdev)->asic->vm.page_flags((rdev), (v), (flags)) |
1739 | #define radeon_asic_vm_set_page(rdev, v, pfn, addr, flags) (rdev)->asic->vm.set_page((rdev), (v), (pfn), (addr), (flags)) | 1756 | #define radeon_asic_vm_set_page(rdev, v, pfn, addr, flags) (rdev)->asic->vm.set_page((rdev), (v), (pfn), (addr), (flags)) |
1740 | #define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp)) | 1757 | #define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp)) |
@@ -1817,6 +1834,11 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm); | |||
1817 | void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm); | 1834 | void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm); |
1818 | int radeon_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm); | 1835 | int radeon_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm); |
1819 | void radeon_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm); | 1836 | void radeon_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm); |
1837 | struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev, | ||
1838 | struct radeon_vm *vm, int ring); | ||
1839 | void radeon_vm_fence(struct radeon_device *rdev, | ||
1840 | struct radeon_vm *vm, | ||
1841 | struct radeon_fence *fence); | ||
1820 | int radeon_vm_bo_update_pte(struct radeon_device *rdev, | 1842 | int radeon_vm_bo_update_pte(struct radeon_device *rdev, |
1821 | struct radeon_vm *vm, | 1843 | struct radeon_vm *vm, |
1822 | struct radeon_bo *bo, | 1844 | struct radeon_bo *bo, |