aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r600_dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/r600_dma.c')
-rw-r--r--drivers/gpu/drm/radeon/r600_dma.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
index 100189ec5fa8..cf0df45d455e 100644
--- a/drivers/gpu/drm/radeon/r600_dma.c
+++ b/drivers/gpu/drm/radeon/r600_dma.c
@@ -232,16 +232,19 @@ int r600_dma_ring_test(struct radeon_device *rdev,
232{ 232{
233 unsigned i; 233 unsigned i;
234 int r; 234 int r;
235 void __iomem *ptr = (void *)rdev->vram_scratch.ptr; 235 unsigned index;
236 u32 tmp; 236 u32 tmp;
237 u64 gpu_addr;
237 238
238 if (!ptr) { 239 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
239 DRM_ERROR("invalid vram scratch pointer\n"); 240 index = R600_WB_DMA_RING_TEST_OFFSET;
240 return -EINVAL; 241 else
241 } 242 index = CAYMAN_WB_DMA1_RING_TEST_OFFSET;
243
244 gpu_addr = rdev->wb.gpu_addr + index;
242 245
243 tmp = 0xCAFEDEAD; 246 tmp = 0xCAFEDEAD;
244 writel(tmp, ptr); 247 rdev->wb.wb[index/4] = cpu_to_le32(tmp);
245 248
246 r = radeon_ring_lock(rdev, ring, 4); 249 r = radeon_ring_lock(rdev, ring, 4);
247 if (r) { 250 if (r) {
@@ -249,13 +252,13 @@ int r600_dma_ring_test(struct radeon_device *rdev,
249 return r; 252 return r;
250 } 253 }
251 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1)); 254 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
252 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc); 255 radeon_ring_write(ring, lower_32_bits(gpu_addr));
253 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff); 256 radeon_ring_write(ring, upper_32_bits(gpu_addr) & 0xff);
254 radeon_ring_write(ring, 0xDEADBEEF); 257 radeon_ring_write(ring, 0xDEADBEEF);
255 radeon_ring_unlock_commit(rdev, ring, false); 258 radeon_ring_unlock_commit(rdev, ring, false);
256 259
257 for (i = 0; i < rdev->usec_timeout; i++) { 260 for (i = 0; i < rdev->usec_timeout; i++) {
258 tmp = readl(ptr); 261 tmp = le32_to_cpu(rdev->wb.wb[index/4]);
259 if (tmp == 0xDEADBEEF) 262 if (tmp == 0xDEADBEEF)
260 break; 263 break;
261 DRM_UDELAY(1); 264 DRM_UDELAY(1);
@@ -335,17 +338,17 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
335{ 338{
336 struct radeon_ib ib; 339 struct radeon_ib ib;
337 unsigned i; 340 unsigned i;
341 unsigned index;
338 int r; 342 int r;
339 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
340 u32 tmp = 0; 343 u32 tmp = 0;
344 u64 gpu_addr;
341 345
342 if (!ptr) { 346 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
343 DRM_ERROR("invalid vram scratch pointer\n"); 347 index = R600_WB_DMA_RING_TEST_OFFSET;
344 return -EINVAL; 348 else
345 } 349 index = CAYMAN_WB_DMA1_RING_TEST_OFFSET;
346 350
347 tmp = 0xCAFEDEAD; 351 gpu_addr = rdev->wb.gpu_addr + index;
348 writel(tmp, ptr);
349 352
350 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256); 353 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
351 if (r) { 354 if (r) {
@@ -354,8 +357,8 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
354 } 357 }
355 358
356 ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1); 359 ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1);
357 ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc; 360 ib.ptr[1] = lower_32_bits(gpu_addr);
358 ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff; 361 ib.ptr[2] = upper_32_bits(gpu_addr) & 0xff;
359 ib.ptr[3] = 0xDEADBEEF; 362 ib.ptr[3] = 0xDEADBEEF;
360 ib.length_dw = 4; 363 ib.length_dw = 4;
361 364
@@ -371,7 +374,7 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
371 return r; 374 return r;
372 } 375 }
373 for (i = 0; i < rdev->usec_timeout; i++) { 376 for (i = 0; i < rdev->usec_timeout; i++) {
374 tmp = readl(ptr); 377 tmp = le32_to_cpu(rdev->wb.wb[index/4]);
375 if (tmp == 0xDEADBEEF) 378 if (tmp == 0xDEADBEEF)
376 break; 379 break;
377 DRM_UDELAY(1); 380 DRM_UDELAY(1);