On Wed, Mar 14, 2018 at 1:15 PM, Michel Dänzer <michel at daenzer.net> wrote: > From: Michel Dänzer <michel.daenzer at amd.com> > > Turning off the sink in this case causes various issues, because > userspace expects it to stay on until it turns it off explicitly. > > Instead, turn the sink off and back on when a display is connected > again. This dance seems necessary for link training to work correctly. > > Bugzilla: https://bugs.freedesktop.org/105308 > Cc: stable at vger.kernel.org > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/radeon/radeon_connectors.c | 31 ++++++++++++------------------ > 1 file changed, 12 insertions(+), 19 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c > index 5012f5e47a1e..b108eaabb6df 100644 > --- a/drivers/gpu/drm/radeon/radeon_connectors.c > +++ b/drivers/gpu/drm/radeon/radeon_connectors.c > @@ -90,25 +90,18 @@ void radeon_connector_hotplug(struct drm_connector *connector) > /* don't do anything if sink is not display port, i.e., > * passive dp->(dvi|hdmi) adaptor > */ > - if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { > - int saved_dpms = connector->dpms; > - /* Only turn off the display if it's physically disconnected */ > - if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { > - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); > - } else if (radeon_dp_needs_link_train(radeon_connector)) { > - /* Don't try to start link training before we > - * have the dpcd */ > - if (!radeon_dp_getdpcd(radeon_connector)) > - return; > - > - /* set it to OFF so that drm_helper_connector_dpms() > - * won't return immediately since the current state > - * is ON at this point. > - */ > - connector->dpms = DRM_MODE_DPMS_OFF; > - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); > - } > - connector->dpms = saved_dpms; > + if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT && > + radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) && > + radeon_dp_needs_link_train(radeon_connector)) { > + /* Don't start link training before we have the DPCD */ > + if (!radeon_dp_getdpcd(radeon_connector)) > + return; > + > + /* Turn the connector off and back on immediately, which > + * will trigger link training > + */ > + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); > + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); > } > } > } > -- > 2.16.2 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx