[PATCH i-g-t v2 4/5] lib/igt_kms: Add helper to obtain a connector by its name or MST path

Kamil Konieczny kamil.konieczny at linux.intel.com
Wed Nov 6 14:24:56 UTC 2024


Hi Louis,
On 2024-10-22 at 12:28:38 +0200, Louis Chauvet wrote:
> Introduce the functions igt_get_connector_from_name() and
> igt_get_connector_id_from_mst_path(). These functions serve to retrieve
> the connector object using a connector name and a connector ID from its
> MST path, respectively.
> 
> Given that the connector id may not be consistent, especially with MST
> connectors, these functions are essential to recognize each connector even
> after system reboots and plug/unplug events.
> 
> The function igt_get_connector_id_from_name() is a convenient wrapper for
> igt_get_connector_from_name() to streamline its usage when the caller only
> requires the connector id.
> 
> Signed-off-by: Louis Chauvet <louis.chauvet at bootlin.com>
> ---
>  lib/igt_kms.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_kms.h |  3 ++
>  2 files changed, 100 insertions(+)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 44b546ae52dc..fce5666cefc6 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -7235,3 +7235,100 @@ int igt_get_connected_connectors(int drm_fd, uint32_t **connector_ids)
>  	return
>  	    connected_count;
>  }
> +
> +drmModeConnectorPtr igt_get_connector_from_name(int drm_fd, const char *port_name)
> +{
> +	drmModeResPtr res = drmModeGetResources(drm_fd);
> +	struct timespec start, end;
> +	int i;
> +
> +	if (!res)
> +		return 0;
> +
> +	for (i = 0; i < res->count_connectors; i++) {
> +		char name[50];

Add define for this '50' or later on use ARRAY_SIZE()

> +
> +		drmModeConnectorPtr connector = drmModeGetConnector(drm_fd, res->connectors[i]);
> +		/*
> +		 * 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, res->connectors[i]);
> +			clock_gettime(CLOCK_MONOTONIC, &end);
> +		}

Could connectors appear/get connected out-of-order?
Some get connected and some others never get it?

Regards,
Kamil

> +
> +		if (igt_time_elapsed(&start, &end) < igt_default_detect_timeout()) {
> +			igt_assert(connector);
> +
> +			/* We have to generate the connector name on our own */
> +			snprintf(name, 50, "%s-%u",
> +				 kmstest_connector_type_str(connector->connector_type),
> +				 connector->connector_type_id);
> +
> +			if (strcmp(port_name, name) == 0) {
> +				drmModeFreeResources(res);
> +				return connector;
> +			}
> +			drmModeFreeConnector(connector);
> +		}
> +	}
> +	drmModeFreeResources(res);
> +	return NULL;
> +}
> +
> +/**
> + * igt_get_connector_id_from_name - Get a connector ID from a connector name
> + * @drm_fd: DRM file descriptor
> + * @port_name: Port name to find in the connector
> + *
> + * Returns 0 when no connector is found with the correct name
> + */
> +uint32_t igt_get_connector_id_from_name(int drm_fd, const char *port_name)
> +{
> +	drmModeConnectorPtr connector = igt_get_connector_from_name(drm_fd, port_name);
> +
> +	if (connector) {
> +		int connector_id = connector->connector_id;
> +
> +		drmModeFreeConnector(connector);
> +		return connector_id;
> +	}
> +	return 0;
> +}
> +
> +/**
> + * igt_get_connector_id_from_mst_path - Get a connector ID from a mst path
> + * @drm_fd: DRM file descriptor
> + * @mst_path: MST path to find in the connector
> + *
> + * Returns 0 when no connector is found with the correct mst path
> + */
> +uint32_t igt_get_connector_id_from_mst_path(int drm_fd, const void *mst_path)
> +{
> +	drmModeResPtr res = drmModeGetResources(drm_fd);
> +	int i;
> +
> +	if (!res)
> +		return 0;
> +
> +	for (i = 0; i < res->count_connectors; i++) {
> +		uint32_t connector_id = res->connectors[i];
> +
> +		drmModePropertyBlobPtr path_blob = kmstest_get_path_blob(drm_fd, connector_id);
> +
> +		if (path_blob) {
> +			if (strcmp(path_blob->data, mst_path) == 0) {
> +				drmModeFreePropertyBlob(path_blob);
> +				drmModeFreeResources(res);
> +				return connector_id;
> +			}
> +			drmModeFreePropertyBlob(path_blob);
> +		}
> +	}
> +	drmModeFreeResources(res);
> +	return 0;
> +}
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 4674b271638a..e9732c247dea 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -1266,5 +1266,8 @@ 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);
> +drmModeConnectorPtr igt_get_connector_from_name(int drm_fd, const char *port_name);
> +uint32_t igt_get_connector_id_from_name(int drm_fd, const char *port_name);
> +uint32_t igt_get_connector_id_from_mst_path(int drm_fd, const void *mst_path);
>  
>  #endif /* __IGT_KMS_H__ */
> 
> -- 
> 2.46.2
> 


More information about the igt-dev mailing list