diff options
author | Christian König <christian.koenig@amd.com> | 2013-11-12 06:58:05 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-11-15 15:56:09 -0500 |
commit | 1654b817d8f5f1c27ebc98773fe0e517b0ba2f1e (patch) | |
tree | b12139b37c3d712973baabfd5f8142728e36ef2a /drivers | |
parent | bd80c8ba995c1dbdddee14acc55c541c499e0442 (diff) |
drm/radeon: allow semaphore emission to fail
To workaround bugs and/or certain limits it's sometimes
useful to fall back to waiting on fences.
Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_dma.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600_dma.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_fence.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 46 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_semaphore.c | 127 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rv770_dma.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si_dma.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/uvd_v1_0.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/uvd_v3_1.c | 4 |
17 files changed, 191 insertions, 147 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index ae92aa041c6a..811fc1b5b4b9 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -3556,7 +3556,7 @@ void cik_fence_compute_ring_emit(struct radeon_device *rdev, | |||
3556 | radeon_ring_write(ring, 0); | 3556 | radeon_ring_write(ring, 0); |
3557 | } | 3557 | } |
3558 | 3558 | ||
3559 | void cik_semaphore_ring_emit(struct radeon_device *rdev, | 3559 | bool cik_semaphore_ring_emit(struct radeon_device *rdev, |
3560 | struct radeon_ring *ring, | 3560 | struct radeon_ring *ring, |
3561 | struct radeon_semaphore *semaphore, | 3561 | struct radeon_semaphore *semaphore, |
3562 | bool emit_wait) | 3562 | bool emit_wait) |
@@ -3567,6 +3567,8 @@ void cik_semaphore_ring_emit(struct radeon_device *rdev, | |||
3567 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); | 3567 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); |
3568 | radeon_ring_write(ring, addr & 0xffffffff); | 3568 | radeon_ring_write(ring, addr & 0xffffffff); |
3569 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel); | 3569 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | sel); |
3570 | |||
3571 | return true; | ||
3570 | } | 3572 | } |
3571 | 3573 | ||
3572 | /** | 3574 | /** |
@@ -3609,13 +3611,8 @@ int cik_copy_cpdma(struct radeon_device *rdev, | |||
3609 | return r; | 3611 | return r; |
3610 | } | 3612 | } |
3611 | 3613 | ||
3612 | if (radeon_fence_need_sync(*fence, ring->idx)) { | 3614 | radeon_semaphore_sync_to(sem, *fence); |
3613 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | 3615 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
3614 | ring->idx); | ||
3615 | radeon_fence_note_sync(*fence, ring->idx); | ||
3616 | } else { | ||
3617 | radeon_semaphore_free(rdev, &sem, NULL); | ||
3618 | } | ||
3619 | 3616 | ||
3620 | for (i = 0; i < num_loops; i++) { | 3617 | for (i = 0; i < num_loops; i++) { |
3621 | cur_size_in_bytes = size_in_bytes; | 3618 | cur_size_in_bytes = size_in_bytes; |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 9c9529de20ee..0300727a4f70 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
@@ -130,7 +130,7 @@ void cik_sdma_fence_ring_emit(struct radeon_device *rdev, | |||
130 | * Add a DMA semaphore packet to the ring wait on or signal | 130 | * Add a DMA semaphore packet to the ring wait on or signal |
131 | * other rings (CIK). | 131 | * other rings (CIK). |
132 | */ | 132 | */ |
133 | void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, | 133 | bool cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, |
134 | struct radeon_ring *ring, | 134 | struct radeon_ring *ring, |
135 | struct radeon_semaphore *semaphore, | 135 | struct radeon_semaphore *semaphore, |
136 | bool emit_wait) | 136 | bool emit_wait) |
@@ -141,6 +141,8 @@ void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, | |||
141 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SEMAPHORE, 0, extra_bits)); | 141 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SEMAPHORE, 0, extra_bits)); |
142 | radeon_ring_write(ring, addr & 0xfffffff8); | 142 | radeon_ring_write(ring, addr & 0xfffffff8); |
143 | radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff); | 143 | radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff); |
144 | |||
145 | return true; | ||
144 | } | 146 | } |
145 | 147 | ||
146 | /** | 148 | /** |
@@ -443,13 +445,8 @@ int cik_copy_dma(struct radeon_device *rdev, | |||
443 | return r; | 445 | return r; |
444 | } | 446 | } |
445 | 447 | ||
446 | if (radeon_fence_need_sync(*fence, ring->idx)) { | 448 | radeon_semaphore_sync_to(sem, *fence); |
447 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | 449 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
448 | ring->idx); | ||
449 | radeon_fence_note_sync(*fence, ring->idx); | ||
450 | } else { | ||
451 | radeon_semaphore_free(rdev, &sem, NULL); | ||
452 | } | ||
453 | 450 | ||
454 | for (i = 0; i < num_loops; i++) { | 451 | for (i = 0; i < num_loops; i++) { |
455 | cur_size_in_bytes = size_in_bytes; | 452 | cur_size_in_bytes = size_in_bytes; |
diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c index 6a0656d00ed0..a37b54436382 100644 --- a/drivers/gpu/drm/radeon/evergreen_dma.c +++ b/drivers/gpu/drm/radeon/evergreen_dma.c | |||
@@ -131,13 +131,8 @@ int evergreen_copy_dma(struct radeon_device *rdev, | |||
131 | return r; | 131 | return r; |
132 | } | 132 | } |
133 | 133 | ||
134 | if (radeon_fence_need_sync(*fence, ring->idx)) { | 134 | radeon_semaphore_sync_to(sem, *fence); |
135 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | 135 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
136 | ring->idx); | ||
137 | radeon_fence_note_sync(*fence, ring->idx); | ||
138 | } else { | ||
139 | radeon_semaphore_free(rdev, &sem, NULL); | ||
140 | } | ||
141 | 136 | ||
142 | for (i = 0; i < num_loops; i++) { | 137 | for (i = 0; i < num_loops; i++) { |
143 | cur_size_in_dw = size_in_dw; | 138 | cur_size_in_dw = size_in_dw; |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 784983d78158..10abc4d5a6cc 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -869,13 +869,14 @@ void r100_fence_ring_emit(struct radeon_device *rdev, | |||
869 | radeon_ring_write(ring, RADEON_SW_INT_FIRE); | 869 | radeon_ring_write(ring, RADEON_SW_INT_FIRE); |
870 | } | 870 | } |
871 | 871 | ||
872 | void r100_semaphore_ring_emit(struct radeon_device *rdev, | 872 | bool r100_semaphore_ring_emit(struct radeon_device *rdev, |
873 | struct radeon_ring *ring, | 873 | struct radeon_ring *ring, |
874 | struct radeon_semaphore *semaphore, | 874 | struct radeon_semaphore *semaphore, |
875 | bool emit_wait) | 875 | bool emit_wait) |
876 | { | 876 | { |
877 | /* Unused on older asics, since we don't have semaphores or multiple rings */ | 877 | /* Unused on older asics, since we don't have semaphores or multiple rings */ |
878 | BUG(); | 878 | BUG(); |
879 | return false; | ||
879 | } | 880 | } |
880 | 881 | ||
881 | int r100_copy_blit(struct radeon_device *rdev, | 882 | int r100_copy_blit(struct radeon_device *rdev, |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 4e609e8a8d2b..9ad06732a78b 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2650,7 +2650,7 @@ void r600_fence_ring_emit(struct radeon_device *rdev, | |||
2650 | } | 2650 | } |
2651 | } | 2651 | } |
2652 | 2652 | ||
2653 | void r600_semaphore_ring_emit(struct radeon_device *rdev, | 2653 | bool r600_semaphore_ring_emit(struct radeon_device *rdev, |
2654 | struct radeon_ring *ring, | 2654 | struct radeon_ring *ring, |
2655 | struct radeon_semaphore *semaphore, | 2655 | struct radeon_semaphore *semaphore, |
2656 | bool emit_wait) | 2656 | bool emit_wait) |
@@ -2664,6 +2664,8 @@ void r600_semaphore_ring_emit(struct radeon_device *rdev, | |||
2664 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); | 2664 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); |
2665 | radeon_ring_write(ring, addr & 0xffffffff); | 2665 | radeon_ring_write(ring, addr & 0xffffffff); |
2666 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); | 2666 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); |
2667 | |||
2668 | return true; | ||
2667 | } | 2669 | } |
2668 | 2670 | ||
2669 | /** | 2671 | /** |
@@ -2706,13 +2708,8 @@ int r600_copy_cpdma(struct radeon_device *rdev, | |||
2706 | return r; | 2708 | return r; |
2707 | } | 2709 | } |
2708 | 2710 | ||
2709 | if (radeon_fence_need_sync(*fence, ring->idx)) { | 2711 | radeon_semaphore_sync_to(sem, *fence); |
2710 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | 2712 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
2711 | ring->idx); | ||
2712 | radeon_fence_note_sync(*fence, ring->idx); | ||
2713 | } else { | ||
2714 | radeon_semaphore_free(rdev, &sem, NULL); | ||
2715 | } | ||
2716 | 2713 | ||
2717 | radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | 2714 | radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); |
2718 | radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); | 2715 | radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); |
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c index 3b317456512a..7844d15c139f 100644 --- a/drivers/gpu/drm/radeon/r600_dma.c +++ b/drivers/gpu/drm/radeon/r600_dma.c | |||
@@ -311,7 +311,7 @@ void r600_dma_fence_ring_emit(struct radeon_device *rdev, | |||
311 | * Add a DMA semaphore packet to the ring wait on or signal | 311 | * Add a DMA semaphore packet to the ring wait on or signal |
312 | * other rings (r6xx-SI). | 312 | * other rings (r6xx-SI). |
313 | */ | 313 | */ |
314 | void r600_dma_semaphore_ring_emit(struct radeon_device *rdev, | 314 | bool r600_dma_semaphore_ring_emit(struct radeon_device *rdev, |
315 | struct radeon_ring *ring, | 315 | struct radeon_ring *ring, |
316 | struct radeon_semaphore *semaphore, | 316 | struct radeon_semaphore *semaphore, |
317 | bool emit_wait) | 317 | bool emit_wait) |
@@ -322,6 +322,8 @@ void r600_dma_semaphore_ring_emit(struct radeon_device *rdev, | |||
322 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SEMAPHORE, 0, s, 0)); | 322 | radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SEMAPHORE, 0, s, 0)); |
323 | radeon_ring_write(ring, addr & 0xfffffffc); | 323 | radeon_ring_write(ring, addr & 0xfffffffc); |
324 | radeon_ring_write(ring, upper_32_bits(addr) & 0xff); | 324 | radeon_ring_write(ring, upper_32_bits(addr) & 0xff); |
325 | |||
326 | return true; | ||
325 | } | 327 | } |
326 | 328 | ||
327 | /** | 329 | /** |
@@ -462,13 +464,8 @@ int r600_copy_dma(struct radeon_device *rdev, | |||
462 | return r; | 464 | return r; |
463 | } | 465 | } |
464 | 466 | ||
465 | if (radeon_fence_need_sync(*fence, ring->idx)) { | 467 | radeon_semaphore_sync_to(sem, *fence); |
466 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | 468 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
467 | ring->idx); | ||
468 | radeon_fence_note_sync(*fence, ring->idx); | ||
469 | } else { | ||
470 | radeon_semaphore_free(rdev, &sem, NULL); | ||
471 | } | ||
472 | 469 | ||
473 | for (i = 0; i < num_loops; i++) { | 470 | for (i = 0; i < num_loops; i++) { |
474 | cur_size_in_dw = size_in_dw; | 471 | cur_size_in_dw = size_in_dw; |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index b9ee99258602..2fe2f6332d44 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -348,6 +348,7 @@ int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, i | |||
348 | void radeon_fence_process(struct radeon_device *rdev, int ring); | 348 | void radeon_fence_process(struct radeon_device *rdev, int ring); |
349 | bool radeon_fence_signaled(struct radeon_fence *fence); | 349 | bool radeon_fence_signaled(struct radeon_fence *fence); |
350 | int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); | 350 | int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); |
351 | int radeon_fence_wait_locked(struct radeon_fence *fence); | ||
351 | int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); | 352 | int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); |
352 | int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); | 353 | int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); |
353 | int radeon_fence_wait_any(struct radeon_device *rdev, | 354 | int radeon_fence_wait_any(struct radeon_device *rdev, |
@@ -548,17 +549,20 @@ struct radeon_semaphore { | |||
548 | struct radeon_sa_bo *sa_bo; | 549 | struct radeon_sa_bo *sa_bo; |
549 | signed waiters; | 550 | signed waiters; |
550 | uint64_t gpu_addr; | 551 | uint64_t gpu_addr; |
552 | struct radeon_fence *sync_to[RADEON_NUM_RINGS]; | ||
551 | }; | 553 | }; |
552 | 554 | ||
553 | int radeon_semaphore_create(struct radeon_device *rdev, | 555 | int radeon_semaphore_create(struct radeon_device *rdev, |
554 | struct radeon_semaphore **semaphore); | 556 | struct radeon_semaphore **semaphore); |
555 | void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, | 557 | bool radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, |
556 | struct radeon_semaphore *semaphore); | 558 | struct radeon_semaphore *semaphore); |
557 | void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, | 559 | bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, |
558 | struct radeon_semaphore *semaphore); | 560 | struct radeon_semaphore *semaphore); |
561 | void radeon_semaphore_sync_to(struct radeon_semaphore *semaphore, | ||
562 | struct radeon_fence *fence); | ||
559 | int radeon_semaphore_sync_rings(struct radeon_device *rdev, | 563 | int radeon_semaphore_sync_rings(struct radeon_device *rdev, |
560 | struct radeon_semaphore *semaphore, | 564 | struct radeon_semaphore *semaphore, |
561 | int signaler, int waiter); | 565 | int waiting_ring); |
562 | void radeon_semaphore_free(struct radeon_device *rdev, | 566 | void radeon_semaphore_free(struct radeon_device *rdev, |
563 | struct radeon_semaphore **semaphore, | 567 | struct radeon_semaphore **semaphore, |
564 | struct radeon_fence *fence); | 568 | struct radeon_fence *fence); |
@@ -765,7 +769,6 @@ struct radeon_ib { | |||
765 | struct radeon_fence *fence; | 769 | struct radeon_fence *fence; |
766 | struct radeon_vm *vm; | 770 | struct radeon_vm *vm; |
767 | bool is_const_ib; | 771 | bool is_const_ib; |
768 | struct radeon_fence *sync_to[RADEON_NUM_RINGS]; | ||
769 | struct radeon_semaphore *semaphore; | 772 | struct radeon_semaphore *semaphore; |
770 | }; | 773 | }; |
771 | 774 | ||
@@ -921,7 +924,6 @@ int radeon_ib_get(struct radeon_device *rdev, int ring, | |||
921 | struct radeon_ib *ib, struct radeon_vm *vm, | 924 | struct radeon_ib *ib, struct radeon_vm *vm, |
922 | unsigned size); | 925 | unsigned size); |
923 | void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib); | 926 | void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib); |
924 | void radeon_ib_sync_to(struct radeon_ib *ib, struct radeon_fence *fence); | ||
925 | int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, | 927 | int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, |
926 | struct radeon_ib *const_ib); | 928 | struct radeon_ib *const_ib); |
927 | int radeon_ib_pool_init(struct radeon_device *rdev); | 929 | int radeon_ib_pool_init(struct radeon_device *rdev); |
@@ -1638,7 +1640,7 @@ struct radeon_asic_ring { | |||
1638 | /* command emmit functions */ | 1640 | /* command emmit functions */ |
1639 | void (*ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib); | 1641 | void (*ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib); |
1640 | void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence); | 1642 | void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence); |
1641 | void (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp, | 1643 | bool (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp, |
1642 | struct radeon_semaphore *semaphore, bool emit_wait); | 1644 | struct radeon_semaphore *semaphore, bool emit_wait); |
1643 | void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 1645 | void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); |
1644 | 1646 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index f2833ee3a613..c9fd97b58076 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -80,7 +80,7 @@ int r100_irq_set(struct radeon_device *rdev); | |||
80 | int r100_irq_process(struct radeon_device *rdev); | 80 | int r100_irq_process(struct radeon_device *rdev); |
81 | void r100_fence_ring_emit(struct radeon_device *rdev, | 81 | void r100_fence_ring_emit(struct radeon_device *rdev, |
82 | struct radeon_fence *fence); | 82 | struct radeon_fence *fence); |
83 | void r100_semaphore_ring_emit(struct radeon_device *rdev, | 83 | bool r100_semaphore_ring_emit(struct radeon_device *rdev, |
84 | struct radeon_ring *cp, | 84 | struct radeon_ring *cp, |
85 | struct radeon_semaphore *semaphore, | 85 | struct radeon_semaphore *semaphore, |
86 | bool emit_wait); | 86 | bool emit_wait); |
@@ -313,13 +313,13 @@ int r600_cs_parse(struct radeon_cs_parser *p); | |||
313 | int r600_dma_cs_parse(struct radeon_cs_parser *p); | 313 | int r600_dma_cs_parse(struct radeon_cs_parser *p); |
314 | void r600_fence_ring_emit(struct radeon_device *rdev, | 314 | void r600_fence_ring_emit(struct radeon_device *rdev, |
315 | struct radeon_fence *fence); | 315 | struct radeon_fence *fence); |
316 | void r600_semaphore_ring_emit(struct radeon_device *rdev, | 316 | bool r600_semaphore_ring_emit(struct radeon_device *rdev, |
317 | struct radeon_ring *cp, | 317 | struct radeon_ring *cp, |
318 | struct radeon_semaphore *semaphore, | 318 | struct radeon_semaphore *semaphore, |
319 | bool emit_wait); | 319 | bool emit_wait); |
320 | void r600_dma_fence_ring_emit(struct radeon_device *rdev, | 320 | void r600_dma_fence_ring_emit(struct radeon_device *rdev, |
321 | struct radeon_fence *fence); | 321 | struct radeon_fence *fence); |
322 | void r600_dma_semaphore_ring_emit(struct radeon_device *rdev, | 322 | bool r600_dma_semaphore_ring_emit(struct radeon_device *rdev, |
323 | struct radeon_ring *ring, | 323 | struct radeon_ring *ring, |
324 | struct radeon_semaphore *semaphore, | 324 | struct radeon_semaphore *semaphore, |
325 | bool emit_wait); | 325 | bool emit_wait); |
@@ -566,10 +566,6 @@ int sumo_dpm_force_performance_level(struct radeon_device *rdev, | |||
566 | */ | 566 | */ |
567 | void cayman_fence_ring_emit(struct radeon_device *rdev, | 567 | void cayman_fence_ring_emit(struct radeon_device *rdev, |
568 | struct radeon_fence *fence); | 568 | struct radeon_fence *fence); |
569 | void cayman_uvd_semaphore_emit(struct radeon_device *rdev, | ||
570 | struct radeon_ring *ring, | ||
571 | struct radeon_semaphore *semaphore, | ||
572 | bool emit_wait); | ||
573 | void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev); | 569 | void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev); |
574 | int cayman_init(struct radeon_device *rdev); | 570 | int cayman_init(struct radeon_device *rdev); |
575 | void cayman_fini(struct radeon_device *rdev); | 571 | void cayman_fini(struct radeon_device *rdev); |
@@ -697,7 +693,7 @@ void cik_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | |||
697 | int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); | 693 | int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); |
698 | void cik_sdma_fence_ring_emit(struct radeon_device *rdev, | 694 | void cik_sdma_fence_ring_emit(struct radeon_device *rdev, |
699 | struct radeon_fence *fence); | 695 | struct radeon_fence *fence); |
700 | void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, | 696 | bool cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, |
701 | struct radeon_ring *ring, | 697 | struct radeon_ring *ring, |
702 | struct radeon_semaphore *semaphore, | 698 | struct radeon_semaphore *semaphore, |
703 | bool emit_wait); | 699 | bool emit_wait); |
@@ -717,7 +713,7 @@ void cik_fence_gfx_ring_emit(struct radeon_device *rdev, | |||
717 | struct radeon_fence *fence); | 713 | struct radeon_fence *fence); |
718 | void cik_fence_compute_ring_emit(struct radeon_device *rdev, | 714 | void cik_fence_compute_ring_emit(struct radeon_device *rdev, |
719 | struct radeon_fence *fence); | 715 | struct radeon_fence *fence); |
720 | void cik_semaphore_ring_emit(struct radeon_device *rdev, | 716 | bool cik_semaphore_ring_emit(struct radeon_device *rdev, |
721 | struct radeon_ring *cp, | 717 | struct radeon_ring *cp, |
722 | struct radeon_semaphore *semaphore, | 718 | struct radeon_semaphore *semaphore, |
723 | bool emit_wait); | 719 | bool emit_wait); |
@@ -807,7 +803,7 @@ void uvd_v1_0_stop(struct radeon_device *rdev); | |||
807 | 803 | ||
808 | int uvd_v1_0_ring_test(struct radeon_device *rdev, struct radeon_ring *ring); | 804 | int uvd_v1_0_ring_test(struct radeon_device *rdev, struct radeon_ring *ring); |
809 | int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring); | 805 | int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring); |
810 | void uvd_v1_0_semaphore_emit(struct radeon_device *rdev, | 806 | bool uvd_v1_0_semaphore_emit(struct radeon_device *rdev, |
811 | struct radeon_ring *ring, | 807 | struct radeon_ring *ring, |
812 | struct radeon_semaphore *semaphore, | 808 | struct radeon_semaphore *semaphore, |
813 | bool emit_wait); | 809 | bool emit_wait); |
@@ -819,7 +815,7 @@ void uvd_v2_2_fence_emit(struct radeon_device *rdev, | |||
819 | struct radeon_fence *fence); | 815 | struct radeon_fence *fence); |
820 | 816 | ||
821 | /* uvd v3.1 */ | 817 | /* uvd v3.1 */ |
822 | void uvd_v3_1_semaphore_emit(struct radeon_device *rdev, | 818 | bool uvd_v3_1_semaphore_emit(struct radeon_device *rdev, |
823 | struct radeon_ring *ring, | 819 | struct radeon_ring *ring, |
824 | struct radeon_semaphore *semaphore, | 820 | struct radeon_semaphore *semaphore, |
825 | bool emit_wait); | 821 | bool emit_wait); |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 26ca223d12d6..f41594b2eeac 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -159,7 +159,8 @@ static void radeon_cs_sync_rings(struct radeon_cs_parser *p) | |||
159 | if (!p->relocs[i].robj) | 159 | if (!p->relocs[i].robj) |
160 | continue; | 160 | continue; |
161 | 161 | ||
162 | radeon_ib_sync_to(&p->ib, p->relocs[i].robj->tbo.sync_obj); | 162 | radeon_semaphore_sync_to(p->ib.semaphore, |
163 | p->relocs[i].robj->tbo.sync_obj); | ||
163 | } | 164 | } |
164 | } | 165 | } |
165 | 166 | ||
@@ -411,9 +412,9 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev, | |||
411 | goto out; | 412 | goto out; |
412 | } | 413 | } |
413 | radeon_cs_sync_rings(parser); | 414 | radeon_cs_sync_rings(parser); |
414 | radeon_ib_sync_to(&parser->ib, vm->fence); | 415 | radeon_semaphore_sync_to(parser->ib.semaphore, vm->fence); |
415 | radeon_ib_sync_to(&parser->ib, radeon_vm_grab_id( | 416 | radeon_semaphore_sync_to(parser->ib.semaphore, |
416 | rdev, vm, parser->ring)); | 417 | radeon_vm_grab_id(rdev, vm, parser->ring)); |
417 | 418 | ||
418 | if ((rdev->family >= CHIP_TAHITI) && | 419 | if ((rdev->family >= CHIP_TAHITI) && |
419 | (parser->chunk_const_ib_idx != -1)) { | 420 | (parser->chunk_const_ib_idx != -1)) { |
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 281d14c22a47..d3a86e43c012 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
@@ -472,6 +472,36 @@ int radeon_fence_wait_any(struct radeon_device *rdev, | |||
472 | } | 472 | } |
473 | 473 | ||
474 | /** | 474 | /** |
475 | * radeon_fence_wait_locked - wait for a fence to signal | ||
476 | * | ||
477 | * @fence: radeon fence object | ||
478 | * | ||
479 | * Wait for the requested fence to signal (all asics). | ||
480 | * Returns 0 if the fence has passed, error for all other cases. | ||
481 | */ | ||
482 | int radeon_fence_wait_locked(struct radeon_fence *fence) | ||
483 | { | ||
484 | uint64_t seq[RADEON_NUM_RINGS] = {}; | ||
485 | int r; | ||
486 | |||
487 | if (fence == NULL) { | ||
488 | WARN(1, "Querying an invalid fence : %p !\n", fence); | ||
489 | return -EINVAL; | ||
490 | } | ||
491 | |||
492 | seq[fence->ring] = fence->seq; | ||
493 | if (seq[fence->ring] == RADEON_FENCE_SIGNALED_SEQ) | ||
494 | return 0; | ||
495 | |||
496 | r = radeon_fence_wait_seq(fence->rdev, seq, false, false); | ||
497 | if (r) | ||
498 | return r; | ||
499 | |||
500 | fence->seq = RADEON_FENCE_SIGNALED_SEQ; | ||
501 | return 0; | ||
502 | } | ||
503 | |||
504 | /** | ||
475 | * radeon_fence_wait_next_locked - wait for the next fence to signal | 505 | * radeon_fence_wait_next_locked - wait for the next fence to signal |
476 | * | 506 | * |
477 | * @rdev: radeon device pointer | 507 | * @rdev: radeon device pointer |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 8a83b89d4709..cd7489b4d709 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -651,7 +651,7 @@ retry: | |||
651 | radeon_asic_vm_set_page(rdev, &ib, vm->pd_gpu_addr, | 651 | radeon_asic_vm_set_page(rdev, &ib, vm->pd_gpu_addr, |
652 | 0, pd_entries, 0, 0); | 652 | 0, pd_entries, 0, 0); |
653 | 653 | ||
654 | radeon_ib_sync_to(&ib, vm->fence); | 654 | radeon_semaphore_sync_to(ib.semaphore, vm->fence); |
655 | r = radeon_ib_schedule(rdev, &ib, NULL); | 655 | r = radeon_ib_schedule(rdev, &ib, NULL); |
656 | if (r) { | 656 | if (r) { |
657 | radeon_ib_free(rdev, &ib); | 657 | radeon_ib_free(rdev, &ib); |
@@ -1220,7 +1220,7 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev, | |||
1220 | radeon_vm_update_ptes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset, | 1220 | radeon_vm_update_ptes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset, |
1221 | addr, radeon_vm_page_flags(bo_va->flags)); | 1221 | addr, radeon_vm_page_flags(bo_va->flags)); |
1222 | 1222 | ||
1223 | radeon_ib_sync_to(&ib, vm->fence); | 1223 | radeon_semaphore_sync_to(ib.semaphore, vm->fence); |
1224 | r = radeon_ib_schedule(rdev, &ib, NULL); | 1224 | r = radeon_ib_schedule(rdev, &ib, NULL); |
1225 | if (r) { | 1225 | if (r) { |
1226 | radeon_ib_free(rdev, &ib); | 1226 | radeon_ib_free(rdev, &ib); |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 18254e1c3e71..9214403ae173 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -61,7 +61,7 @@ int radeon_ib_get(struct radeon_device *rdev, int ring, | |||
61 | struct radeon_ib *ib, struct radeon_vm *vm, | 61 | struct radeon_ib *ib, struct radeon_vm *vm, |
62 | unsigned size) | 62 | unsigned size) |
63 | { | 63 | { |
64 | int i, r; | 64 | int r; |
65 | 65 | ||
66 | r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256, true); | 66 | r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256, true); |
67 | if (r) { | 67 | if (r) { |
@@ -87,8 +87,6 @@ int radeon_ib_get(struct radeon_device *rdev, int ring, | |||
87 | ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo); | 87 | ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo); |
88 | } | 88 | } |
89 | ib->is_const_ib = false; | 89 | ib->is_const_ib = false; |
90 | for (i = 0; i < RADEON_NUM_RINGS; ++i) | ||
91 | ib->sync_to[i] = NULL; | ||
92 | 90 | ||
93 | return 0; | 91 | return 0; |
94 | } | 92 | } |
@@ -109,25 +107,6 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib) | |||
109 | } | 107 | } |
110 | 108 | ||
111 | /** | 109 | /** |
112 | * radeon_ib_sync_to - sync to fence before executing the IB | ||
113 | * | ||
114 | * @ib: IB object to add fence to | ||
115 | * @fence: fence to sync to | ||
116 | * | ||
117 | * Sync to the fence before executing the IB | ||
118 | */ | ||
119 | void radeon_ib_sync_to(struct radeon_ib *ib, struct radeon_fence *fence) | ||
120 | { | ||
121 | struct radeon_fence *other; | ||
122 | |||
123 | if (!fence) | ||
124 | return; | ||
125 | |||
126 | other = ib->sync_to[fence->ring]; | ||
127 | ib->sync_to[fence->ring] = radeon_fence_later(fence, other); | ||
128 | } | ||
129 | |||
130 | /** | ||
131 | * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring | 110 | * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring |
132 | * | 111 | * |
133 | * @rdev: radeon_device pointer | 112 | * @rdev: radeon_device pointer |
@@ -151,8 +130,7 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, | |||
151 | struct radeon_ib *const_ib) | 130 | struct radeon_ib *const_ib) |
152 | { | 131 | { |
153 | struct radeon_ring *ring = &rdev->ring[ib->ring]; | 132 | struct radeon_ring *ring = &rdev->ring[ib->ring]; |
154 | bool need_sync = false; | 133 | int r = 0; |
155 | int i, r = 0; | ||
156 | 134 | ||
157 | if (!ib->length_dw || !ring->ready) { | 135 | if (!ib->length_dw || !ring->ready) { |
158 | /* TODO: Nothings in the ib we should report. */ | 136 | /* TODO: Nothings in the ib we should report. */ |
@@ -166,19 +144,15 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, | |||
166 | dev_err(rdev->dev, "scheduling IB failed (%d).\n", r); | 144 | dev_err(rdev->dev, "scheduling IB failed (%d).\n", r); |
167 | return r; | 145 | return r; |
168 | } | 146 | } |
169 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { | 147 | |
170 | struct radeon_fence *fence = ib->sync_to[i]; | 148 | /* sync with other rings */ |
171 | if (radeon_fence_need_sync(fence, ib->ring)) { | 149 | r = radeon_semaphore_sync_rings(rdev, ib->semaphore, ib->ring); |
172 | need_sync = true; | 150 | if (r) { |
173 | radeon_semaphore_sync_rings(rdev, ib->semaphore, | 151 | dev_err(rdev->dev, "failed to sync rings (%d)\n", r); |
174 | fence->ring, ib->ring); | 152 | radeon_ring_unlock_undo(rdev, ring); |
175 | radeon_fence_note_sync(fence, ib->ring); | 153 | return r; |
176 | } | ||
177 | } | ||
178 | /* immediately free semaphore when we don't need to sync */ | ||
179 | if (!need_sync) { | ||
180 | radeon_semaphore_free(rdev, &ib->semaphore, NULL); | ||
181 | } | 154 | } |
155 | |||
182 | /* if we can't remember our last VM flush then flush now! */ | 156 | /* if we can't remember our last VM flush then flush now! */ |
183 | /* XXX figure out why we have to flush for every IB */ | 157 | /* XXX figure out why we have to flush for every IB */ |
184 | if (ib->vm /*&& !ib->vm->last_flush*/) { | 158 | if (ib->vm /*&& !ib->vm->last_flush*/) { |
diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c index 97d73bfc8782..2b42aa1914f2 100644 --- a/drivers/gpu/drm/radeon/radeon_semaphore.c +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c | |||
@@ -34,7 +34,7 @@ | |||
34 | int radeon_semaphore_create(struct radeon_device *rdev, | 34 | int radeon_semaphore_create(struct radeon_device *rdev, |
35 | struct radeon_semaphore **semaphore) | 35 | struct radeon_semaphore **semaphore) |
36 | { | 36 | { |
37 | int r; | 37 | int i, r; |
38 | 38 | ||
39 | *semaphore = kmalloc(sizeof(struct radeon_semaphore), GFP_KERNEL); | 39 | *semaphore = kmalloc(sizeof(struct radeon_semaphore), GFP_KERNEL); |
40 | if (*semaphore == NULL) { | 40 | if (*semaphore == NULL) { |
@@ -50,58 +50,121 @@ int radeon_semaphore_create(struct radeon_device *rdev, | |||
50 | (*semaphore)->waiters = 0; | 50 | (*semaphore)->waiters = 0; |
51 | (*semaphore)->gpu_addr = radeon_sa_bo_gpu_addr((*semaphore)->sa_bo); | 51 | (*semaphore)->gpu_addr = radeon_sa_bo_gpu_addr((*semaphore)->sa_bo); |
52 | *((uint64_t*)radeon_sa_bo_cpu_addr((*semaphore)->sa_bo)) = 0; | 52 | *((uint64_t*)radeon_sa_bo_cpu_addr((*semaphore)->sa_bo)) = 0; |
53 | |||
54 | for (i = 0; i < RADEON_NUM_RINGS; ++i) | ||
55 | (*semaphore)->sync_to[i] = NULL; | ||
56 | |||
53 | return 0; | 57 | return 0; |
54 | } | 58 | } |
55 | 59 | ||
56 | void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, | 60 | bool radeon_semaphore_emit_signal(struct radeon_device *rdev, int ridx, |
57 | struct radeon_semaphore *semaphore) | 61 | struct radeon_semaphore *semaphore) |
58 | { | 62 | { |
59 | trace_radeon_semaphore_signale(ring, semaphore); | 63 | struct radeon_ring *ring = &rdev->ring[ridx]; |
64 | |||
65 | trace_radeon_semaphore_signale(ridx, semaphore); | ||
66 | |||
67 | if (radeon_semaphore_ring_emit(rdev, ridx, ring, semaphore, false)) { | ||
68 | --semaphore->waiters; | ||
60 | 69 | ||
61 | --semaphore->waiters; | 70 | /* for debugging lockup only, used by sysfs debug files */ |
62 | radeon_semaphore_ring_emit(rdev, ring, &rdev->ring[ring], semaphore, false); | 71 | ring->last_semaphore_signal_addr = semaphore->gpu_addr; |
72 | return true; | ||
73 | } | ||
74 | return false; | ||
63 | } | 75 | } |
64 | 76 | ||
65 | void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, | 77 | bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ridx, |
66 | struct radeon_semaphore *semaphore) | 78 | struct radeon_semaphore *semaphore) |
67 | { | 79 | { |
68 | trace_radeon_semaphore_wait(ring, semaphore); | 80 | struct radeon_ring *ring = &rdev->ring[ridx]; |
81 | |||
82 | trace_radeon_semaphore_wait(ridx, semaphore); | ||
83 | |||
84 | if (radeon_semaphore_ring_emit(rdev, ridx, ring, semaphore, true)) { | ||
85 | ++semaphore->waiters; | ||
69 | 86 | ||
70 | ++semaphore->waiters; | 87 | /* for debugging lockup only, used by sysfs debug files */ |
71 | radeon_semaphore_ring_emit(rdev, ring, &rdev->ring[ring], semaphore, true); | 88 | ring->last_semaphore_wait_addr = semaphore->gpu_addr; |
89 | return true; | ||
90 | } | ||
91 | return false; | ||
72 | } | 92 | } |
73 | 93 | ||
74 | /* caller must hold ring lock */ | 94 | /** |
95 | * radeon_semaphore_sync_to - use the semaphore to sync to a fence | ||
96 | * | ||
97 | * @semaphore: semaphore object to add fence to | ||
98 | * @fence: fence to sync to | ||
99 | * | ||
100 | * Sync to the fence using this semaphore object | ||
101 | */ | ||
102 | void radeon_semaphore_sync_to(struct radeon_semaphore *semaphore, | ||
103 | struct radeon_fence *fence) | ||
104 | { | ||
105 | struct radeon_fence *other; | ||
106 | |||
107 | if (!fence) | ||
108 | return; | ||
109 | |||
110 | other = semaphore->sync_to[fence->ring]; | ||
111 | semaphore->sync_to[fence->ring] = radeon_fence_later(fence, other); | ||
112 | } | ||
113 | |||
114 | /** | ||
115 | * radeon_semaphore_sync_rings - sync ring to all registered fences | ||
116 | * | ||
117 | * @rdev: radeon_device pointer | ||
118 | * @semaphore: semaphore object to use for sync | ||
119 | * @ring: ring that needs sync | ||
120 | * | ||
121 | * Ensure that all registered fences are signaled before letting | ||
122 | * the ring continue. The caller must hold the ring lock. | ||
123 | */ | ||
75 | int radeon_semaphore_sync_rings(struct radeon_device *rdev, | 124 | int radeon_semaphore_sync_rings(struct radeon_device *rdev, |
76 | struct radeon_semaphore *semaphore, | 125 | struct radeon_semaphore *semaphore, |
77 | int signaler, int waiter) | 126 | int ring) |
78 | { | 127 | { |
79 | int r; | 128 | int i, r; |
80 | 129 | ||
81 | /* no need to signal and wait on the same ring */ | 130 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { |
82 | if (signaler == waiter) { | 131 | struct radeon_fence *fence = semaphore->sync_to[i]; |
83 | return 0; | ||
84 | } | ||
85 | 132 | ||
86 | /* prevent GPU deadlocks */ | 133 | /* check if we really need to sync */ |
87 | if (!rdev->ring[signaler].ready) { | 134 | if (!radeon_fence_need_sync(fence, ring)) |
88 | dev_err(rdev->dev, "Trying to sync to a disabled ring!"); | 135 | continue; |
89 | return -EINVAL; | ||
90 | } | ||
91 | 136 | ||
92 | r = radeon_ring_alloc(rdev, &rdev->ring[signaler], 8); | 137 | /* prevent GPU deadlocks */ |
93 | if (r) { | 138 | if (!rdev->ring[i].ready) { |
94 | return r; | 139 | dev_err(rdev->dev, "Syncing to a disabled ring!"); |
95 | } | 140 | return -EINVAL; |
96 | radeon_semaphore_emit_signal(rdev, signaler, semaphore); | 141 | } |
97 | radeon_ring_commit(rdev, &rdev->ring[signaler]); | ||
98 | 142 | ||
99 | /* we assume caller has already allocated space on waiters ring */ | 143 | /* allocate enough space for sync command */ |
100 | radeon_semaphore_emit_wait(rdev, waiter, semaphore); | 144 | r = radeon_ring_alloc(rdev, &rdev->ring[i], 16); |
145 | if (r) { | ||
146 | return r; | ||
147 | } | ||
101 | 148 | ||
102 | /* for debugging lockup only, used by sysfs debug files */ | 149 | /* emit the signal semaphore */ |
103 | rdev->ring[signaler].last_semaphore_signal_addr = semaphore->gpu_addr; | 150 | if (!radeon_semaphore_emit_signal(rdev, i, semaphore)) { |
104 | rdev->ring[waiter].last_semaphore_wait_addr = semaphore->gpu_addr; | 151 | /* signaling wasn't successful wait manually */ |
152 | radeon_ring_undo(&rdev->ring[i]); | ||
153 | radeon_fence_wait_locked(fence); | ||
154 | continue; | ||
155 | } | ||
156 | |||
157 | /* we assume caller has already allocated space on waiters ring */ | ||
158 | if (!radeon_semaphore_emit_wait(rdev, ring, semaphore)) { | ||
159 | /* waiting wasn't successful wait manually */ | ||
160 | radeon_ring_undo(&rdev->ring[i]); | ||
161 | radeon_fence_wait_locked(fence); | ||
162 | continue; | ||
163 | } | ||
164 | |||
165 | radeon_ring_commit(rdev, &rdev->ring[i]); | ||
166 | radeon_fence_note_sync(fence, ring); | ||
167 | } | ||
105 | 168 | ||
106 | return 0; | 169 | return 0; |
107 | } | 170 | } |
diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c index f9b02e3d6830..aca8cbe8a335 100644 --- a/drivers/gpu/drm/radeon/rv770_dma.c +++ b/drivers/gpu/drm/radeon/rv770_dma.c | |||
@@ -66,13 +66,8 @@ int rv770_copy_dma(struct radeon_device *rdev, | |||
66 | return r; | 66 | return r; |
67 | } | 67 | } |
68 | 68 | ||
69 | if (radeon_fence_need_sync(*fence, ring->idx)) { | 69 | radeon_semaphore_sync_to(sem, *fence); |
70 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | 70 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
71 | ring->idx); | ||
72 | radeon_fence_note_sync(*fence, ring->idx); | ||
73 | } else { | ||
74 | radeon_semaphore_free(rdev, &sem, NULL); | ||
75 | } | ||
76 | 71 | ||
77 | for (i = 0; i < num_loops; i++) { | 72 | for (i = 0; i < num_loops; i++) { |
78 | cur_size_in_dw = size_in_dw; | 73 | cur_size_in_dw = size_in_dw; |
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c index 8e8f46133532..59be2cfcbb47 100644 --- a/drivers/gpu/drm/radeon/si_dma.c +++ b/drivers/gpu/drm/radeon/si_dma.c | |||
@@ -195,13 +195,8 @@ int si_copy_dma(struct radeon_device *rdev, | |||
195 | return r; | 195 | return r; |
196 | } | 196 | } |
197 | 197 | ||
198 | if (radeon_fence_need_sync(*fence, ring->idx)) { | 198 | radeon_semaphore_sync_to(sem, *fence); |
199 | radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring, | 199 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
200 | ring->idx); | ||
201 | radeon_fence_note_sync(*fence, ring->idx); | ||
202 | } else { | ||
203 | radeon_semaphore_free(rdev, &sem, NULL); | ||
204 | } | ||
205 | 200 | ||
206 | for (i = 0; i < num_loops; i++) { | 201 | for (i = 0; i < num_loops; i++) { |
207 | cur_size_in_bytes = size_in_bytes; | 202 | cur_size_in_bytes = size_in_bytes; |
diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c index 7266805d9786..d4a68af1a279 100644 --- a/drivers/gpu/drm/radeon/uvd_v1_0.c +++ b/drivers/gpu/drm/radeon/uvd_v1_0.c | |||
@@ -357,7 +357,7 @@ int uvd_v1_0_ring_test(struct radeon_device *rdev, struct radeon_ring *ring) | |||
357 | * | 357 | * |
358 | * Emit a semaphore command (either wait or signal) to the UVD ring. | 358 | * Emit a semaphore command (either wait or signal) to the UVD ring. |
359 | */ | 359 | */ |
360 | void uvd_v1_0_semaphore_emit(struct radeon_device *rdev, | 360 | bool uvd_v1_0_semaphore_emit(struct radeon_device *rdev, |
361 | struct radeon_ring *ring, | 361 | struct radeon_ring *ring, |
362 | struct radeon_semaphore *semaphore, | 362 | struct radeon_semaphore *semaphore, |
363 | bool emit_wait) | 363 | bool emit_wait) |
@@ -372,6 +372,8 @@ void uvd_v1_0_semaphore_emit(struct radeon_device *rdev, | |||
372 | 372 | ||
373 | radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0)); | 373 | radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0)); |
374 | radeon_ring_write(ring, emit_wait ? 1 : 0); | 374 | radeon_ring_write(ring, emit_wait ? 1 : 0); |
375 | |||
376 | return true; | ||
375 | } | 377 | } |
376 | 378 | ||
377 | /** | 379 | /** |
diff --git a/drivers/gpu/drm/radeon/uvd_v3_1.c b/drivers/gpu/drm/radeon/uvd_v3_1.c index 5b6fa1f62d4e..d722db2cf340 100644 --- a/drivers/gpu/drm/radeon/uvd_v3_1.c +++ b/drivers/gpu/drm/radeon/uvd_v3_1.c | |||
@@ -37,7 +37,7 @@ | |||
37 | * | 37 | * |
38 | * Emit a semaphore command (either wait or signal) to the UVD ring. | 38 | * Emit a semaphore command (either wait or signal) to the UVD ring. |
39 | */ | 39 | */ |
40 | void uvd_v3_1_semaphore_emit(struct radeon_device *rdev, | 40 | bool uvd_v3_1_semaphore_emit(struct radeon_device *rdev, |
41 | struct radeon_ring *ring, | 41 | struct radeon_ring *ring, |
42 | struct radeon_semaphore *semaphore, | 42 | struct radeon_semaphore *semaphore, |
43 | bool emit_wait) | 43 | bool emit_wait) |
@@ -52,4 +52,6 @@ void uvd_v3_1_semaphore_emit(struct radeon_device *rdev, | |||
52 | 52 | ||
53 | radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0)); | 53 | radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0)); |
54 | radeon_ring_write(ring, 0x80 | (emit_wait ? 1 : 0)); | 54 | radeon_ring_write(ring, 0x80 | (emit_wait ? 1 : 0)); |
55 | |||
56 | return true; | ||
55 | } | 57 | } |