[PATCH i-g-t v7 03/48] lib/igt_kms: Add function to list connected connectors

Louis Chauvet
2026-02-23T12:08:55Z

Introduce the igt_get_connected_connectors() function, which returns a
list of connector IDs that are currently connected according to DRM.

This function includes a timeout mechanism because connectors can be
unplugged at any time. Also, especially with MST, the connector can be
listed by drmModeGetResources() but not yet accessible with
drmModeGetConnector().

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
lib/igt_kms.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
lib/igt_kms.h | 1 +
2 files changed, 70 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 6435ea25db0b..1f9f30f7d8b1 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7954,6 +7954,30 @@ bool igt_has_lobf_debugfs(int drmfd, igt_output_t *output)
return res == 0;
}

+static drmModeConnectorPtr igt_wait_for_connector(int drm_fd, unsigned int connector_id,
+ double timeout)
+{
+ drmModeConnectorPtr connector = NULL;
+ struct timespec start, end;
+
+ connector = drmModeGetConnector(drm_fd, connector_id);
+ /*
+ * This time is required as sometimes some id in the connector list are not totally
+ * ready or can disappear
+ */
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ end = start;
+
+ while (!connector &&
+ igt_time_elapsed(&start, &end) <= timeout) {
+ connector = drmModeGetConnector(drm_fd, connector_id);
+ usleep(10000);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ }
+
+ return connector;
+}
+
/**
* igt_wait_for_connector_status:
* @drm_fd: drm file descriptor
@@ -7993,3 +8017,48 @@ bool igt_wait_for_connector_status(int drm_fd, unsigned int connector_id, double
connector_id);
return false;
}
+
+/**
+ * igt_get_connected_connectors:
+ *
+ * @drm_fd: DRM file descriptor
+ * @connector_ids: Out pointer for the list of connector ids connected. The function
+ * will allocate and store the pointer in this out pointer. The caller is
+ * responsible to free the inner pointer using free(*connector_ids). caller.
+ *
+ * This will probe all the connectors and return the list of all
+ * connected connectors.
+ * Returns: The number of connectors in @connector_ids
+ */
+int igt_get_connected_connectors(int drm_fd, uint32_t **connector_ids)
+{
+ int connected_count = 0;
+ double timeout = igt_default_display_detect_timeout();
+ drmModeResPtr resources;
+
+ igt_assert(drm_fd);
+ *connector_ids = NULL;
+
+ resources = drmModeGetResources(drm_fd);
+ igt_assert(resources);
+ for (int j = 0; j < resources->count_connectors; j++) {
+ drmModeConnectorPtr connector = igt_wait_for_connector(drm_fd,
+ resources->connectors[j],
+ timeout);
+
+ if (connector) {
+ if (connector->connection == DRM_MODE_CONNECTED) {
+ *connector_ids = reallocarray(*connector_ids,
+ connected_count
+ + 1, sizeof(**connector_ids));
+ igt_assert(*connector_ids);
+ (*connector_ids)[connected_count] = resources->connectors[j];
+ connected_count++;
+ }
+ drmModeFreeConnector(connector);
+ }
+ }
+ drmModeFreeResources(resources);
+
+ return connected_count;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 27357854e442..86e0235728c4 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1321,5 +1321,6 @@ igt_colorop_t *igt_find_colorop(igt_display_t *display, uint32_t id);

bool igt_wait_for_connector_status(int drm_fd, unsigned int connector_id, double timeout,
int drm_mode);
+int igt_get_connected_connectors(int drm_fd, uint32_t **connector_ids);

#endif /* __IGT_KMS_H__ */

--
2.52.0