[PATCH i-g-t v2 3/5] lib/igt_kms: Add function to list connected connectors
Kamil Konieczny
kamil.konieczny at linux.intel.com
Wed Nov 6 14:20:44 UTC 2024
Hi Louis,
On 2024-10-22 at 12:28:37 +0200, Louis Chauvet wrote:
> 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 at bootlin.com>
> ---
> lib/igt_kms.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> lib/igt_kms.h | 1 +
> 2 files changed, 55 insertions(+)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 40c0a207cd17..44b546ae52dc 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -7181,3 +7181,57 @@ bool igt_wait_for_connector_status(int drm_fd, unsigned int connector_id, double
> connector_id);
> return false;
> }
> +
> +/**
> + * igt_get_connected_connectors - List all connectors reported as CONNECTED by DRM.
> + *
> + * @drm_fd: DRM file description
> + * @connector_ids: out pointer for the list of connector ids connected. It must be freed by the
> + * caller.
> + *
> + * The returns value is the number of connectors
> + */
> +int igt_get_connected_connectors(int drm_fd, uint32_t **connector_ids)
> +{
> + int connected_count = 0;
> + drmModeResPtr resources;
> + struct timespec start, end;
> +
> + *connector_ids = NULL;
> +
> + resources = drmModeGetResources(drm_fd);
> + for (int j = 0; j < resources->count_connectors; j++) {
> + drmModeConnectorPtr connector = NULL;
> +
> + connector = drmModeGetConnector(drm_fd, resources->connectors[j]);
> + /*
> + * This time is required as sometimes some id in the connector list are not totally
> + * ready or can disappear
> + */
> + clock_gettime(CLOCK_MONOTONIC, &start);
> + clock_gettime(CLOCK_MONOTONIC, &end);
> + while (!connector &&
> + igt_time_elapsed(&start, &end) < igt_default_detect_timeout()) {
> + connector = drmModeGetConnector(drm_fd, resources->connectors[j]);
> + clock_gettime(CLOCK_MONOTONIC, &end);
> + }
> +
> + if (igt_time_elapsed(&start, &end) < igt_default_detect_timeout()) {
> + igt_assert(connector);
Please try to not assert in lib functions, unless abslutly nessesery.
Why not just return zero in case no connected connectors are detected.
Regards,
Kamil
> +
> + 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 4cd4a4f65460..4674b271638a 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -1265,5 +1265,6 @@ float igt_default_detect_timeout(void);
>
> 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.46.2
>
More information about the igt-dev
mailing list