aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/cik.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-01-09 16:51:56 -0500
committerAlex Deucher <alexander.deucher@amd.com>2014-01-20 12:05:15 -0500
commit5d2590673f3e5c0c0ecf496fb48c73e3ee3ee573 (patch)
tree3e6b3f66afc3ec7d5501f6132d79e3ce9ec32037 /drivers/gpu/drm/radeon/cik.c
parentda9e07e6f53eaac4e838bc8c987d87c5769be724 (diff)
drm/radeon/cik: use WAIT_REG_MEM special op for CP HDP flush
This is the preferred flushing method on CIK. Note, this only works on the PFP so the engine bit must be set. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/cik.c')
-rw-r--r--drivers/gpu/drm/radeon/cik.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index c6e31b8f8983..e8ec15dfe5f8 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -3498,16 +3498,37 @@ static void cik_hdp_flush_cp_ring_emit(struct radeon_device *rdev,
3498 int ridx) 3498 int ridx)
3499{ 3499{
3500 struct radeon_ring *ring = &rdev->ring[ridx]; 3500 struct radeon_ring *ring = &rdev->ring[ridx];
3501 u32 ref_and_mask;
3501 3502
3502 /* We should be using the new WAIT_REG_MEM special op packet here 3503 switch (ring->idx) {
3503 * but it causes the CP to hang 3504 case CAYMAN_RING_TYPE_CP1_INDEX:
3504 */ 3505 case CAYMAN_RING_TYPE_CP2_INDEX:
3505 radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3506 default:
3506 radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | 3507 switch (ring->me) {
3507 WRITE_DATA_DST_SEL(0))); 3508 case 0:
3508 radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); 3509 ref_and_mask = CP2 << ring->pipe;
3509 radeon_ring_write(ring, 0); 3510 break;
3510 radeon_ring_write(ring, 0); 3511 case 1:
3512 ref_and_mask = CP6 << ring->pipe;
3513 break;
3514 default:
3515 return;
3516 }
3517 break;
3518 case RADEON_RING_TYPE_GFX_INDEX:
3519 ref_and_mask = CP0;
3520 break;
3521 }
3522
3523 radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
3524 radeon_ring_write(ring, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */
3525 WAIT_REG_MEM_FUNCTION(3) | /* == */
3526 WAIT_REG_MEM_ENGINE(1))); /* pfp */
3527 radeon_ring_write(ring, GPU_HDP_FLUSH_REQ >> 2);
3528 radeon_ring_write(ring, GPU_HDP_FLUSH_DONE >> 2);
3529 radeon_ring_write(ring, ref_and_mask);
3530 radeon_ring_write(ring, ref_and_mask);
3531 radeon_ring_write(ring, 0x20); /* poll interval */
3511} 3532}
3512 3533
3513/** 3534/**