[PATCH 2/2] drm/probe-helper: clamp unknown connector status in the poll work

Rob Clark robdclark at gmail.com
Wed Jan 21 13:43:04 PST 2015


On Wed, Jan 21, 2015 at 2:45 AM, Daniel Vetter <daniel.vetter at ffwll.ch> wrote:
> On some chipset we try to avoid possibly invasive output detection
> methods (like load detect which can cause flickering elsewhere) in the
> output poll work. Drivers could hence return unknown when a previous
> full ->detect call returned a different state.
>
> This change will generate a hotplug event, forcing userspace to do a
> full scan. This in turn updates the connector->status field so that we
> will _again_ get a state change when the hotplug work re-runs in 10
> seconds.
>
> To avoid this ping-pong loop detect this situation and clamp the
> connector state to the old value.
>
> Patch is inspired by a patch from Knut Peterson. Knut's patch
> completely ignored connector state changes if either the old or new
> status was unknown, which seemed to be a bit too agressive to me.
>
> v2: Rebased onto the drm_probe_helper.c extraction.
>
> References: http://lists.freedesktop.org/archives/dri-devel/2012-August/025975.html
> Cc: Knut Petersen <Knut_Petersen at t-online.de>
> Cc: Alex Deucher <alexander.deucher at amd.com>
> Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
> Acked-by: Alex Deucher <alexander.deucher at amd.com>
> Cc: Rob Clark <robdclark at gmail.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Reviewed-by: Rob Clark <robdclark at gmail.com>

> ---
>  drivers/gpu/drm/drm_probe_helper.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
> index be9eca7f41d2..776a48c5de74 100644
> --- a/drivers/gpu/drm/drm_probe_helper.c
> +++ b/drivers/gpu/drm/drm_probe_helper.c
> @@ -334,6 +334,24 @@ static void output_poll_execute(struct work_struct *work)
>                 if (old_status != connector->status) {
>                         const char *old, *new;
>
> +                       /*
> +                        * The poll work sets force=false when calling detect so
> +                        * that drivers can avoid to do disruptive tests (e.g.
> +                        * when load detect cycles could cause flickering on
> +                        * other, running displays). This bears the risk that we
> +                        * flip-flop between unknown here in the poll work and
> +                        * the real state when userspace forces a full detect
> +                        * call after receiving a hotplug event due to this
> +                        * change.
> +                        *
> +                        * Hence clamp an unknown detect status to the old
> +                        * value.
> +                        */
> +                       if (connector->status == connector_status_unknown) {
> +                               connector->status = old_status;
> +                               continue;
> +                       }
> +
>                         old = drm_get_connector_status_name(old_status);
>                         new = drm_get_connector_status_name(connector->status);
>
> --
> 2.1.4
>


More information about the dri-devel mailing list