Skip to content

Commit 7a7d58d

Browse files
dhnkrnjlahtine-intel
authored andcommitted
drm/i915/dp: Write to SET_POWER dpcd to enable MST hub.
If bios sets up an MST output and hardware state readout code sees this is an SST configuration, when disabling the encoder we end up calling ->post_disable_dp() hook instead of the MST version. Consequently, we write to the DP_SET_POWER dpcd to set it D3 state. Further along when we try enable the encoder in MST mode, POWER_UP_PHY transaction fails to power up the MST hub. This results in continuous link training failures which keep the system busy delaying boot. We could identify bios MST boot discrepancy and handle it accordingly but a simple way to solve this is to write to the DP_SET_POWER dpcd for MST too. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105470 Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reported-by: Laura Abbott <labbott@redhat.com> Cc: stable@vger.kernel.org Fixes: 5ea2355 ("drm/i915/mst: Use MST sideband message transactions for dpms control") Tested-by: Laura Abbott <labbott@redhat.com> Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180314054825.1718-1-dhinakaran.pandiyan@intel.com (cherry picked from commit ad260ab) Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
1 parent 33d009c commit 7a7d58d

File tree

1 file changed

+2
-5
lines changed

1 file changed

+2
-5
lines changed

drivers/gpu/drm/i915/intel_ddi.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,8 +2205,7 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
22052205
intel_prepare_dp_ddi_buffers(encoder, crtc_state);
22062206

22072207
intel_ddi_init_dp_buf_reg(encoder);
2208-
if (!is_mst)
2209-
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
2208+
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
22102209
intel_dp_start_link_train(intel_dp);
22112210
if (port != PORT_A || INTEL_GEN(dev_priv) >= 9)
22122211
intel_dp_stop_link_train(intel_dp);
@@ -2304,14 +2303,12 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
23042303
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
23052304
struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
23062305
struct intel_dp *intel_dp = &dig_port->dp;
2307-
bool is_mst = intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST);
23082306

23092307
/*
23102308
* Power down sink before disabling the port, otherwise we end
23112309
* up getting interrupts from the sink on detecting link loss.
23122310
*/
2313-
if (!is_mst)
2314-
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
2311+
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
23152312

23162313
intel_disable_ddi_buf(encoder);
23172314

0 commit comments

Comments
 (0)