diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-01-20 16:11:20 +0000 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-01-23 00:58:22 +0100 | 
| commit | 1c8c38c588ea91f8deeae21284840459d1bb58e3 (patch) | |
| tree | d712ba6c0702c7950e540d40608c584c8e64312e /drivers/gpu/drm/i915/intel_ringbuffer.c | |
| parent | 014b34409fb2015f63663b6cafdf557fdf289628 (diff) | |
| download | olio-linux-3.10-1c8c38c588ea91f8deeae21284840459d1bb58e3.tar.xz olio-linux-3.10-1c8c38c588ea91f8deeae21284840459d1bb58e3.zip  | |
drm/i915: Disable AsyncFlip performance optimisations
This is a required workarounds for all products, especially on gen6+
where it causes the command streamer to fail to parse instructions
following a WAIT_FOR_EVENT. We use WAIT_FOR_EVENT for synchronising
between the GPU and the display engines, and so this bit being unset may
cause hangs.
References: https://bugzilla.kernel.org/show_bug.cgi?id=52311
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@vger.kernel.org
Reviewed-by: Imre Deak <imre.deak@intel.com>
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 | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index ae253e04c39..1f46a8bf2b0 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -505,13 +505,20 @@ static int init_render_ring(struct intel_ring_buffer *ring)  	struct drm_i915_private *dev_priv = dev->dev_private;  	int ret = init_ring_common(ring); -	if (INTEL_INFO(dev)->gen > 3) { +	if (INTEL_INFO(dev)->gen > 3)  		I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(VS_TIMER_DISPATCH)); -		if (IS_GEN7(dev)) -			I915_WRITE(GFX_MODE_GEN7, -				   _MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) | -				   _MASKED_BIT_ENABLE(GFX_REPLAY_MODE)); -	} + +	/* We need to disable the AsyncFlip performance optimisations in order +	 * to use MI_WAIT_FOR_EVENT within the CS. It should already be +	 * programmed to '1' on all products. +	 */ +	if (INTEL_INFO(dev)->gen >= 6) +		I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE)); + +	if (IS_GEN7(dev)) +		I915_WRITE(GFX_MODE_GEN7, +			   _MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) | +			   _MASKED_BIT_ENABLE(GFX_REPLAY_MODE));  	if (INTEL_INFO(dev)->gen >= 5) {  		ret = init_pipe_control(ring);  |