[PATCH] drm/radeon: Don't turn off DP sink when disconnected
Alex Deucher
alexdeucher at gmail.com
Wed Mar 14 19:35:39 UTC 2018
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
More information about the amd-gfx
mailing list