summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2019-05-06 19:42:04 +0300
committerImre Deak <imre.deak@intel.com>2019-05-09 16:55:41 +0300
commit54538a37ded2bbdc775141cb0858defb22809bde (patch)
treed12a2276c56eda181ab91966f053b3f15754a7a5
parentb1d91d0228db999145405e529952ca49bab7f706 (diff)
tests/kms_chamelium: Make sure we wait for each connectors' hotplug event
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. 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@bootlin.com> Cc: Lyude Paul <lyude@redhat.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Reviewed-By: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
-rw-r--r--tests/kms_chamelium.c45
1 files 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;