diff options
author | Rodrigo Vivi <rodrigo.vivi@gmail.com> | 2013-06-06 15:58:16 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-06-07 11:56:55 -0400 |
commit | fd3da6c95b6d865446fa9b29df6edff4343e385a (patch) | |
tree | a6b9c198d259871f9acd94f8760d279f2bf73652 /drivers/gpu/drm/i915/intel_ringbuffer.c | |
parent | c65355bbefaf02d8819a810aacfd566634e3b146 (diff) |
drm/i915: WA: FBC Render Nuke.
WaFbcNukeOn3DBlt for IVB, HSW.
According BSPec: "Workaround: Do not enable Render Command Streamer tracking for FBC.
Instead insert a LRI to address 0x50380 with data 0x00000004 after the PIPE_CONTROL that
follows each render submission."
v2: Chris noticed that flush_domains check was missing here and also suggested to do
LRI only when fbc is enabled. To avoid do a I915_READ on every flush lets use the
module parameter check.
v3: Adding Wa name as Damien suggested.
v4: Ville noticed VLV doesn't support fbc at all and comment came wrong from spec.
v5: Ville noticed than on blt a Cache Clean LRI should be used instead the Nuke one.
v6: Check for flush domain on blt (by Ville).
Check for scanout dirty (by Chris).
v7: Apply proper fbc_dirty implemented by Chris.
v8: remove unused variables.
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 0e72da6ad0fa..1ef081cd1706 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -280,6 +280,27 @@ gen7_render_ring_cs_stall_wa(struct intel_ring_buffer *ring) | |||
280 | return 0; | 280 | return 0; |
281 | } | 281 | } |
282 | 282 | ||
283 | static int gen7_ring_fbc_flush(struct intel_ring_buffer *ring, u32 value) | ||
284 | { | ||
285 | int ret; | ||
286 | |||
287 | if (!ring->fbc_dirty) | ||
288 | return 0; | ||
289 | |||
290 | ret = intel_ring_begin(ring, 4); | ||
291 | if (ret) | ||
292 | return ret; | ||
293 | intel_ring_emit(ring, MI_NOOP); | ||
294 | /* WaFbcNukeOn3DBlt:ivb/hsw */ | ||
295 | intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); | ||
296 | intel_ring_emit(ring, MSG_FBC_REND_STATE); | ||
297 | intel_ring_emit(ring, value); | ||
298 | intel_ring_advance(ring); | ||
299 | |||
300 | ring->fbc_dirty = false; | ||
301 | return 0; | ||
302 | } | ||
303 | |||
283 | static int | 304 | static int |
284 | gen7_render_ring_flush(struct intel_ring_buffer *ring, | 305 | gen7_render_ring_flush(struct intel_ring_buffer *ring, |
285 | u32 invalidate_domains, u32 flush_domains) | 306 | u32 invalidate_domains, u32 flush_domains) |
@@ -336,6 +357,9 @@ gen7_render_ring_flush(struct intel_ring_buffer *ring, | |||
336 | intel_ring_emit(ring, 0); | 357 | intel_ring_emit(ring, 0); |
337 | intel_ring_advance(ring); | 358 | intel_ring_advance(ring); |
338 | 359 | ||
360 | if (flush_domains) | ||
361 | return gen7_ring_fbc_flush(ring, FBC_REND_NUKE); | ||
362 | |||
339 | return 0; | 363 | return 0; |
340 | } | 364 | } |
341 | 365 | ||
@@ -1685,6 +1709,7 @@ gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, | |||
1685 | static int gen6_ring_flush(struct intel_ring_buffer *ring, | 1709 | static int gen6_ring_flush(struct intel_ring_buffer *ring, |
1686 | u32 invalidate, u32 flush) | 1710 | u32 invalidate, u32 flush) |
1687 | { | 1711 | { |
1712 | struct drm_device *dev = ring->dev; | ||
1688 | uint32_t cmd; | 1713 | uint32_t cmd; |
1689 | int ret; | 1714 | int ret; |
1690 | 1715 | ||
@@ -1707,6 +1732,10 @@ static int gen6_ring_flush(struct intel_ring_buffer *ring, | |||
1707 | intel_ring_emit(ring, 0); | 1732 | intel_ring_emit(ring, 0); |
1708 | intel_ring_emit(ring, MI_NOOP); | 1733 | intel_ring_emit(ring, MI_NOOP); |
1709 | intel_ring_advance(ring); | 1734 | intel_ring_advance(ring); |
1735 | |||
1736 | if (IS_GEN7(dev) && flush) | ||
1737 | return gen7_ring_fbc_flush(ring, FBC_REND_CACHE_CLEAN); | ||
1738 | |||
1710 | return 0; | 1739 | return 0; |
1711 | } | 1740 | } |
1712 | 1741 | ||