Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Louis Chauvet <louis.chauvet@bootlin.com>
To: igt-dev@lists.freedesktop.org, ihf@google.com,
	markyacoub@google.com,  thomas.petazzoni@bootlin.com,
	jeremie.dautheribes@bootlin.com
Cc: Louis Chauvet <louis.chauvet@bootlin.com>
Subject: [PATCH i-g-t v2 24/39] lib/chamelium/v3: Introduce new configuration format for MST support
Date: Tue, 09 Jul 2024 17:34:40 +0200	[thread overview]
Message-ID: <20240709-dev-remove-static-ports-v2-24-5adfc6985778@bootlin.com> (raw)
In-Reply-To: <20240709-dev-remove-static-ports-v2-0-5adfc6985778@bootlin.com>

The current Chamelium v2 configuration format does not accommodate MST
usage. To maintain compatibility with existing configuration files, this
commit introduces a new format with a distinct prefix for Chamelium v3
port mapping.

Support for the Chamelium v2 format is retained to facilitate the
transition between Chamelium v2 and v3. The v2 format will be used if the
v3 format is not present in the file.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/chamelium/v3/igt_chamelium.c | 126 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 123 insertions(+), 3 deletions(-)

diff --git a/lib/chamelium/v3/igt_chamelium.c b/lib/chamelium/v3/igt_chamelium.c
index d528b40ca0c7..26f6b83cd10a 100644
--- a/lib/chamelium/v3/igt_chamelium.c
+++ b/lib/chamelium/v3/igt_chamelium.c
@@ -13,6 +13,11 @@
 #define CHAMELIUM_V2_CONFIG_PREFIX "Chamelium"
 #define CHAMELIUM_V2_CONFIG_PORT_ID "ChameliumPortID"
 
+#define CHAMELIUM_V3_CONFIG_PORT_NAME "PortName"
+#define CHAMELIUM_V3_CONFIG_MST_PATH "MstPath"
+#define CHAMELIUM_V3_CONFIG_PARENT_ID "ChameliumParentID"
+#define CHAMELIUM_V3_CONFIG_AUTODETECT_SAVE "ChameliumAutodetectSave"
+
 struct igt_chamelium_v3 {
 	xmlrpc_env env;
 	xmlrpc_client *client;
@@ -172,7 +177,7 @@ static void chamelium_v3_fill_port_mapping_from_config_v2(struct igt_chamelium_v
 				}
 			} else {
 				igt_warn("Skipping malformed entry %s: Missing "
-					 CHAMELIUM_V2_CONFIG_PORT_ID "\n",
+					     CHAMELIUM_V2_CONFIG_PORT_ID "\n",
 					 group_list[group_idx]);
 				chamelium_v3_port_mapping_free(port_mapping);
 			}
@@ -186,6 +191,115 @@ static void chamelium_v3_fill_port_mapping_from_config_v2(struct igt_chamelium_v
 	free(group_list);
 }
 
+/**
+ * chamelium_v3_fill_port_mapping_from_config_v2() - Read the configuration file using the chamelium
+ *	v3 format
+ *
+ * @chamelium: chamelium to store the port mapping into
+ *
+ * Read the configuration file to search a chamelium configuration, using the Cv3 format. It will
+ * ignore any malformed entry.
+ */
+static void chamelium_v3_fill_port_mapping_from_config_v3(struct igt_chamelium_v3 *chamelium)
+{
+	char **group_list;
+
+	igt_assert(igt_key_file);
+
+	group_list = g_key_file_get_groups(igt_key_file, NULL);
+	for (int group_idx = 0; group_list[group_idx]; group_idx++) {
+		if (strstr(group_list[group_idx], CHAMELIUM_CONFIG_SECTION ":")) {
+			struct chamelium_v3_port_mapping *port_mapping = NULL;
+			uint32_t chamelium_port_id;
+			char *tmp_end;
+			GError *error = NULL;
+			char *chamelium_port_id_str =
+			    group_list[group_idx] + (sizeof(CHAMELIUM_CONFIG_SECTION ":") - 1);
+
+			errno = 0;
+			chamelium_port_id = strtoul(chamelium_port_id_str, &tmp_end, 0);
+
+			if (chamelium_port_id_str == tmp_end) {
+				igt_warn("Failed to read config file, expecting ["
+					     CHAMELIUM_CONFIG_SECTION ":<int>], found %s\n",
+					 group_list[group_idx]);
+				goto exit_loop;
+			} else if (errno == ERANGE) {
+				igt_warn("Range error during parsing of number, expecting \"%.*s\", strtolu returned %d",
+					 (int)(tmp_end - chamelium_port_id_str),
+					 chamelium_port_id_str, chamelium_port_id);
+				goto exit_loop;
+			}
+
+			port_mapping = chamelium_v3_port_mapping_alloc();
+			port_mapping->port_id = chamelium_port_id;
+
+			if (g_key_file_has_key(igt_key_file, group_list[group_idx],
+					       CHAMELIUM_V3_CONFIG_PORT_NAME, NULL)) {
+				port_mapping->connector_name = g_key_file_get_string(igt_key_file,
+										     group_list[group_idx],
+										     CHAMELIUM_V3_CONFIG_PORT_NAME,
+										     &error);
+				if (error) {
+					igt_info("Skipping malformed entry %s: %s\n",
+						 group_list[group_idx], error->message);
+					goto exit_loop;
+				}
+			}
+
+			if (g_key_file_has_key(igt_key_file, group_list[group_idx],
+					       CHAMELIUM_V3_CONFIG_MST_PATH, NULL)) {
+				port_mapping->mst_path = g_key_file_get_string(igt_key_file,
+									       group_list[group_idx],
+									       CHAMELIUM_V3_CONFIG_MST_PATH,
+									       &error);
+				if (error) {
+					igt_warn("Skipping malformed entry %s: %s\n",
+						 group_list[group_idx], error->message);
+					goto exit_loop;
+				}
+			}
+
+			if (g_key_file_has_key(igt_key_file, group_list[group_idx],
+					       CHAMELIUM_V3_CONFIG_PARENT_ID, NULL)) {
+				port_mapping->parent_id = g_key_file_get_integer(igt_key_file,
+										 group_list[group_idx],
+										 CHAMELIUM_V3_CONFIG_PARENT_ID,
+										 &error);
+				port_mapping->is_children = true;
+				if (error) {
+					igt_warn("Skipping malformed entry %s: %s\n",
+						 group_list[group_idx],
+						 error->message);
+					goto exit_loop;
+				}
+			}
+
+			if (port_mapping->is_children && !port_mapping->mst_path) {
+				igt_warn("If the port have a " CHAMELIUM_V3_CONFIG_PARENT_ID
+					     ", it must also have an " CHAMELIUM_V3_CONFIG_MST_PATH
+					     ". Skipping malformed entry %s.\n",
+					 group_list[group_idx]);
+				goto exit_loop;
+			}
+
+			igt_list_add(&port_mapping->link, &chamelium->port_mapping);
+
+			if (error)
+				free(error);
+			continue;
+exit_loop:
+			if (error)
+				free(error);
+			if (port_mapping)
+				chamelium_v3_port_mapping_free(port_mapping);
+		}
+
+		free(group_list[group_idx]);
+	}
+	free(group_list);
+}
+
 /**
  * chamelium_v3_port_mapping_info_list() - Display the current configured port mapping for the
  *	chamelium
@@ -212,11 +326,17 @@ static void chamelium_v3_port_mapping_info_list(struct igt_list_head *head)
  *	structure.
  *
  * @chamelium: chamelium to store the port mapping into
+ *
+ * It will read the configuration file searching for a Cv3 configuration. If this configuration does
+ * not exist or is empty, it will try to read a Cv2 configuration.
  */
 void chamelium_v3_fill_port_mapping(struct igt_chamelium_v3 *chamelium)
 {
-	if (igt_key_file)
-		chamelium_v3_fill_port_mapping_from_config_v2(chamelium);
+	if (igt_key_file) {
+		chamelium_v3_fill_port_mapping_from_config_v3(chamelium);
+		if (igt_list_length(&chamelium->port_mapping) == 0)
+			chamelium_v3_fill_port_mapping_from_config_v2(chamelium);
+	}
 
 	chamelium_v3_port_mapping_info_list(&chamelium->port_mapping);
 }

-- 
2.44.2


  parent reply	other threads:[~2024-07-09 15:35 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-09 15:34 [PATCH i-g-t v2 00/39] tests/chamelium: Integrate the chamelium v3 Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 01/39] lib/igt_kms: Add a detect timeout value Louis Chauvet
2024-08-27  7:51   ` Kamil Konieczny
2024-08-28 14:31     ` Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 02/39] lib/igt_kms: Add helper to wait for a specific status on a connector Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 03/39] lib/igt_kms: Add function to list connected connectors Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 04/39] lib/igt_kms: Add helper to obtain a connector by its name or MST path Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 05/39] lib/igt_kms: Add function to get valid pipe for specific output Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 06/39] lib/monitor_edids: Add helper functions for using monitor_edid objects Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 07/39] lib/monitor_edids: Add helper to get an EDID by its name Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 08/39] lib/monitor_edids: Add helper to print all available EDID names Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 09/39] lib/monitor_edids: Fix missing names in some monitor EDID Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 10/39] lib/monitor_edids: Add new EDID for HDMI 4k Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 11/39] tests/chamelium: Extract Chamelium v2 tests into a separate directory Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 12/39] lib/chamelium/v2: Extract chamelium v2 wrapper into its own directory Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 13/39] lib/chamelium/v2: Modify build options to separate Chamelium v2 and v3 Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 14/39] lib/chamelium/v3: Introduce the foundation for the Chamelium v3 wrapper Louis Chauvet
2024-08-26  9:22   ` Vignesh Raman
2024-08-28 17:26     ` Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 15/39] lib/chamelium/v3: Introduce initialization and cleanup of Chamelium-related structures Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 16/39] lib/chamelium/v3: Add method to discover Chamelium ports Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 17/39] lib/chamelium/v3: Implement method to retrieve Chamelium port names Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 18/39] tests/chamelium/v3: Implement a basic Chamelium v3 accessibility test Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 19/39] lib/chamelium/v3: Implement Chamelium reinitialization via Reset RPC call Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 20/39] lib/chamelium/v3: Implement methods for plugging Chamelium ports Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 21/39] lib/chamelium/v3: Implement methods for managing Chamelium EDID Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 22/39] lib/chamelium/v3: Implement Chamelium configuration parsing Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 23/39] lib/chamelium/v3: Log port mapping for debugging purposes Louis Chauvet
2024-07-09 15:34 ` Louis Chauvet [this message]
2024-07-09 15:34 ` [PATCH i-g-t v2 25/39] lib/chamelium/v3: Provide access to port_mapping via method call Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 26/39] lib/chamelium/v3: Implement helper function to get port mapping from Chameleon port id Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 27/39] lib/chamelium/v3: Implement helper function to retrieve connector from port mapping Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 28/39] lib/chamelium/v3: Plug specific ports for all tests Louis Chauvet
2024-08-26  9:26   ` Vignesh Raman
2024-08-28 17:26     ` Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 29/39] lib/chamelium/v3: Implement Chamelium port autodetection algorithm Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 30/39] lib/chamelium/v3: Add save option to avoid doing autodetection every time Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 31/39] tests/chamelium/v3: Implement basic EDID handling test Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 32/39] tests/chamelium/v3: Implement 4K EDID stress test Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 33/39] tests/chamelium/v3: Implement non-4K " Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 34/39] lib/chamelium/v3: Implement method to discover video signal status Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 35/39] tests/chamelium/v3: Implement test for DRM device resolution Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 36/39] lib/chamelium/v3: Implement hot plug toggle scheduling method Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 37/39] tests/chamelium/v3: Add test for display change detection during sleep Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 38/39] tests/chamelium/v3: Add MST EDID reading test Louis Chauvet
2024-07-09 15:34 ` [PATCH i-g-t v2 39/39] docs: Add Chamelium v3 Louis Chauvet
2024-07-09 15:47 ` [PATCH i-g-t v2 00/39] tests/chamelium: Integrate the chamelium v3 Louis Chauvet
2024-07-09 16:16 ` ✗ Fi.CI.BUILD: failure for " Patchwork
2024-07-10  9:48   ` Louis Chauvet
2024-08-26  9:30     ` Vignesh Raman
2024-07-09 16:21 ` ✗ GitLab.Pipeline: warning " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240709-dev-remove-static-ports-v2-24-5adfc6985778@bootlin.com \
    --to=louis.chauvet@bootlin.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=ihf@google.com \
    --cc=jeremie.dautheribes@bootlin.com \
    --cc=markyacoub@google.com \
    --cc=thomas.petazzoni@bootlin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox