[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