[igt-dev] [PATCH i-g-t] tests/kms_chamelium: Check if port adapters are in use

Petri Latvala petri.latvala at intel.com
Thu May 19 11:25:29 UTC 2022


On Wed, May 18, 2022 at 01:23:08PM +0200, Ryszard Knop wrote:
> If a DUT has Chamelium ports connected via an adapter (for example, DP
> on the Chamelium side -> DP-HDMI adapter -> HDMI on the DUT), this will
> usually cause many tests to fail. If mismatching port types are found
> on both sides, the tests will now be aborted with a warning.
> 
> This behavior can be overridden with a new AdapterAllowed config value,
> which must be set in [Chamelium:PORT] blocks in .igtrc.

Your signed-off-by is missing.


> ---
>  docs/chamelium.txt  | 18 ++++++++++++++----
>  lib/igt_chamelium.c | 35 +++++++++++++++++++++++++++++++++++
>  2 files changed, 49 insertions(+), 4 deletions(-)
> 
> diff --git a/docs/chamelium.txt b/docs/chamelium.txt
> index 32c296f7..7484a3f8 100644
> --- a/docs/chamelium.txt
> +++ b/docs/chamelium.txt
> @@ -94,7 +94,8 @@ example (only Chamelium.URL is mandatory):
>      URL=http://192.168.1.2:9992
>  
>      # The rest of the sections are used for defining connector mappings. This
> -    # is optional, the mappings will be discovered automatically.
> +    # is optional if the same connector type (ex. DP-DP) is used on both sides,
> +    # the mappings will be discovered automatically.
>  
>      # The name of the DRM connector
>      # The DP-1 of [Chamelium:DP-1] and the HDMI-A-1 of [Chamelium:HDMI-A-1] indicate
> @@ -102,13 +103,22 @@ example (only Chamelium.URL is mandatory):
>      [Chamelium:DP-1]
>      # The ChameliumPortID indicates physical port (device) id of a Chamelium Board.
>      # A Chamelium daemon program defines these port ids as
> -    # DP1 (located next to the HDMI port) = 1
> -    # DP2 (located next to the VGA connector) = 2
> -    # HDMI = 3 and VGA = 4
> +    # - DP1 (located next to the HDMI port) = 1
> +    # - DP2 (located next to the VGA connector) = 2
> +    # - HDMI = 3
> +    # - VGA = 4
>      # The port ids are defined at:
>      # https://chromium.googlesource.com/chromiumos/platform/chameleon/+/master/chameleond/utils/ids.py
>      ChameliumPortID=1
>  
> +    [Chamelium:HDMI-A-1]
> +    # Notice that the DRM side has HDMI, but Chamelium has DP on port 2.
> +    # This is possible via an HDMI-DP adapter, but such scenarios often cause
> +    # issues, so by default we fail if mismatching connector types are found.
> +    # If AdapterAllowed is set to 1, the tests will proceed with a warning.
> +    ChameliumPortID=2
> +    AdapterAllowed=1
> +
>      [Chamelium:HDMI-A-2]
>      ChameliumPortID=3
>  
> diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
> index b4d838bb..55cbfa12 100644
> --- a/lib/igt_chamelium.c
> +++ b/lib/igt_chamelium.c
> @@ -26,6 +26,7 @@
>  
>  #include "config.h"
>  
> +#include <stdbool.h>
>  #include <string.h>
>  #include <errno.h>
>  #include <math.h>
> @@ -103,6 +104,7 @@ struct chamelium_port {
>  	int id;
>  	int connector_id;
>  	char *name;
> +	bool adapter_allowed;
>  };
>  
>  struct chamelium_frame_dump {
> @@ -2324,6 +2326,9 @@ static bool chamelium_read_port_mappings(struct chamelium *chamelium,
>  			goto out;
>  		}
>  
> +		port->adapter_allowed = g_key_file_get_boolean(igt_key_file, group,
> +		                                               "AdapterAllowed", &error);
> +
>  		for (j = 0;
>  		     j < res->count_connectors && !port->connector_id;
>  		     j++) {
> @@ -2557,6 +2562,7 @@ static bool chamelium_autodiscover(struct chamelium *chamelium, int drm_fd)
>  		port->id = port_id;
>  		port->type = chamelium_get_port_type(chamelium, port);
>  		port->connector_id = conn_id;
> +		port->adapter_allowed = false;
>  
>  		connector = drmModeGetConnectorCurrent(drm_fd, conn_id);
>  		snprintf(conn_name, sizeof(conn_name), "%s-%u",
> @@ -2703,6 +2709,7 @@ error:
>  struct chamelium *chamelium_init(int drm_fd)
>  {
>  	struct chamelium *chamelium = chamelium_init_rpc_only();
> +	bool mismatching_ports_found = false;
>  
>  	if (chamelium == NULL)
>  		return NULL;
> @@ -2734,9 +2741,37 @@ struct chamelium *chamelium_init(int drm_fd)
>  		}
>  	}
>  
> +	for (int i = 0; i < chamelium->port_count; i++) {
> +		bool type_mismatch = false;
> +		struct chamelium_port * port = &chamelium->ports[i];
> +		drmModeConnectorPtr connector =
> +			drmModeGetConnectorCurrent(drm_fd, port->connector_id);
> +
> +		igt_assert(connector != NULL);
> +
> +		type_mismatch = port->type != connector->connector_type;
> +
> +		if (type_mismatch)
> +			igt_info("Chamelium port %d is %s, but the DRM connector is %s\n",
> +				 port->id, kmstest_connector_type_str(port->type),
> +				 kmstest_connector_type_str(connector->connector_type));
> +
> +		if (type_mismatch && !port->adapter_allowed)
> +			mismatching_ports_found = true;
> +
> +		drmModeFreeConnector(connector);
> +	}
> +
>  	cleanup_instance = chamelium;
>  	igt_install_exit_handler(chamelium_exit_handler);
>  
> +	igt_abort_on_f(mismatching_ports_found,
> +		       "Chamelium port(s) with mismatching connector type on the "
> +		       "DRM side found - this will most likely cause test failures. "
> +		       "If you want to proceed with this this configuration, set the "
> +		       "port mapping manually in .igtrc with AdapterAllowed=1. See "
> +		       "docs/chamelium.txt for more information.\n");

This abort should probably be before the exit handler installation above.



-- 
Petri Latvala


> +
>  	return chamelium;
>  error:
>  	close(chamelium->drm_fd);
> -- 
> 2.36.1
> 


More information about the igt-dev mailing list