diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 28 | 
1 files changed, 21 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index fd7fb6a6a9a..1bbf7071e0c 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -3724,6 +3724,26 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)  		encoder->enable(encoder);  } +static void i9xx_pfit_disable(struct intel_crtc *crtc) +{ +	struct drm_device *dev = crtc->base.dev; +	struct drm_i915_private *dev_priv = dev->dev_private; +	enum pipe pipe; +	uint32_t pctl = I915_READ(PFIT_CONTROL); + +	assert_pipe_disabled(dev_priv, crtc->pipe); + +	if (INTEL_INFO(dev)->gen >= 4) +		pipe = (pctl & PFIT_PIPE_MASK) >> PFIT_PIPE_SHIFT; +	else +		pipe = PIPE_B; + +	if (pipe == crtc->pipe) { +		DRM_DEBUG_DRIVER("disabling pfit, current: 0x%08x\n", pctl); +		I915_WRITE(PFIT_CONTROL, 0); +	} +} +  static void i9xx_crtc_disable(struct drm_crtc *crtc)  {  	struct drm_device *dev = crtc->dev; @@ -3732,8 +3752,6 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)  	struct intel_encoder *encoder;  	int pipe = intel_crtc->pipe;  	int plane = intel_crtc->plane; -	u32 pctl; -  	if (!intel_crtc->active)  		return; @@ -3753,11 +3771,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)  	intel_disable_plane(dev_priv, plane, pipe);  	intel_disable_pipe(dev_priv, pipe); -	/* Disable pannel fitter if it is on this pipe. */ -	pctl = I915_READ(PFIT_CONTROL); -	if ((pctl & PFIT_ENABLE) && -	    ((pctl & PFIT_PIPE_MASK) >> PFIT_PIPE_SHIFT) == pipe) -		I915_WRITE(PFIT_CONTROL, 0); +	i9xx_pfit_disable(intel_crtc);  	intel_disable_pll(dev_priv, pipe);  |