diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-10-02 14:43:38 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2012-10-02 15:01:21 -0400 |
commit | 498522b455e8867bed5d59234c209b0be8ec4b57 (patch) | |
tree | e7d59e6d1574a1c89850d24cefa3fdf863ce8953 | |
parent | 76c44f2c0d008b60ce3058c51d85fa36d98c3681 (diff) |
drm/radeon: rework the vm_flush interface
Pass the vm and ring index rather than an IB. This allows
us to use the vm_flush interface for non-IB cases in the
future.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 7 |
5 files changed, 11 insertions, 13 deletions
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index f920a2c5ef23..9a46f7d4e61f 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1565,10 +1565,9 @@ void cayman_vm_set_page(struct radeon_device *rdev, uint64_t pe, | |||
1565 | * Update the page table base and flush the VM TLB | 1565 | * Update the page table base and flush the VM TLB |
1566 | * using the CP (cayman-si). | 1566 | * using the CP (cayman-si). |
1567 | */ | 1567 | */ |
1568 | void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib) | 1568 | void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) |
1569 | { | 1569 | { |
1570 | struct radeon_ring *ring = &rdev->ring[ib->ring]; | 1570 | struct radeon_ring *ring = &rdev->ring[ridx]; |
1571 | struct radeon_vm *vm = ib->vm; | ||
1572 | 1571 | ||
1573 | if (vm == NULL) | 1572 | if (vm == NULL) |
1574 | return; | 1573 | return; |
@@ -1588,5 +1587,5 @@ void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib) | |||
1588 | 1587 | ||
1589 | /* bits 0-7 are the VM contexts0-7 */ | 1588 | /* bits 0-7 are the VM contexts0-7 */ |
1590 | radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); | 1589 | radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); |
1591 | radeon_ring_write(ring, 1 << ib->vm->id); | 1590 | radeon_ring_write(ring, 1 << vm->id); |
1592 | } | 1591 | } |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 519d8a32aa43..b04c06444d8b 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -1165,7 +1165,7 @@ struct radeon_asic { | |||
1165 | int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp); | 1165 | int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp); |
1166 | int (*ib_test)(struct radeon_device *rdev, struct radeon_ring *cp); | 1166 | int (*ib_test)(struct radeon_device *rdev, struct radeon_ring *cp); |
1167 | bool (*is_lockup)(struct radeon_device *rdev, struct radeon_ring *cp); | 1167 | bool (*is_lockup)(struct radeon_device *rdev, struct radeon_ring *cp); |
1168 | void (*vm_flush)(struct radeon_device *rdev, struct radeon_ib *ib); | 1168 | void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); |
1169 | } ring[RADEON_NUM_RINGS]; | 1169 | } ring[RADEON_NUM_RINGS]; |
1170 | /* irqs */ | 1170 | /* irqs */ |
1171 | struct { | 1171 | struct { |
@@ -1772,7 +1772,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); | |||
1772 | #define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)].ib_execute((rdev), (ib)) | 1772 | #define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)].ib_execute((rdev), (ib)) |
1773 | #define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)].ib_parse((rdev), (ib)) | 1773 | #define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)].ib_parse((rdev), (ib)) |
1774 | #define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)].is_lockup((rdev), (cp)) | 1774 | #define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)].is_lockup((rdev), (cp)) |
1775 | #define radeon_ring_vm_flush(rdev, r, ib) (rdev)->asic->ring[(r)].vm_flush((rdev), (ib)) | 1775 | #define radeon_ring_vm_flush(rdev, r, vm) (rdev)->asic->ring[(r)].vm_flush((rdev), (r), (vm)) |
1776 | #define radeon_irq_set(rdev) (rdev)->asic->irq.set((rdev)) | 1776 | #define radeon_irq_set(rdev) (rdev)->asic->irq.set((rdev)) |
1777 | #define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev)) | 1777 | #define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev)) |
1778 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc)) | 1778 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc)) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index f158c11c9065..5c823e77bc21 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -443,7 +443,7 @@ int cayman_asic_reset(struct radeon_device *rdev); | |||
443 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 443 | void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
444 | int cayman_vm_init(struct radeon_device *rdev); | 444 | int cayman_vm_init(struct radeon_device *rdev); |
445 | void cayman_vm_fini(struct radeon_device *rdev); | 445 | void cayman_vm_fini(struct radeon_device *rdev); |
446 | void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib); | 446 | void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); |
447 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags); | 447 | uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags); |
448 | void cayman_vm_set_page(struct radeon_device *rdev, uint64_t pe, | 448 | void cayman_vm_set_page(struct radeon_device *rdev, uint64_t pe, |
449 | uint64_t addr, unsigned count, | 449 | uint64_t addr, unsigned count, |
@@ -470,7 +470,7 @@ int si_irq_set(struct radeon_device *rdev); | |||
470 | int si_irq_process(struct radeon_device *rdev); | 470 | int si_irq_process(struct radeon_device *rdev); |
471 | int si_vm_init(struct radeon_device *rdev); | 471 | int si_vm_init(struct radeon_device *rdev); |
472 | void si_vm_fini(struct radeon_device *rdev); | 472 | void si_vm_fini(struct radeon_device *rdev); |
473 | void si_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib); | 473 | void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); |
474 | int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); | 474 | int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); |
475 | uint64_t si_get_gpu_clock(struct radeon_device *rdev); | 475 | uint64_t si_get_gpu_clock(struct radeon_device *rdev); |
476 | 476 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index d90b0bc6f072..028508859a3b 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -162,7 +162,7 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, | |||
162 | } | 162 | } |
163 | /* if we can't remember our last VM flush then flush now! */ | 163 | /* if we can't remember our last VM flush then flush now! */ |
164 | if (ib->vm && !ib->vm->last_flush) { | 164 | if (ib->vm && !ib->vm->last_flush) { |
165 | radeon_ring_vm_flush(rdev, ib->ring, ib); | 165 | radeon_ring_vm_flush(rdev, ib->ring, ib->vm); |
166 | } | 166 | } |
167 | if (const_ib) { | 167 | if (const_ib) { |
168 | radeon_ring_ib_execute(rdev, const_ib->ring, const_ib); | 168 | radeon_ring_ib_execute(rdev, const_ib->ring, const_ib); |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 916d1cb274c0..3319a9a53d8e 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -2789,10 +2789,9 @@ void si_vm_fini(struct radeon_device *rdev) | |||
2789 | { | 2789 | { |
2790 | } | 2790 | } |
2791 | 2791 | ||
2792 | void si_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib) | 2792 | void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) |
2793 | { | 2793 | { |
2794 | struct radeon_ring *ring = &rdev->ring[ib->ring]; | 2794 | struct radeon_ring *ring = &rdev->ring[ridx]; |
2795 | struct radeon_vm *vm = ib->vm; | ||
2796 | 2795 | ||
2797 | if (vm == NULL) | 2796 | if (vm == NULL) |
2798 | return; | 2797 | return; |
@@ -2826,7 +2825,7 @@ void si_vm_flush(struct radeon_device *rdev, struct radeon_ib *ib) | |||
2826 | WRITE_DATA_DST_SEL(0))); | 2825 | WRITE_DATA_DST_SEL(0))); |
2827 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); | 2826 | radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); |
2828 | radeon_ring_write(ring, 0); | 2827 | radeon_ring_write(ring, 0); |
2829 | radeon_ring_write(ring, 1 << ib->vm->id); | 2828 | radeon_ring_write(ring, 1 << vm->id); |
2830 | } | 2829 | } |
2831 | 2830 | ||
2832 | /* | 2831 | /* |