On Wed, Jan 21, 2015 at 2:45 AM, Daniel Vetter <daniel.vetter@xxxxxxxx> 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@xxxxxxxxxxx> > Cc: Alex Deucher <alexander.deucher@xxxxxxx> > Reviewed-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > Cc: Rob Clark <robdclark@xxxxxxxxx> > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxx> Reviewed-by: Rob Clark <robdclark@xxxxxxxxx> > --- > 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 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel