[igt-dev] [PATCH i-g-t v2] tests/kms_chamelium: Make sure we wait for each connectors' hotplug event

Imre Deak imre.deak at intel.com
Thu May 9 12:08:45 UTC 2019


On Thu, May 09, 2019 at 09:25:41AM +0200, Paul Kocialkowski wrote:
> On Wed, 2019-05-08 at 11:24 +0300, Imre Deak wrote:
> > After scheduling an HPD toggle event, make sure that we wait for the
> > hotplug event for each connector that may be sent by the driver.
> > 
> > Depending on the scheduling there could be 1 event or as many events as
> > connectors we scheduled an HPD toggle event on, depending on the timing.
> > So if we don't yet see the expected connector state on a given connector
> > try to wait for an additional hotplug event and reprobe/recheck the
> > state.
> 
> This changes makes good sense to me, so:
> 
> Reviewed-By: Paul Kocialkowski <paul.kocialkowski at bootlin.com>
> 
> And it brings back hard feelings about the hotplug interface we have
> today...

Yes, I was surprised too not find any way to identify which connector(s)
the hotplug event is associated with. We discussed with Ville if it'd
make sense to add a connector ID map to the uevent, but not sure if it'd
be useful outside of this test, or how that would align with Chris'
connector probe state generation idea.

> 
> Cheers,
> 
> Paul
> 
> > v2:
> > - s/igt_assert(x >= y)/igt_assert_lte(y, x)/ to see the actual limits in
> >   the debugging output. (Lyude)
> > 
> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110534
> > Cc: Paul Kocialkowski <paul.kocialkowski at bootlin.com>
> > Cc: Lyude Paul <lyude at redhat.com>
> > Signed-off-by: Imre Deak <imre.deak at intel.com>
> > Reviewed-by: Lyude Paul <lyude at redhat.com>
> > ---
> >  tests/kms_chamelium.c | 45 +++++++++++++++++++++++++++++++++++++------
> >  1 file changed, 39 insertions(+), 6 deletions(-)
> > 
> > diff --git a/tests/kms_chamelium.c b/tests/kms_chamelium.c
> > index 714e5e06..502f1efa 100644
> > --- a/tests/kms_chamelium.c
> > +++ b/tests/kms_chamelium.c
> > @@ -284,11 +284,32 @@ test_edid_read(data_t *data, struct chamelium_port *port,
> >  	drmModeFreeConnector(connector);
> >  }
> >  
> > +/* Wait for hotplug and return the remaining time left from timeout */
> > +static bool wait_for_hotplug(struct udev_monitor *mon, int *timeout)
> > +{
> > +	struct timespec start, end;
> > +	int elapsed;
> > +	bool detected;
> > +
> > +	igt_assert_eq(igt_gettime(&start), 0);
> > +	detected = igt_hotplug_detected(mon, *timeout);
> > +	igt_assert_eq(igt_gettime(&end), 0);
> > +
> > +	elapsed = igt_time_elapsed(&start, &end);
> > +	igt_assert_lte(0, elapsed);
> > +	*timeout = max(0, *timeout - elapsed);
> > +
> > +	return detected;
> > +}
> > +
> >  static void
> >  try_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
> >  		       enum igt_suspend_state state, enum igt_suspend_test test,
> >  		       struct udev_monitor *mon, bool connected)
> >  {
> > +	drmModeConnection target_state = connected ? DRM_MODE_DISCONNECTED :
> > +						     DRM_MODE_CONNECTED;
> > +	int timeout = HOTPLUG_TIMEOUT;
> >  	int delay;
> >  	int p;
> >  
> > @@ -310,17 +331,29 @@ try_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
> >  	}
> >  
> >  	igt_system_suspend_autoresume(state, test);
> > +	igt_assert(wait_for_hotplug(mon, &timeout));
> >  
> > -	igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
> >  	if (port) {
> > -		igt_assert_eq(reprobe_connector(data, port), connected ?
> > -			      DRM_MODE_DISCONNECTED : DRM_MODE_CONNECTED);
> > +		igt_assert_eq(reprobe_connector(data, port), target_state);
> >  	} else {
> >  		for (p = 0; p < data->port_count; p++) {
> > +			drmModeConnection current_state;
> > +
> >  			port = data->ports[p];
> > -			igt_assert_eq(reprobe_connector(data, port), connected ?
> > -				      DRM_MODE_DISCONNECTED :
> > -				      DRM_MODE_CONNECTED);
> > +			/*
> > +			 * There could be as many hotplug events sent by
> > +			 * driver as connectors we scheduled an HPD toggle on
> > +			 * above, depending on timing. So if we're not seeing
> > +			 * the expected connector state try to wait for an HPD
> > +			 * event for each connector/port.
> > +			 */
> > +			current_state = reprobe_connector(data, port);
> > +			if (p > 0 && current_state != target_state) {
> > +				igt_assert(wait_for_hotplug(mon, &timeout));
> > +				current_state = reprobe_connector(data, port);
> > +			}
> > +
> > +			igt_assert_eq(current_state, target_state);
> >  		}
> >  
> >  		port = NULL;
> -- 
> Paul Kocialkowski, Bootlin
> Embedded Linux and kernel engineering
> https://bootlin.com
> 


More information about the igt-dev mailing list