aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-10-13 13:20:02 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-10-16 18:34:07 -0400
commitadfed2b0587289013f8143c54913ddfd44ac1fd3 (patch)
tree738a650b2b3c88d3a8c5b25315cafa42a1874720 /drivers
parent4910403836ded89803fab201d4b5caaa85de3a89 (diff)
drm/radeon: use gart memory for DMA ring tests
Avoids HDP cache flush issues when using vram which can cause ring test failures on certain boards. Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: Alexander Fyodorov <halcy@yandex.ru> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c21
-rw-r--r--drivers/gpu/drm/radeon/r600_dma.c21
-rw-r--r--drivers/gpu/drm/radeon/radeon.h2
3 files changed, 26 insertions, 18 deletions
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
index c473c9125295..7deb2ef4da32 100644
--- a/drivers/gpu/drm/radeon/cik_sdma.c
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -618,16 +618,19 @@ int cik_sdma_ring_test(struct radeon_device *rdev,
618{ 618{
619 unsigned i; 619 unsigned i;
620 int r; 620 int r;
621 void __iomem *ptr = (void *)rdev->vram_scratch.ptr; 621 unsigned index;
622 u32 tmp; 622 u32 tmp;
623 u64 gpu_addr;
623 624
624 if (!ptr) { 625 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
625 DRM_ERROR("invalid vram scratch pointer\n"); 626 index = R600_WB_DMA_RING_TEST_OFFSET;
626 return -EINVAL; 627 else
627 } 628 index = CAYMAN_WB_DMA1_RING_TEST_OFFSET;
629
630 gpu_addr = rdev->wb.gpu_addr + index;
628 631
629 tmp = 0xCAFEDEAD; 632 tmp = 0xCAFEDEAD;
630 writel(tmp, ptr); 633 rdev->wb.wb[index/4] = cpu_to_le32(tmp);
631 634
632 r = radeon_ring_lock(rdev, ring, 5); 635 r = radeon_ring_lock(rdev, ring, 5);
633 if (r) { 636 if (r) {
@@ -635,14 +638,14 @@ int cik_sdma_ring_test(struct radeon_device *rdev,
635 return r; 638 return r;
636 } 639 }
637 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0)); 640 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
638 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc); 641 radeon_ring_write(ring, lower_32_bits(gpu_addr));
639 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr)); 642 radeon_ring_write(ring, upper_32_bits(gpu_addr));
640 radeon_ring_write(ring, 1); /* number of DWs to follow */ 643 radeon_ring_write(ring, 1); /* number of DWs to follow */
641 radeon_ring_write(ring, 0xDEADBEEF); 644 radeon_ring_write(ring, 0xDEADBEEF);
642 radeon_ring_unlock_commit(rdev, ring, false); 645 radeon_ring_unlock_commit(rdev, ring, false);
643 646
644 for (i = 0; i < rdev->usec_timeout; i++) { 647 for (i = 0; i < rdev->usec_timeout; i++) {
645 tmp = readl(ptr); 648 tmp = le32_to_cpu(rdev->wb.wb[index/4]);
646 if (tmp == 0xDEADBEEF) 649 if (tmp == 0xDEADBEEF)
647 break; 650 break;
648 DRM_UDELAY(1); 651 DRM_UDELAY(1);
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
index a49db830a47f..d9375a361985 100644
--- a/drivers/gpu/drm/radeon/r600_dma.c
+++ b/drivers/gpu/drm/radeon/r600_dma.c
@@ -241,16 +241,19 @@ int r600_dma_ring_test(struct radeon_device *rdev,
241{ 241{
242 unsigned i; 242 unsigned i;
243 int r; 243 int r;
244 void __iomem *ptr = (void *)rdev->vram_scratch.ptr; 244 unsigned index;
245 u32 tmp; 245 u32 tmp;
246 u64 gpu_addr;
246 247
247 if (!ptr) { 248 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
248 DRM_ERROR("invalid vram scratch pointer\n"); 249 index = R600_WB_DMA_RING_TEST_OFFSET;
249 return -EINVAL; 250 else
250 } 251 index = CAYMAN_WB_DMA1_RING_TEST_OFFSET;
252
253 gpu_addr = rdev->wb.gpu_addr + index;
251 254
252 tmp = 0xCAFEDEAD; 255 tmp = 0xCAFEDEAD;
253 writel(tmp, ptr); 256 rdev->wb.wb[index/4] = cpu_to_le32(tmp);
254 257
255 r = radeon_ring_lock(rdev, ring, 4); 258 r = radeon_ring_lock(rdev, ring, 4);
256 if (r) { 259 if (r) {
@@ -258,13 +261,13 @@ int r600_dma_ring_test(struct radeon_device *rdev,
258 return r; 261 return r;
259 } 262 }
260 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1)); 263 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
261 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc); 264 radeon_ring_write(ring, lower_32_bits(gpu_addr));
262 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff); 265 radeon_ring_write(ring, upper_32_bits(gpu_addr) & 0xff);
263 radeon_ring_write(ring, 0xDEADBEEF); 266 radeon_ring_write(ring, 0xDEADBEEF);
264 radeon_ring_unlock_commit(rdev, ring, false); 267 radeon_ring_unlock_commit(rdev, ring, false);
265 268
266 for (i = 0; i < rdev->usec_timeout; i++) { 269 for (i = 0; i < rdev->usec_timeout; i++) {
267 tmp = readl(ptr); 270 tmp = le32_to_cpu(rdev->wb.wb[index/4]);
268 if (tmp == 0xDEADBEEF) 271 if (tmp == 0xDEADBEEF)
269 break; 272 break;
270 DRM_UDELAY(1); 273 DRM_UDELAY(1);
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index e01424fe2848..588672d4fd59 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1132,6 +1132,8 @@ struct radeon_wb {
1132#define R600_WB_EVENT_OFFSET 3072 1132#define R600_WB_EVENT_OFFSET 3072
1133#define CIK_WB_CP1_WPTR_OFFSET 3328 1133#define CIK_WB_CP1_WPTR_OFFSET 3328
1134#define CIK_WB_CP2_WPTR_OFFSET 3584 1134#define CIK_WB_CP2_WPTR_OFFSET 3584
1135#define R600_WB_DMA_RING_TEST_OFFSET 3588
1136#define CAYMAN_WB_DMA1_RING_TEST_OFFSET 3592
1135 1137
1136/** 1138/**
1137 * struct radeon_pm - power management datas 1139 * struct radeon_pm - power management datas