diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2014-01-09 16:51:56 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-01-20 12:05:15 -0500 |
commit | 5d2590673f3e5c0c0ecf496fb48c73e3ee3ee573 (patch) | |
tree | 3e6b3f66afc3ec7d5501f6132d79e3ce9ec32037 /drivers/gpu/drm/radeon/cik.c | |
parent | da9e07e6f53eaac4e838bc8c987d87c5769be724 (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.c | 39 |
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 | /** |