aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2013-11-12 06:58:05 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-11-15 15:56:09 -0500
commit1654b817d8f5f1c27ebc98773fe0e517b0ba2f1e (patch)
treeb12139b37c3d712973baabfd5f8142728e36ef2a /drivers
parentbd80c8ba995c1dbdddee14acc55c541c499e0442 (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.c13
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c13
-rw-r--r--drivers/gpu/drm/radeon/evergreen_dma.c9
-rw-r--r--drivers/gpu/drm/radeon/r100.c3
-rw-r--r--drivers/gpu/drm/radeon/r600.c13
-rw-r--r--drivers/gpu/drm/radeon/r600_dma.c13
-rw-r--r--drivers/gpu/drm/radeon/radeon.h14
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h18
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c9
-rw-r--r--drivers/gpu/drm/radeon/radeon_fence.c30
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_ring.c46
-rw-r--r--drivers/gpu/drm/radeon/radeon_semaphore.c127
-rw-r--r--drivers/gpu/drm/radeon/rv770_dma.c9
-rw-r--r--drivers/gpu/drm/radeon/si_dma.c9
-rw-r--r--drivers/gpu/drm/radeon/uvd_v1_0.c4
-rw-r--r--drivers/gpu/drm/radeon/uvd_v3_1.c4
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
3559void cik_semaphore_ring_emit(struct radeon_device *rdev, 3559bool 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 */
133void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, 133bool 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
872void r100_semaphore_ring_emit(struct radeon_device *rdev, 872bool 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
881int r100_copy_blit(struct radeon_device *rdev, 882int 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
2653void r600_semaphore_ring_emit(struct radeon_device *rdev, 2653bool 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 */
314void r600_dma_semaphore_ring_emit(struct radeon_device *rdev, 314bool 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
348void radeon_fence_process(struct radeon_device *rdev, int ring); 348void radeon_fence_process(struct radeon_device *rdev, int ring);
349bool radeon_fence_signaled(struct radeon_fence *fence); 349bool radeon_fence_signaled(struct radeon_fence *fence);
350int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); 350int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
351int radeon_fence_wait_locked(struct radeon_fence *fence);
351int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); 352int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring);
352int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); 353int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring);
353int radeon_fence_wait_any(struct radeon_device *rdev, 354int 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
553int radeon_semaphore_create(struct radeon_device *rdev, 555int radeon_semaphore_create(struct radeon_device *rdev,
554 struct radeon_semaphore **semaphore); 556 struct radeon_semaphore **semaphore);
555void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, 557bool radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring,
556 struct radeon_semaphore *semaphore); 558 struct radeon_semaphore *semaphore);
557void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, 559bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
558 struct radeon_semaphore *semaphore); 560 struct radeon_semaphore *semaphore);
561void radeon_semaphore_sync_to(struct radeon_semaphore *semaphore,
562 struct radeon_fence *fence);
559int radeon_semaphore_sync_rings(struct radeon_device *rdev, 563int 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);
562void radeon_semaphore_free(struct radeon_device *rdev, 566void 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);
923void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib); 926void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib);
924void radeon_ib_sync_to(struct radeon_ib *ib, struct radeon_fence *fence);
925int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib, 927int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
926 struct radeon_ib *const_ib); 928 struct radeon_ib *const_ib);
927int radeon_ib_pool_init(struct radeon_device *rdev); 929int 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);
80int r100_irq_process(struct radeon_device *rdev); 80int r100_irq_process(struct radeon_device *rdev);
81void r100_fence_ring_emit(struct radeon_device *rdev, 81void r100_fence_ring_emit(struct radeon_device *rdev,
82 struct radeon_fence *fence); 82 struct radeon_fence *fence);
83void r100_semaphore_ring_emit(struct radeon_device *rdev, 83bool 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);
313int r600_dma_cs_parse(struct radeon_cs_parser *p); 313int r600_dma_cs_parse(struct radeon_cs_parser *p);
314void r600_fence_ring_emit(struct radeon_device *rdev, 314void r600_fence_ring_emit(struct radeon_device *rdev,
315 struct radeon_fence *fence); 315 struct radeon_fence *fence);
316void r600_semaphore_ring_emit(struct radeon_device *rdev, 316bool 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);
320void r600_dma_fence_ring_emit(struct radeon_device *rdev, 320void r600_dma_fence_ring_emit(struct radeon_device *rdev,
321 struct radeon_fence *fence); 321 struct radeon_fence *fence);
322void r600_dma_semaphore_ring_emit(struct radeon_device *rdev, 322bool 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 */
567void cayman_fence_ring_emit(struct radeon_device *rdev, 567void cayman_fence_ring_emit(struct radeon_device *rdev,
568 struct radeon_fence *fence); 568 struct radeon_fence *fence);
569void cayman_uvd_semaphore_emit(struct radeon_device *rdev,
570 struct radeon_ring *ring,
571 struct radeon_semaphore *semaphore,
572 bool emit_wait);
573void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev); 569void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev);
574int cayman_init(struct radeon_device *rdev); 570int cayman_init(struct radeon_device *rdev);
575void cayman_fini(struct radeon_device *rdev); 571void cayman_fini(struct radeon_device *rdev);
@@ -697,7 +693,7 @@ void cik_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
697int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 693int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
698void cik_sdma_fence_ring_emit(struct radeon_device *rdev, 694void cik_sdma_fence_ring_emit(struct radeon_device *rdev,
699 struct radeon_fence *fence); 695 struct radeon_fence *fence);
700void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, 696bool 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);
718void cik_fence_compute_ring_emit(struct radeon_device *rdev, 714void cik_fence_compute_ring_emit(struct radeon_device *rdev,
719 struct radeon_fence *fence); 715 struct radeon_fence *fence);
720void cik_semaphore_ring_emit(struct radeon_device *rdev, 716bool 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
808int uvd_v1_0_ring_test(struct radeon_device *rdev, struct radeon_ring *ring); 804int uvd_v1_0_ring_test(struct radeon_device *rdev, struct radeon_ring *ring);
809int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring); 805int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring);
810void uvd_v1_0_semaphore_emit(struct radeon_device *rdev, 806bool 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 */
822void uvd_v3_1_semaphore_emit(struct radeon_device *rdev, 818bool 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 */
482int 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 */
119void 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 @@
34int radeon_semaphore_create(struct radeon_device *rdev, 34int 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
56void radeon_semaphore_emit_signal(struct radeon_device *rdev, int ring, 60bool 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
65void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, 77bool 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 */
102void 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 */
75int radeon_semaphore_sync_rings(struct radeon_device *rdev, 124int 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 */
360void uvd_v1_0_semaphore_emit(struct radeon_device *rdev, 360bool 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 */
40void uvd_v3_1_semaphore_emit(struct radeon_device *rdev, 40bool 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}