aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-20 16:33:59 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-20 16:37:04 -0500
commitbbd440fb81338d8e8d58193867f1404c4e6cef7a (patch)
tree39cc7fa60e1b2bbdd28c9b2e343e403fae46b249
parent99990f1b0b95b3c6056d7d80669ab9a8644fed34 (diff)
drm/i915: Don't rely upon encoder->type for infoframe hw state readout
encoder->type can change underneath us and doesn't need to reflect actual hw state (since we don't construct it from hw state like e.g. encoder->crtc crtc->config). And this can indeed happen: 1) Boot with plugged-in hdmi screen. Since we only set ->type in the probe functions this means we won't detect any infoframes since type is still unkown. 2) First probe sets type to HDMI. 3) If the first modeset now does _not_ happen on the HDMI pipe with infoframes encoder->get_config suddenly sees infoframes and the state checker gets angry. Fix this by only relying on actual hw state when figuring out whether the ddi port is in hdmi mode and sends infoframes. Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Cc: Paulo Zanoni <przanoni@gmail.com> Reported-by: Paulo Zanoni <przanoni@gmail.com> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 24110c96e539..e6b45cd150d3 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2027,6 +2027,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
2027 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; 2027 struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
2028 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); 2028 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
2029 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder; 2029 enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
2030 struct intel_hdmi *intel_hdmi;
2030 u32 temp, flags = 0; 2031 u32 temp, flags = 0;
2031 struct drm_device *dev = dev_priv->dev; 2032 struct drm_device *dev = dev_priv->dev;
2032 2033
@@ -2062,6 +2063,10 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
2062 switch (temp & TRANS_DDI_MODE_SELECT_MASK) { 2063 switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
2063 case TRANS_DDI_MODE_SELECT_HDMI: 2064 case TRANS_DDI_MODE_SELECT_HDMI:
2064 pipe_config->has_hdmi_sink = true; 2065 pipe_config->has_hdmi_sink = true;
2066 intel_hdmi = enc_to_intel_hdmi(&encoder->base);
2067
2068 if (intel_hdmi->infoframe_enabled(&encoder->base))
2069 pipe_config->has_infoframe = true;
2065 break; 2070 break;
2066 case TRANS_DDI_MODE_SELECT_DVI: 2071 case TRANS_DDI_MODE_SELECT_DVI:
2067 case TRANS_DDI_MODE_SELECT_FDI: 2072 case TRANS_DDI_MODE_SELECT_FDI:
@@ -2075,14 +2080,6 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
2075 break; 2080 break;
2076 } 2081 }
2077 2082
2078 if (encoder->type == INTEL_OUTPUT_HDMI) {
2079 struct intel_hdmi *intel_hdmi =
2080 enc_to_intel_hdmi(&encoder->base);
2081
2082 if (intel_hdmi->infoframe_enabled(&encoder->base))
2083 pipe_config->has_infoframe = true;
2084 }
2085
2086 if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) { 2083 if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
2087 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD); 2084 temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
2088 if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe)) 2085 if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))