aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
authorDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>2017-10-03 10:22:11 -0400
committerJani Nikula <jani.nikula@intel.com>2017-10-05 01:38:17 -0400
commit5ea2355a100a3c6304901d058aee06d3a6be69bc (patch)
treee85c57fc1d8e15cbdd7f170b0b3612b9520e5ea5 /drivers/gpu/drm/i915/intel_dp_mst.c
parentac14fbd460d0ec16e7750e40dcd8199b0ff83d0a (diff)
drm/i915/mst: Use MST sideband message transactions for dpms control
Use the POWER_DOWN_PHY and POWER_UP_PHY sideband message transactions to set power states for downstream sinks. Apart from giving us the ability to set power state for individual sinks, this fixes the below test for me. $ xrandr --display :0 --output DP-2-2-8 --off $ xrandr --display :0 --output DP-2-2-1 --off $ xrandr --display :0 --output DP-2-2-8 --auto #Black screen $ xrandr --display :0 --output DP-2-2-1 --auto v2: Modify and document the dpms and port disable order (Ville) Add comment explaining is_mst = !crtc_state equivalence(Ville, Maarten) v3 by Jani: rebase References: https://bugs.freedesktop.org/show_bug.cgi?id=90963 References: https://bugs.freedesktop.org/show_bug.cgi?id=88124 Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Lyude <lyude@redhat.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Acked-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.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/20171003142211.860-1-jani.nikula@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 9a396f483f8b..3c131e2544cf 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -162,14 +162,19 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
162 162
163 drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, connector->port); 163 drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, connector->port);
164 164
165 /*
166 * Power down mst path before disabling the port, otherwise we end
167 * up getting interrupts from the sink upon detecting link loss.
168 */
169 drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port,
170 false);
171
165 intel_dp->active_mst_links--; 172 intel_dp->active_mst_links--;
166 173
167 intel_mst->connector = NULL; 174 intel_mst->connector = NULL;
168 if (intel_dp->active_mst_links == 0) { 175 if (intel_dp->active_mst_links == 0) {
169 intel_dig_port->base.post_disable(&intel_dig_port->base, 176 intel_dig_port->base.post_disable(&intel_dig_port->base,
170 NULL, NULL); 177 NULL, NULL);
171
172 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
173 } 178 }
174 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links); 179 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
175} 180}
@@ -196,6 +201,7 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
196 201
197 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links); 202 DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
198 203
204 drm_dp_send_power_updown_phy(&intel_dp->mst_mgr, connector->port, true);
199 if (intel_dp->active_mst_links == 0) 205 if (intel_dp->active_mst_links == 0)
200 intel_dig_port->base.pre_enable(&intel_dig_port->base, 206 intel_dig_port->base.pre_enable(&intel_dig_port->base,
201 pipe_config, NULL); 207 pipe_config, NULL);