[PATCH] drm/radeon: Don't turn off DP sink when disconnected

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux