aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-11-07 13:43:37 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-11-08 12:33:37 -0500
commitd45fd24dd30a791ba0739a1d3c4fd29710d94b9f (patch)
treecff2011d707db452b0a6d6b92676ec7079759f0e
parent520a8718fe1bb03a8fb58bfe1b0c0ca083a381cc (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.c40
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,
720void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm) 712void 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));