diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-11-07 13:43:37 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-11-08 12:33:37 -0500 |
commit | d45fd24dd30a791ba0739a1d3c4fd29710d94b9f (patch) | |
tree | cff2011d707db452b0a6d6b92676ec7079759f0e | |
parent | 520a8718fe1bb03a8fb58bfe1b0c0ca083a381cc (diff) |
drm/radeon: use HDP_MEM_COHERENCY_FLUSH_CNTL for sdma as well
The new HDP flush method doesn't seem to work reliably on
sDMA either, so use the old method here too.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 40 |
1 files changed, 12 insertions, 28 deletions
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 8d84ebe2b6fa..9c9529de20ee 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
@@ -102,14 +102,6 @@ void cik_sdma_fence_ring_emit(struct radeon_device *rdev, | |||
102 | { | 102 | { |
103 | struct radeon_ring *ring = &rdev->ring[fence->ring]; | 103 | struct radeon_ring *ring = &rdev->ring[fence->ring]; |
104 | u64 addr = rdev->fence_drv[fence->ring].gpu_addr; | 104 | u64 addr = rdev->fence_drv[fence->ring].gpu_addr; |
105 | u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(1) | | ||
106 | SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */ | ||
107 | u32 ref_and_mask; | ||
108 | |||
109 | if (fence->ring == R600_RING_TYPE_DMA_INDEX) | ||
110 | ref_and_mask = SDMA0; | ||
111 | else | ||
112 | ref_and_mask = SDMA1; | ||
113 | 105 | ||
114 | /* write the fence */ | 106 | /* write the fence */ |
115 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_FENCE, 0, 0)); | 107 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_FENCE, 0, 0)); |
@@ -119,12 +111,12 @@ void cik_sdma_fence_ring_emit(struct radeon_device *rdev, | |||
119 | /* generate an interrupt */ | 111 | /* generate an interrupt */ |
120 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0)); | 112 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0)); |
121 | /* flush HDP */ | 113 | /* flush HDP */ |
122 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits)); | 114 | /* We should be using the new POLL_REG_MEM special op packet here |
123 | radeon_ring_write(ring, GPU_HDP_FLUSH_DONE); | 115 | * but it causes sDMA to hang sometimes |
124 | radeon_ring_write(ring, GPU_HDP_FLUSH_REQ); | 116 | */ |
125 | radeon_ring_write(ring, ref_and_mask); /* REFERENCE */ | 117 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
126 | radeon_ring_write(ring, ref_and_mask); /* MASK */ | 118 | radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); |
127 | radeon_ring_write(ring, (4 << 16) | 10); /* RETRY_COUNT, POLL_INTERVAL */ | 119 | radeon_ring_write(ring, 0); |
128 | } | 120 | } |
129 | 121 | ||
130 | /** | 122 | /** |
@@ -720,18 +712,10 @@ void cik_sdma_vm_set_page(struct radeon_device *rdev, | |||
720 | void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) | 712 | void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) |
721 | { | 713 | { |
722 | struct radeon_ring *ring = &rdev->ring[ridx]; | 714 | struct radeon_ring *ring = &rdev->ring[ridx]; |
723 | u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(1) | | ||
724 | SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */ | ||
725 | u32 ref_and_mask; | ||
726 | 715 | ||
727 | if (vm == NULL) | 716 | if (vm == NULL) |
728 | return; | 717 | return; |
729 | 718 | ||
730 | if (ridx == R600_RING_TYPE_DMA_INDEX) | ||
731 | ref_and_mask = SDMA0; | ||
732 | else | ||
733 | ref_and_mask = SDMA1; | ||
734 | |||
735 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 719 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
736 | if (vm->id < 8) { | 720 | if (vm->id < 8) { |
737 | radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2); | 721 | radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2); |
@@ -766,12 +750,12 @@ void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm | |||
766 | radeon_ring_write(ring, VMID(0)); | 750 | radeon_ring_write(ring, VMID(0)); |
767 | 751 | ||
768 | /* flush HDP */ | 752 | /* flush HDP */ |
769 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits)); | 753 | /* We should be using the new POLL_REG_MEM special op packet here |
770 | radeon_ring_write(ring, GPU_HDP_FLUSH_DONE); | 754 | * but it causes sDMA to hang sometimes |
771 | radeon_ring_write(ring, GPU_HDP_FLUSH_REQ); | 755 | */ |
772 | radeon_ring_write(ring, ref_and_mask); /* REFERENCE */ | 756 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |
773 | radeon_ring_write(ring, ref_and_mask); /* MASK */ | 757 | radeon_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL >> 2); |
774 | radeon_ring_write(ring, (4 << 16) | 10); /* RETRY_COUNT, POLL_INTERVAL */ | 758 | radeon_ring_write(ring, 0); |
775 | 759 | ||
776 | /* flush TLB */ | 760 | /* flush TLB */ |
777 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); | 761 | radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000)); |