On Fri, Mar 9, 2018 at 12:27 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 > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> Care to send a similar patch for radeon as well? Alex > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 31 ++++++++++---------------- > 1 file changed, 12 insertions(+), 19 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > index ffc1f6f46913..9da8d5802980 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > @@ -69,25 +69,18 @@ void amdgpu_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 (!amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) { > - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); > - } else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) { > - /* Don't try to start link training before we > - * have the dpcd */ > - if (amdgpu_atombios_dp_get_dpcd(amdgpu_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 && > + amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd) && > + amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) { > + /* Don't start link training before we have the DPCD */ > + if (amdgpu_atombios_dp_get_dpcd(amdgpu_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