diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 54 | 
1 files changed, 47 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index efd3cf50cb0f..e27e7804c0b9 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -2087,6 +2087,7 @@ void intel_flush_primary_plane(struct drm_i915_private *dev_priv,  static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv,  					  enum plane plane, enum pipe pipe)  { +	struct drm_device *dev = dev_priv->dev;  	struct intel_crtc *intel_crtc =  		to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);  	int reg; @@ -2106,6 +2107,14 @@ static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv,  	I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);  	intel_flush_primary_plane(dev_priv, plane); + +	/* +	 * BDW signals flip done immediately if the plane +	 * is disabled, even if the plane enable is already +	 * armed to occur at the next vblank :( +	 */ +	if (IS_BROADWELL(dev)) +		intel_wait_for_vblank(dev, intel_crtc->pipe);  }  /** @@ -4564,7 +4573,10 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)  	if (intel_crtc->active)  		return; -	vlv_prepare_pll(intel_crtc); +	is_dsi = intel_pipe_has_type(crtc, INTEL_OUTPUT_DSI); + +	if (!is_dsi && !IS_CHERRYVIEW(dev)) +		vlv_prepare_pll(intel_crtc);  	/* Set up the display plane register */  	dspcntr = DISPPLANE_GAMMA_ENABLE; @@ -4598,8 +4610,6 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)  		if (encoder->pre_pll_enable)  			encoder->pre_pll_enable(encoder); -	is_dsi = intel_pipe_has_type(crtc, INTEL_OUTPUT_DSI); -  	if (!is_dsi) {  		if (IS_CHERRYVIEW(dev))  			chv_enable_pll(intel_crtc); @@ -11087,6 +11097,22 @@ const char *intel_output_name(int output)  	return names[output];  } +static bool intel_crt_present(struct drm_device *dev) +{ +	struct drm_i915_private *dev_priv = dev->dev_private; + +	if (IS_ULT(dev)) +		return false; + +	if (IS_CHERRYVIEW(dev)) +		return false; + +	if (IS_VALLEYVIEW(dev) && !dev_priv->vbt.int_crt_support) +		return false; + +	return true; +} +  static void intel_setup_outputs(struct drm_device *dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; @@ -11095,7 +11121,7 @@ static void intel_setup_outputs(struct drm_device *dev)  	intel_lvds_init(dev); -	if (!IS_ULT(dev) && !IS_CHERRYVIEW(dev) && dev_priv->vbt.int_crt_support) +	if (intel_crt_present(dev))  		intel_crt_init(dev);  	if (HAS_DDI(dev)) { @@ -11565,6 +11591,14 @@ static void quirk_invert_brightness(struct drm_device *dev)  	DRM_INFO("applying inverted panel brightness quirk\n");  } +/* Some VBT's incorrectly indicate no backlight is present */ +static void quirk_backlight_present(struct drm_device *dev) +{ +	struct drm_i915_private *dev_priv = dev->dev_private; +	dev_priv->quirks |= QUIRK_BACKLIGHT_PRESENT; +	DRM_INFO("applying backlight present quirk\n"); +} +  struct intel_quirk {  	int device;  	int subsystem_vendor; @@ -11633,6 +11667,12 @@ static struct intel_quirk intel_quirks[] = {  	/* Acer Aspire 5336 */  	{ 0x2a42, 0x1025, 0x048a, quirk_invert_brightness }, + +	/* Acer C720 and C720P Chromebooks (Celeron 2955U) have backlights */ +	{ 0x0a06, 0x1025, 0x0a11, quirk_backlight_present }, + +	/* Toshiba CB35 Chromebook (Celeron 2955U) */ +	{ 0x0a06, 0x1179, 0x0a88, quirk_backlight_present },  };  static void intel_init_quirks(struct drm_device *dev) @@ -12411,8 +12451,8 @@ intel_display_capture_error_state(struct drm_device *dev)  	for_each_pipe(i) {  		error->pipe[i].power_domain_on = -			intel_display_power_enabled_sw(dev_priv, -						       POWER_DOMAIN_PIPE(i)); +			intel_display_power_enabled_unlocked(dev_priv, +							   POWER_DOMAIN_PIPE(i));  		if (!error->pipe[i].power_domain_on)  			continue; @@ -12447,7 +12487,7 @@ intel_display_capture_error_state(struct drm_device *dev)  		enum transcoder cpu_transcoder = transcoders[i];  		error->transcoder[i].power_domain_on = -			intel_display_power_enabled_sw(dev_priv, +			intel_display_power_enabled_unlocked(dev_priv,  				POWER_DOMAIN_TRANSCODER(cpu_transcoder));  		if (!error->transcoder[i].power_domain_on)  			continue;  |