[PATCH i-g-t 2/5] lib/igt_kms: Add helper to wait for a specific status on a connector
Louis Chauvet
louis.chauvet at bootlin.com
Wed Aug 28 14:31:51 UTC 2024
During testing with chamelium, it is frequent to wait for a specific
connector status. This new helper is polling the DRM API to wait for this
status. This allows detecting new status without notifier systems (which
can fail if hot plug detection is not working properly on the device under
test.
Signed-off-by: Louis Chauvet <louis.chauvet at bootlin.com>
---
lib/igt_kms.c | 38 ++++++++++++++++++++++++++++++++++++++
lib/igt_kms.h | 3 +++
2 files changed, 41 insertions(+)
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index d78b239c3bd7..b1d937b4d91e 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -6729,3 +6729,41 @@ float igt_default_detect_timeout(void)
return timeout;
}
+
+/**
+ * igt_wait_for_connector_status - Wait for at most @timeout that the connector @connector_id
+ * status become @drm_mode
+ *
+ * @drm_fd: drm file descriptor
+ * @connector_id: connector to monitor
+ * @timeout: maximum duration to wait, in second
+ * @drm_mode: mode to wait for, see enum drmModeConnection
+ *
+ * Returns: true when the status is reached, false if there is a timeout
+ */
+bool igt_wait_for_connector_status(int drm_fd, unsigned int connector_id, double timeout,
+ int drm_mode)
+{
+ drmModeConnector *connector;
+ struct timespec start, end;
+
+ if (timeout == 0.0)
+ timeout = igt_default_detect_timeout();
+
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+
+ while (igt_time_elapsed(&start, &end) <= timeout) {
+ connector = drmModeGetConnector(drm_fd, connector_id);
+ if (connector && connector->connection == drm_mode) {
+ free(connector);
+ return true;
+ }
+ free(connector);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ }
+
+ igt_debug("Timeout waiting for connection status %d on connector %d\n", drm_mode,
+ connector_id);
+ return false;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index e4a64cb19322..33f663d54463 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1234,4 +1234,7 @@ int get_num_scalers(igt_display_t *display, enum pipe pipe);
float igt_default_detect_timeout(void);
+bool igt_wait_for_connector_status(int drm_fd, unsigned int connector_id, double timeout,
+ int drm_mode);
+
#endif /* __IGT_KMS_H__ */
--
2.44.2
More information about the igt-dev
mailing list