[PATCH i-g-t v3 3/5] lib/igt_kms: Add function to list connected connectors
Kamil Konieczny
kamil.konieczny at linux.intel.com
Thu Dec 19 19:44:34 UTC 2024
Hi Louis,
On 2024-11-22 at 16:19:06 +0100, 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 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> lib/igt_kms.h | 1 +
> 2 files changed, 58 insertions(+)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 626f56b8caa4bc0ba98c69aa22d0a6bf80aadedf..5d3f609d469d741d9fd68a9a0b41ab0162d322b6 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -7257,3 +7257,60 @@ 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 description
> + * @connector_ids: Out pointer for the list of connector ids connected. It must be freed by the
> + * 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;
> + 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);
> + end = start;
> +
> + while (!connector &&
> + igt_time_elapsed(&start, &end) <= igt_default_detect_timeout()) {
Get this timeout ahead of loop into a var,
for example 'timeout':
double timeout = igt_default_detect_timeout();
int connected_count = 0;
...
and here:
igt_time_elapsed(&start, &end) <= timeout) {
> + connector = drmModeGetConnector(drm_fd, resources->connectors[j]);
> + clock_gettime(CLOCK_MONOTONIC, &end);
> + }
> +
> + if (igt_time_elapsed(&start, &end) <= igt_default_detect_timeout()) {
Use if() instead:
if(connector) {
> + igt_assert(connector);
imho you should not assert here. Try to write lib functions
without asserts (if possible).
> +
> + if (connector->connection == DRM_MODE_CONNECTED) {
> + *connector_ids = reallocarray(*connector_ids,
> + connected_count
> + + 1, sizeof(**connector_ids));
> + igt_assert(*connector_ids);
Here assert is ok.
Regards,
Kamil
> + (*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 6c6df3f18dde72459d09b56192e108da5d951bdd..33079b696c070ee7b62ec1d5705b221ba4ad5a7c 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -1277,5 +1277,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.47.0
>
More information about the igt-dev
mailing list