aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon.h
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2012-08-09 10:21:08 -0400
committerAlex Deucher <alexander.deucher@amd.com>2012-09-20 13:10:39 -0400
commitee60e29f1dc650bf2239b757038973ef32f10878 (patch)
treef69c0ce143536212dd12690f4da87221af922e5b /drivers/gpu/drm/radeon/radeon.h
parent9b40e5d8427f12567749978f66e86e5e8fced5ab (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.h30
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
256static 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
631struct radeon_vm { 650struct 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 {
646struct radeon_vm_manager { 665struct 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);
1817void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm); 1834void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm);
1818int radeon_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm); 1835int radeon_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm);
1819void radeon_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm); 1836void radeon_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm);
1837struct radeon_fence *radeon_vm_grab_id(struct radeon_device *rdev,
1838 struct radeon_vm *vm, int ring);
1839void radeon_vm_fence(struct radeon_device *rdev,
1840 struct radeon_vm *vm,
1841 struct radeon_fence *fence);
1820int radeon_vm_bo_update_pte(struct radeon_device *rdev, 1842int 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,