On Mon, 2017-06-19 at 12:39 +0300, Paul Kocialkowski wrote: > This adds two new tests: common-hpd-after-suspend and > common-hpd-after-hibernate that are aimed at testing HPD change > during > suspend/hibernate for both DP and HDMI, at the same time. > > The interest in bringing this test up is to reduce the time spent in > testing, with the downside of less precision regarding the test's > outcome. The per-connector tests are still available to get a more > precise idea of which connector causes a failure, when that happens. > > VGA is explicitly excluded from this test as there is currently no > way of doing delayed hpd pulses for it. > > The generic hpd suspend/resume test code is split in a dedicated > function, that allow testing one or all possible ports. > > Signed-off-by: Paul Kocialkowski <paul.kocialkowski@xxxxxxxxxxxxxxx> Reviewed-by: Lyude Paul <lyude@xxxxxxxxxx> Will push to git in just a little bit, thanks! > --- > tests/chamelium.c | 118 > +++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 100 insertions(+), 18 deletions(-) > > diff --git a/tests/chamelium.c b/tests/chamelium.c > index 76b14e95..3cf9f3b5 100644 > --- a/tests/chamelium.c > +++ b/tests/chamelium.c > @@ -143,8 +143,18 @@ wait_for_connector(data_t *data, struct > chamelium_port *port, > static void > reset_state(data_t *data, struct chamelium_port *port) > { > + int p; > + > chamelium_reset(data->chamelium); > - wait_for_connector(data, port, DRM_MODE_DISCONNECTED); > + > + if (port) { > + wait_for_connector(data, port, > DRM_MODE_DISCONNECTED); > + } else { > + for (p = 0; p < data->port_count; p++) { > + port = data->ports[p]; > + wait_for_connector(data, port, > DRM_MODE_DISCONNECTED); > + } > + } > } > > static void > @@ -206,36 +216,96 @@ test_edid_read(data_t *data, struct > chamelium_port *port, > } > > static void > -test_suspend_resume_hpd(data_t *data, struct chamelium_port *port, > - enum igt_suspend_state state, > - enum igt_suspend_test test) > +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) > { > - struct udev_monitor *mon = igt_watch_hotplug(); > - > - reset_state(data, port); > + int p; > > igt_set_autoresume_delay(SUSPEND_RESUME_DELAY); > igt_flush_hotplugs(mon); > > - /* Make sure we notice new connectors after resuming */ > - chamelium_async_hpd_pulse_start(data->chamelium, port, > false, > - SUSPEND_RESUME_DELAY / 2); > + if (port) { > + chamelium_async_hpd_pulse_start(data->chamelium, > port, > + connected, > + SUSPEND_RESUME_DELAY > / 2); > + } else { > + for (p = 0; p < data->port_count; p++) { > + port = data->ports[p]; > + if (chamelium_port_get_type(port) == > DRM_MODE_CONNECTOR_VGA) > + continue; > + > + chamelium_async_hpd_pulse_start(data- > >chamelium, port, > + connected, > + SUSPEND_RESU > ME_DELAY / 2); > + } > + > + port = NULL; > + } > + > igt_system_suspend_autoresume(state, test); > chamelium_async_hpd_pulse_finish(data->chamelium); > > igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT)); > - igt_assert_eq(reprobe_connector(data, port), > DRM_MODE_CONNECTED); > + if (port) { > + igt_assert_eq(reprobe_connector(data, port), > connected ? > + DRM_MODE_DISCONNECTED : > DRM_MODE_CONNECTED); > + } else { > + for (p = 0; p < data->port_count; p++) { > + port = data->ports[p]; > + if (chamelium_port_get_type(port) == > DRM_MODE_CONNECTOR_VGA) > + continue; > + > + igt_assert_eq(reprobe_connector(data, port), > connected ? > + DRM_MODE_DISCONNECTED : > + DRM_MODE_CONNECTED); > + } > > - igt_flush_hotplugs(mon); > + port = NULL; > + } > +} > + > +static void > +test_suspend_resume_hpd(data_t *data, struct chamelium_port *port, > + enum igt_suspend_state state, > + enum igt_suspend_test test) > +{ > + struct udev_monitor *mon = igt_watch_hotplug(); > + > + reset_state(data, port); > + > + /* Make sure we notice new connectors after resuming */ > + try_suspend_resume_hpd(data, port, state, test, mon, false); > > /* Now make sure we notice disconnected connectors after > resuming */ > - chamelium_async_hpd_pulse_start(data->chamelium, port, true, > - SUSPEND_RESUME_DELAY / 2); > - igt_system_suspend_autoresume(state, test); > - chamelium_async_hpd_pulse_finish(data->chamelium); > + try_suspend_resume_hpd(data, port, state, test, mon, true); > > - igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT)); > - igt_assert_eq(reprobe_connector(data, port), > DRM_MODE_DISCONNECTED); > + igt_cleanup_hotplug(mon); > +} > + > +static void > +test_suspend_resume_hpd_common(data_t *data, enum igt_suspend_state > state, > + enum igt_suspend_test test) > +{ > + struct udev_monitor *mon = igt_watch_hotplug(); > + struct chamelium_port *port; > + int p; > + > + for (p = 0; p < data->port_count; p++) { > + port = data->ports[p]; > + if (chamelium_port_get_type(port) == > DRM_MODE_CONNECTOR_VGA) > + continue; > + > + igt_debug("Testing port %s\n", > chamelium_port_get_name(port)); > + } > + > + reset_state(data, NULL); > + > + /* Make sure we notice new connectors after resuming */ > + try_suspend_resume_hpd(data, NULL, state, test, mon, false); > + > + /* Now make sure we notice disconnected connectors after > resuming */ > + try_suspend_resume_hpd(data, NULL, state, test, mon, true); > > igt_cleanup_hotplug(mon); > } > @@ -750,6 +820,18 @@ igt_main > test_hpd_without_ddc(&data, port); > } > > + igt_subtest_group { > + igt_subtest("common-hpd-after-suspend") > + test_suspend_resume_hpd_common(&data, > + SUSPEND_STATE > _MEM, > + SUSPEND_TEST_ > NONE); > + > + igt_subtest("common-hpd-after-hibernate") > + test_suspend_resume_hpd_common(&data, > + SUSPEND_STATE > _DISK, > + SUSPEND_TEST_ > DEVICES); > + } > + > igt_fixture { > close(data.drm_fd); > } _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx