diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 23 | 
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 4c844c68ec8..8c239f2d6bc 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -3078,8 +3078,11 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,  			return false;  	} -	/* All interlaced capable intel hw wants timings in frames. */ -	drm_mode_set_crtcinfo(adjusted_mode, 0); +	/* All interlaced capable intel hw wants timings in frames. Note though +	 * that intel_lvds_mode_fixup does some funny tricks with the crtc +	 * timings, so we need to be careful not to clobber these.*/ +	if (!(adjusted_mode->private_flags & INTEL_MODE_CRTC_TIMINGS_SET)) +		drm_mode_set_crtcinfo(adjusted_mode, 0);  	return true;  } @@ -5385,9 +5388,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)  	struct drm_device *dev = crtc->dev;  	drm_i915_private_t *dev_priv = dev->dev_private;  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); -	int pipe = intel_crtc->pipe; -	int dpll_reg = DPLL(pipe); -	int dpll = I915_READ(dpll_reg);  	if (HAS_PCH_SPLIT(dev))  		return; @@ -5400,10 +5400,15 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)  	 * the manual case.  	 */  	if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) { +		int pipe = intel_crtc->pipe; +		int dpll_reg = DPLL(pipe); +		int dpll; +  		DRM_DEBUG_DRIVER("downclocking LVDS\n");  		assert_panel_unlocked(dev_priv, pipe); +		dpll = I915_READ(dpll_reg);  		dpll |= DISPLAY_RATE_SELECT_FPA1;  		I915_WRITE(dpll_reg, dpll);  		intel_wait_for_vblank(dev, pipe); @@ -5793,7 +5798,13 @@ static int intel_gen6_queue_flip(struct drm_device *dev,  	OUT_RING(fb->pitches[0] | obj->tiling_mode);  	OUT_RING(obj->gtt_offset); -	pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE; +	/* Contrary to the suggestions in the documentation, +	 * "Enable Panel Fitter" does not seem to be required when page +	 * flipping with a non-native mode, and worse causes a normal +	 * modeset to fail. +	 * pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE; +	 */ +	pf = 0;  	pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;  	OUT_RING(pf | pipesrc);  	ADVANCE_LP_RING();  |