[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