aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2011-10-26 11:41:22 -0400
committerDave Airlie <airlied@redhat.com>2011-11-01 12:02:07 -0400
commit77b1bad423599c9841ea282a82172f039bb2ff92 (patch)
tree289bc45bf7cd81361ac2a8aa97a0ef44e6a57cf9 /drivers/gpu
parent8ab250d4484b72ccc78e34276c5ffa84c1d41303 (diff)
drm/radeon: flush read cache for gtt with fence on r6xx and newer GPU V3
Cayman seems to be particularly sensitive to read cache returning old data after bind/unbind to GTT. Flush read cache for GTT range with each fences for all new hw. Should fix several rendering glitches. Like V2 flush whole address space V3 also flush shader read cache https://bugs.freedesktop.org/show_bug.cgi?id=40221 https://bugs.freedesktop.org/show_bug.cgi?id=38022 https://bugzilla.redhat.com/show_bug.cgi?id=738790 Signed-off-by: Jerome Glisse <jglisse@redhat.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/evergreen_blit_kms.c4
-rw-r--r--drivers/gpu/drm/radeon/r600.c16
-rw-r--r--drivers/gpu/drm/radeon/r600_blit_kms.c4
3 files changed, 20 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
index 551e76f283f7..914e5af84163 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -625,9 +625,9 @@ int evergreen_blit_init(struct radeon_device *rdev)
625 rdev->r600_blit.primitives.set_default_state = set_default_state; 625 rdev->r600_blit.primitives.set_default_state = set_default_state;
626 626
627 rdev->r600_blit.ring_size_common = 55; /* shaders + def state */ 627 rdev->r600_blit.ring_size_common = 55; /* shaders + def state */
628 rdev->r600_blit.ring_size_common += 10; /* fence emit for VB IB */ 628 rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
629 rdev->r600_blit.ring_size_common += 5; /* done copy */ 629 rdev->r600_blit.ring_size_common += 5; /* done copy */
630 rdev->r600_blit.ring_size_common += 10; /* fence emit for done copy */ 630 rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
631 631
632 rdev->r600_blit.ring_size_per_loop = 74; 632 rdev->r600_blit.ring_size_per_loop = 74;
633 if (rdev->family >= CHIP_CAYMAN) 633 if (rdev->family >= CHIP_CAYMAN)
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 12470b090ddf..1f007adc2723 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2331,6 +2331,14 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
2331 if (rdev->wb.use_event) { 2331 if (rdev->wb.use_event) {
2332 u64 addr = rdev->wb.gpu_addr + R600_WB_EVENT_OFFSET + 2332 u64 addr = rdev->wb.gpu_addr + R600_WB_EVENT_OFFSET +
2333 (u64)(rdev->fence_drv.scratch_reg - rdev->scratch.reg_base); 2333 (u64)(rdev->fence_drv.scratch_reg - rdev->scratch.reg_base);
2334 /* flush read cache over gart */
2335 radeon_ring_write(rdev, PACKET3(PACKET3_SURFACE_SYNC, 3));
2336 radeon_ring_write(rdev, PACKET3_TC_ACTION_ENA |
2337 PACKET3_VC_ACTION_ENA |
2338 PACKET3_SH_ACTION_ENA);
2339 radeon_ring_write(rdev, 0xFFFFFFFF);
2340 radeon_ring_write(rdev, 0);
2341 radeon_ring_write(rdev, 10); /* poll interval */
2334 /* EVENT_WRITE_EOP - flush caches, send int */ 2342 /* EVENT_WRITE_EOP - flush caches, send int */
2335 radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 2343 radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
2336 radeon_ring_write(rdev, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5)); 2344 radeon_ring_write(rdev, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
@@ -2339,6 +2347,14 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
2339 radeon_ring_write(rdev, fence->seq); 2347 radeon_ring_write(rdev, fence->seq);
2340 radeon_ring_write(rdev, 0); 2348 radeon_ring_write(rdev, 0);
2341 } else { 2349 } else {
2350 /* flush read cache over gart */
2351 radeon_ring_write(rdev, PACKET3(PACKET3_SURFACE_SYNC, 3));
2352 radeon_ring_write(rdev, PACKET3_TC_ACTION_ENA |
2353 PACKET3_VC_ACTION_ENA |
2354 PACKET3_SH_ACTION_ENA);
2355 radeon_ring_write(rdev, 0xFFFFFFFF);
2356 radeon_ring_write(rdev, 0);
2357 radeon_ring_write(rdev, 10); /* poll interval */
2342 radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE, 0)); 2358 radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE, 0));
2343 radeon_ring_write(rdev, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0)); 2359 radeon_ring_write(rdev, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0));
2344 /* wait for 3D idle clean */ 2360 /* wait for 3D idle clean */
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
index ff36532734b7..e09d2818f949 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -503,9 +503,9 @@ int r600_blit_init(struct radeon_device *rdev)
503 rdev->r600_blit.primitives.set_default_state = set_default_state; 503 rdev->r600_blit.primitives.set_default_state = set_default_state;
504 504
505 rdev->r600_blit.ring_size_common = 40; /* shaders + def state */ 505 rdev->r600_blit.ring_size_common = 40; /* shaders + def state */
506 rdev->r600_blit.ring_size_common += 10; /* fence emit for VB IB */ 506 rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
507 rdev->r600_blit.ring_size_common += 5; /* done copy */ 507 rdev->r600_blit.ring_size_common += 5; /* done copy */
508 rdev->r600_blit.ring_size_common += 10; /* fence emit for done copy */ 508 rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
509 509
510 rdev->r600_blit.ring_size_per_loop = 76; 510 rdev->r600_blit.ring_size_per_loop = 76;
511 /* set_render_target emits 2 extra dwords on rv6xx */ 511 /* set_render_target emits 2 extra dwords on rv6xx */