Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH i-g-t v4 00/46] Unigraf integration
@ 2025-11-10 13:39 Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 01/46] lib/igt_kms: Add a detect timeout value Louis Chauvet
                   ` (51 more replies)
  0 siblings, 52 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Hi everyone,

I am excited to share I currently have access to a Unigraf device,
which I believe could significantly enhance the capabilities within IGT.
This device has the potential to enable testing of low-level hardware
features that are currently not covered. Specifically, Unigraf devices can
assist in testing link training, signal integrity, HDCP, DSC, and more.

It's important to note that the Unigraf SDK is not open-source, and the
communication protocol with the device is proprietary. As a result, I have
utilized the libTSI.so library, which can be downloaded from [1]. In this
RFC, I have not used the official TSI_types.h header because it was
incompatible with C, so I hardcoded some necessary values. The next
iteration will use the official TSI_types.h (they plan to fix it for the
next release).

This RFC is intentionally concise to gather initial feedback from the
community regarding the integration of a proprietary device into the test
suite. I plan to expand on this work by adding more features and pushing
the developments upstream.

I have also started to work on MST testing (hotplug, link training, 
bandwith limitation), but I have a big issue: connector detection is very 
strange when changing MST configurat (MST->SST, sink count...).

If I use the Unigraf GUI or my own C script outside IGT, everything seems 
fine: `watch -n0 modetest -c` update connector status almost immediatly 
after a HDP pulse, never hang and always have the correct result.

But if I do the same in IGT (same script in igt_main), igt have too 
much/not all connectors, and some of them are broken (no EDID property 
for example). I tried to run `watch -n0 modetest -c` in parallel, but 
modetest can:
- hang
- only update once igt test is finished.

Do you have any hint about something I missed in IGT to properly enumerate 
connectors? I tried close/open the DRM device, added a lot of delay 
everywhere, emulate plug/unplug... I used kms_wait_for_new_connectors (in 
this series) and for_each_connected_output to get list the connectors.

Looking forward to your thoughts and suggestions!

Thanks,
Louis Chauvet

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
Changes in v4:
- Rebased on master
- Fixed multiple unigraf callbacks
- Created link training tests
- Link to v3: https://lore.kernel.org/r/20250823-unigraf-integration-v3-0-cdc36d5fab4c@bootlin.com

Changes in v3:
- Rebased on master
- Added support for MST
- Repair autodetection and CRC usage
- Link to v2: https://lore.kernel.org/r/20250717-unigraf-integration-v2-0-77dc329e584c@bootlin.com

Changes in v2:
- Splitted in many commits
- Add CRC support
- Link to v1: https://lore.kernel.org/r/20250517-unigraf-integration-v1-1-044acd2133dd@bootlin.com

---
Louis Chauvet (46):
      lib/igt_kms: Add a detect timeout value
      lib/igt_kms: Add helper to wait for a specific status on a connector
      lib/igt_kms: Add function to list connected connectors
      lib/igt_kms: Add helper to obtain a connector by its name or MST path
      lib/igt_kms: Add helper to wait for new connectors
      lib/igt_kms: Add helper to get a pipe from a connector
      lib/igt_kms: Expose dump_connector_attrs
      lib/igt_kms: Expose reset_connectors_at_exit
      lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set
      lib/igt_debugfs: Move debugfs helpers to the proper location
      lib/igt_debugfs: Add const when make sense
      lib/igt_amd: Add const when make sense
      lib/igt_kms: Add const when make sense
      lib/monitor_edids: Add helper functions for using monitor_edid objects
      lib/monitor_edids: Add helper to get an EDID by its name
      lib/monitor_edids: Add helper to print all available EDID names
      lib/unigraf: Add used defines for TSI_Types
      lib/unigraf: Add TSI.h
      lib/unigraf: Initial Unigraf support
      lib/igt_kms: Automatically connect unigraf on display require
      lib/unigraf: Introduce device configuration
      lib/unigraf: Introduce role configuration
      lib/unigraf: Introduce input configuration
      lib/unigraf: Add reset function
      lib/unigraf: Add unigraf assert and deassert helpers
      lib/unigraf: Add plug/unplug helpers
      lib/unigraf: Allows sst/mst configuration
      lib/unigraf: Add helpers to read and write edid
      lib/unigraf: Add connector configuration
      tests/unigraf: Add basic unigraf tests
      lib/unigraf: Add unigraf CRC capture
      lib/unigraf: Add configuration for CRC usage
      lib/unigraf: add unigraf_get_connector_by_stream
      lib/unigraf: Add helper to check timings received by unigraf
      lib/igt_pipe_crc: Add ungiraf crc calculation
      lib/unigraf: Add lane count configuration
      docs/unigraf: Add unigraf documentation
      lib/unigraf: Add helpers to set maximum link rate
      lib/i915/dp: Move DP-related function for i915 to proper folder
      lib/i915/dp: Rename functions to avoid confusion
      lib/i915/dp: Add helper to get maximum supported rate
      lib/igt_dp: Create generic helpers for DP information
      lib/igt_kms: Add asserts to avoid null pointer dereference
      lib/igt_kms: Add helper to get a pipe from an output
      lib/unigraf: Add helpers to get the current LT status
      tests/unigraf/unigraf_lt: Add test for link training

 docs/unigraf.txt                         |  81 +++
 lib/i915/i915_dp.c                       | 354 +++++++++++++
 lib/i915/i915_dp.h                       |  23 +
 lib/igt_amd.c                            |   2 +-
 lib/igt_amd.h                            |   2 +-
 lib/igt_core.c                           |   4 +
 lib/igt_debugfs.c                        |  96 +++-
 lib/igt_debugfs.h                        |  15 +-
 lib/igt_dp.c                             | 101 ++++
 lib/igt_dp.h                             |  89 ++++
 lib/igt_kms.c                            | 825 ++++++++++++++++---------------
 lib/igt_kms.h                            |  58 ++-
 lib/igt_pipe_crc.c                       |  28 ++
 lib/meson.build                          |  12 +
 lib/monitor_edids/dp_edids.h             |   3 +
 lib/monitor_edids/hdmi_edids.h           |   3 +
 lib/monitor_edids/monitor_edids_helper.c | 126 +++++
 lib/monitor_edids/monitor_edids_helper.h |  10 +-
 lib/unigraf/TSI.h                        | 226 +++++++++
 lib/unigraf/TSI_types.h                  | 117 +++++
 lib/unigraf/unigraf.c                    | 758 ++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h                    | 257 ++++++++++
 meson.build                              |  14 +
 tests/intel/kms_dp_link_training.c       |  19 +-
 tests/intel/kms_dp_linktrain_fallback.c  |  57 +--
 tests/meson.build                        |   4 +
 tests/unigraf/meson.build                |  13 +
 tests/unigraf/unigraf_connectivity.c     | 123 +++++
 tests/unigraf/unigraf_lt.c               | 178 +++++++
 29 files changed, 3130 insertions(+), 468 deletions(-)
---
base-commit: bfab3ea5fab190f4ebf083db4dfe703f6d4f40c6
change-id: 20250425-unigraf-integration-11ed330755d5

Best regards,
-- 
Louis Chauvet <louis.chauvet@bootlin.com>


^ permalink raw reply	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 01/46] lib/igt_kms: Add a detect timeout value
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:09   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 02/46] lib/igt_kms: Add helper to wait for a specific status on a connector Louis Chauvet
                   ` (50 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Some tests need to wait for a specific connector status. In order to make
the timeout customisable for each target, add an option in the
configuration file.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_core.c |  4 ++++
 lib/igt_kms.c  | 35 +++++++++++++++++++++++++++++++++++
 lib/igt_kms.h  | 10 ++++++++++
 3 files changed, 49 insertions(+)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index 4477cfef157a..1f4b4c256e64 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -271,6 +271,10 @@
  *	&num; It is not mandatory and allows overriding default values.
  *	[DUT]
  *	SuspendResumeDelay=10
+ *
+ *	&num; The following option define the timeout for detection feature
+ *	&num; (waiting for a connector status)
+ *	DisplayDetectTimeout=10.0
  * ]|
  *
  * Some specific configuration options may be used by specific parts of IGT,
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 9208c8dbfc86..708cf82ae357 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -59,6 +59,7 @@
 #include "intel_chipset.h"
 #include "igt_debugfs.h"
 #include "igt_device.h"
+#include "igt_rc.h"
 #include "igt_sysfs.h"
 #include "sw_sync.h"
 #ifdef HAVE_CHAMELIUM
@@ -7585,3 +7586,37 @@ bool igt_has_lobf_debugfs(int drmfd, igt_output_t *output)
                                               buf, sizeof(buf));
         return res == 0;
 }
+
+/**
+ * igt_default_display_detect_timeout:
+ *
+ * Get the default timeout value for detection feature
+ *
+ * Some tests requires to wait for a specific connector status. This value will determine the
+ * timeout value for this waiting.
+ */
+double igt_default_display_detect_timeout(void)
+{
+	static double timeout = 0.0;
+	static bool first_call = true;
+	GError *error = NULL;
+
+	if (first_call) {
+		if (igt_key_file) {
+			timeout = g_key_file_get_double(igt_key_file, "DUT", "DisplayDetectTimeout",
+							&error);
+			if (error) {
+				igt_debug("Failed to read DisplayDetectTimeout, defaulting to %f\n",
+					  DEFAULT_DETECT_TIMEOUT);
+				g_clear_error(&error);
+				timeout = DEFAULT_DETECT_TIMEOUT;
+			}
+		} else {
+			timeout = DEFAULT_DETECT_TIMEOUT;
+		}
+
+		first_call = false;
+	}
+
+	return timeout;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index eff76f0de0b3..513e1ff59d22 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -40,6 +40,14 @@
 #include "igt_fb.h"
 #include "ioctl_wrappers.h"
 
+/**
+ * define DEFAULT_DETECT_TIMEOUT - Default timeout in second used for some screen detection
+ * functions
+ *
+ * It can be overiden by option DetectTimeout in the .igtrc file.
+ */
+#define DEFAULT_DETECT_TIMEOUT 10.0
+
 /* Low-level helpers with kmstest_ prefix */
 
 /**
@@ -1292,4 +1300,6 @@ uint32_t igt_get_connected_output_count(igt_display_t *display);
 
 drmModePropertyBlobRes *igt_get_writeback_formats_blob(igt_output_t *output);
 
+double igt_default_display_detect_timeout(void);
+
 #endif /* __IGT_KMS_H__ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 02/46] lib/igt_kms: Add helper to wait for a specific status on a connector
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 01/46] lib/igt_kms: Add a detect timeout value Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:09   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 03/46] lib/igt_kms: Add function to list connected connectors Louis Chauvet
                   ` (49 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

During testing with chamelium, it is frequent to wait for a specific
connector status. This new helper is polling the DRM API to wait for this
status. This allows detecting it without notifier systems which can fail
if hot plug detection is not working properly on the device under test.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 39 +++++++++++++++++++++++++++++++++++++++
 lib/igt_kms.h |  3 +++
 2 files changed, 42 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 708cf82ae357..f5bcd6d6b573 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7620,3 +7620,42 @@ double igt_default_display_detect_timeout(void)
 
 	return timeout;
 }
+
+/**
+ * igt_wait_for_connector_status:
+ * @drm_fd: drm file descriptor
+ * @connector_id: connector to monitor
+ * @timeout: maximum duration to wait, in second. Use -1.0 to set the timeout
+ *           to igt_default_detect_timeout().
+ * @drm_mode: mode to wait for, see enum drmModeConnection
+ *
+ * Wait for at most @timeout that the connector @connector_id  status
+ * become @drm_mode
+ * Returns: true when the status is reached, false if there is a timeout
+ */
+bool igt_wait_for_connector_status(int drm_fd, unsigned int connector_id, double timeout,
+				   int drm_mode)
+{
+	drmModeConnector *connector;
+	struct timespec start, end;
+
+	if (timeout == -1.0)
+		timeout = igt_default_display_detect_timeout();
+
+	clock_gettime(CLOCK_MONOTONIC, &start);
+	end = start;
+
+	while (igt_time_elapsed(&start, &end) <= timeout) {
+		connector = drmModeGetConnector(drm_fd, connector_id);
+		if (connector && connector->connection == drm_mode) {
+			drmModeFreeConnector(connector);
+			return true;
+		}
+		drmModeFreeConnector(connector);
+		clock_gettime(CLOCK_MONOTONIC, &end);
+	}
+
+	igt_debug("Timeout waiting for connection status %d on connector %d\n", drm_mode,
+		  connector_id);
+	return false;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 513e1ff59d22..f70a93f34fae 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1302,4 +1302,7 @@ drmModePropertyBlobRes *igt_get_writeback_formats_blob(igt_output_t *output);
 
 double igt_default_display_detect_timeout(void);
 
+bool igt_wait_for_connector_status(int drm_fd, unsigned int connector_id, double timeout,
+				   int drm_mode);
+
 #endif /* __IGT_KMS_H__ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 03/46] lib/igt_kms: Add function to list connected connectors
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 01/46] lib/igt_kms: Add a detect timeout value Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 02/46] lib/igt_kms: Add helper to wait for a specific status on a connector Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:10   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 04/46] lib/igt_kms: Add helper to obtain a connector by its name or MST path Louis Chauvet
                   ` (48 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

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@bootlin.com>
---
 lib/igt_kms.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_kms.h |  1 +
 2 files changed, 68 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index f5bcd6d6b573..6392999bb341 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7621,6 +7621,29 @@ double igt_default_display_detect_timeout(void)
 	return timeout;
 }
 
+static drmModeConnectorPtr igt_wait_for_connector(int drm_fd, unsigned int connector_id,
+						  double timeout)
+{
+	drmModeConnectorPtr connector = NULL;
+	struct timespec start, end;
+
+	connector = drmModeGetConnector(drm_fd, connector_id);
+	/*
+	 * 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) <= timeout) {
+		connector = drmModeGetConnector(drm_fd, connector_id);
+		clock_gettime(CLOCK_MONOTONIC, &end);
+	}
+
+	return connector;
+}
+
 /**
  * igt_wait_for_connector_status:
  * @drm_fd: drm file descriptor
@@ -7659,3 +7682,47 @@ 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;
+	double timeout = igt_default_display_detect_timeout();
+	drmModeResPtr resources;
+
+	igt_assert(drm_fd);
+	*connector_ids = NULL;
+
+	resources = drmModeGetResources(drm_fd);
+	igt_assert(resources);
+	for (int j = 0; j < resources->count_connectors; j++) {
+		drmModeConnectorPtr connector = igt_wait_for_connector(drm_fd,
+								       resources->connectors[j],
+								       timeout);
+
+		if (connector) {
+			if (connector->connection == DRM_MODE_CONNECTED) {
+				*connector_ids = reallocarray(*connector_ids,
+							      connected_count
+							      + 1, sizeof(**connector_ids));
+				igt_assert(*connector_ids);
+				(*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 f70a93f34fae..c520f3b80e6a 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1304,5 +1304,6 @@ double igt_default_display_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.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 04/46] lib/igt_kms: Add helper to obtain a connector by its name or MST path
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (2 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 03/46] lib/igt_kms: Add function to list connected connectors Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:10   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 05/46] lib/igt_kms: Add helper to wait for new connectors Louis Chauvet
                   ` (47 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

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@bootlin.com>
---
 lib/igt_kms.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_kms.h |   3 ++
 2 files changed, 110 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 6392999bb341..6f2a8abbaf7d 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -93,6 +93,10 @@
 #define MAX_CONNECTORS 32
 #define MAX_EDID 2
 #define DISPLAY_TILE_BLOCK 0x12
+/**
+ * define IGT_KMS_CONNECTOR_NAME_SIZE - Size used when a connector name is needed
+ */
+#define IGT_KMS_CONNECTOR_NAME_SIZE 50
 
 typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
 
@@ -7726,3 +7730,106 @@ int igt_get_connected_connectors(int drm_fd, uint32_t **connector_ids)
 
 	return connected_count;
 }
+
+/**
+ * igt_get_connector_from_name:
+ * @drm_fd: DRM file descriptor
+ * @port_name: Port name to search
+ *
+ * Returns: The connector if found, NULL otherwise. The pointer must
+ * be freed with drmModeFreeConnector()
+ */
+drmModeConnectorPtr igt_get_connector_from_name(int drm_fd, const char *port_name)
+{
+	drmModeResPtr res = drmModeGetResources(drm_fd);
+	double timeout = igt_default_display_detect_timeout();
+	int i, len;
+
+	if (!res)
+		return NULL;
+
+	for (i = 0; i < res->count_connectors; i++) {
+		char name[IGT_KMS_CONNECTOR_NAME_SIZE];
+
+		drmModeConnectorPtr connector = igt_wait_for_connector(drm_fd, res->connectors[i],
+								       timeout);
+
+		if (connector) {
+			/* We have to generate the connector name on our own */
+			len = snprintf(name, ARRAY_SIZE(name), "%s-%u",
+				       kmstest_connector_type_str(connector->connector_type),
+				       connector->connector_type_id);
+			name[len] = 0;
+
+			if (strcmp(port_name, name) == 0) {
+				drmModeFreeResources(res);
+
+				return connector;
+			}
+
+			drmModeFreeConnector(connector);
+		}
+	}
+
+	drmModeFreeResources(res);
+
+	return NULL;
+}
+
+/**
+ * igt_get_connector_id_from_name:
+ * @drm_fd: DRM file descriptor
+ * @port_name: Port name to find in the connector
+ *
+ * Returns: The connector id if the port is found, 0 if the port is not found
+ */
+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) {
+		uint32_t connector_id = connector->connector_id;
+
+		drmModeFreeConnector(connector);
+
+		return connector_id;
+	}
+
+	return 0;
+}
+
+/**
+ * igt_get_connector_id_from_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 (memcmp(path_blob->data, mst_path, path_blob->length) == 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 c520f3b80e6a..9b8095376f98 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1305,5 +1305,8 @@ double igt_default_display_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.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 05/46] lib/igt_kms: Add helper to wait for new connectors
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (3 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 04/46] lib/igt_kms: Add helper to obtain a connector by its name or MST path Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:10   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 06/46] lib/igt_kms: Add helper to get a pipe from a connector Louis Chauvet
                   ` (46 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Add list comparison utilities and a new function to wait for new
connectors to appear on the system.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_kms.h |  6 ++++
 2 files changed, 99 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 6f2a8abbaf7d..c77c94d7c437 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7833,3 +7833,96 @@ uint32_t igt_get_connector_id_from_mst_path(int drm_fd, const void *mst_path)
 
 	return 0;
 }
+
+/**
+ * list_contains() - Search an element in the list
+ *
+ * @list: Pointer to the list to search into
+ * @list_len: Length of the list
+ * @value: Value to search in the list
+ *
+ * Returns true if @list contains @value
+ */
+static bool list_contains(const uint32_t *list, int list_len, uint32_t value)
+{
+	igt_assert((!list && list_len == 0) || list);
+	for (int i = 0; i < list_len; i++) {
+		if (list[i] == value)
+			return true;
+	}
+	return false;
+}
+
+/**
+ * get_list_diff() - Compute and return the difference between two lists
+ *
+ * @list_a: Pointer to the first list to compare
+ * @list_a_len: Length of the first list
+ * @list_b: Pointer to the second list to compare
+ * @list_b_len: Length of the second list
+ * @diff: Out pointer for the difference. Can be null to only count new elements.
+ *
+ * Returns the number of element which are in @list_a but not in @list_b.
+ */
+int
+get_list_diff(const uint32_t *list_a, int list_a_len, const uint32_t *list_b, int list_b_len,
+	      uint32_t **diff)
+{
+	int diff_len = 0;
+
+	igt_assert((!list_a && list_a_len == 0) || list_a);
+	igt_assert((!list_b && list_b_len == 0) || list_b);
+
+	if (diff)
+		*diff = malloc(sizeof(**diff));
+
+	for (int i = 0; i < list_a_len; i++) {
+		if (!list_contains(list_b, list_b_len, list_a[i])) {
+			if (diff) {
+				*diff = reallocarray(*diff, diff_len + 1, sizeof(**diff));
+				igt_assert(*diff);
+				(*diff)[diff_len] = list_a[i];
+			}
+
+			diff_len++;
+		}
+	}
+
+	return diff_len;
+}
+
+/**
+ * kms_wait_for_new_connectors() - Wait for new connector to appear
+ *
+ * @list_a: Pointer to the first list to compare
+ * @list_a_len: Length of the first list
+ * @list_b: Pointer to the second list to compare
+ * @list_b_len: Length of the second list
+ * @diff: Out pointer for the difference. Can be null.
+ *
+ * Returns the number of element which differ between the two lists.
+ */
+int kms_wait_for_new_connectors(uint32_t **newly_connected,
+				const uint32_t *already_connected,
+				int already_connected_count, int drm_fd)
+{
+	int newly_connected_count;
+	struct timespec start, end;
+
+	igt_assert(newly_connected);
+	igt_assert(drm_fd);
+
+	clock_gettime(CLOCK_MONOTONIC, &start);
+	clock_gettime(CLOCK_MONOTONIC, &end);
+	do {
+		if (*newly_connected)
+			free(*newly_connected);
+		newly_connected_count = igt_get_connected_connectors(drm_fd, newly_connected);
+		clock_gettime(CLOCK_MONOTONIC, &end);
+	} while (get_list_diff(*newly_connected, newly_connected_count,
+			       already_connected, already_connected_count,
+			       NULL) == 0 &&
+		 igt_time_elapsed(&start, &end) <= igt_default_display_detect_timeout());
+
+	return newly_connected_count;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 9b8095376f98..7b1d01efebf2 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1309,4 +1309,10 @@ drmModeConnectorPtr igt_get_connector_from_name(int drm_fd, const char *port_nam
 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);
 
+int kms_wait_for_new_connectors(uint32_t **newly_connected,
+				const uint32_t *already_connected,
+				int already_connected_count, int drm_fd);
+int
+get_list_diff(const uint32_t *list_a, int list_a_len, const uint32_t *list_b, int list_b_len,
+	      uint32_t **diff);
 #endif /* __IGT_KMS_H__ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 06/46] lib/igt_kms: Add helper to get a pipe from a connector
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (4 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 05/46] lib/igt_kms: Add helper to wait for new connectors Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:10   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 07/46] lib/igt_kms: Expose dump_connector_attrs Louis Chauvet
                   ` (45 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Currently there is no way to get a pipe from the connector. Add this tiny
helper that will try to get the currently used pipe for a specific
connector.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 34 ++++++++++++++++++++++++++++++++++
 lib/igt_kms.h |  8 ++++++++
 2 files changed, 42 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index c77c94d7c437..f8d4037a68bf 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7926,3 +7926,37 @@ int kms_wait_for_new_connectors(uint32_t **newly_connected,
 
 	return newly_connected_count;
 }
+
+enum pipe igt_get_pipe_from_connector(int drm_fd, int connector_id)
+{
+	drmModeObjectPropertiesPtr proplist;
+	drmModePropertyPtr crtc_id_prop;
+	drmModePropertyPtr prop;
+	uint32_t crtc_id;
+	enum pipe pipe_id;
+	int i;
+
+	proplist = drmModeObjectGetProperties(drm_fd, connector_id, DRM_MODE_OBJECT_CONNECTOR);
+	crtc_id_prop = NULL;
+
+	for (i = 0; i < proplist->count_props; i++) {
+		prop = drmModeGetProperty(drm_fd, proplist->props[i]);
+
+		if (strcmp(prop->name, "CRTC_ID") == 0) {
+			crtc_id_prop = prop;
+			break;
+		}
+		drmModeFreeProperty(prop);
+	}
+
+	igt_assert(crtc_id_prop);
+	igt_assert((crtc_id_prop->flags & DRM_MODE_PROP_EXTENDED_TYPE) == DRM_MODE_PROP_OBJECT);
+	crtc_id = proplist->prop_values[i];
+	drmModeFreeProperty(crtc_id_prop);
+	drmModeFreeObjectProperties(proplist);
+	if (crtc_id != 0) {
+		pipe_id = kmstest_get_pipe_from_crtc_id(drm_fd, crtc_id);
+		return pipe_id;
+	}
+	return PIPE_NONE;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 7b1d01efebf2..4184c3930cbd 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1315,4 +1315,12 @@ int kms_wait_for_new_connectors(uint32_t **newly_connected,
 int
 get_list_diff(const uint32_t *list_a, int list_a_len, const uint32_t *list_b, int list_b_len,
 	      uint32_t **diff);
+/**
+ * igt_get_pipe_from_connector() - Get a pipe from the connector id
+ * @drm_fd: drm file descriptor to which the connector belongs
+ * @connector_id: connector to inspect
+ *
+ * Returns PIPE_NONE if the connector is not connected to any pipe
+ */
+enum pipe igt_get_pipe_from_connector(int drm_fd, int connector_id);
 #endif /* __IGT_KMS_H__ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 07/46] lib/igt_kms: Expose dump_connector_attrs
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (5 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 06/46] lib/igt_kms: Add helper to get a pipe from a connector Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:10   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 08/46] lib/igt_kms: Expose reset_connectors_at_exit Louis Chauvet
                   ` (44 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

dump_connector_attrs is used by i915 DP helpers, so expose it from igt_kms
to be able to reuse them.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 2 +-
 lib/igt_kms.h | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index f8d4037a68bf..a5b840e5aed3 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -1682,7 +1682,7 @@ static bool connector_attr_set_debugfs(int drm_fd,
 	return true;
 }
 
-static void dump_connector_attrs(void)
+void dump_connector_attrs(void)
 {
 	char name[80];
 
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 4184c3930cbd..3975909aeeef 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -288,6 +288,7 @@ enum joined_pipes {
 
 uint64_t igt_kms_frame_time_from_vrefresh(uint32_t vrefresh);
 
+void dump_connector_attrs(void);
 bool kmstest_force_connector(int fd, drmModeConnector *connector,
 			     enum kmstest_force_connector_state state);
 bool kmstest_force_connector_joiner(int drm_fd, drmModeConnector *connector, int joined_pipes);

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 08/46] lib/igt_kms: Expose reset_connectors_at_exit
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (6 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 07/46] lib/igt_kms: Expose dump_connector_attrs Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 09/46] lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set Louis Chauvet
                   ` (43 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

reset_connectors_at_exit is used by i915 DP helpers, expose it so it can
be reused in a different file.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 2 +-
 lib/igt_kms.h | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index a5b840e5aed3..473d35b373e5 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -1493,7 +1493,7 @@ void kmstest_set_vt_text_mode(void)
 	igt_assert(set_vt_mode(KD_TEXT) >= 0);
 }
 
-static void reset_connectors_at_exit(int sig)
+void reset_connectors_at_exit(int sig)
 {
 	igt_reset_connectors();
 }
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 3975909aeeef..7caceec7c076 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -162,6 +162,7 @@ int kmstest_get_pipe_from_crtc_id(int fd, int crtc_id);
 void kmstest_set_vt_graphics_mode(void);
 void kmstest_restore_vt_mode(void);
 void kmstest_set_vt_text_mode(void);
+void reset_connectors_at_exit(int sig);
 
 enum igt_atomic_crtc_properties {
        IGT_CRTC_CTM = 0,

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 09/46] lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (7 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 08/46] lib/igt_kms: Expose reset_connectors_at_exit Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 10/46] lib/igt_debugfs: Move debugfs helpers to the proper location Louis Chauvet
                   ` (42 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Some debugfs helpers need to use connector attributes. Expose those helpers
to allow using them in igt_debugfs.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 12 +++++-------
 lib/igt_kms.h |  6 ++++++
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 473d35b373e5..4f6a07c06e9d 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -98,8 +98,6 @@
  */
 #define IGT_KMS_CONNECTOR_NAME_SIZE 50
 
-typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
-
 struct igt_connector_attr {
 	uint32_t connector_type;
 	uint32_t connector_type_id;
@@ -1593,11 +1591,11 @@ static void connector_attr_free(struct igt_connector_attr *c)
 	memset(c, 0, sizeof(*c));
 }
 
-static bool connector_attr_set(int idx, drmModeConnector *connector,
-			       int dir, igt_connector_attr_set set,
-			       const char *attr, const char *value,
-			       const char *reset_value,
-			       bool force_reset)
+bool connector_attr_set(int idx, drmModeConnector *connector,
+			int dir, igt_connector_attr_set set,
+			const char *attr, const char *value,
+			const char *reset_value,
+			bool force_reset)
 {
 	struct igt_connector_attr *c;
 
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 7caceec7c076..21057c62fc05 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1224,6 +1224,12 @@ void igt_parse_connector_tile_blob(drmModePropertyBlobPtr blob,
 
 int igt_connector_sysfs_open(int drm_fd,
 			     drmModeConnector *connector);
+typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
+bool connector_attr_set(int idx, drmModeConnector *connector,
+			int dir, igt_connector_attr_set set,
+			const char *attr, const char *value,
+			const char *reset_value,
+			bool force_reset);
 uint32_t igt_reduce_format(uint32_t format);
 
 

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 10/46] lib/igt_debugfs: Move debugfs helpers to the proper location
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (8 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 09/46] lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:10   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 11/46] lib/igt_debugfs: Add const when make sense Louis Chauvet
                   ` (41 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

igt_debugfs_read_connector_file and igt_debugfs_write_connector_file are
debugfs related helpers. To avoid mixing everything in igt_kms, move them
to igt_debugfs.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_debugfs.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_debugfs.h | 13 ++++++++
 lib/igt_kms.c     | 93 ------------------------------------------------------
 3 files changed, 107 insertions(+), 93 deletions(-)

diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index 210a9cea0d1e..e73db25835eb 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -43,6 +43,7 @@
 #include "igt_aux.h"
 #include "igt_kms.h"
 #include "igt_debugfs.h"
+#include "igt_device.h"
 #include "igt_sysfs.h"
 
 /**
@@ -745,3 +746,96 @@ void __igt_debugfs_dump(int device, const char *filename, int level)
 	igt_log(IGT_LOG_DOMAIN, level, "%s:\n%s\n", filename, contents);
 	free(contents);
 }
+
+/**
+ * igt_debugfs_read_connector_file:
+ * @drm_fd: A drm file descriptor
+ * @conn_name: Name of the output connector
+ * @filename: The file to read from in the connector's directory
+ * @buf: Buffer to store the read content
+ * @buf_size: Size of the buffer
+ *
+ * Reads from a specific file in the connector's debugfs directory.
+ *
+ * Returns: 0 on success, -1 on failure.
+ */
+int igt_debugfs_read_connector_file(int drm_fd, char *conn_name,
+				    const char *filename, char *buf,
+				    size_t buf_size)
+{
+	int dir, res;
+
+	dir = igt_debugfs_connector_dir(drm_fd, conn_name, O_RDONLY);
+	igt_assert_f(dir >= 0, "Failed to open debugfs dir for connector %s\n", conn_name);
+
+	res = igt_debugfs_simple_read(dir, filename, buf, buf_size);
+	close(dir);
+
+	if (res < 0)
+		return -1;
+
+	return 0;
+}
+
+/**
+ * igt_debugfs_write_connector_file:
+ * @drm_fd: A drm file descriptor
+ * @conn_name: Name of the output connector
+ * @filename: The file to write to in the connector's directory
+ * @data: Data to write to the file
+ * @data_size: Size of the data to write
+ *
+ * Writes to a specific file in the connector's debugfs directory.
+ *
+ * Returns: 0 on success, -1 on failure.
+ */
+int igt_debugfs_write_connector_file(int drm_fd, char *conn_name,
+				     const char *filename, const char *data,
+				     size_t data_size)
+{
+	int dir, res;
+
+	dir = igt_debugfs_connector_dir(drm_fd, conn_name, O_RDONLY);
+	igt_assert_f(dir >= 0, "Failed to open debugfs dir for connector %s\n",
+		     conn_name);
+
+	res = igt_sysfs_write(dir, filename, data, data_size);
+	close(dir);
+
+	if (res < 0)
+		return -1;
+
+	return 0;
+}
+
+bool connector_attr_set_debugfs(int drm_fd,
+				drmModeConnector *connector,
+				const char *attr, const char *value,
+				const char *reset_value,
+				bool force_reset)
+{
+	char name[80];
+	int idx, dir;
+
+	idx = igt_device_get_card_index(drm_fd);
+	if (idx < 0 || idx > 63)
+		return false;
+
+	snprintf(name, sizeof(name), "%s-%d",
+		 kmstest_connector_type_str(connector->connector_type),
+		 connector->connector_type_id);
+
+	dir = igt_debugfs_connector_dir(drm_fd, name, O_DIRECTORY);
+	if (dir < 0)
+		return false;
+
+	if (!connector_attr_set(idx, connector, dir,
+				igt_sysfs_set, attr,
+				value, reset_value,
+				force_reset))
+		return false;
+
+	igt_info("Connector %s/%s is now %s\n", name, attr, value);
+
+	return true;
+}
diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
index f4044d5458ab..c33908054da7 100644
--- a/lib/igt_debugfs.h
+++ b/lib/igt_debugfs.h
@@ -28,6 +28,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
+#include <xf86drmMode.h>
 
 enum pipe;
 
@@ -177,4 +178,16 @@ int igt_get_stable_obj_count(int driver);
 void __igt_debugfs_dump(int device, const char *filename, int level);
 #define igt_debugfs_dump(d, f) __igt_debugfs_dump(d, f, IGT_LOG_DEBUG)
 
+int igt_debugfs_read_connector_file(int drm_fd, char *conn_name,
+				    const char *filename, char *buf,
+				    size_t buf_size);
+int igt_debugfs_write_connector_file(int drm_fd, char *conn_name,
+				     const char *filename, const char *data,
+				     size_t data_size);
+bool connector_attr_set_debugfs(int drm_fd,
+				drmModeConnector *connector,
+				const char *attr, const char *value,
+				const char *reset_value,
+				bool force_reset);
+
 #endif /* __IGT_DEBUGFS_H__ */
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 4f6a07c06e9d..27c0947bcb7b 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -1648,38 +1648,6 @@ static bool connector_attr_set_sysfs(int drm_fd,
 	return true;
 }
 
-static bool connector_attr_set_debugfs(int drm_fd,
-				       drmModeConnector *connector,
-				       const char *attr, const char *value,
-				       const char *reset_value,
-				       bool force_reset)
-{
-	char name[80];
-	int idx, dir;
-
-	idx = igt_device_get_card_index(drm_fd);
-	if (idx < 0 || idx > 63)
-		return false;
-
-	snprintf(name, sizeof(name), "%s-%d",
-		 kmstest_connector_type_str(connector->connector_type),
-		 connector->connector_type_id);
-
-	dir = igt_debugfs_connector_dir(drm_fd, name, O_DIRECTORY);
-	if (dir < 0)
-		return false;
-
-	if (!connector_attr_set(idx, connector, dir,
-				igt_sysfs_set, attr,
-				value, reset_value,
-				force_reset))
-		return false;
-
-	igt_info("Connector %s/%s is now %s\n", name, attr, value);
-
-	return true;
-}
-
 void dump_connector_attrs(void)
 {
 	char name[80];
@@ -7118,67 +7086,6 @@ static int igt_parse_marked_value(const char *buf, char marked_char, int *result
 	return -1;
 }
 
-/**
- * igt_debugfs_read_connector_file:
- * @drm_fd: A drm file descriptor
- * @conn_name: Name of the output connector
- * @filename: The file to read from in the connector's directory
- * @buf: Buffer to store the read content
- * @buf_size: Size of the buffer
- *
- * Reads from a specific file in the connector's debugfs directory.
- *
- * Returns: 0 on success, -1 on failure.
- */
-static int igt_debugfs_read_connector_file(int drm_fd, char *conn_name,
-				    const char *filename, char *buf,
-				    size_t buf_size)
-{
-	int dir, res;
-
-	dir = igt_debugfs_connector_dir(drm_fd, conn_name, O_RDONLY);
-	igt_assert_f(dir >= 0, "Failed to open debugfs dir for connector %s\n", conn_name);
-
-	res = igt_debugfs_simple_read(dir, filename, buf, buf_size);
-	close(dir);
-
-	if (res < 0)
-		return -1;
-
-	return 0;
-}
-
-/**
- * igt_debugfs_write_connector_file:
- * @drm_fd: A drm file descriptor
- * @conn_name: Name of the output connector
- * @filename: The file to write to in the connector's directory
- * @data: Data to write to the file
- * @data_size: Size of the data to write
- *
- * Writes to a specific file in the connector's debugfs directory.
- *
- * Returns: 0 on success, -1 on failure.
- */
-static int igt_debugfs_write_connector_file(int drm_fd, char *conn_name,
-				     const char *filename, const char *data,
-				     size_t data_size)
-{
-	int dir, res;
-
-	dir = igt_debugfs_connector_dir(drm_fd, conn_name, O_RDONLY);
-	igt_assert_f(dir >= 0, "Failed to open debugfs dir for connector %s\n",
-		     conn_name);
-
-	res = igt_sysfs_write(dir, filename, data, data_size);
-	close(dir);
-
-	if (res < 0)
-		return -1;
-
-	return 0;
-}
-
 /**
  * igt_get_current_link_rate:
  * @drm_fd: A drm file descriptor

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 11/46] lib/igt_debugfs: Add const when make sense
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (9 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 10/46] lib/igt_debugfs: Move debugfs helpers to the proper location Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:11   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 12/46] lib/igt_amd: " Louis Chauvet
                   ` (40 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Const qualifier avoid unwanted modifications. Add const at place where
it make sense.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_debugfs.c | 4 ++--
 lib/igt_debugfs.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index e73db25835eb..6b19ffa3a7ae 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -239,7 +239,7 @@ int igt_debugfs_gt_dir(int device, unsigned int gt)
  * Returns:
  * The directory fd, or -1 on failure.
  */
-int igt_debugfs_connector_dir(int device, char *conn_name, int mode)
+int igt_debugfs_connector_dir(int device, const char *conn_name, int mode)
 {
 	int dir, ret;
 
@@ -759,7 +759,7 @@ void __igt_debugfs_dump(int device, const char *filename, int level)
  *
  * Returns: 0 on success, -1 on failure.
  */
-int igt_debugfs_read_connector_file(int drm_fd, char *conn_name,
+int igt_debugfs_read_connector_file(int drm_fd, const char *conn_name,
 				    const char *filename, char *buf,
 				    size_t buf_size)
 {
diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
index c33908054da7..22046539d919 100644
--- a/lib/igt_debugfs.h
+++ b/lib/igt_debugfs.h
@@ -36,7 +36,7 @@ const char *igt_debugfs_mount(void);
 char *igt_debugfs_path(int device, char *path, int pathlen);
 
 int igt_debugfs_dir(int device);
-int igt_debugfs_connector_dir(int device, char *conn_name, int mode);
+int igt_debugfs_connector_dir(int device, const char *conn_name, int mode);
 int igt_debugfs_pipe_dir(int device, int pipe, int mode);
 
 int igt_debugfs_open(int fd, const char *filename, int mode);
@@ -178,7 +178,7 @@ int igt_get_stable_obj_count(int driver);
 void __igt_debugfs_dump(int device, const char *filename, int level);
 #define igt_debugfs_dump(d, f) __igt_debugfs_dump(d, f, IGT_LOG_DEBUG)
 
-int igt_debugfs_read_connector_file(int drm_fd, char *conn_name,
+int igt_debugfs_read_connector_file(int drm_fd, const char *conn_name,
 				    const char *filename, char *buf,
 				    size_t buf_size);
 int igt_debugfs_write_connector_file(int drm_fd, char *conn_name,

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 12/46] lib/igt_amd: Add const when make sense
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (10 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 11/46] lib/igt_debugfs: Add const when make sense Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:11   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 13/46] lib/igt_kms: " Louis Chauvet
                   ` (39 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Const qualifier helps to avoid unwanted modification of a pointer.
To help avoiding those errors, modify the function signature to
use const.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_amd.c | 2 +-
 lib/igt_amd.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/igt_amd.c b/lib/igt_amd.c
index 3ddb5f40374e..081bad411355 100644
--- a/lib/igt_amd.c
+++ b/lib/igt_amd.c
@@ -831,7 +831,7 @@ int igt_amd_trigger_hotplug(int drm_fd, char *connector_name)
  * values of "Current", "Verified", "Reported", and "Preferred", respectively.
  */
 void igt_amd_read_link_settings(
-	int drm_fd, char *connector_name, int *lane_count, int *link_rate, int *link_spread)
+	int drm_fd, const char *connector_name, int *lane_count, int *link_rate, int *link_spread)
 {
 	int fd, ret;
 	char buf[101];
diff --git a/lib/igt_amd.h b/lib/igt_amd.h
index bce4657cbcfd..217ee6dcbd02 100644
--- a/lib/igt_amd.h
+++ b/lib/igt_amd.h
@@ -210,7 +210,7 @@ int igt_amd_trigger_hotplug(int drm_fd, char *connector_name);
 
 /* IGT link helper functions */
 void igt_amd_read_link_settings(
-	int drm_fd, char *connector_name, int *lane_count, int *link_rate, int *link_spread);
+	int drm_fd, const char *connector_name, int *lane_count, int *link_rate, int *link_spread);
 void igt_amd_write_link_settings(
 	int drm_fd, char *connector_name, enum dc_lane_count lane_count,
 	enum dc_link_rate link_rate, enum dc_link_training_type training_type);

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 13/46] lib/igt_kms: Add const when make sense
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (11 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 12/46] lib/igt_amd: " Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:11   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 14/46] lib/monitor_edids: Add helper functions for using monitor_edid objects Louis Chauvet
                   ` (38 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Const qualifier helps to avoid unwanted modification of a pointer.
To help avoiding those errors, modify the function signature to
use const.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 2 +-
 lib/igt_kms.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 27c0947bcb7b..3d73f338cc80 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -4819,7 +4819,7 @@ int igt_display_drop_events(igt_display_t *display)
  *
  * Returns: String representing a connector's name, e.g. "DP-1".
  */
-const char *igt_output_name(igt_output_t *output)
+const char *igt_output_name(const igt_output_t *output)
 {
 	return output->name;
 }
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 21057c62fc05..9dc0362300aa 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -558,7 +558,7 @@ int  igt_display_get_n_pipes(igt_display_t *display);
 void igt_display_require_output(igt_display_t *display);
 void igt_display_require_output_on_pipe(igt_display_t *display, enum pipe pipe);
 
-const char *igt_output_name(igt_output_t *output);
+const char *igt_output_name(const igt_output_t *output);
 drmModeModeInfo *igt_output_get_mode(igt_output_t *output);
 drmModeModeInfo *igt_output_get_highres_mode(igt_output_t *output);
 drmModeModeInfo *igt_output_get_lowres_mode(igt_output_t *output);

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 14/46] lib/monitor_edids: Add helper functions for using monitor_edid objects
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (12 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 13/46] lib/igt_kms: " Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:11   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 15/46] lib/monitor_edids: Add helper to get an EDID by its name Louis Chauvet
                   ` (37 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Introduce the functions edid_from_monitor_edid() and
get_edids_for_connector_type(). The former converts a monitor_edid object
to a struct edid, which can then be utilized by igt_kms helpers. The
latter returns a list of monitor_edid objects for a specific connector
with certain characteristics

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/monitor_edids/dp_edids.h             |  3 ++
 lib/monitor_edids/hdmi_edids.h           |  3 ++
 lib/monitor_edids/monitor_edids_helper.c | 80 ++++++++++++++++++++++++++++++++
 lib/monitor_edids/monitor_edids_helper.h |  7 ++-
 4 files changed, 92 insertions(+), 1 deletion(-)

diff --git a/lib/monitor_edids/dp_edids.h b/lib/monitor_edids/dp_edids.h
index 144907558be1..07793381257e 100644
--- a/lib/monitor_edids/dp_edids.h
+++ b/lib/monitor_edids/dp_edids.h
@@ -194,4 +194,7 @@ monitor_edid DP_EDIDS_NON_4K[] = {
 
  };
 
+#define DP_EDIDS_4K_COUNT ARRAY_SIZE(DP_EDIDS_4K)
+#define DP_EDIDS_NON_4K_COUNT ARRAY_SIZE(DP_EDIDS_NON_4K)
+
 #endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_DP_EDIDS_H_ */
diff --git a/lib/monitor_edids/hdmi_edids.h b/lib/monitor_edids/hdmi_edids.h
index f6cfe82ff6e1..3984241775c3 100644
--- a/lib/monitor_edids/hdmi_edids.h
+++ b/lib/monitor_edids/hdmi_edids.h
@@ -604,4 +604,7 @@ monitor_edid HDMI_EDIDS_NON_4K[] = {
 		  "1620582c2500baac4200009e0000006b" },
 };
 
+#define HDMI_EDIDS_4K_COUNT ARRAY_SIZE(HDMI_EDIDS_4K)
+#define HDMI_EDIDS_NON_4K_COUNT ARRAY_SIZE(HDMI_EDIDS_NON_4K)
+
 #endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_HDMI_EDIDS_H_ */
diff --git a/lib/monitor_edids/monitor_edids_helper.c b/lib/monitor_edids/monitor_edids_helper.c
index 1cbf1c22f0bb..6043e7a084b3 100644
--- a/lib/monitor_edids/monitor_edids_helper.c
+++ b/lib/monitor_edids/monitor_edids_helper.c
@@ -15,6 +15,10 @@
 #include <assert.h>
 
 #include "igt_core.h"
+#include "igt_edid.h"
+#include "dp_edids.h"
+#include "drmtest.h"
+#include "hdmi_edids.h"
 
 static uint8_t convert_hex_char_to_byte(char c)
 {
@@ -90,3 +94,79 @@ void free_chamelium_edid_from_monitor_edid(struct chamelium_edid *edid)
 	free(edid);
 	edid = NULL;
 }
+
+/**
+ * edid_from_monitor_edid:
+ * @mon_edid: Monitor EDID to convert
+ *
+ * Get a struct edid from a monitor_edid. This returns a pointer to a newly allocated struct edid.
+ * The caller is in charge to free this pointer when required.
+ */
+struct edid *edid_from_monitor_edid(const monitor_edid *mon_edid)
+{
+	uint8_t *raw_edid;
+	size_t edid_size;
+	int i;
+
+	edid_size = strlen(mon_edid->edid) / 2; /* each ascii is a nibble. */
+	raw_edid = malloc(edid_size);
+	igt_assert(raw_edid);
+
+	for (i = 0; i < edid_size; i++) {
+		raw_edid[i] = convert_hex_char_to_byte(mon_edid->edid[i * 2]) << 4 |
+			      convert_hex_char_to_byte(mon_edid->edid[i * 2 + 1]);
+	}
+
+	if (edid_get_size((struct edid *)raw_edid) > edid_size) {
+		uint8_t *new_edid;
+
+		igt_debug("The edid size stored in the raw edid is longer than the edid stored in the table.");
+		new_edid = realloc(raw_edid, edid_get_size((struct edid *)raw_edid));
+		igt_assert(new_edid);
+		raw_edid = new_edid;
+	}
+
+	return (struct edid *)raw_edid;
+}
+
+/**
+ * get_edids_for_connector_type:
+ * @type: The connector type to get the EDIDs from
+ * @count: Used to store the number of EDIDs in the returned list
+ * @four_k: Use true to fetch 4k EDIDs, false to fetch non-4k EDIDs
+ *
+ * Get the list of EDIDS for a specific connector type. This returns a pointer to a static list,
+ * so no need to free the pointer.
+ */
+struct monitor_edid *get_edids_for_connector_type(uint32_t type, size_t *count, bool four_k)
+{
+	if (four_k) {
+		switch (type) {
+		case DRM_MODE_CONNECTOR_DisplayPort:
+			*count = DP_EDIDS_4K_COUNT;
+			return DP_EDIDS_4K;
+		case DRM_MODE_CONNECTOR_HDMIA:
+			*count = HDMI_EDIDS_4K_COUNT;
+			return HDMI_EDIDS_4K;
+		default:
+			*count = 0;
+			igt_debug("No 4k EDID for the connector %s\n",
+				  kmstest_connector_type_str(type));
+			return NULL;
+		}
+	} else {
+		switch (type) {
+		case DRM_MODE_CONNECTOR_DisplayPort:
+			*count = DP_EDIDS_NON_4K_COUNT;
+			return DP_EDIDS_NON_4K;
+		case DRM_MODE_CONNECTOR_HDMIA:
+			*count = HDMI_EDIDS_NON_4K_COUNT;
+			return HDMI_EDIDS_NON_4K;
+		default:
+			*count = 0;
+			igt_debug("No EDID for the connector %s\n",
+				  kmstest_connector_type_str(type));
+			return NULL;
+		}
+	}
+}
diff --git a/lib/monitor_edids/monitor_edids_helper.h b/lib/monitor_edids/monitor_edids_helper.h
index 05679f0897f3..e5069868683d 100644
--- a/lib/monitor_edids/monitor_edids_helper.h
+++ b/lib/monitor_edids/monitor_edids_helper.h
@@ -12,6 +12,8 @@
 #define TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_
 
 #include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
 
 #include "igt_chamelium.h"
 
@@ -30,4 +32,7 @@ get_chameleon_edid_from_monitor_edid(struct chamelium *chamelium,
 				     const monitor_edid *edid);
 void free_chamelium_edid_from_monitor_edid(struct chamelium_edid *edid);
 
-#endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ */
\ No newline at end of file
+struct edid *edid_from_monitor_edid(const monitor_edid *monitor_edid);
+struct monitor_edid *get_edids_for_connector_type(uint32_t type, size_t *count, bool four_k);
+
+#endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 15/46] lib/monitor_edids: Add helper to get an EDID by its name
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (13 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 14/46] lib/monitor_edids: Add helper functions for using monitor_edid objects Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:11   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 16/46] lib/monitor_edids: Add helper to print all available EDID names Louis Chauvet
                   ` (36 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

For testing specific EDID, it is useful to be able to retrieve an EDID by
a verbose name.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/monitor_edids/monitor_edids_helper.c | 30 ++++++++++++++++++++++++++++++
 lib/monitor_edids/monitor_edids_helper.h |  1 +
 2 files changed, 31 insertions(+)

diff --git a/lib/monitor_edids/monitor_edids_helper.c b/lib/monitor_edids/monitor_edids_helper.c
index 6043e7a084b3..01feb34a5516 100644
--- a/lib/monitor_edids/monitor_edids_helper.c
+++ b/lib/monitor_edids/monitor_edids_helper.c
@@ -20,6 +20,16 @@
 #include "drmtest.h"
 #include "hdmi_edids.h"
 
+struct {
+	struct monitor_edid *edid_list;
+	int list_size;
+} ALL_EDIDS[] = {
+	{DP_EDIDS_NON_4K,	DP_EDIDS_NON_4K_COUNT},
+	{DP_EDIDS_4K,		DP_EDIDS_4K_COUNT},
+	{HDMI_EDIDS_NON_4K,	HDMI_EDIDS_NON_4K_COUNT},
+	{HDMI_EDIDS_4K,		HDMI_EDIDS_4K_COUNT},
+};
+
 static uint8_t convert_hex_char_to_byte(char c)
 {
 	if (c >= '0' && c <= '9')
@@ -170,3 +180,23 @@ struct monitor_edid *get_edids_for_connector_type(uint32_t type, size_t *count,
 		}
 	}
 }
+
+/**
+ * get_edid_by_name:
+ * @name: Name to search in available EDIDs
+ *
+ * Return the struct edid associated with a specific name. As with edid_from_monitor_edid, the
+ * caller must ensure to free the EDID after use. If no EDID with the exact name is found, returns
+ * NULL.
+ */
+struct edid *get_edid_by_name(const char *name)
+{
+	for (int i = 0; i < ARRAY_SIZE(ALL_EDIDS); i++) {
+		for (int j = 0; j < ALL_EDIDS[i].list_size; j++) {
+			if (strcmp(ALL_EDIDS[i].edid_list[j].name, name) == 0)
+				return edid_from_monitor_edid(&ALL_EDIDS[i].edid_list[j]);
+		}
+	}
+
+	return NULL;
+}
diff --git a/lib/monitor_edids/monitor_edids_helper.h b/lib/monitor_edids/monitor_edids_helper.h
index e5069868683d..6d9e3fc89592 100644
--- a/lib/monitor_edids/monitor_edids_helper.h
+++ b/lib/monitor_edids/monitor_edids_helper.h
@@ -34,5 +34,6 @@ void free_chamelium_edid_from_monitor_edid(struct chamelium_edid *edid);
 
 struct edid *edid_from_monitor_edid(const monitor_edid *monitor_edid);
 struct monitor_edid *get_edids_for_connector_type(uint32_t type, size_t *count, bool four_k);
+struct edid *get_edid_by_name(const char *name);
 
 #endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 16/46] lib/monitor_edids: Add helper to print all available EDID names
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (14 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 15/46] lib/monitor_edids: Add helper to get an EDID by its name Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-20 21:11   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 17/46] lib/unigraf: Add used defines for TSI_Types Louis Chauvet
                   ` (35 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

During the unigraf configuration, it may be required to know the list
of supported EDID names, so add an helper to print them.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/monitor_edids/monitor_edids_helper.c | 16 ++++++++++++++++
 lib/monitor_edids/monitor_edids_helper.h |  2 ++
 2 files changed, 18 insertions(+)

diff --git a/lib/monitor_edids/monitor_edids_helper.c b/lib/monitor_edids/monitor_edids_helper.c
index 01feb34a5516..0f9f5269471c 100644
--- a/lib/monitor_edids/monitor_edids_helper.c
+++ b/lib/monitor_edids/monitor_edids_helper.c
@@ -200,3 +200,19 @@ struct edid *get_edid_by_name(const char *name)
 
 	return NULL;
 }
+
+/*
+ * list_edid_names:
+ * @level: Log level to write the names on
+ *
+ * Print all the EDID available in igt.
+ */
+void list_edid_names(enum igt_log_level level)
+{
+	for (int i = 0; i < ARRAY_SIZE(ALL_EDIDS); i++) {
+		for (int j = 0; j < ALL_EDIDS[i].list_size; j++) {
+			igt_log(IGT_LOG_DOMAIN, level, " - \"%s\"\n",
+				ALL_EDIDS[i].edid_list[j].name);
+		}
+	}
+}
diff --git a/lib/monitor_edids/monitor_edids_helper.h b/lib/monitor_edids/monitor_edids_helper.h
index 6d9e3fc89592..7ae0fd40c041 100644
--- a/lib/monitor_edids/monitor_edids_helper.h
+++ b/lib/monitor_edids/monitor_edids_helper.h
@@ -15,6 +15,7 @@
 #include <stddef.h>
 #include <stdbool.h>
 
+#include "igt_core.h"
 #include "igt_chamelium.h"
 
 /* Max Length can be increased as needed, when new EDIDs are added. */
@@ -35,5 +36,6 @@ void free_chamelium_edid_from_monitor_edid(struct chamelium_edid *edid);
 struct edid *edid_from_monitor_edid(const monitor_edid *monitor_edid);
 struct monitor_edid *get_edids_for_connector_type(uint32_t type, size_t *count, bool four_k);
 struct edid *get_edid_by_name(const char *name);
+void list_edid_names(enum igt_log_level level);
 
 #endif /* TESTS_CHAMELIUM_MONITOR_EDIDS_MONITOR_EDIDS_HELPER_H_ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 17/46] lib/unigraf: Add used defines for TSI_Types
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (15 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 16/46] lib/monitor_edids: Add helper to print all available EDID names Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-21 17:49   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h Louis Chauvet
                   ` (34 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Current unigraf public release are not c-compatible, this file hardcode
some values. One future release of libTSI may include a c-compatible
TSI_types.h file with full structure definition, but until then.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/TSI_types.h | 117 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)

diff --git a/lib/unigraf/TSI_types.h b/lib/unigraf/TSI_types.h
new file mode 100644
index 000000000000..f854c500a82c
--- /dev/null
+++ b/lib/unigraf/TSI_types.h
@@ -0,0 +1,117 @@
+/* SPDX-License-Identifier: MIT */
+
+// DO NOT MERGE THIS FILE
+//
+// Current unigraf public release are not c-compatible, this file hardcode some values
+// The next release of libTSI should include a c-compatible TSI_types.h file, that will
+// be directly used in place of this file
+
+#include <stdbool.h>
+#include <stdint.h>
+#ifndef TSI_REG_H
+
+#define TSI_VERSION_TEXT			0x80000001
+#define TSI_DEVCAP_VIDEO_CAPTURE		0x00000001
+#define TSI_SEARCHOPTIONS_SHOW_DEVICES_IN_USE	0x00000001
+
+#define TSI_EDID_TE_INPUT			0x1100
+#define TSI_EDID_SELECT_STREAM			0x1102
+
+#define TSI_BASE_LEGACY_GENERIC(offset)		(0x210 + (offset))
+#define	TSI_FORCE_HOT_PLUG_STATE_W		TSI_BASE_LEGACY_GENERIC(0x2)
+
+#define TSI_BASE_LEGACY_DPRX_MSA(offset)		(0x260 + (offset))
+#define	TSI_DPRX_MSA_COMMAND_W				TSI_BASE_LEGACY_DPRX_MSA(0x0)
+#define TSI_DPRX_MSA_STREAM_COUNT_R			TSI_BASE_LEGACY_DPRX_MSA(0x1)
+#define TSI_DPRX_MSA_STREAM_SELECT			TSI_BASE_LEGACY_DPRX_MSA(0x3)
+#define TSI_DPRX_MSA_HTOTAL_R				TSI_BASE_LEGACY_DPRX_MSA(0x6)
+#define TSI_DPRX_MSA_VTOTAL_R				TSI_BASE_LEGACY_DPRX_MSA(0x7)
+#define TSI_DPRX_MSA_HACTIVE_R				TSI_BASE_LEGACY_DPRX_MSA(0x8)
+#define TSI_DPRX_MSA_VACTIVE_R				TSI_BASE_LEGACY_DPRX_MSA(0x9)
+#define TSI_DPRX_MSA_HSYNC_WIDTH_R			TSI_BASE_LEGACY_DPRX_MSA(0xa)
+#define TSI_DPRX_MSA_VSYNC_WIDTH_R			TSI_BASE_LEGACY_DPRX_MSA(0xb)
+#define TSI_DPRX_MSA_HSTART_R				TSI_BASE_LEGACY_DPRX_MSA(0xc)
+#define TSI_DPRX_MSA_VSTART_R				TSI_BASE_LEGACY_DPRX_MSA(0xd)
+
+#define TSI_DPRX_LINK_FLAGS_MST				0x01
+#define TSI_DPRX_LINK_FLAGS_TPS3			0x02
+#define TSI_DPRX_LINK_FLAGS_TPS4			0x03
+#define TSI_DPRX_LINK_FLAGS_EDP				0x04
+#define TSI_DPRX_NOT_DOCUMENTED_DP_128_132_SUPPORTED	0x10
+#define TSI_DPRX_NOT_DOCUMENTED_SIDEBAND_MSG_SUPPORT	0x20
+
+#define TSI_BASE_DPRX(offset)			(0x50000000u + 0x21000 + (offset))
+#define TSI_DPRX_HW_CAPS_R			TSI_BASE_DPRX(0x4)
+
+/**
+ * struct TSI_DPRX_HW_CAPS_R_s - Structure representing the hardware capabilities of the DP RX.
+ *
+ * This structure defines the bitfields and fields that describe the hardware
+ * capabilities of the DP RX (DisplayPort Receiver) interface. Each field
+ * corresponds to a specific capability or feature supported by the hardware.
+ *
+ * This structure is used to interpret the value read from the
+ * TSI_DPRX_HW_CAPS_R register.
+ *
+ * @mst: MST support
+ * @hdcp_1_x: HDCP 1.x support.
+ * @hdcp_2_x: HDCP 2.x support.
+ * @fec_8_10_b: FEC for 8/10 link support.
+ * @dsc_8_10_b: DSC for 8/10 link support.
+ * @three_lanes: Three lane link configuration support.
+ * @edp_link_rate: eDP link rate support.
+ * @mst_stream_count: Number of MST streams supported.
+ * @max_link_rate: Maximum link rate supported.
+ * @force_link_config: Forced link configuration support.
+ * @power_provision: Power provision support on DP_PWR pin of receptacle connector.
+ * @aux_swing_voltage_control: AUX output voltage swing control support.
+ * @custom_dp_rate: Custom DP 2.0 rate support.
+ * @custom_bit_rate: Custom bit rate support.
+ * @fec_128_132_b: FEC for 128/132 link support.
+ * @dsc_128_132_b: DSC for 128/132 link support.
+ */
+struct TSI_DPRX_HW_CAPS_R_s {
+	bool mst:1;
+	bool hdcp_1_x:1;
+	bool hdcp_2_x:1;
+	bool fec_8_10_b:1;
+	bool dsc_8_10_b:1;
+	bool reserved_1:1;
+	bool three_lanes:1;
+	bool edp_link_rate:1;
+	uint8_t mst_stream_count:3;
+	uint8_t reserved_2:5;
+	uint8_t max_link_rate;
+	bool force_link_config:1;
+	bool reserved_3:1;
+	bool power_provision:1;
+	bool aux_swing_voltage_control:1;
+	bool custom_dp_rate:1;
+	bool custom_bit_rate:1;
+	bool fec_128_132_b:1;
+	bool dsc_128_132_b:1;
+};
+
+#define TSI_DPRX_LT_LANE_COUNT_R		TSI_BASE_DPRX(0x0B)
+#define TSI_DPRX_LT_RATE_R			TSI_BASE_DPRX(0x0C)
+#define TSI_DPRX_HPD_FORCE			TSI_BASE_DPRX(0x12)
+#define TSI_DPRX_MST_SINK_COUNT			TSI_BASE_DPRX(0x9D)
+
+#define TSI_BASE_DP_RX(offset)                  (0x00010100 + (offset))
+#define TSI_DP_RX_DUT_MAX_LANE_COUNT		TSI_BASE_DP_RX(0xf)
+
+#define TSI_BASE_DP_LTT(offset)                 (0x00010700 + (offset))
+#define TSI_DP_LTT_MAX_LANE_COUNT		TSI_BASE_DP_LTT(0x01)
+
+#define TSI_BASE_LEGACY_DPRX(offset)		(0x2b0 + (offset))
+#define TSI_DPRX_DPCD_BASE_W			TSI_BASE_LEGACY_DPRX(0x9)
+#define TSI_DPRX_DPCD_DATA			TSI_BASE_LEGACY_DPRX(0xA)
+#define TSI_DPRX_MAX_LANES			TSI_BASE_LEGACY_DPRX(0x10)
+#define TSI_DPRX_MAX_LINK_RATE			TSI_BASE_LEGACY_DPRX(0x11)
+#define TSI_DPRX_LINK_FLAGS			TSI_BASE_LEGACY_DPRX(0x12)
+#define TSI_DPRX_STREAM_SELECT			TSI_BASE_LEGACY_DPRX(0x13)
+#define TSI_DPRX_CRC_R_R			TSI_BASE_LEGACY_DPRX(0x14)
+#define TSI_DPRX_CRC_G_R			TSI_BASE_LEGACY_DPRX(0x15)
+#define TSI_DPRX_CRC_B_R			TSI_BASE_LEGACY_DPRX(0x16)
+#define TSI_DPRX_HPD_PULSE_W			TSI_BASE_LEGACY_DPRX(0x1B)
+#endif

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (16 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 17/46] lib/unigraf: Add used defines for TSI_Types Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-21 17:49   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support Louis Chauvet
                   ` (33 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Unigraf does not provide header for the libTSI.so file, only dynamic
library loading helpers for windows.

In order to link against this library and use unigraf devices, add the
function declaration used in the dynamic library loading wrappers.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/TSI.h | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 234 insertions(+)

diff --git a/lib/unigraf/TSI.h b/lib/unigraf/TSI.h
new file mode 100644
index 000000000000..62daaab6300e
--- /dev/null
+++ b/lib/unigraf/TSI.h
@@ -0,0 +1,234 @@
+/* SPDX-License-Identifier: MIT */
+
+/*
+ * tsi.h - Header for libTSI.so
+ * Documentation here is taken from official documentation and developer observation.
+ */
+
+#ifndef TSI_H
+#define TSI_H
+
+#define TSI_CURRENT_VERSION	12
+#define MAX_EDID_SIZE		4096
+
+#define TSI_SUCCESS		0
+
+typedef unsigned int		TSI_VERSION_ID;
+typedef unsigned int		TSI_SEARCH_OPTIONS;
+typedef unsigned int		TSI_DEVICE_CAPS;
+typedef unsigned int		TSI_CONFIG_ID;
+typedef unsigned int		TSI_DEVICE_ID;
+typedef unsigned int		TSI_INPUT_ID;
+typedef int			TSI_RESULT;
+typedef void			*TSI_HANDLE;
+typedef int			TSI_FLAGS;
+
+/**
+ * TSI_Init() - Initialize the TSI library
+ * @ClientVersion: Indicates the version used to call the libTSI.so functions.
+ *
+ * Initialize libTSI for use and sets up internal state. It can be called
+ * multiple times, but TSI_Clean must be called the exact same number of time.
+ *
+ * Returns:
+ * - In case of success: Reference count to the API (number of times to call TSI_Clean)
+ * - TSI_ERROR_NOT_COMPATIBLE if the requested client version is not supported
+ *   by the library
+ * - TSI_ERROR_COMPATIBILITY_MISMATCH if TSI_Init is called twice with
+ *   different client version
+ */
+TSI_RESULT TSI_Init(TSI_VERSION_ID ClientVersion);
+
+/**
+ * TSI_Clean() - Cleans and closes the TSI library
+ *
+ * When TSI_Clean is called for the last time, cleanup the internal state. It
+ * should be called exactly the same number of time as TSI_Init
+ */
+TSI_RESULT TSI_Clean(void);
+
+/**
+ * TSI_MISC_GetErrorDescription() - Get a human readable error message
+ * @ErrorCode: Error code for which you want the message
+ * @ErrorString: Pointer where to copy the message
+ * @StringMaxLen: Size of the allocated string @ErrorString
+ *
+ * The official documentation states: If the function succeeds, the
+ * return value is the number of characters required for the complete
+ * error description string.
+ * In reality, this function always returns 0 or error, so there is no way to
+ * tell if the allocated memory was big enough
+ *
+ * Returns:
+ * - >= 0 on success, theorically the required string len to store the message
+ * - < 0 on failure
+ */
+TSI_RESULT TSI_MISC_GetErrorDescription(TSI_RESULT ErrorCode,
+					char *ErrorString,
+					unsigned int StringMaxLen);
+
+/**
+ * TSIX_TS_GetConfigItem() - Read a configuration item from the UCD device
+ * @Device: Device handle to read config from. Can be NULL for certain configuration items.
+ * @ConfigItemID: Identifier of the requested configuration item.
+ * @ConfigItemData: Pointer to store the read value.
+ * @ItemMaxSize: Size of the allocated memory for @ConfigItemData.
+ *
+ * Returns: The size of the raw data. If the return value is larger than ItemMaxSize, no data
+ *          is copied to ConfigItemData.
+ * Note:
+ * - Some configurations require specific size and alignment for the allocated buffer. Refer to
+ *   the specific item configuration documentation for details.
+ * - Data may still be written to @ConfigItemData even if the return value is larger than
+ *   @ItemMaxSize, potentially causing buffer overflow.
+ */
+TSI_RESULT TSIX_TS_GetConfigItem(TSI_HANDLE Device, TSI_CONFIG_ID ConfigItemID,
+				 void *ConfigItemData,
+				 unsigned int ItemMaxSize);
+
+/**
+ * TSIX_DEV_RescanDevices() - Refresh the internal list of devices for libTSI
+ * @SearchOptions: Options to filter the list of devices (e.g.,
+ *                 TSI_SEARCHOPTIONS_SHOW_DEVICES_IN_USE to include
+ *                 devices already in use).
+ * @RequiredCaps: Filter to list only devices with specific capabilities.
+ * @UnallowedCaps: Filter to list only devices without specific capabilities.
+ *
+ * Returns: >=0 in case of success.
+ *
+ * This function should be called every time you need to update the list of connected devices,
+ * and it must be called at least once before calling TSI_DEV_GetDeviceCount.
+ */
+TSI_RESULT TSIX_DEV_RescanDevices(TSI_SEARCH_OPTIONS SearchOptions,
+				  TSI_DEVICE_CAPS RequiredCaps,
+				  TSI_DEVICE_CAPS UnallowedCaps);
+/**
+ * TSIX_DEV_GetDeviceCount() - Get the count of scanned devices
+ * Returns: the number of devices that the previous call to TSIX_DEV_RescanDevices() detected
+ *
+ * Must be called after a TSIX_DEV_RescanDevices.
+ */
+TSI_RESULT TSIX_DEV_GetDeviceCount(void);
+
+/**
+ * TSIX_DEV_OpenDevice() - Open a device from the scanned list
+ * @DeviceID: index in the TSI_DEV_RescanDevices list
+ * @Result: Pointer to store the error code returned while opening the device
+ * Returns: if the device is found, an opaque pointer that can be used for other
+ * API calls. If some error occurred during the detection, the status code is
+ * written in the pointer @Result.
+ */
+TSI_HANDLE TSIX_DEV_OpenDevice(TSI_DEVICE_ID DeviceID, TSI_RESULT *Result);
+
+/**
+ * TSIX_DEV_CloseDevice() - Close the device handle when finished
+ * @Device: Device handle to close
+ * Returns: >=0 in case of success
+ */
+TSI_RESULT TSIX_DEV_CloseDevice(TSI_HANDLE Device);
+
+/**
+ * TSIX_VIN_Disable() - Disable video input on the specified device
+ * @Device: Device handle to disable video input on
+ * Returns: >=0 in case of success
+ */
+TSI_RESULT TSIX_VIN_Disable(TSI_HANDLE Device);
+
+/**
+ * TSIX_VIN_Select() - Select a specific video input on the specified device
+ * @Device: Device handle on which to select the input
+ * @InputID: Identifier of the input to select
+ * Returns: >=0 in case of success
+ */
+TSI_RESULT TSIX_VIN_Select(TSI_HANDLE Device, TSI_INPUT_ID InputID);
+
+/**
+ * TSIX_DEV_SelectRole() - Select a specific role for the specified device
+ * @Device: Device handle on which to assign the role
+ * @RoleIndex: Index of the role to assign
+ * Returns: >=0 in case of success
+ */
+TSI_RESULT TSIX_DEV_SelectRole(TSI_HANDLE Device, int RoleIndex);
+
+/**
+ * TSIX_TS_SetConfigItem() - Set a configuration item on the specified device
+ * @Device: Device handle to set the configuration on
+ * @ConfigItemID: Identifier of the configuration item to set
+ * @ItemData: Pointer to the data to set
+ * @ItemSize: Size of the data to set
+ * Returns: >=0 in case of success
+ */
+TSI_RESULT TSIX_TS_SetConfigItem(TSI_HANDLE Device, TSI_CONFIG_ID ConfigItemID,
+				 const void *ItemData, unsigned int ItemSize);
+
+/**
+ * TSIX_VIN_Enable() - Enable video input on the specified device
+ * @Device: Device handle to enable video input on
+ * @Flags: Flags to specify the options for enabling the video input
+ * Returns: >=0 in case of success
+ */
+TSI_RESULT TSIX_VIN_Enable(TSI_HANDLE Device, TSI_FLAGS Flags);
+
+/**
+ * TSIX_VIN_GetInputCount() - Get the number of video inputs available on a device
+ * @Device: Device handle to query
+ *
+ * Returns: >=0 in case of success, the number of video inputs available on the device
+ */
+TSI_RESULT TSIX_VIN_GetInputCount(TSI_HANDLE Device);
+
+/**
+ * TSIX_DEV_GetDeviceName() - Get the name of a device from the scanned list
+ * @DeviceID: Index in the TSI_DEV_RescanDevices list
+ * @DevNameString: Pointer to store the device name
+ * @NameStringMaxLength: Size of the allocated memory for @DevNameString
+ *
+ * Returns: >=0 in case of success, the length of the device name string
+ * Note: If the return value is larger than NameStringMaxLength, the string may be truncated
+ */
+TSI_RESULT TSIX_DEV_GetDeviceName(TSI_DEVICE_ID DeviceID, char *DevNameString,
+				  unsigned int NameStringMaxLength);
+
+/**
+ * TSIX_DEV_GetDeviceRoleCount() - Get the number of roles available for a device
+ * @Device: Device handle to query
+ *
+ * Returns: >=0 in case of success, the number of roles available for the device
+ */
+TSI_RESULT TSIX_DEV_GetDeviceRoleCount(TSI_HANDLE Device);
+
+/**
+ * TSIX_DEV_GetDeviceRoleName() - Get the name of a specific role for a device
+ * @Device: Device handle to query
+ * @RoleIndex: Index of the role to get the name for
+ * @RoleNameString: Pointer to store the role name
+ * @RoleStringMaxLength: Size of the allocated memory for @RoleNameString
+ *
+ * Returns: >=0 in case of success, the length of the role name string
+ * Note: If the return value is larger than RoleStringMaxLength, the string may be truncated
+ */
+TSI_RESULT TSIX_DEV_GetDeviceRoleName(TSI_HANDLE Device, int RoleIndex,
+				      char *RoleNameString, unsigned int RoleStringMaxLength);
+
+/**
+ * TSIX_VIN_GetInputCount() - Get the number of video inputs available on a device
+ * @Device: Device handle to query
+ *
+ * Returns: >=0 in case of success, the number of video inputs available on the device
+ */
+TSI_RESULT TSIX_VIN_GetInputCount(TSI_HANDLE Device);
+
+/**
+ * TSIX_VIN_GetInputName() - Get the name of a specific video input on a device
+ * @Device: Device handle to query
+ * @InputID: Identifier of the input to get the name for
+ * @InputNameString: Pointer to store the input name
+ * @NameStringMaxLen: Size of the allocated memory for @InputNameString
+ *
+ * Returns: >=0 in case of success, the length of the input name string
+ * Note: If the return value is larger than NameStringMaxLen, the string may be truncated
+ */
+TSI_RESULT TSIX_VIN_GetInputName(TSI_HANDLE Device, TSI_INPUT_ID InputID,
+				 char *InputNameString, unsigned int NameStringMaxLen);
+
+#endif

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (17 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-21 18:23   ` Luca Ceresoli
  2026-01-21 18:30   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 20/46] lib/igt_kms: Automatically connect unigraf on display require Louis Chauvet
                   ` (32 subsequent siblings)
  51 siblings, 2 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

This introduce the basic boilerplate to connect to a unigraf device.

This integration currently only supports one device openned to simplify
its usage and cleanup.

The functions unigraf_open_device and unigraf_require_device will register
a handler to do proper cleanup on IGT exit.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/meson.build       |  10 +++++
 lib/unigraf/TSI.h     |   8 ----
 lib/unigraf/unigraf.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h |  51 +++++++++++++++++++++++
 meson.build           |  14 +++++++
 5 files changed, 184 insertions(+), 8 deletions(-)

diff --git a/lib/meson.build b/lib/meson.build
index 707ce6ff9ce2..fd98e280637c 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -146,6 +146,13 @@ lib_deps = [
 	zlib
 ]
 
+if libtsi.found()
+	lib_deps += libtsi
+	lib_sources += [
+		'unigraf/unigraf.c'
+	]
+endif
+
 if libdrm_nouveau.found()
 	lib_deps += libdrm_nouveau
 	lib_sources += [
@@ -215,6 +222,9 @@ endif
 if chamelium.found()
 	lib_deps += chamelium
 	lib_sources += [ 'igt_chamelium.c', 'igt_chamelium_stream.c' ]
+endif
+
+if chamelium.found() or libtsi.found()
 	lib_sources += 'monitor_edids/monitor_edids_helper.c'
 endif
 
diff --git a/lib/unigraf/TSI.h b/lib/unigraf/TSI.h
index 62daaab6300e..669748c91aac 100644
--- a/lib/unigraf/TSI.h
+++ b/lib/unigraf/TSI.h
@@ -210,14 +210,6 @@ TSI_RESULT TSIX_DEV_GetDeviceRoleCount(TSI_HANDLE Device);
 TSI_RESULT TSIX_DEV_GetDeviceRoleName(TSI_HANDLE Device, int RoleIndex,
 				      char *RoleNameString, unsigned int RoleStringMaxLength);
 
-/**
- * TSIX_VIN_GetInputCount() - Get the number of video inputs available on a device
- * @Device: Device handle to query
- *
- * Returns: >=0 in case of success, the number of video inputs available on the device
- */
-TSI_RESULT TSIX_VIN_GetInputCount(TSI_HANDLE Device);
-
 /**
  * TSIX_VIN_GetInputName() - Get the name of a specific video input on a device
  * @Device: Device handle to query
diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
new file mode 100644
index 000000000000..55c3c445fa5e
--- /dev/null
+++ b/lib/unigraf/unigraf.c
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: MIT
+
+#include "drmtest.h"
+#include "glib.h"
+#include "igt_core.h"
+#include "igt_edid.h"
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include "unigraf.h"
+#include "TSI.h"
+#include "TSI_types.h"
+#include "igt_kms.h"
+#include "igt_pipe_crc.h"
+#include "igt_rc.h"
+#include "monitor_edids/monitor_edids_helper.h"
+
+#define unigraf_debug(fmt, ...)	igt_debug("TSI:%p: " fmt, unigraf_device, ##__VA_ARGS__)
+
+static int unigraf_open_count;
+static TSI_HANDLE unigraf_device;
+static char *unigraf_default_edid;
+static char *unigraf_connector_name;
+
+static void unigraf_close_device(void)
+{
+	unigraf_debug("Closing...\n");
+	unigraf_assert(TSIX_DEV_CloseDevice(unigraf_device));
+	TSI_Clean();
+	unigraf_device = NULL;
+	free(unigraf_default_edid);
+	free(unigraf_connector_name);
+}
+
+/**
+ * unigraf_exit_handler - Handle the exit signal and clean up unigraf resources.
+ * @sig: The signal number received.
+ *
+ * This function is called when the program receives an exit signal. It ensures
+ * that all unigraf resources are properly cleaned up by calling unigraf_deinit
+ * for each open instance.
+ */
+static void unigraf_exit_handler(int sig)
+{
+	if (unigraf_open_count)
+		unigraf_close_device();
+}
+
+static void unigraf_init(void)
+{
+	int ret;
+
+	unigraf_debug("Initialize unigraf...\n");
+	ret = TSI_Init(TSI_CURRENT_VERSION);
+	unigraf_assert(ret);
+	igt_install_exit_handler(unigraf_exit_handler);
+}
+
+/**
+ * unigraf_device_count() - Return the number of scanned devices
+ *
+ * Must be called after a unigraf_rescan_devices().
+ */
+static unsigned int unigraf_device_count(void)
+{
+	return unigraf_assert(TSIX_DEV_GetDeviceCount());
+}
+
+bool unigraf_open_device(int drm_fd)
+{
+	TSI_RESULT r;
+	int device_count;
+	int chosen_device = 0;
+	int chosen_role = 0;
+	int chosen_input = 0;
+
+	assert(igt_can_fail());
+
+	if (unigraf_device)
+		return true;
+
+	unigraf_init();
+
+	unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
+
+	device_count = unigraf_device_count();
+	if (device_count < 1) {
+		unigraf_debug("No device found.\n");
+		return false;
+	}
+
+	unigraf_device = TSIX_DEV_OpenDevice(chosen_device, &r);
+	unigraf_assert(r);
+	igt_assert(unigraf_device);
+	unigraf_debug("Successfully opened the unigraf device %d.\n", chosen_device);
+
+	unigraf_assert(TSIX_DEV_SelectRole(unigraf_device, chosen_role));
+	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
+	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));
+
+	return true;
+}
+
+void unigraf_require_device(int drm_fd)
+{
+	igt_require(unigraf_open_device(drm_fd));
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
new file mode 100644
index 000000000000..a93bd464bac3
--- /dev/null
+++ b/lib/unigraf/unigraf.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef UNIGRAF_H
+#define UNIGRAF_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/**
+ * unigraf_assert: Helper macro to assert a TSI return value and retrieve a detailed error message.
+ * @result: libTSI return value to check
+ *
+ * This macro checks the return value of a libTSI function call. If the return value indicates an
+ * error, it retrieves a detailed error message and asserts with that message.
+ * If retrieving the error description fails, it asserts with a generic error message.
+ */
+#define unigraf_assert(result)									\
+({												\
+	char msg[256];										\
+	TSI_RESULT __r = (result);								\
+	if (__r < TSI_SUCCESS) {								\
+		TSI_RESULT __r2 = TSI_MISC_GetErrorDescription(__r, msg, sizeof(msg));		\
+		if (__r2 < TSI_SUCCESS)								\
+			igt_assert_f(false,							\
+				     "unigraf error: %d (get error description failed: %d)\n",	\
+				     __r, __r2);						\
+		else										\
+			igt_assert_f(false, "unigraf error: %d (%s)\n", __r, msg);		\
+	}											\
+	(__r);											\
+})
+
+/**
+ * unigraf_open_device() - Search and open a device.
+ * @drm_fd: File descriptor of the currently used drm device
+ *
+ * Returns: true if a device was found and initialized, otherwise false.
+ *
+ * This function searches for a compatible device and opens it.
+ */
+bool unigraf_open_device(int drm_fd);
+
+/**
+ * unigraf_require_device() - Search and open a device.
+ * @drm_fd: File descriptor of the currently used drm device
+ *
+ * This is a shorthand to reduce test boilerplate when a unigraf device must be present.
+ */
+void unigraf_require_device(int drm_fd);
+
+#endif // UNIGRAF_H
diff --git a/meson.build b/meson.build
index bfcffbb9a3cd..c411f4cf8248 100644
--- a/meson.build
+++ b/meson.build
@@ -165,6 +165,12 @@ cairo = dependency('cairo', version : '>1.12.0', required : true)
 libudev = dependency('libudev', required : true)
 glib = dependency('glib-2.0', required : true)
 
+libtsi = cc.find_library('TSI', required : false)
+
+if libtsi.found()
+	config.set('HAVE_UNIGRAF', 1)
+endif
+
 xmlrpc = dependency('xmlrpc', required : false)
 xmlrpc_util = dependency('xmlrpc_util', required : false)
 xmlrpc_client = dependency('xmlrpc_client', required : false)
@@ -289,6 +295,7 @@ amdgpudir = join_paths(libexecdir, 'amdgpu')
 msmdir = join_paths(libexecdir, 'msm')
 panfrostdir = join_paths(libexecdir, 'panfrost')
 panthordir = join_paths(libexecdir, 'panthor')
+unigrafdir = join_paths(libexecdir, 'unigraf')
 v3ddir = join_paths(libexecdir, 'v3d')
 vc4dir = join_paths(libexecdir, 'vc4')
 vkmsdir = join_paths(libexecdir, 'vkms')
@@ -371,6 +378,12 @@ if get_option('use_rpath')
 		vmwgfx_rpathdir = join_paths(vmwgfx_rpathdir, '..')
 	endforeach
 	vmwgfx_rpathdir = join_paths(vmwgfx_rpathdir, libdir)
+
+	unigraf_rpathdir = '$ORIGIN'
+	foreach p : unigrafdir.split('/')
+		unigraf_rpathdir = join_paths(unigraf_rpathdir, '..')
+	endforeach
+	unigraf_rpathdir = join_paths(unigraf_rpathdir, libdir)
 else
 	bindir_rpathdir = ''
 	libexecdir_rpathdir = ''
@@ -382,6 +395,7 @@ else
 	vc4_rpathdir = ''
 	vkms_rpathdir = ''
 	vmwgfx_rpathdir = ''
+	unigraf_rpathdir = ''
 endif
 
 build_testplan = get_option('testplan')

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 20/46] lib/igt_kms: Automatically connect unigraf on display require
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (18 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-22 20:26   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 21/46] lib/unigraf: Introduce device configuration Louis Chauvet
                   ` (31 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As Unigraf can emualte a display, automatically connect it for all
devices. If a test is already using unigraf, this have no effect.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 3d73f338cc80..d429a1d5d605 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -37,6 +37,7 @@
 #include <sys/stat.h>
 #include <string.h>
 #include <stdlib.h>
+#include <xf86drmMode.h>
 #ifdef HAVE_LINUX_KD_H
 #include <linux/kd.h>
 #elif HAVE_SYS_KD_H
@@ -65,6 +66,9 @@
 #ifdef HAVE_CHAMELIUM
 #include "igt_chamelium.h"
 #endif
+#ifdef HAVE_UNIGRAF
+#include "unigraf/unigraf.h"
+#endif
 
 /**
  * SECTION:igt_kms
@@ -2946,6 +2950,9 @@ void igt_display_require(igt_display_t *display, int drm_fd)
 		}
 	}
 #endif
+#ifdef HAVE_UNIGRAF
+	unigraf_open_device(drm_fd);
+#endif
 
 	igt_require_f(resources->count_crtcs <= IGT_MAX_PIPES,
 		     "count_crtcs exceeds IGT_MAX_PIPES, resources->count_crtcs=%d, IGT_MAX_PIPES=%d\n",

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 21/46] lib/unigraf: Introduce device configuration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (19 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 20/46] lib/igt_kms: Automatically connect unigraf on display require Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-23 17:38   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 22/46] lib/unigraf: Introduce role configuration Louis Chauvet
                   ` (30 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As there could be multiple devices detected by libTSI, add a configuration
field to ensure that igt will use the proper unigraf device.

The unigraf integration will search for a [Unigraf] entry containing a
Device=

For example, it can look like:

[Unigraf]
Device=UCD-500 [2434C620]

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 69 insertions(+), 7 deletions(-)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 55c3c445fa5e..304567467b27 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -1,21 +1,16 @@
 // SPDX-License-Identifier: MIT
 
-#include "drmtest.h"
 #include "glib.h"
 #include "igt_core.h"
-#include "igt_edid.h"
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
 
 #include "unigraf.h"
-#include "TSI.h"
 #include "TSI_types.h"
-#include "igt_kms.h"
-#include "igt_pipe_crc.h"
+#include "TSI.h"
 #include "igt_rc.h"
-#include "monitor_edids/monitor_edids_helper.h"
 
 #define unigraf_debug(fmt, ...)	igt_debug("TSI:%p: " fmt, unigraf_device, ##__VA_ARGS__)
 
@@ -24,6 +19,19 @@ static TSI_HANDLE unigraf_device;
 static char *unigraf_default_edid;
 static char *unigraf_connector_name;
 
+/**
+ * UNIGRAF_CONFIG_GROUP - Name of the unigraf group in the configuration file
+ */
+#define UNIGRAF_CONFIG_GROUP "Unigraf"
+/**
+ * UNIGRAF_CONFIG_DEVICE_NAME - Key of the device name in the configuration file
+ */
+#define UNIGRAF_CONFIG_DEVICE_NAME "Device"
+/**
+ * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
+ */
+#define UNIGRAF_NAME_MAX 1024
+
 static void unigraf_close_device(void)
 {
 	unigraf_debug("Closing...\n");
@@ -68,11 +76,31 @@ static unsigned int unigraf_device_count(void)
 	return unigraf_assert(TSIX_DEV_GetDeviceCount());
 }
 
+static int unigraf_find_device(char *request)
+{
+	int chosen_device = -1;
+	int device_count = unigraf_device_count();
+
+	for (int i = 0; i < device_count; i++) {
+		char dev_name[UNIGRAF_NAME_MAX];
+
+		memset(dev_name, 0, UNIGRAF_NAME_MAX);
+		unigraf_assert(TSIX_DEV_GetDeviceName(i, dev_name, UNIGRAF_NAME_MAX));
+		unigraf_debug("Detected unigraf device %d: %s\n", i, dev_name);
+		if (!strncmp(dev_name, request, UNIGRAF_NAME_MAX))
+			chosen_device = i;
+	}
+	return chosen_device;
+}
+
 bool unigraf_open_device(int drm_fd)
 {
 	TSI_RESULT r;
+	char *cfg_group = NULL;
+	GError *cfg_error = NULL;
+	char *cfg_device = NULL;
 	int device_count;
-	int chosen_device = 0;
+	int chosen_device;
 	int chosen_role = 0;
 	int chosen_input = 0;
 
@@ -83,6 +111,30 @@ bool unigraf_open_device(int drm_fd)
 
 	unigraf_init();
 
+	if (igt_key_file) {
+		char **group_list = g_key_file_get_groups(igt_key_file, NULL);
+
+		for (int i = 0; group_list[i]; i++) {
+			if (strcmp(group_list[i], UNIGRAF_CONFIG_GROUP))
+				continue;
+			cfg_group = strdup(group_list[i]);
+		}
+		g_strfreev(group_list);
+	}
+
+	if (!cfg_group) {
+		unigraf_debug("No device configured, will try to find the first available.\n");
+		cfg_device = NULL;
+		unigraf_connector_name = NULL;
+	} else {
+		cfg_device = g_key_file_get_string(igt_key_file, cfg_group,
+						   UNIGRAF_CONFIG_DEVICE_NAME, &cfg_error);
+		if (cfg_error) {
+			unigraf_debug("No device name configured, uses first device available.\n");
+			cfg_device = NULL;
+		}
+	}
+
 	unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
 
 	device_count = unigraf_device_count();
@@ -91,6 +143,16 @@ bool unigraf_open_device(int drm_fd)
 		return false;
 	}
 
+	if (!cfg_device) {
+		chosen_device = 0;
+	} else {
+		chosen_device = unigraf_find_device(cfg_device);
+		if (chosen_device == -1) {
+			igt_warn("The requested unigraf device %s is not found.\n", cfg_device);
+			return false;
+		}
+	}
+
 	unigraf_device = TSIX_DEV_OpenDevice(chosen_device, &r);
 	unigraf_assert(r);
 	igt_assert(unigraf_device);

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 22/46] lib/unigraf: Introduce role configuration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (20 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 21/46] lib/unigraf: Introduce device configuration Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-26 11:28   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 23/46] lib/unigraf: Introduce input configuration Louis Chauvet
                   ` (29 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Some unigraf devices, like the UCD-500 can have multiple hardware
configurations: displayport input/output, usbc input/output.

The device configuration can look like:

[Unigraf]
Device=UCD-500 [2434C620]
Role=DisplayPort Source and Sink

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 62 insertions(+), 3 deletions(-)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 304567467b27..0b8fe11a957b 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -19,18 +19,30 @@ static TSI_HANDLE unigraf_device;
 static char *unigraf_default_edid;
 static char *unigraf_connector_name;
 
+/**
+ * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
+ */
+#define UNIGRAF_NAME_MAX 1024
+
 /**
  * UNIGRAF_CONFIG_GROUP - Name of the unigraf group in the configuration file
  */
 #define UNIGRAF_CONFIG_GROUP "Unigraf"
+
 /**
  * UNIGRAF_CONFIG_DEVICE_NAME - Key of the device name in the configuration file
  */
 #define UNIGRAF_CONFIG_DEVICE_NAME "Device"
+
 /**
- * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
+ * UNIGRAF_CONFIG_DEVICE_ROLE - Key of the device role in the configuration file
  */
-#define UNIGRAF_NAME_MAX 1024
+#define UNIGRAF_CONFIG_DEVICE_ROLE "Role"
+
+/**
+ * UNIGRAF_DEFAULT_ROLE_NAME - Default role name to search on the unigraf device
+ */
+#define UNIGRAF_DEFAULT_ROLE_NAME "USB-C, DP Alt Mode Source and Sink"
 
 static void unigraf_close_device(void)
 {
@@ -93,15 +105,35 @@ static int unigraf_find_device(char *request)
 	return chosen_device;
 }
 
+static int unigraf_find_role(const char *request)
+{
+	int chosen_role = -1;
+	int role_count = unigraf_assert(TSIX_DEV_GetDeviceRoleCount(unigraf_device));
+
+	for (int i = 0; i < role_count; i++) {
+		char role_name[UNIGRAF_NAME_MAX];
+
+		memset(role_name, 0, UNIGRAF_NAME_MAX);
+		unigraf_assert(TSIX_DEV_GetDeviceRoleName(unigraf_device, i,
+							  role_name,
+							  UNIGRAF_NAME_MAX));
+		unigraf_debug("Role %d: %s\n", i, role_name);
+		if (!strncmp(role_name, request, UNIGRAF_NAME_MAX))
+			chosen_role = i;
+	}
+	return chosen_role;
+}
+
 bool unigraf_open_device(int drm_fd)
 {
 	TSI_RESULT r;
 	char *cfg_group = NULL;
 	GError *cfg_error = NULL;
 	char *cfg_device = NULL;
+	char *cfg_role = NULL;
 	int device_count;
 	int chosen_device;
-	int chosen_role = 0;
+	int chosen_role;
 	int chosen_input = 0;
 
 	assert(igt_can_fail());
@@ -125,6 +157,7 @@ bool unigraf_open_device(int drm_fd)
 	if (!cfg_group) {
 		unigraf_debug("No device configured, will try to find the first available.\n");
 		cfg_device = NULL;
+		cfg_role = NULL;
 		unigraf_connector_name = NULL;
 	} else {
 		cfg_device = g_key_file_get_string(igt_key_file, cfg_group,
@@ -133,6 +166,14 @@ bool unigraf_open_device(int drm_fd)
 			unigraf_debug("No device name configured, uses first device available.\n");
 			cfg_device = NULL;
 		}
+
+		cfg_error = NULL;
+		cfg_role = g_key_file_get_string(igt_key_file, cfg_group,
+						 UNIGRAF_CONFIG_DEVICE_ROLE, &cfg_error);
+		if (cfg_error) {
+			unigraf_debug("No device role configured.\n");
+			cfg_role = NULL;
+		}
 	}
 
 	unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
@@ -158,6 +199,24 @@ bool unigraf_open_device(int drm_fd)
 	igt_assert(unigraf_device);
 	unigraf_debug("Successfully opened the unigraf device %d.\n", chosen_device);
 
+	if (!cfg_role) {
+		unigraf_debug("No role configured, trying " UNIGRAF_DEFAULT_ROLE_NAME "\n");
+		chosen_role = unigraf_find_role(UNIGRAF_DEFAULT_ROLE_NAME);
+		if (chosen_role < 0) {
+			char role_name[UNIGRAF_NAME_MAX];
+
+			chosen_role = 0;
+			unigraf_assert(TSIX_DEV_GetDeviceRoleName(unigraf_device, chosen_role,
+								  role_name, UNIGRAF_NAME_MAX));
+			unigraf_debug("Role " UNIGRAF_DEFAULT_ROLE_NAME " not found, using role 0 (%s)\n",
+				      role_name);
+		}
+	} else {
+		chosen_role = unigraf_find_role(cfg_role);
+		igt_assert_f(chosen_role >= 0, "TSI:%p: Role %s not found.",
+			     unigraf_device, cfg_role);
+	}
+
 	unigraf_assert(TSIX_DEV_SelectRole(unigraf_device, chosen_role));
 	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
 	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 23/46] lib/unigraf: Introduce input configuration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (21 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 22/46] lib/unigraf: Introduce role configuration Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-23 17:38   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function Louis Chauvet
                   ` (28 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As multiple input can be present on unigraf devices, add a configuration
field to select the proper input. By default it will take the first
available.

The configuration can look like:

[Unigraf]
Device=UCD-500 [2434C620]
Role=DisplayPort Source and Sink
Input=DP RX

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 0b8fe11a957b..59a85e1b84c9 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -39,11 +39,21 @@ static char *unigraf_connector_name;
  */
 #define UNIGRAF_CONFIG_DEVICE_ROLE "Role"
 
+/**
+ * UNIGRAF_CONFIG_INPUT_NAME - Key of the input name in the configuration file
+ */
+#define UNIGRAF_CONFIG_INPUT_NAME "Input"
+
 /**
  * UNIGRAF_DEFAULT_ROLE_NAME - Default role name to search on the unigraf device
  */
 #define UNIGRAF_DEFAULT_ROLE_NAME "USB-C, DP Alt Mode Source and Sink"
 
+/**
+ * UNIGRAF_DEFAULT_INPUT_NAME - Default input name to search on the unigraf device
+ */
+#define UNIGRAF_DEFAULT_INPUT_NAME "DP RX"
+
 static void unigraf_close_device(void)
 {
 	unigraf_debug("Closing...\n");
@@ -124,6 +134,24 @@ static int unigraf_find_role(const char *request)
 	return chosen_role;
 }
 
+static int unigraf_find_input(const char *request)
+{
+	int chosen_input = -1;
+	int role_count = unigraf_assert(TSIX_VIN_GetInputCount(unigraf_device));
+
+	for (int i = 0; i < role_count; i++) {
+		char input_name[UNIGRAF_NAME_MAX];
+
+		memset(input_name, 0, UNIGRAF_NAME_MAX);
+		unigraf_assert(TSIX_VIN_GetInputName(unigraf_device, i,
+						     input_name, UNIGRAF_NAME_MAX));
+		unigraf_debug("Input %d: %s\n", i, input_name);
+		if (!strncmp(input_name, request, UNIGRAF_NAME_MAX))
+			chosen_input = i;
+	}
+	return chosen_input;
+}
+
 bool unigraf_open_device(int drm_fd)
 {
 	TSI_RESULT r;
@@ -131,10 +159,11 @@ bool unigraf_open_device(int drm_fd)
 	GError *cfg_error = NULL;
 	char *cfg_device = NULL;
 	char *cfg_role = NULL;
+	char *cfg_input = NULL;
 	int device_count;
 	int chosen_device;
 	int chosen_role;
-	int chosen_input = 0;
+	int chosen_input;
 
 	assert(igt_can_fail());
 
@@ -158,6 +187,7 @@ bool unigraf_open_device(int drm_fd)
 		unigraf_debug("No device configured, will try to find the first available.\n");
 		cfg_device = NULL;
 		cfg_role = NULL;
+		cfg_input = NULL;
 		unigraf_connector_name = NULL;
 	} else {
 		cfg_device = g_key_file_get_string(igt_key_file, cfg_group,
@@ -174,6 +204,14 @@ bool unigraf_open_device(int drm_fd)
 			unigraf_debug("No device role configured.\n");
 			cfg_role = NULL;
 		}
+
+		cfg_error = NULL;
+		cfg_input = g_key_file_get_string(igt_key_file, cfg_group,
+						  UNIGRAF_CONFIG_INPUT_NAME, &cfg_error);
+		if (cfg_error) {
+			unigraf_debug("No input name configured.\n");
+			cfg_input = NULL;
+		}
 	}
 
 	unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
@@ -218,6 +256,25 @@ bool unigraf_open_device(int drm_fd)
 	}
 
 	unigraf_assert(TSIX_DEV_SelectRole(unigraf_device, chosen_role));
+
+	if (!cfg_input) {
+		unigraf_debug("No input configured, trying " UNIGRAF_DEFAULT_INPUT_NAME "\n");
+		chosen_input = unigraf_find_input(UNIGRAF_DEFAULT_INPUT_NAME);
+		if (chosen_input < 0) {
+			char input_name[UNIGRAF_NAME_MAX];
+
+			chosen_input = 0;
+			unigraf_assert(TSIX_VIN_GetInputName(unigraf_device, chosen_input,
+							     input_name, UNIGRAF_NAME_MAX));
+			unigraf_debug("Input " UNIGRAF_DEFAULT_INPUT_NAME " not found, using input 0 (%s).\n",
+				      input_name);
+		}
+	} else  {
+		chosen_input = unigraf_find_input(cfg_input);
+		igt_assert_f(chosen_input >= 0, "TSI:%p: Input %s not found.",
+			     unigraf_device, cfg_input);
+	}
+
 	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
 	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));
 

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (22 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 23/46] lib/unigraf: Introduce input configuration Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-23 17:39   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 25/46] lib/unigraf: Add unigraf assert and deassert helpers Louis Chauvet
                   ` (27 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

To have a consistent state at the beginning of tests, add a unigraf_reset
function that will restore a known state.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 5 +++++
 lib/unigraf/unigraf.h | 9 +++++++++
 2 files changed, 14 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 59a85e1b84c9..e96c7fc3a91e 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -278,6 +278,8 @@ bool unigraf_open_device(int drm_fd)
 	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
 	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));
 
+	unigraf_reset();
+
 	return true;
 }
 
@@ -285,3 +287,6 @@ void unigraf_require_device(int drm_fd)
 {
 	igt_require(unigraf_open_device(drm_fd));
 }
+
+void unigraf_reset(void)
+{}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index a93bd464bac3..76f4f8878c2c 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -48,4 +48,13 @@ bool unigraf_open_device(int drm_fd);
  */
 void unigraf_require_device(int drm_fd);
 
+/**
+ * unigraf_reset() - Reset the Unigraf device
+ *
+ * This function performs a hardware reset of the Unigraf device, restoring it to a
+ * default state. This includes resetting all configuration parameters, stream settings,
+ * and link parameters to default values.
+ */
+void unigraf_reset(void);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 25/46] lib/unigraf: Add unigraf assert and deassert helpers
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (23 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-23 17:40   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 26/46] lib/unigraf: Add plug/unplug helpers Louis Chauvet
                   ` (26 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Unigraf is able to manipulate the HPD line of the connector, add few
helpers to manipulate them.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 40 ++++++++++++++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h | 22 ++++++++++++++++++++++
 2 files changed, 62 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index e96c7fc3a91e..40daa42ef7e9 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -88,6 +88,26 @@ static void unigraf_init(void)
 	igt_install_exit_handler(unigraf_exit_handler);
 }
 
+/**
+ * _unigraf_write_u32 - Write a 32-bit value to a TSI configuration item
+ * @config_id: The configuration item ID to write to
+ * @value: The 32-bit value to write
+ *
+ * This function writes a 32-bit value to the specified TSI configuration item.
+ */
+static void _unigraf_write_u32(TSI_CONFIG_ID config_id, uint32_t value)
+{
+	igt_assert(unigraf_device);
+	unigraf_assert(TSIX_TS_SetConfigItem(unigraf_device, config_id, &value, sizeof(value)));
+}
+
+#define unigraf_write_u32(config_id, value)					\
+	({									\
+		uint32_t v = (value);						\
+		unigraf_debug("Value write: " #config_id "=%d...\n", v);	\
+		_unigraf_write_u32(config_id, v);				\
+	})
+
 /**
  * unigraf_device_count() - Return the number of scanned devices
  *
@@ -290,3 +310,23 @@ void unigraf_require_device(int drm_fd)
 
 void unigraf_reset(void)
 {}
+
+void unigraf_hpd_assert(void)
+{
+	unigraf_write_u32(TSI_FORCE_HOT_PLUG_STATE_W, 1);
+}
+
+void unigraf_hpd_pulse(int duration)
+{
+	// In theory this should work:
+	// unigraf_write_u32(TSI_DPRX_HPD_PULSE_W, duration);
+	// But this seems to be broken and this work:
+	unigraf_hpd_deassert();
+	usleep(duration);
+	unigraf_hpd_assert();
+}
+
+void unigraf_hpd_deassert(void)
+{
+	unigraf_write_u32(TSI_FORCE_HOT_PLUG_STATE_W, 0);
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 76f4f8878c2c..17a3dacc768a 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -57,4 +57,26 @@ void unigraf_require_device(int drm_fd);
  */
 void unigraf_reset(void);
 
+/**
+ * unigraf_hpd_deassert() - Deassert Hot Plug Detect signal
+ *
+ * This function deasserts the HPD signal, simulating a device disconnection.
+ */
+void unigraf_hpd_deassert(void);
+
+/**
+ * unigraf_hpd_pulse() - Pulse the Hot Plug Detect signal
+ * @duration: The duration in milliseconds for which the HPD signal should be pulsed
+ *
+ * This function pulses the HPD signal for the specified duration.
+ */
+void unigraf_hpd_pulse(int duration);
+
+/**
+ * unigraf_hpd_assert() - Assert Hot Plug Detect signal
+ *
+ * This function asserts the HPD signal, simulating a device connection.
+ */
+void unigraf_hpd_assert(void);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 26/46] lib/unigraf: Add plug/unplug helpers
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (24 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 25/46] lib/unigraf: Add unigraf assert and deassert helpers Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-23 17:40   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 27/46] lib/unigraf: Allows sst/mst configuration Louis Chauvet
                   ` (25 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

The unigraf can emulate a full cable plug/unplug, so add helper to emulate
this.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 18 +++++++++++++++++-
 lib/unigraf/unigraf.h | 14 ++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 40daa42ef7e9..5ce1bd7d757b 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -309,7 +309,9 @@ void unigraf_require_device(int drm_fd)
 }
 
 void unigraf_reset(void)
-{}
+{
+	unigraf_plug();
+}
 
 void unigraf_hpd_assert(void)
 {
@@ -330,3 +332,17 @@ void unigraf_hpd_deassert(void)
 {
 	unigraf_write_u32(TSI_FORCE_HOT_PLUG_STATE_W, 0);
 }
+
+void unigraf_unplug(void)
+{
+	int d = 2 << 2;
+
+	unigraf_write_u32(TSI_DPRX_HPD_FORCE, d);
+}
+
+void unigraf_plug(void)
+{
+	int d = 3 << 2;
+
+	unigraf_write_u32(TSI_DPRX_HPD_FORCE, d);
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 17a3dacc768a..14e5fd984159 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -79,4 +79,18 @@ void unigraf_hpd_pulse(int duration);
  */
 void unigraf_hpd_assert(void);
 
+/**
+ * unigraf_plug() - Emulate a cable plug
+ *
+ * This function will emulate a full cable plug (not a simple HPD line change)
+ */
+void unigraf_plug(void);
+
+/**
+ * unigraf_plug() - Emulate a cable unplug
+ *
+ * This function will emulate a full cable unplug (not a simple HPD line change)
+ */
+void unigraf_unplug(void);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 27/46] lib/unigraf: Allows sst/mst configuration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (25 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 26/46] lib/unigraf: Add plug/unplug helpers Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-23 17:40   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 28/46] lib/unigraf: Add helpers to read and write edid Louis Chauvet
                   ` (24 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Unigraf devices can emulate both SST and MST display port. In order to
write tests using both, add fews helper to manipulate them.

The define TSI_DPRX_NOT_DOCUMENTED_SIDEBAND_MSG_SUPPORT is taken from the
python SDK, as it was not defined by the C sdk nor documented.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h | 38 ++++++++++++++++++++++++++
 2 files changed, 113 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 5ce1bd7d757b..9e77a052d755 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -108,6 +108,23 @@ static void _unigraf_write_u32(TSI_CONFIG_ID config_id, uint32_t value)
 		_unigraf_write_u32(config_id, v);				\
 	})
 
+static uint32_t _unigraf_read_u32(TSI_CONFIG_ID config_id)
+{
+	uint32_t value;
+
+	igt_assert(unigraf_device);
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, config_id, &value, sizeof(value)));
+	return value;
+}
+
+#define unigraf_read_u32(config_id)						\
+	({									\
+		uint32_t value;							\
+		value = _unigraf_read_u32((config_id));				\
+		unigraf_debug("Value read: " #config_id "=%d\n", value);	\
+		value;								\
+	})
+
 /**
  * unigraf_device_count() - Return the number of scanned devices
  *
@@ -311,6 +328,8 @@ void unigraf_require_device(int drm_fd)
 void unigraf_reset(void)
 {
 	unigraf_plug();
+	unigraf_set_mst_stream_count(1);
+	unigraf_set_sst();
 }
 
 void unigraf_hpd_assert(void)
@@ -346,3 +365,59 @@ void unigraf_plug(void)
 
 	unigraf_write_u32(TSI_DPRX_HPD_FORCE, d);
 }
+
+void unigraf_set_sst(void)
+{
+	int link_flags = 0xFFFFFFFF;
+
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, TSI_DPRX_LINK_FLAGS,
+					     &link_flags, sizeof(link_flags)));
+	link_flags &= ~(TSI_DPRX_LINK_FLAGS_MST | TSI_DPRX_NOT_DOCUMENTED_SIDEBAND_MSG_SUPPORT);
+	unigraf_write_u32(TSI_DPRX_LINK_FLAGS, link_flags);
+}
+
+void unigraf_set_mst(void)
+{
+	int link_flags = 0xFFFFFFFF;
+
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, TSI_DPRX_LINK_FLAGS,
+					     &link_flags, sizeof(link_flags)));
+	link_flags |= TSI_DPRX_LINK_FLAGS_MST | TSI_DPRX_NOT_DOCUMENTED_SIDEBAND_MSG_SUPPORT;
+	unigraf_write_u32(TSI_DPRX_LINK_FLAGS, link_flags);
+}
+
+int unigraf_get_mst_stream_max_count(void)
+{
+	struct TSI_DPRX_HW_CAPS_R_s caps;
+
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, TSI_DPRX_HW_CAPS_R,
+					     &caps, sizeof(caps)));
+
+	return caps.mst_stream_count;
+}
+
+int unigraf_get_mst_stream_count(void)
+{
+	return unigraf_read_u32(TSI_DPRX_MST_SINK_COUNT);
+}
+
+bool unigraf_set_mst_stream_count(int count)
+{
+	int new_count;
+
+	igt_assert_lte(count, unigraf_get_mst_stream_max_count());
+
+	unigraf_write_u32(TSI_DPRX_MST_SINK_COUNT, count);
+	new_count = unigraf_get_mst_stream_count();
+
+	igt_warn_on_f(count != new_count,
+		      "IGT:%p: Requested MST stream count (%d) differ from what was applied by the device (%d)\n",
+		      unigraf_device, count, new_count);
+
+	return count == new_count;
+}
+
+void unigraf_select_stream(int stream)
+{
+	unigraf_write_u32(TSI_DPRX_STREAM_SELECT, stream);
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 14e5fd984159..9fcae674b1d5 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -93,4 +93,42 @@ void unigraf_plug(void);
  */
 void unigraf_unplug(void);
 
+/**
+ * unigraf_set_sst() - Configure the device for Single Stream Transport mode
+ *
+ * This function sets the device to operate in Single Stream Transport (SST) mode.
+ */
+void unigraf_set_sst(void);
+
+/**
+ * unigraf_set_mst() - Configure the device for Multi Stream Transport mode
+ *
+ * This function sets the device to operate in Multi Stream Transport (MST) mode.
+ */
+void unigraf_set_mst(void);
+
+/**
+ * unigraf_get_mst_stream_count() - Get the current number of MST streams
+ *
+ * Returns: The current number of MST streams configured on the device.
+ */
+int unigraf_get_mst_stream_count(void);
+
+/**
+ * unigraf_set_mst_stream_count() - Set the number of accepted stream count
+ *
+ * Returns true when the stream count was properly applied, false if the final stream count
+ * is not the one requested
+ */
+bool unigraf_set_mst_stream_count(int count);
+
+/**
+ * unigraf_get_mst_stream_max_count() - Get the maximum number of stream count accepted by the
+ * device
+ * Caution: This function can be destructive to some configuration: the only way to get the
+ * information is to try and read the new value.
+ */
+int unigraf_get_mst_stream_max_count(void);
+void unigraf_select_stream(int stream);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 28/46] lib/unigraf: Add helpers to read and write edid
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (26 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 27/46] lib/unigraf: Allows sst/mst configuration Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-23 17:40   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 29/46] lib/unigraf: Add connector configuration Louis Chauvet
                   ` (23 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Read and writing EDID on unigraf can be useful to emulate different
screens, add helpers to read and write them.

There is a limitation on the libTSI.so, it is only possible to read EDID
using buffers of size multiple of 128 bytes, and there is no way to query
the actual EDID size. The current implementation can only read EDID up to
2048 bytes.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 40 ++++++++++++++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h | 21 +++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 9e77a052d755..2229202ea868 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -125,6 +125,21 @@ static uint32_t _unigraf_read_u32(TSI_CONFIG_ID config_id)
 		value;								\
 	})
 
+/**
+ * unigraf_write() - Helper to write a value to unigraf
+ * @dev: device handle, can be null for some config id
+ * @config: config id to write
+ * @data: data to write
+ * @data_len: length of the data
+ * Returns
+ */
+static void unigraf_write(TSI_CONFIG_ID config, const void *data, size_t data_len)
+{
+	unigraf_debug("Writing %zu bytes to 0x%x\n", data_len, config);
+
+	unigraf_assert(TSIX_TS_SetConfigItem(unigraf_device, config, data, data_len));
+}
+
 /**
  * unigraf_device_count() - Return the number of scanned devices
  *
@@ -332,6 +347,31 @@ void unigraf_reset(void)
 	unigraf_set_sst();
 }
 
+struct edid *unigraf_read_edid(uint32_t stream, uint32_t *edid_size)
+{
+	void *edid;
+
+	unigraf_debug("Read EDID for stream %d...\n", stream);
+
+	edid = malloc(2048);
+	memset(edid, 0, 2048);
+
+	unigraf_write_u32(TSI_EDID_SELECT_STREAM, stream);
+	*edid_size = unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device,
+							  TSI_EDID_TE_INPUT,
+							  edid, 2048));
+
+	return edid;
+}
+
+void unigraf_write_edid(uint32_t stream, const struct edid *edid, uint32_t edid_size)
+{
+	unigraf_debug("Write EDID for stream %d...\n", stream);
+
+	unigraf_write_u32(TSI_EDID_SELECT_STREAM, stream);
+	unigraf_write(TSI_EDID_TE_INPUT, edid, 2048);
+}
+
 void unigraf_hpd_assert(void)
 {
 	unigraf_write_u32(TSI_FORCE_HOT_PLUG_STATE_W, 1);
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 9fcae674b1d5..983a21bbd61b 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -57,6 +57,27 @@ void unigraf_require_device(int drm_fd);
  */
 void unigraf_reset(void);
 
+/**
+ * unigraf_read_edid() - Read the EDID from the specified input
+ * @dev: The device handle
+ * @stream: The stream ID to read the EDID from
+ * @edid_size: Pointer to an integer where the size of the EDID will be stored
+ *
+ * Returns: A pointer to the EDID structure, or NULL if the operation failed. The caller
+ * is responsible to free this pointer.
+ */
+struct edid *unigraf_read_edid(uint32_t stream, uint32_t *edid_size);
+
+/**
+ * unigraf_write_edid() - Write EDID data to the specified stream
+ * @stream: The stream ID to write the EDID to
+ * @edid: Pointer to the EDID structure to write
+ * @edid_size: Size of the EDID data in bytes
+ *
+ * This function writes the provided EDID data to the specified stream.
+ */
+void unigraf_write_edid(uint32_t stream, const struct edid *edid, uint32_t edid_size);
+
 /**
  * unigraf_hpd_deassert() - Deassert Hot Plug Detect signal
  *

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 29/46] lib/unigraf: Add connector configuration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (27 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 28/46] lib/unigraf: Add helpers to read and write edid Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-26 11:40   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 30/46] tests/unigraf: Add basic unigraf tests Louis Chauvet
                   ` (22 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As multiple connectors can be present on the DUT, add a configuration to
tell which connector is used by the Unigraf.

The configuration will look like:

[Unigraf]
Device=UCD-500 [2434C620]
Role=DisplayPort Source and Sink
Input=DP RX
Connector=DP-4

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++-
 lib/unigraf/unigraf.h |  11 +++++
 2 files changed, 129 insertions(+), 2 deletions(-)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 2229202ea868..596fd6db39d0 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -10,7 +10,10 @@
 #include "unigraf.h"
 #include "TSI_types.h"
 #include "TSI.h"
+#include "igt_edid.h"
+#include "igt_kms.h"
 #include "igt_rc.h"
+#include "monitor_edids/monitor_edids_helper.h"
 
 #define unigraf_debug(fmt, ...)	igt_debug("TSI:%p: " fmt, unigraf_device, ##__VA_ARGS__)
 
@@ -44,6 +47,16 @@ static char *unigraf_connector_name;
  */
 #define UNIGRAF_CONFIG_INPUT_NAME "Input"
 
+/**
+ * UNIGRAF_CONFIG_CONNECTOR_NAME - Key of the connector name in the configuration file
+ */
+#define UNIGRAF_CONFIG_CONNECTOR_NAME "Connector"
+
+/**
+ * UNIGRAF_CONFIG_EDID_NAME - Key of the EDID name in the configuration file
+ */
+#define UNIGRAF_CONFIG_EDID_NAME "EDID"
+
 /**
  * UNIGRAF_DEFAULT_ROLE_NAME - Default role name to search on the unigraf device
  */
@@ -204,6 +217,74 @@ static int unigraf_find_input(const char *request)
 	return chosen_input;
 }
 
+static void unigraf_load_default_edid(void)
+{
+	struct edid *edid = get_edid_by_name(unigraf_default_edid);
+
+	if (edid) {
+		for (int i = unigraf_get_mst_stream_max_count(); i > 0; i--)
+			unigraf_write_edid(i - 1, edid, edid_get_size(edid));
+	} else {
+		igt_warn("Impossible to find an edid named \"%s\"", unigraf_default_edid);
+		list_edid_names(IGT_LOG_WARN);
+	}
+}
+
+static void unigraf_autodetect_connector(int drm_fd)
+{
+	int newly_connected_count, already_connected_count, diff_len;
+	uint32_t *newly_connected = NULL, *already_connected = NULL;
+	drmModeConnectorPtr connector;
+	uint32_t *diff = NULL;
+
+	igt_assert(drm_fd);
+	unigraf_set_sst();
+	unigraf_hpd_deassert();
+
+	/*
+	 * Hard sleep is required here as we don't know how long it will take for the device under
+	 * test to properly detect the port disconnection.
+	 */
+	sleep(igt_default_display_detect_timeout());
+
+	already_connected_count = igt_get_connected_connectors(drm_fd, &already_connected);
+
+	unigraf_hpd_assert();
+
+	newly_connected_count = kms_wait_for_new_connectors(&newly_connected,
+							    already_connected,
+							    already_connected_count,
+							    drm_fd);
+
+	diff_len = get_list_diff(newly_connected, newly_connected_count,
+				 already_connected, already_connected_count, &diff);
+
+	if (diff_len == 0) {
+		unigraf_debug("No newly connected connector, assuming that the unigraf is not connected.\n");
+	} else if (diff_len > 1) {
+		unigraf_debug("More than one new connectors connected, this is not supported by autodetection.\n");
+	} else {
+		unigraf_debug("Found one connector (%d) connected to the Unigraf\n", diff[0]);
+		connector = drmModeGetConnector(drm_fd, diff[0]);
+		igt_assert(connector);
+		igt_assert(asprintf(&unigraf_connector_name, "%s-%u",
+				    kmstest_connector_type_str(connector->connector_type),
+				    connector->connector_type_id) != -1);
+		drmModeFreeConnector(connector);
+	}
+
+	free(already_connected);
+	free(newly_connected);
+	free(diff);
+}
+
+drmModeConnectorPtr unigraf_get_connector(int drm_fd)
+{
+	if (!unigraf_connector_name)
+		unigraf_autodetect_connector(drm_fd);
+	return igt_get_connector_from_name(drm_fd, unigraf_connector_name);
+}
+
 bool unigraf_open_device(int drm_fd)
 {
 	TSI_RESULT r;
@@ -212,6 +293,7 @@ bool unigraf_open_device(int drm_fd)
 	char *cfg_device = NULL;
 	char *cfg_role = NULL;
 	char *cfg_input = NULL;
+	char *cfg_edid_name = NULL;
 	int device_count;
 	int chosen_device;
 	int chosen_role;
@@ -220,7 +302,7 @@ bool unigraf_open_device(int drm_fd)
 	assert(igt_can_fail());
 
 	if (unigraf_device)
-		return true;
+		return unigraf_connector_name != NULL;
 
 	unigraf_init();
 
@@ -240,6 +322,7 @@ bool unigraf_open_device(int drm_fd)
 		cfg_device = NULL;
 		cfg_role = NULL;
 		cfg_input = NULL;
+		cfg_edid_name = NULL;
 		unigraf_connector_name = NULL;
 	} else {
 		cfg_device = g_key_file_get_string(igt_key_file, cfg_group,
@@ -264,6 +347,23 @@ bool unigraf_open_device(int drm_fd)
 			unigraf_debug("No input name configured.\n");
 			cfg_input = NULL;
 		}
+
+		cfg_error = NULL;
+		unigraf_connector_name = g_key_file_get_string(igt_key_file, cfg_group,
+							       UNIGRAF_CONFIG_CONNECTOR_NAME,
+							       &cfg_error);
+		if (cfg_error) {
+			unigraf_debug("No connector name configured, will autodetect.\n");
+			unigraf_connector_name = NULL;
+		}
+
+		cfg_error = NULL;
+		cfg_edid_name = g_key_file_get_string(igt_key_file, cfg_group,
+						      UNIGRAF_CONFIG_EDID_NAME, &cfg_error);
+		if (cfg_error) {
+			unigraf_debug("No default EDID set, use IGT default.\n");
+			cfg_edid_name = NULL;
+		}
 	}
 
 	unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
@@ -330,9 +430,22 @@ bool unigraf_open_device(int drm_fd)
 	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
 	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));
 
+	if (!cfg_edid_name)
+		cfg_edid_name = strdup("DEL_16543_DELL_P2314T_DP");
+
+	unigraf_default_edid = cfg_edid_name;
+
+	if (!unigraf_connector_name) {
+		unigraf_hpd_deassert();
+		unigraf_set_sst();
+		unigraf_hpd_assert();
+		sleep(1);
+		unigraf_autodetect_connector(drm_fd);
+	}
+
 	unigraf_reset();
 
-	return true;
+	return unigraf_connector_name != NULL;
 }
 
 void unigraf_require_device(int drm_fd)
@@ -345,6 +458,9 @@ void unigraf_reset(void)
 	unigraf_plug();
 	unigraf_set_mst_stream_count(1);
 	unigraf_set_sst();
+	unigraf_load_default_edid();
+	unigraf_hpd_assert();
+	sleep(1);
 }
 
 struct edid *unigraf_read_edid(uint32_t stream, uint32_t *edid_size)
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 983a21bbd61b..ca459949dade 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -5,6 +5,7 @@
 
 #include <stdbool.h>
 #include <stdint.h>
+#include <xf86drmMode.h>
 
 /**
  * unigraf_assert: Helper macro to assert a TSI return value and retrieve a detailed error message.
@@ -57,6 +58,16 @@ void unigraf_require_device(int drm_fd);
  */
 void unigraf_reset(void);
 
+/**
+ * unigraf_get_connector() - Get a DRM connector for the Unigraf device
+ * @drm_fd: DRM file descriptor
+ *
+ * Returns: A pointer to the drmModeConnector connected to the unigraf device,
+ * or NULL if the operation failed. The caller is responsible for freeing this
+ * pointer with drmModeFreeConnector().
+ */
+drmModeConnectorPtr unigraf_get_connector(int drm_fd);
+
 /**
  * unigraf_read_edid() - Read the EDID from the specified input
  * @dev: The device handle

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 30/46] tests/unigraf: Add basic unigraf tests
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (28 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 29/46] lib/unigraf: Add connector configuration Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2026-01-26 12:00   ` Luca Ceresoli
  2025-11-10 13:39 ` [PATCH i-g-t v4 31/46] lib/unigraf: Add unigraf CRC capture Louis Chauvet
                   ` (21 subsequent siblings)
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Adds two tests to validate unigraf communication.

unigraf-connected checks if the device is connected and if the EDID is
properly applied.

ungiraf-disconnect checks if the device can be connected/reconnected using
SST and MST configurations.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 tests/meson.build                    |   4 ++
 tests/unigraf/meson.build            |  12 ++++
 tests/unigraf/unigraf_connectivity.c | 123 +++++++++++++++++++++++++++++++++++
 3 files changed, 139 insertions(+)

diff --git a/tests/meson.build b/tests/meson.build
index 9736f2338507..30bad12a904d 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -463,6 +463,10 @@ foreach prog : intel_progs
 	endif
 endforeach
 
+if libtsi.found()
+	subdir('unigraf')
+endif
+
 if chamelium.found()
 	foreach prog : chamelium_progs
 		testexe = executable(prog,
diff --git a/tests/unigraf/meson.build b/tests/unigraf/meson.build
new file mode 100644
index 000000000000..4ef8c32151e4
--- /dev/null
+++ b/tests/unigraf/meson.build
@@ -0,0 +1,12 @@
+unigraf_progs = [
+	'unigraf_connectivity',
+]
+
+foreach prog : unigraf_progs
+	test_executables += executable(prog, prog + '.c',
+				       dependencies : test_deps,
+				       install_dir : unigrafdir,
+				       install_rpath : unigraf_rpathdir,
+				       install : true)
+	test_list += join_paths('unigraf', prog)
+endforeach
diff --git a/tests/unigraf/unigraf_connectivity.c b/tests/unigraf/unigraf_connectivity.c
new file mode 100644
index 000000000000..38b777a89228
--- /dev/null
+++ b/tests/unigraf/unigraf_connectivity.c
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: MIT
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <xf86drmMode.h>
+
+#include "drmtest.h"
+#include "igt_aux.h"
+#include "igt_core.h"
+#include "igt_kms.h"
+#include "unigraf/unigraf.h"
+
+/**
+ * TEST: unigraf connectivity
+ * Category: Core
+ * Description: Testing connectivity with a unigraf device
+ *
+ * SUBTEST: unigraf-open
+ * Description: Make sure that a unigraf device can be accessed
+ *
+ * SUBTEST: unigraf-connected
+ * Description: Make sure that the unigraf device is connected to the DUT
+ */
+
+IGT_TEST_DESCRIPTION("Test basic unigraf connectivity");
+igt_main
+{
+	int drm_fd;
+
+	igt_fixture {
+		drm_fd = drm_open_driver_master(DRIVER_ANY);
+	}
+
+	igt_describe("Make sure that the unigraf device is connected to the DUT");
+	igt_subtest("unigraf-connected") {
+		drmModePropertyBlobPtr edid_blob = NULL;
+		struct igt_display display;
+		uint64_t edid_blob_id;
+		igt_output_t *output;
+		uint32_t unigraf_edid_len;
+		void *unigraf_edid;
+		bool found = false;
+
+		unigraf_require_device(drm_fd);
+		unigraf_hpd_deassert();
+		sleep(1);
+		unigraf_set_sst();
+		unigraf_hpd_assert();
+
+		sleep(5);
+
+		igt_display_require(&display, drm_fd);
+		sleep(5);
+
+		unigraf_edid = unigraf_read_edid(0, &unigraf_edid_len);
+
+		for_each_connected_output(&display, output) {
+			if (output->config.connector->connector_type ==
+			    DRM_MODE_CONNECTOR_DisplayPort) {
+				igt_assert(kmstest_get_property(drm_fd,
+								output->config.connector->connector_id,
+								DRM_MODE_OBJECT_CONNECTOR, "EDID",
+								NULL, &edid_blob_id, NULL));
+				edid_blob = drmModeGetPropertyBlob(drm_fd, edid_blob_id);
+				if (!edid_blob)
+					continue;
+
+				found |= memcmp(unigraf_edid, edid_blob->data,
+						min(edid_blob->length, unigraf_edid_len)) == 0;
+
+				drmModeFreePropertyBlob(edid_blob);
+			}
+		}
+		igt_assert_f(found, "No output with the correct EDID was found\n");
+
+		free(unigraf_edid);
+	}
+
+	igt_describe("Make sure that the unigraf device can be deconnected/reconnected");
+	igt_subtest("ungiraf-disconnect") {
+		int newly_connected_count, already_connected_count, diff_len;
+		uint32_t *newly_connected = NULL, *already_connected = NULL, *diff = NULL;
+		int max_count;
+
+		unigraf_require_device(drm_fd);
+		max_count = unigraf_get_mst_stream_max_count();
+
+		unigraf_hpd_deassert();
+
+		already_connected_count = igt_get_connected_connectors(drm_fd, &already_connected);
+
+		igt_debug("Already connected count: %d\n", already_connected_count);
+
+		// i = 0 is SST
+		for (int i = 0; i <= max_count; i++) {
+			unigraf_hpd_deassert();
+
+			sleep(1);
+			unigraf_set_mst_stream_count(max(i, 1));
+			if (i == 0)
+				unigraf_set_sst();
+			else
+				unigraf_set_mst();
+
+			unigraf_hpd_assert();
+
+			sleep(5);
+
+			newly_connected_count = kms_wait_for_new_connectors(&newly_connected,
+									    already_connected,
+									    already_connected_count,
+									    drm_fd);
+
+			diff_len = get_list_diff(newly_connected, newly_connected_count,
+						 already_connected, already_connected_count, &diff);
+
+			igt_assert_f(diff_len == max(i, 1),
+				     "Invalid connected connector count, expected %d found %d\n",
+				     max(i, 1), diff_len);
+		}
+	}
+}

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 31/46] lib/unigraf: Add unigraf CRC capture
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (29 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 30/46] tests/unigraf: Add basic unigraf tests Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 32/46] lib/unigraf: Add configuration for CRC usage Louis Chauvet
                   ` (20 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As unigraf devices are able to grab a CRC for the current video stream,
add an helper to read the CRC.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 14 ++++++++++++++
 lib/unigraf/unigraf.h | 11 +++++++++++
 2 files changed, 25 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 596fd6db39d0..173e56ccc268 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -12,6 +12,7 @@
 #include "TSI.h"
 #include "igt_edid.h"
 #include "igt_kms.h"
+#include "igt_pipe_crc.h"
 #include "igt_rc.h"
 #include "monitor_edids/monitor_edids_helper.h"
 
@@ -577,3 +578,16 @@ void unigraf_select_stream(int stream)
 {
 	unigraf_write_u32(TSI_DPRX_STREAM_SELECT, stream);
 }
+
+void unigraf_read_crc(int stream, igt_crc_t *out)
+{
+	unigraf_select_stream(stream);
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, TSI_DPRX_CRC_R_R,
+					     &out->crc[0], sizeof(out->crc[0])));
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, TSI_DPRX_CRC_G_R,
+					     &out->crc[1], sizeof(out->crc[1])));
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, TSI_DPRX_CRC_B_R,
+					     &out->crc[2], sizeof(out->crc[2])));
+	out->n_words = 3;
+	out->has_valid_frame = false;
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index ca459949dade..d00895b64d39 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -3,6 +3,7 @@
 #ifndef UNIGRAF_H
 #define UNIGRAF_H
 
+#include "igt_fb.h"
 #include <stdbool.h>
 #include <stdint.h>
 #include <xf86drmMode.h>
@@ -163,4 +164,14 @@ bool unigraf_set_mst_stream_count(int count);
 int unigraf_get_mst_stream_max_count(void);
 void unigraf_select_stream(int stream);
 
+/**
+ * unigraf_read_crc() - Read the CRC values from the Unigraf device
+ * @stream: Stream to grab the CRC from
+ * @out: Pointer to an igt_crc_t structure where the CRC values will be stored
+ *
+ * This function reads the CRC values from the Unigraf device and stores them in the
+ * provided igt_crc_t structure.
+ */
+void unigraf_read_crc(int stream, igt_crc_t *out);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 32/46] lib/unigraf: Add configuration for CRC usage
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (30 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 31/46] lib/unigraf: Add unigraf CRC capture Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 33/46] lib/unigraf: add unigraf_get_connector_by_stream Louis Chauvet
                   ` (19 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As Unigraf devices are able to compute a CRC for the input image, add a
configuration file option to use them.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 20 ++++++++++++++++++++
 lib/unigraf/unigraf.h |  8 ++++++++
 2 files changed, 28 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 173e56ccc268..ce8a12a1f889 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -22,6 +22,7 @@ static int unigraf_open_count;
 static TSI_HANDLE unigraf_device;
 static char *unigraf_default_edid;
 static char *unigraf_connector_name;
+static bool unigraf_crc;
 
 /**
  * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
@@ -58,6 +59,11 @@ static char *unigraf_connector_name;
  */
 #define UNIGRAF_CONFIG_EDID_NAME "EDID"
 
+/**
+ * UNIGRAF_CONFIG_USE_CRC_NAME - Key of the CRC selection in the configuration file
+ */
+#define UNIGRAF_CONFIG_USE_CRC_NAME "UseCRC"
+
 /**
  * UNIGRAF_DEFAULT_ROLE_NAME - Default role name to search on the unigraf device
  */
@@ -325,6 +331,7 @@ bool unigraf_open_device(int drm_fd)
 		cfg_input = NULL;
 		cfg_edid_name = NULL;
 		unigraf_connector_name = NULL;
+		unigraf_crc = true;
 	} else {
 		cfg_device = g_key_file_get_string(igt_key_file, cfg_group,
 						   UNIGRAF_CONFIG_DEVICE_NAME, &cfg_error);
@@ -365,6 +372,14 @@ bool unigraf_open_device(int drm_fd)
 			unigraf_debug("No default EDID set, use IGT default.\n");
 			cfg_edid_name = NULL;
 		}
+
+		cfg_error = NULL;
+		unigraf_crc = g_key_file_get_boolean(igt_key_file, cfg_group,
+						     UNIGRAF_CONFIG_USE_CRC_NAME, &cfg_error);
+		if (cfg_error) {
+			unigraf_debug("CRC usage not configured, using unigraf CRC.\n");
+			unigraf_crc = true;
+		}
 	}
 
 	unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
@@ -591,3 +606,8 @@ void unigraf_read_crc(int stream, igt_crc_t *out)
 	out->n_words = 3;
 	out->has_valid_frame = false;
 }
+
+bool unigraf_use_crc(void)
+{
+	return unigraf_crc;
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index d00895b64d39..9c7c71a22d82 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -174,4 +174,12 @@ void unigraf_select_stream(int stream);
  */
 void unigraf_read_crc(int stream, igt_crc_t *out);
 
+/**
+ * unigraf_use_crc() - Check if Unigraf device should be used for CRC computation
+ *
+ * Returns: true if the Unigraf device should be used for CRC computation,
+ *          false otherwise.
+ */
+bool unigraf_use_crc(void);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 33/46] lib/unigraf: add unigraf_get_connector_by_stream
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (31 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 32/46] lib/unigraf: Add configuration for CRC usage Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 34/46] lib/unigraf: Add helper to check timings received by unigraf Louis Chauvet
                   ` (18 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As unigraf can emulate MST, we need a way to grab the corresponding DRM
connector from the stream id.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 36 ++++++++++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h |  7 +++++++
 2 files changed, 43 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index ce8a12a1f889..7770d3a86ad1 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -6,6 +6,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
+#include <xf86drmMode.h>
 
 #include "unigraf.h"
 #include "TSI_types.h"
@@ -292,6 +293,41 @@ drmModeConnectorPtr unigraf_get_connector(int drm_fd)
 	return igt_get_connector_from_name(drm_fd, unigraf_connector_name);
 }
 
+int unigraf_get_connector_by_stream(int drm_fd, int stream_id)
+{
+	drmModeConnectorPtr main_connector = unigraf_get_connector(drm_fd);
+	drmModeResPtr res = drmModeGetResources(drm_fd);
+
+	char *mst_path;
+	int mst_path_len = asprintf(&mst_path, "mst:%d-", main_connector->connector_id);
+
+	igt_assert(mst_path_len >= 0);
+
+	for (int i = 0; i < res->count_connectors; i++) {
+		drmModePropertyBlobPtr path_blob = kmstest_get_path_blob(drm_fd,
+									 res->connectors[i]);
+
+		if (path_blob && path_blob->length >= mst_path_len) {
+			if (memcmp(path_blob->data, mst_path, mst_path_len) == 0) {
+				if (stream_id == 0) {
+					drmModeFreePropertyBlob(path_blob);
+					drmModeFreeResources(res);
+					drmModeFreeConnector(main_connector);
+					return res->connectors[i];
+				}
+				stream_id--;
+			}
+
+			drmModeFreePropertyBlob(path_blob);
+		}
+	}
+
+	drmModeFreeResources(res);
+	drmModeFreeConnector(main_connector);
+
+	return 0;
+}
+
 bool unigraf_open_device(int drm_fd)
 {
 	TSI_RESULT r;
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 9c7c71a22d82..f870843cc7b5 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -182,4 +182,11 @@ void unigraf_read_crc(int stream, igt_crc_t *out);
  */
 bool unigraf_use_crc(void);
 
+/**
+ * unigraf_get_connector_by_stream() - Get a connector id from a stream id
+ * @drm_fd: DRM device where the unigraf is attached
+ * @stream_id: Stream to grab the connector from
+ */
+int unigraf_get_connector_by_stream(int drm_fd, int stream_id);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 34/46] lib/unigraf: Add helper to check timings received by unigraf
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (32 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 33/46] lib/unigraf: add unigraf_get_connector_by_stream Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 35/46] lib/igt_pipe_crc: Add ungiraf crc calculation Louis Chauvet
                   ` (17 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Unigraf device can check that some input video parameters.
Add a function to compare a mode with the actual signal
received by the unigraf.
---
 lib/unigraf/unigraf.c | 29 +++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h |  8 ++++++++
 2 files changed, 37 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 7770d3a86ad1..51f1f13af354 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -647,3 +647,32 @@ bool unigraf_use_crc(void)
 {
 	return unigraf_crc;
 }
+
+static void unigraf_read_msa(void)
+{
+	uint32_t data = 1;
+
+	unigraf_write_u32(TSI_DPRX_MSA_COMMAND_W, data);
+}
+
+void unigraf_assert_stream_timings(int stream, drmModeModeInfoPtr mode_info)
+{
+	uint32_t stream_count;
+
+	igt_assert(mode_info);
+
+	unigraf_read_msa();
+	stream_count = unigraf_read_u32(TSI_DPRX_MSA_STREAM_COUNT_R);
+	igt_assert_lt(stream, stream_count);
+	unigraf_write_u32(TSI_DPRX_MSA_STREAM_SELECT, stream);
+	igt_assert_eq(mode_info->htotal, unigraf_read_u32(TSI_DPRX_MSA_HTOTAL_R));
+	igt_assert_eq(mode_info->vtotal, unigraf_read_u32(TSI_DPRX_MSA_VTOTAL_R));
+	igt_assert_eq(mode_info->hdisplay, unigraf_read_u32(TSI_DPRX_MSA_HACTIVE_R));
+	igt_assert_eq(mode_info->vdisplay, unigraf_read_u32(TSI_DPRX_MSA_VACTIVE_R));
+	igt_assert_eq(mode_info->hsync_end - mode_info->hsync_start,
+		      unigraf_read_u32(TSI_DPRX_MSA_HSYNC_WIDTH_R));
+	igt_assert_eq(mode_info->vsync_end - mode_info->vsync_start,
+		      unigraf_read_u32(TSI_DPRX_MSA_VSYNC_WIDTH_R));
+	igt_assert_eq(mode_info->vsync_start, unigraf_read_u32(TSI_DPRX_MSA_VSTART_R));
+	igt_assert_eq(mode_info->hsync_start, unigraf_read_u32(TSI_DPRX_MSA_HSTART_R));
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index f870843cc7b5..d0d547db9a9d 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -189,4 +189,12 @@ bool unigraf_use_crc(void);
  */
 int unigraf_get_connector_by_stream(int drm_fd, int stream_id);
 
+/**
+ * unigraf_assert_stream_timings() - Assert that the received stream on unigraf
+ * matches the mode_info
+ * @stream: Stream id on the unigraf
+ * @mode_info: Mode to compare with
+ */
+void unigraf_assert_stream_timings(int stream, drmModeModeInfoPtr mode_info);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 35/46] lib/igt_pipe_crc: Add ungiraf crc calculation
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (33 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 34/46] lib/unigraf: Add helper to check timings received by unigraf Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 36/46] lib/unigraf: Add lane count configuration Louis Chauvet
                   ` (16 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Unigraf can read crc from the physical output, use this CRC instead of
internal CRC when configured. This allows to also test the hardware signal
generation.

This small addition allows to use the unigraf device for most of the
kms_* tests.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_pipe_crc.c    | 28 ++++++++++++++++++++++++++++
 lib/unigraf/unigraf.c | 24 ++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

diff --git a/lib/igt_pipe_crc.c b/lib/igt_pipe_crc.c
index 866bf2881cbd..32fd7f09ff5a 100644
--- a/lib/igt_pipe_crc.c
+++ b/lib/igt_pipe_crc.c
@@ -3,9 +3,12 @@
  * Copyright © 2013 Intel Corporation
  */
 
+#include "igt_core.h"
+#include "unigraf/unigraf.h"
 #include <inttypes.h>
 #include <sys/stat.h>
 #include <sys/mount.h>
+#include <xf86drmMode.h>
 #ifdef __linux__
 #include <sys/sysmacros.h>
 #endif
@@ -359,6 +362,31 @@ static void read_one_crc(igt_pipe_crc_t *pipe_crc, igt_crc_t *out)
 	} while (ret == -EINTR);
 
 	fcntl(pipe_crc->crc_fd, F_SETFL, pipe_crc->flags);
+
+#if HAVE_UNIGRAF
+	if (unigraf_open_device(pipe_crc->fd) && unigraf_use_crc()) {
+		int pipe_id;
+		int stream_id;
+		drmModeConnectorPtr connector = unigraf_get_connector(pipe_crc->fd);
+
+		if (!connector)
+			return;
+
+		pipe_id = igt_get_pipe_from_connector(pipe_crc->fd, connector->connector_id);
+		if (pipe_id != PIPE_NONE && pipe_id == pipe_crc->pipe) {
+			unigraf_read_crc(0, out);
+			return;
+		}
+
+		for (stream_id = 0; stream_id < unigraf_get_mst_stream_count(); stream_id++) {
+			pipe_id = unigraf_get_connector_by_stream(pipe_crc->fd, stream_id);
+			if (pipe_id != PIPE_NONE && pipe_id == pipe_crc->pipe) {
+				unigraf_read_crc(stream_id, out);
+				return;
+			}
+		}
+	}
+#endif
 }
 
 /**
diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 51f1f13af354..74bc9b2137d1 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: MIT
 
 #include "glib.h"
+#include "igt_aux.h"
 #include "igt_core.h"
 #include <stdint.h>
 #include <stdio.h>
@@ -65,6 +66,13 @@ static bool unigraf_crc;
  */
 #define UNIGRAF_CONFIG_USE_CRC_NAME "UseCRC"
 
+/**
+ * UNIGRAF_CONFIG_MST_STREAM_COUNT - Key for the stream count configuration
+ *
+ * Set to 0 to use SST, 1..4 for MST
+ */
+#define UNIGRAF_CONFIG_MST_STREAM_COUNT "MSTStreams"
+
 /**
  * UNIGRAF_DEFAULT_ROLE_NAME - Default role name to search on the unigraf device
  */
@@ -341,6 +349,7 @@ bool unigraf_open_device(int drm_fd)
 	int chosen_device;
 	int chosen_role;
 	int chosen_input;
+	int unigraf_stream_count;
 
 	assert(igt_can_fail());
 
@@ -368,6 +377,7 @@ bool unigraf_open_device(int drm_fd)
 		cfg_edid_name = NULL;
 		unigraf_connector_name = NULL;
 		unigraf_crc = true;
+		unigraf_stream_count = 0;
 	} else {
 		cfg_device = g_key_file_get_string(igt_key_file, cfg_group,
 						   UNIGRAF_CONFIG_DEVICE_NAME, &cfg_error);
@@ -416,6 +426,15 @@ bool unigraf_open_device(int drm_fd)
 			unigraf_debug("CRC usage not configured, using unigraf CRC.\n");
 			unigraf_crc = true;
 		}
+
+		cfg_error = NULL;
+		unigraf_stream_count = g_key_file_get_boolean(igt_key_file, cfg_group,
+							      UNIGRAF_CONFIG_MST_STREAM_COUNT,
+							      &cfg_error);
+		if (cfg_error) {
+			unigraf_debug("MST usage not configured, using SST.\n");
+			unigraf_stream_count = 0;
+		}
 	}
 
 	unigraf_assert(TSIX_DEV_RescanDevices(0, TSI_DEVCAP_VIDEO_CAPTURE, 0));
@@ -497,6 +516,11 @@ bool unigraf_open_device(int drm_fd)
 
 	unigraf_reset();
 
+	if (unigraf_stream_count == 0)
+		unigraf_set_sst();
+	else
+		unigraf_set_mst_stream_count(unigraf_stream_count);
+
 	return unigraf_connector_name != NULL;
 }
 

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 36/46] lib/unigraf: Add lane count configuration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (34 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 35/46] lib/igt_pipe_crc: Add ungiraf crc calculation Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 37/46] docs/unigraf: Add unigraf documentation Louis Chauvet
                   ` (15 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As unigraf can emulate 1, 2 or 4 lanes display port connections, add
helpers to configure the number of lanes.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 16 ++++++++++++++++
 lib/unigraf/unigraf.h | 17 +++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 74bc9b2137d1..5b5e01cb8f58 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -536,6 +536,7 @@ void unigraf_reset(void)
 	unigraf_set_sst();
 	unigraf_load_default_edid();
 	unigraf_hpd_assert();
+	unigraf_set_max_lane_count(4);
 	sleep(1);
 }
 
@@ -700,3 +701,18 @@ void unigraf_assert_stream_timings(int stream, drmModeModeInfoPtr mode_info)
 	igt_assert_eq(mode_info->vsync_start, unigraf_read_u32(TSI_DPRX_MSA_VSTART_R));
 	igt_assert_eq(mode_info->hsync_start, unigraf_read_u32(TSI_DPRX_MSA_HSTART_R));
 }
+
+void unigraf_set_max_lane_count(uint32_t count)
+{
+	unigraf_write_u32(TSI_DPRX_MAX_LANES, count);
+}
+
+int unigraf_get_max_lane_count(void)
+{
+	int max_lanes;
+
+	igt_assert(unigraf_device);
+	unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device, TSI_DPRX_MAX_LANES,
+					     &max_lanes, sizeof(max_lanes)));
+	return max_lanes;
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index d0d547db9a9d..84f59e843fd5 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -197,4 +197,21 @@ int unigraf_get_connector_by_stream(int drm_fd, int stream_id);
  */
 void unigraf_assert_stream_timings(int stream, drmModeModeInfoPtr mode_info);
 
+/**
+ * unigraf_get_max_lane_count() - Get the maximum number of lanes supported by the device
+ *
+ * Returns: The maximum number of lanes supported by the device.
+ */
+int unigraf_get_max_lane_count(void);
+
+/**
+ * unigraf_set_max_lane_count() - Set the maximum number of lanes advertised to the DUT
+ * @count: The maximum number of lanes to configure on the device
+ *
+ * This function sets the maximum number of lanes that the device will advertise on the DP link.
+ * The actual number of lanes used may be less than the requested count if the
+ * DUT does not support/use it.
+ */
+void unigraf_set_max_lane_count(uint32_t count);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 37/46] docs/unigraf: Add unigraf documentation
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (35 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 36/46] lib/unigraf: Add lane count configuration Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 38/46] lib/unigraf: Add helpers to set maximum link rate Louis Chauvet
                   ` (14 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Add unigraf documentation to explain how to compile and use it with IGT.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 docs/unigraf.txt | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/docs/unigraf.txt b/docs/unigraf.txt
new file mode 100644
index 000000000000..49225a6f4e51
--- /dev/null
+++ b/docs/unigraf.txt
@@ -0,0 +1,81 @@
+Unigraf Support in IGT
+========================
+
+This document provides information, instructions and for Unigraf support in IGT.
+
+Introduction
+------------
+
+Unigraf devices are a set of devices that can be used to test all sort of graphical
+interface and signals. See Unigraf website for more information about all the
+capabilities of earch devices: https://unigraf.fi
+
+Unigraf documentation
+---------------------
+
+All the documentation for libTSI, the library used to communicate with the unigraf,
+can be found on unigraf website: TODO
+
+Setting up Unigraf
+------------------
+
+For most of the unigraf devices, this should be as simple as "plugging the
+unigraf and plug the video cable". If you need to install some license, upgrade
+the firmawre... please take a look at the official unigraf documentation.
+
+Compiling IGT with Unigraf support
+----------------------------------
+
+Unfortunatly, the communication with the device use a proprietary library and the
+underlaying protocol is not open. To use the unigraf you need to install the unigraf
+SDK, grab the libTSI.so and make it available on the build machine and the DUT.
+
+Deploying the Unigraf with IGT
+------------------------------
+
+Unigraf may work out of the box: by default if IGT find a unigraf device, it will
+try to connect and configure it to use USB-C input. This allows running most of
+the existing tests without an actual screens.
+
+Here is a complete example configuration:
+
+        [Unigraf]
+        # Choose a device using his name, you can find it in UCDConsole (installed with the SDK)
+        Device=UCD-500 [2434C620]
+        # Choose a role for the device, you can find it UCDConsole
+        Role=USB-C, DP Alt Mode Source and Sink
+        # Choose active input for the device
+        Input=DP RX
+        # Set the connector name used by the unigraf device. If not set, IGT will try to
+        # autodetect which connector is used.
+        Connector=DP-2
+        # Set the EDID used by Unigraf
+        EDID=DEL_16543_DELL_P2314T_DP
+        # Enable or disable the use of Unigraf's CRCs instead of the CRTC CRCs
+        UseCRC=1
+        # Set the number of emulated MST streams (0 = Single Stream Transport, >=1 = MST)
+        MSTStreams=0'
+
+Current Support in IGT
+----------------------
+
+Support for the Unigraf devices in IGT is found in the following places:
+* lib/unigraf/unigraf.[ch] -> IGT API
+* lib/unigraf/TSI.h -> Header for libTSI.so, not provided by Unigraf
+* lib/unigraf/TSI_types.h -> Header containing all the relevant values from unigraf SDK. The unigraf SDK can't be used directly because it is only compatible with windows and c++.
+
+Current unigraf.c features are:
+* Plug, unplug, hotplug pulse
+* EDID management
+* MST/SST stream management
+* CRC calculation
+
+Current testing are:
+* All igt tests that require a display and use a CRC (kms_plane, )
+* Basic EDID and MST tests
+
+Planned tests:
+* Link training scenarios (link rate, lane count, scrambling, ...)
+* Bandwidth constraint management
+* HDCP content protection
+* Display stream compression

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 38/46] lib/unigraf: Add helpers to set maximum link rate
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (36 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 37/46] docs/unigraf: Add unigraf documentation Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 39/46] lib/i915/dp: Move DP-related function for i915 to proper folder Louis Chauvet
                   ` (13 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

As link rate can vary on a display port link, add a way
to change advertised link rate from unigraf.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 30 ++++++++++++++++++++++++++++++
 lib/unigraf/unigraf.h | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index 5b5e01cb8f58..f1d6d809e216 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -537,6 +537,7 @@ void unigraf_reset(void)
 	unigraf_load_default_edid();
 	unigraf_hpd_assert();
 	unigraf_set_max_lane_count(4);
+	unigraf_set_max_link_rate(UNIGRAF_RATE_8_10_GHZ);
 	sleep(1);
 }
 
@@ -716,3 +717,32 @@ int unigraf_get_max_lane_count(void)
 					     &max_lanes, sizeof(max_lanes)));
 	return max_lanes;
 }
+
+void unigraf_set_max_link_rate(int bandwidth)
+{
+	unigraf_write_u32(TSI_DPRX_MAX_LINK_RATE, bandwidth);
+}
+
+int unigraf_get_max_link_rate(void)
+{
+	return unigraf_read_u32(TSI_DPRX_MAX_LINK_RATE);
+}
+
+int unigraf_rate_to_kbs(enum unigraf_rate rate)
+{
+	switch (rate) {
+	case UNIGRAF_RATE_1_62_GHZ:
+		return 1620000;
+	case UNIGRAF_RATE_2_7_GHZ:
+		return 2700000;
+	case UNIGRAF_RATE_5_4_GHZ:
+		return 5400000;
+	case UNIGRAF_RATE_6_75_GHZ:
+		return 6750000;
+	case UNIGRAF_RATE_8_10_GHZ:
+		return 8100000;
+	default:
+		igt_assert_f(0, "Unknown rate %d\n", rate);
+		return 0;
+	}
+}
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 84f59e843fd5..721fd025924e 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -214,4 +214,41 @@ int unigraf_get_max_lane_count(void);
  */
 void unigraf_set_max_lane_count(uint32_t count);
 
+enum unigraf_rate {
+	UNIGRAF_RATE_1_62_GHZ = 6,
+	UNIGRAF_RATE_2_7_GHZ = 10,
+	UNIGRAF_RATE_5_4_GHZ = 20,
+	UNIGRAF_RATE_6_75_GHZ = 25,
+	UNIGRAF_RATE_8_10_GHZ = 30,
+};
+
+/**
+ * unigraf_set_max_link_rate() - Set the maximum link rate advertised to the DUT
+ * @rate: The maximum link rate to configure on the device. Actual value is
+ *        @rate * 270000 kHz. Common values can be found in enum unigraf_rate
+ *
+ * This function sets the maximum link rate that the device will advertise on the DP link.
+ * The actual link rate used may be less than the requested value if the DUT does not
+ * support/use it.
+ */
+void unigraf_set_max_link_rate(int rate);
+
+/**
+ * unigraf_get_max_link_rate() - Get the maximum link rate supported by the device
+ *
+ * Returns: The maximum link rate supported by the device. The value returned must be multiplied by
+ *          270000 to get the value in kHz.
+ */
+int unigraf_get_max_link_rate(void);
+
+/**
+ * unigraf_rate_to_kbs - Convert a rate value to kilobits per second
+ * @rate: The rate value to convert
+ *
+ * This function converts a rate value to kilobits per second (kbps).
+ *
+ * Returns: The converted rate in kilobits per second
+ */
+int unigraf_rate_to_kbs(enum unigraf_rate rate);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 39/46] lib/i915/dp: Move DP-related function for i915 to proper folder
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (37 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 38/46] lib/unigraf: Add helpers to set maximum link rate Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 40/46] lib/i915/dp: Rename functions to avoid confusion Louis Chauvet
                   ` (12 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Some functions, prefixed with igt_ are not generic but specific to the
i915 intel driver. To avoid confusion and allows the introduction of
generic helpers, move those to a dedicated file.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/i915/i915_dp.c                      | 318 ++++++++++++++++++++++++++++++++
 lib/i915/i915_dp.h                      |  22 +++
 lib/igt_kms.c                           | 310 -------------------------------
 lib/igt_kms.h                           |  13 --
 lib/meson.build                         |   1 +
 tests/intel/kms_dp_link_training.c      |   1 +
 tests/intel/kms_dp_linktrain_fallback.c |   1 +
 7 files changed, 343 insertions(+), 323 deletions(-)

diff --git a/lib/i915/i915_dp.c b/lib/i915/i915_dp.c
new file mode 100644
index 000000000000..6cb212f20b1b
--- /dev/null
+++ b/lib/i915/i915_dp.c
@@ -0,0 +1,318 @@
+// SPDX-License-Identifier: MIT
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "i915_dp.h"
+#include "igt_core.h"
+
+/**
+ * igt_parse_marked_value:
+ * @buf: Buffer containing the content to parse
+ * @marked_char: The character marking the value to parse
+ * @result: Pointer to store the parsed value
+ *
+ * Finds the integer value in the buffer that is marked by the given character.
+ *
+ * Returns: 0 on success, -1 on failure
+ */
+static int igt_parse_marked_value(const char *buf, char marked_char, int *result)
+{
+	char *marked_ptr, *val_ptr;
+
+	/*
+	 * Look for the marked character
+	 */
+	marked_ptr = strchr(buf, marked_char);
+
+	if (marked_ptr) {
+		val_ptr = marked_ptr - 1;
+		while (val_ptr > buf && isdigit(*val_ptr))
+			val_ptr--;
+		val_ptr++;
+		if (sscanf(val_ptr, "%d", result) == 1)
+			return 0;
+	}
+	return -1;
+}
+
+ /**
+  * igt_get_current_link_rate:
+  * @drm_fd: A drm file descriptor
+  * @output: Target output
+  *
+  * Returns: link_rate if set for output else -1
+  */
+int igt_get_current_link_rate(int drm_fd, igt_output_t *output)
+{
+	char buf[512];
+	int res, ret;
+
+	res = igt_debugfs_read_connector_file(drm_fd, output->name,
+					      "i915_dp_force_link_rate",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_rate\n",
+		     output->name);
+	res = igt_parse_marked_value(buf, '*', &ret);
+	igt_assert_f(res == 0, "Output %s not enabled\n", output->name);
+	return ret;
+}
+
+/**
+ * igt_get_current_lane_count:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Returns: lane_count if set for output else -1
+ */
+int igt_get_current_lane_count(int drm_fd, igt_output_t *output)
+{
+	char buf[512];
+	int res, ret;
+
+	res = igt_debugfs_read_connector_file(drm_fd, output->name,
+					      "i915_dp_force_lane_count",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_lane_count\n",
+		     output->name);
+	res = igt_parse_marked_value(buf, '*', &ret);
+	igt_assert_f(res == 0, "Output %s not enabled\n", output->name);
+	return ret;
+}
+
+/**
+ * igt_get_max_link_rate:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Returns: max_link_rate
+ */
+int igt_get_max_link_rate(int drm_fd, igt_output_t *output)
+{
+	char buf[512];
+	int res, ret;
+
+	res = igt_debugfs_read_connector_file(drm_fd, output->name,
+					      "i915_dp_max_link_rate",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_max_link_rate\n",
+		     output->name);
+
+	sscanf(buf, "%d", &ret);
+	return ret;
+}
+
+/**
+ * igt_get_max_link_rate:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Returns: max_link_rate
+ */
+int igt_get_max_lane_count(int drm_fd, igt_output_t *output)
+{
+	char buf[512];
+	int res, ret;
+
+	res = igt_debugfs_read_connector_file(drm_fd, output->name,
+					      "i915_dp_max_lane_count",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_max_lane_count\n",
+		     output->name);
+
+	sscanf(buf, "%d", &ret);
+	return ret;
+}
+
+/**
+ * igt_force_link_retrain:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ * @retrain_count: number of retraining required
+ *
+ * Force link retrain on the output.
+ */
+void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count)
+{
+	char value[2];
+	int res;
+
+	snprintf(value, sizeof(value), "%d", retrain_count);
+	res = igt_debugfs_write_connector_file(drm_fd, output->name,
+					       "i915_dp_force_link_retrain",
+					       value, strlen(value));
+	igt_assert_f(res == 0, "Unable to write to %s/i915_dp_force_link_retrain\n",
+		     output->name);
+}
+
+/**
+ * igt_force_lt_failure:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ * @failure_count: 1 for same link param and
+ *		   2 for reduced link params
+ *
+ * Force link training failure on the output.
+ * @failure_count: 1 for retraining with same link params
+ *		   2 for retraining with reduced link params
+ */
+void igt_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count)
+{
+	char value[2];
+	int res;
+
+	snprintf(value, sizeof(value), "%d", failure_count);
+	res = igt_debugfs_write_connector_file(drm_fd, output->name,
+					       "i915_dp_force_link_training_failure",
+					       value, strlen(value));
+	igt_assert_f(res == 0, "Unable to write to %s/i915_dp_force_link_training_failure\n",
+		     output->name);
+}
+
+/**
+ * igt_get_dp_link_retrain_disabled:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Returns: True if link retrain disabled, false otherwise
+ */
+bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output)
+{
+	char buf[512];
+	int res;
+
+	res = igt_debugfs_read_connector_file(drm_fd, output->name,
+					      "i915_dp_link_retrain_disabled",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_link_retrain_disabled\n",
+		     output->name);
+	return strstr(buf, "yes");
+}
+
+/**
+ * Checks if the force link training failure debugfs
+ * is available for a specific output.
+ *
+ * @drmfd: file descriptor of the DRM device.
+ * @output: output to check.
+ * Returns:
+ *  true if the debugfs is available, false otherwise.
+ */
+bool igt_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output)
+{
+	char buf[512];
+	int res;
+
+	res = igt_debugfs_read_connector_file(drmfd, output->name,
+					      "i915_dp_link_retrain_disabled",
+					      buf, sizeof(buf));
+	return res == 0;
+}
+
+/**
+ * igt_get_dp_pending_lt_failures:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Returns: Number of pending link training failures.
+ */
+int igt_get_dp_pending_lt_failures(int drm_fd, igt_output_t *output)
+{
+	char buf[512];
+	int res, ret;
+
+	res = igt_debugfs_read_connector_file(drm_fd, output->name,
+					      "i915_dp_force_link_training_failure",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_training_failure\n",
+		     output->name);
+	sscanf(buf, "%d", &ret);
+	return ret;
+}
+
+/**
+ * igt_dp_pending_retrain:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Returns: Number of pending link retrains.
+ */
+int igt_get_dp_pending_retrain(int drm_fd, igt_output_t *output)
+{
+	char buf[512];
+	int res, ret;
+
+	res = igt_debugfs_read_connector_file(drm_fd, output->name,
+					      "i915_dp_force_link_retrain",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_retrain\n",
+		     output->name);
+	sscanf(buf, "%d", &ret);
+	return ret;
+}
+
+/**
+ * igt_reset_link_params:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Reset link rate and lane count to auto, also installs exit handler
+ * to set link rate and lane count to auto on exit
+ */
+void igt_reset_link_params(int drm_fd, igt_output_t *output)
+{
+	bool valid;
+	drmModeConnector *temp;
+
+	valid = true;
+	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
+						    "i915_dp_force_link_rate",
+						    "auto", "auto", true);
+	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
+						    "i915_dp_force_lane_count",
+						    "auto", "auto", true);
+	igt_assert_f(valid, "Unable to set attr or install exit handler\n");
+	dump_connector_attrs();
+	igt_install_exit_handler(reset_connectors_at_exit);
+
+	/*
+	 * To allow callers to always use GetConnectorCurrent we need to force a
+	 * redetection here.
+	 */
+	temp = drmModeGetConnector(drm_fd, output->config.connector->connector_id);
+	drmModeFreeConnector(temp);
+}
+
+/**
+ * igt_set_link_params:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * set link rate and lane count to given value, also installs exit handler
+ * to set link rate and lane count to auto on exit
+ */
+void igt_set_link_params(int drm_fd, igt_output_t *output,
+			 char *link_rate, char *lane_count)
+{
+	bool valid;
+	drmModeConnector *temp;
+
+	valid = true;
+	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
+						    "i915_dp_force_link_rate",
+						    link_rate, "auto", true);
+	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
+						    "i915_dp_force_lane_count",
+						    lane_count, "auto", true);
+	igt_assert_f(valid, "Unable to set attr or install exit handler\n");
+	dump_connector_attrs();
+	igt_install_exit_handler(reset_connectors_at_exit);
+
+	/*
+	 * To allow callers to always use GetConnectorCurrent we need to force a
+	 * redetection here.
+	 */
+	temp = drmModeGetConnector(drm_fd, output->config.connector->connector_id);
+	drmModeFreeConnector(temp);
+}
diff --git a/lib/i915/i915_dp.h b/lib/i915/i915_dp.h
new file mode 100644
index 000000000000..3ca596f78e93
--- /dev/null
+++ b/lib/i915/i915_dp.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef _I915_CRC_H_
+#define _I915_CRC_H_
+
+#include "igt_kms.h"
+
+int igt_get_current_link_rate(int drm_fd, igt_output_t *output);
+int igt_get_current_lane_count(int drm_fd, igt_output_t *output);
+int igt_get_max_link_rate(int drm_fd, igt_output_t *output);
+int igt_get_max_lane_count(int drm_fd, igt_output_t *output);
+void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count);
+void igt_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count);
+bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output);
+bool igt_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output);
+int igt_get_dp_pending_lt_failures(int drm_fd, igt_output_t *output);
+int igt_get_dp_pending_retrain(int drm_fd, igt_output_t *output);
+void igt_reset_link_params(int drm_fd, igt_output_t *output);
+void igt_set_link_params(int drm_fd, igt_output_t *output,
+			 char *link_rate, char *lane_count);
+
+#endif
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index d429a1d5d605..326dde1fba33 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7063,316 +7063,6 @@ int get_num_scalers(igt_display_t *display, enum pipe pipe)
 	return num_scalers;
 }
 
-/**
- * igt_parse_marked_value:
- * @buf: Buffer containing the content to parse
- * @marked_char: The character marking the value to parse
- * @result: Pointer to store the parsed value
- *
- * Finds the integer value in the buffer that is marked by the given character.
- *
- * Returns: 0 on success, -1 on failure
- */
-static int igt_parse_marked_value(const char *buf, char marked_char, int *result)
-{
-	char *marked_ptr, *val_ptr;
-
-	/*
-	 * Look for the marked character
-	 */
-	marked_ptr = strchr(buf, marked_char);
-
-	if (marked_ptr) {
-		val_ptr = marked_ptr - 1;
-		while (val_ptr > buf && isdigit(*val_ptr))
-			val_ptr--;
-		val_ptr++;
-		if (sscanf(val_ptr, "%d", result) == 1)
-			return 0;
-	}
-	return -1;
-}
-
-/**
- * igt_get_current_link_rate:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Returns: link_rate if set for output else -1
- */
-int igt_get_current_link_rate(int drm_fd, igt_output_t *output)
-{
-	char buf[512];
-	int res, ret;
-
-	res = igt_debugfs_read_connector_file(drm_fd, output->name,
-					       "i915_dp_force_link_rate",
-					       buf, sizeof(buf));
-	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_rate\n",
-			       output->name);
-	res = igt_parse_marked_value(buf, '*', &ret);
-	igt_assert_f(res == 0, "Output %s not enabled\n", output->name);
-	return ret;
-}
-
-/**
- * igt_get_current_lane_count:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Returns: lane_count if set for output else -1
- */
-int igt_get_current_lane_count(int drm_fd, igt_output_t *output)
-{
-	char buf[512];
-	int res, ret;
-
-	res = igt_debugfs_read_connector_file(drm_fd, output->name,
-					      "i915_dp_force_lane_count",
-					      buf, sizeof(buf));
-	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_lane_count\n",
-			       output->name);
-	res = igt_parse_marked_value(buf, '*', &ret);
-	igt_assert_f(res == 0, "Output %s not enabled\n", output->name);
-	return ret;
-}
-
-/**
- * igt_get_max_link_rate:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Returns: max_link_rate
- */
-int igt_get_max_link_rate(int drm_fd, igt_output_t *output)
-{
-	char buf[512];
-	int res, ret;
-
-	res = igt_debugfs_read_connector_file(drm_fd, output->name,
-					       "i915_dp_max_link_rate",
-					       buf, sizeof(buf));
-	igt_assert_f(res == 0, "Unable to read %s/i915_dp_max_link_rate\n",
-		     output->name);
-
-	sscanf(buf, "%d", &ret);
-	return ret;
-}
-
-/**
- * igt_get_max_link_rate:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Returns: max_link_rate
- */
-int igt_get_max_lane_count(int drm_fd, igt_output_t *output)
-{
-	char buf[512];
-	int res, ret;
-
-	res = igt_debugfs_read_connector_file(drm_fd, output->name,
-					       "i915_dp_max_lane_count",
-					       buf, sizeof(buf));
-	igt_assert_f(res == 0, "Unable to read %s/i915_dp_max_lane_count\n",
-		     output->name);
-
-	sscanf(buf, "%d", &ret);
-	return ret;
-}
-
-/**
- * igt_force_link_retrain:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- * @retrain_count: number of retraining required
- *
- * Force link retrain on the output.
- */
-void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count)
-{
-	char value[2];
-	int res;
-
-	snprintf(value, sizeof(value), "%d", retrain_count);
-	res = igt_debugfs_write_connector_file(drm_fd, output->name,
-					       "i915_dp_force_link_retrain",
-					       value, strlen(value));
-	igt_assert_f(res == 0, "Unable to write to %s/i915_dp_force_link_retrain\n",
-			  output->name);
-}
-
-/**
- * igt_force_lt_failure:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- * @failure_count: 1 for same link param and
- *		   2 for reduced link params
- *
- * Force link training failure on the output.
- * @failure_count: 1 for retraining with same link params
- *		   2 for retraining with reduced link params
- */
-void igt_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count)
-{
-	char value[2];
-	int res;
-
-	snprintf(value, sizeof(value), "%d", failure_count);
-	res = igt_debugfs_write_connector_file(drm_fd, output->name,
-					       "i915_dp_force_link_training_failure",
-					       value, strlen(value));
-	igt_assert_f(res == 0, "Unable to write to %s/i915_dp_force_link_training_failure\n",
-			  output->name);
-}
-
-/**
- * igt_get_dp_link_retrain_disabled:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Returns: True if link retrain disabled, false otherwise
- */
-bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output)
-{
-	char buf[512];
-	int res;
-
-	res = igt_debugfs_read_connector_file(drm_fd, output->name,
-					      "i915_dp_link_retrain_disabled",
-					      buf, sizeof(buf));
-	igt_assert_f(res == 0, "Unable to read %s/i915_dp_link_retrain_disabled\n",
-			       output->name);
-	return strstr(buf, "yes");
-}
-
-/**
- * Checks if the force link training failure debugfs
- * is available for a specific output.
- *
- * @drmfd: file descriptor of the DRM device.
- * @output: output to check.
- * Returns:
- *  true if the debugfs is available, false otherwise.
- */
-bool igt_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output)
-{
-	char buf[512];
-	int res;
-
-	res = igt_debugfs_read_connector_file(drmfd, output->name,
-					      "i915_dp_link_retrain_disabled",
-					      buf, sizeof(buf));
-	return res == 0;
-}
-
-/**
- * igt_get_dp_pending_lt_failures:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Returns: Number of pending link training failures.
- */
-int igt_get_dp_pending_lt_failures(int drm_fd, igt_output_t *output)
-{
-	char buf[512];
-	int res, ret;
-
-	res = igt_debugfs_read_connector_file(drm_fd, output->name,
-					      "i915_dp_force_link_training_failure",
-					      buf, sizeof(buf));
-	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_training_failure\n",
-			       output->name);
-	sscanf(buf, "%d", &ret);
-	return ret;
-}
-
-/**
- * igt_dp_pending_retrain:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Returns: Number of pending link retrains.
- */
-int igt_get_dp_pending_retrain(int drm_fd, igt_output_t *output)
-{
-	char buf[512];
-	int res, ret;
-
-	res = igt_debugfs_read_connector_file(drm_fd, output->name,
-					      "i915_dp_force_link_retrain",
-					      buf, sizeof(buf));
-	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_retrain\n",
-			       output->name);
-	sscanf(buf, "%d", &ret);
-	return ret;
-}
-
-/**
- * igt_reset_link_params:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * Reset link rate and lane count to auto, also installs exit handler
- * to set link rate and lane count to auto on exit
- */
-void igt_reset_link_params(int drm_fd, igt_output_t *output)
-{
-	bool valid;
-	drmModeConnector *temp;
-
-	valid = true;
-	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
-						    "i915_dp_force_link_rate",
-						    "auto", "auto", true);
-	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
-						    "i915_dp_force_lane_count",
-						    "auto", "auto", true);
-	igt_assert_f(valid, "Unable to set attr or install exit handler\n");
-	dump_connector_attrs();
-	igt_install_exit_handler(reset_connectors_at_exit);
-
-	/*
-	 * To allow callers to always use GetConnectorCurrent we need to force a
-	 * redetection here.
-	 */
-	temp = drmModeGetConnector(drm_fd, output->config.connector->connector_id);
-	drmModeFreeConnector(temp);
-}
-
-/**
- * igt_set_link_params:
- * @drm_fd: A drm file descriptor
- * @output: Target output
- *
- * set link rate and lane count to given value, also installs exit handler
- * to set link rate and lane count to auto on exit
- */
-void igt_set_link_params(int drm_fd, igt_output_t *output,
-			   char *link_rate, char *lane_count)
-{
-	bool valid;
-	drmModeConnector *temp;
-
-	valid = true;
-	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
-						    "i915_dp_force_link_rate",
-						    link_rate, "auto", true);
-	valid = valid && connector_attr_set_debugfs(drm_fd, output->config.connector,
-						    "i915_dp_force_lane_count",
-						    lane_count, "auto", true);
-	igt_assert_f(valid, "Unable to set attr or install exit handler\n");
-	dump_connector_attrs();
-	igt_install_exit_handler(reset_connectors_at_exit);
-
-	/*
-	 * To allow callers to always use GetConnectorCurrent we need to force a
-	 * redetection here.
-	 */
-	temp = drmModeGetConnector(drm_fd, output->config.connector->connector_id);
-	drmModeFreeConnector(temp);
-}
-
 /**
  * igt_backlight_read:
  * @result:	Pointer to store the result
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 9dc0362300aa..86e5b3224df3 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1289,19 +1289,6 @@ bool intel_pipe_output_combo_valid(igt_display_t *display);
 bool igt_check_output_is_dp_mst(igt_output_t *output);
 int igt_get_dp_mst_connector_id(igt_output_t *output);
 int get_num_scalers(igt_display_t *display, enum pipe pipe);
-int igt_get_current_lane_count(int drm_fd, igt_output_t *output);
-int igt_get_current_link_rate(int drm_fd, igt_output_t *output);
-int igt_get_max_link_rate(int drm_fd, igt_output_t *output);
-int igt_get_max_lane_count(int drm_fd, igt_output_t *output);
-void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count);
-void igt_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count);
-bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output);
-bool igt_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output);
-int igt_get_dp_pending_lt_failures(int drm_fd, igt_output_t *output);
-int igt_get_dp_pending_retrain(int drm_fd, igt_output_t *output);
-void igt_reset_link_params(int drm_fd, igt_output_t *output);
-void igt_set_link_params(int drm_fd, igt_output_t *output,
-			   char *link_rate, char *lane_count);
 int igt_backlight_read(int *result, const char *fname, igt_backlight_context_t *context);
 int igt_backlight_write(int value, const char *fname, igt_backlight_context_t *context);
 uint32_t igt_get_connected_output_count(igt_display_t *display);
diff --git a/lib/meson.build b/lib/meson.build
index fd98e280637c..fa4663abc0ab 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -16,6 +16,7 @@ lib_sources = [
 	'i915/intel_fbc.c',
 	'i915/intel_memory_region.c',
 	'i915/i915_crc.c',
+	'i915/i915_dp.c',
 	'igt_collection.c',
 	'igt_color_encoding.c',
 	'igt_configfs.c',
diff --git a/tests/intel/kms_dp_link_training.c b/tests/intel/kms_dp_link_training.c
index fb9b42608f25..ddc98b7f570b 100644
--- a/tests/intel/kms_dp_link_training.c
+++ b/tests/intel/kms_dp_link_training.c
@@ -21,6 +21,7 @@
  * Description: Test we can drive non-UHBR rates over MST.
  */
 
+#include "i915/i915_dp.h"
 #include "igt.h"
 #include "igt_kms.h"
 #include "intel/kms_joiner_helper.h"
diff --git a/tests/intel/kms_dp_linktrain_fallback.c b/tests/intel/kms_dp_linktrain_fallback.c
index fa58999e8269..80b113885e47 100644
--- a/tests/intel/kms_dp_linktrain_fallback.c
+++ b/tests/intel/kms_dp_linktrain_fallback.c
@@ -12,6 +12,7 @@
  */
 
 #include <sys/types.h>
+#include "i915/i915_dp.h"
 #include "igt_sysfs.h"
 #include "igt.h"
 #include "kms_mst_helper.h"

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 40/46] lib/i915/dp: Rename functions to avoid confusion
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (38 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 39/46] lib/i915/dp: Move DP-related function for i915 to proper folder Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 41/46] lib/i915/dp: Add helper to get maximum supported rate Louis Chauvet
                   ` (11 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Add the proper prefix for i915 dp-related functions.
This will avoid confusion when using them.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/i915/i915_dp.c                      | 57 +++++++++++++++++----------------
 lib/i915/i915_dp.h                      | 26 +++++++--------
 tests/intel/kms_dp_link_training.c      | 18 +++++------
 tests/intel/kms_dp_linktrain_fallback.c | 56 ++++++++++++++++----------------
 4 files changed, 79 insertions(+), 78 deletions(-)

diff --git a/lib/i915/i915_dp.c b/lib/i915/i915_dp.c
index 6cb212f20b1b..c5b9273ebafd 100644
--- a/lib/i915/i915_dp.c
+++ b/lib/i915/i915_dp.c
@@ -8,7 +8,7 @@
 #include "igt_core.h"
 
 /**
- * igt_parse_marked_value:
+ * i915_dp_parse_marked_value:
  * @buf: Buffer containing the content to parse
  * @marked_char: The character marking the value to parse
  * @result: Pointer to store the parsed value
@@ -17,7 +17,7 @@
  *
  * Returns: 0 on success, -1 on failure
  */
-static int igt_parse_marked_value(const char *buf, char marked_char, int *result)
+static int i915_dp_parse_marked_value(const char *buf, char marked_char, int *result)
 {
 	char *marked_ptr, *val_ptr;
 
@@ -38,13 +38,13 @@ static int igt_parse_marked_value(const char *buf, char marked_char, int *result
 }
 
  /**
-  * igt_get_current_link_rate:
+  * i915_dp_get_current_link_rate:
   * @drm_fd: A drm file descriptor
   * @output: Target output
   *
   * Returns: link_rate if set for output else -1
   */
-int igt_get_current_link_rate(int drm_fd, igt_output_t *output)
+int i915_dp_get_current_link_rate(int drm_fd, igt_output_t *output)
 {
 	char buf[512];
 	int res, ret;
@@ -54,19 +54,19 @@ int igt_get_current_link_rate(int drm_fd, igt_output_t *output)
 					      buf, sizeof(buf));
 	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_rate\n",
 		     output->name);
-	res = igt_parse_marked_value(buf, '*', &ret);
+	res = i915_dp_parse_marked_value(buf, '*', &ret);
 	igt_assert_f(res == 0, "Output %s not enabled\n", output->name);
 	return ret;
 }
 
 /**
- * igt_get_current_lane_count:
+ * i915_dp_get_current_lane_count:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * Returns: lane_count if set for output else -1
  */
-int igt_get_current_lane_count(int drm_fd, igt_output_t *output)
+int i915_dp_get_current_lane_count(int drm_fd, igt_output_t *output)
 {
 	char buf[512];
 	int res, ret;
@@ -76,19 +76,19 @@ int igt_get_current_lane_count(int drm_fd, igt_output_t *output)
 					      buf, sizeof(buf));
 	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_lane_count\n",
 		     output->name);
-	res = igt_parse_marked_value(buf, '*', &ret);
+	res = i915_dp_parse_marked_value(buf, '*', &ret);
 	igt_assert_f(res == 0, "Output %s not enabled\n", output->name);
 	return ret;
 }
 
 /**
- * igt_get_max_link_rate:
+ * i915_dp_get_max_link_rate:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * Returns: max_link_rate
  */
-int igt_get_max_link_rate(int drm_fd, igt_output_t *output)
+int i915_dp_get_max_link_rate(int drm_fd, igt_output_t *output)
 {
 	char buf[512];
 	int res, ret;
@@ -104,13 +104,13 @@ int igt_get_max_link_rate(int drm_fd, igt_output_t *output)
 }
 
 /**
- * igt_get_max_link_rate:
+ * i915_dp_get_max_lane_count:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * Returns: max_link_rate
  */
-int igt_get_max_lane_count(int drm_fd, igt_output_t *output)
+int i915_dp_get_max_lane_count(int drm_fd, igt_output_t *output)
 {
 	char buf[512];
 	int res, ret;
@@ -126,14 +126,14 @@ int igt_get_max_lane_count(int drm_fd, igt_output_t *output)
 }
 
 /**
- * igt_force_link_retrain:
+ * i915_dp_force_link_retrain:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  * @retrain_count: number of retraining required
  *
  * Force link retrain on the output.
  */
-void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count)
+void i915_dp_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count)
 {
 	char value[2];
 	int res;
@@ -147,7 +147,7 @@ void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count)
 }
 
 /**
- * igt_force_lt_failure:
+ * i915_dp_force_lt_failure:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  * @failure_count: 1 for same link param and
@@ -157,7 +157,7 @@ void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count)
  * @failure_count: 1 for retraining with same link params
  *		   2 for retraining with reduced link params
  */
-void igt_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count)
+void i915_dp_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count)
 {
 	char value[2];
 	int res;
@@ -171,13 +171,13 @@ void igt_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count)
 }
 
 /**
- * igt_get_dp_link_retrain_disabled:
+ * i915_dp_get_link_retrain_disabled:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * Returns: True if link retrain disabled, false otherwise
  */
-bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output)
+bool i915_dp_get_link_retrain_disabled(int drm_fd, igt_output_t *output)
 {
 	char buf[512];
 	int res;
@@ -191,6 +191,7 @@ bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output)
 }
 
 /**
+ * i915_dp_has_force_link_training_failure_debugfs:
  * Checks if the force link training failure debugfs
  * is available for a specific output.
  *
@@ -199,7 +200,7 @@ bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output)
  * Returns:
  *  true if the debugfs is available, false otherwise.
  */
-bool igt_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output)
+bool i915_dp_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output)
 {
 	char buf[512];
 	int res;
@@ -211,13 +212,13 @@ bool igt_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output
 }
 
 /**
- * igt_get_dp_pending_lt_failures:
+ * i915_dp_get_pending_lt_failures:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * Returns: Number of pending link training failures.
  */
-int igt_get_dp_pending_lt_failures(int drm_fd, igt_output_t *output)
+int i915_dp_get_pending_lt_failures(int drm_fd, igt_output_t *output)
 {
 	char buf[512];
 	int res, ret;
@@ -232,13 +233,13 @@ int igt_get_dp_pending_lt_failures(int drm_fd, igt_output_t *output)
 }
 
 /**
- * igt_dp_pending_retrain:
+ * i915_dp_get_pending_retrain:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * Returns: Number of pending link retrains.
  */
-int igt_get_dp_pending_retrain(int drm_fd, igt_output_t *output)
+int i915_dp_get_pending_retrain(int drm_fd, igt_output_t *output)
 {
 	char buf[512];
 	int res, ret;
@@ -253,14 +254,14 @@ int igt_get_dp_pending_retrain(int drm_fd, igt_output_t *output)
 }
 
 /**
- * igt_reset_link_params:
+ * i915_dp_reset_link_params:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * Reset link rate and lane count to auto, also installs exit handler
  * to set link rate and lane count to auto on exit
  */
-void igt_reset_link_params(int drm_fd, igt_output_t *output)
+void i915_dp_reset_link_params(int drm_fd, igt_output_t *output)
 {
 	bool valid;
 	drmModeConnector *temp;
@@ -285,15 +286,15 @@ void igt_reset_link_params(int drm_fd, igt_output_t *output)
 }
 
 /**
- * igt_set_link_params:
+ * i915_dp_set_link_params:
  * @drm_fd: A drm file descriptor
  * @output: Target output
  *
  * set link rate and lane count to given value, also installs exit handler
  * to set link rate and lane count to auto on exit
  */
-void igt_set_link_params(int drm_fd, igt_output_t *output,
-			 char *link_rate, char *lane_count)
+void i915_dp_set_link_params(int drm_fd, igt_output_t *output,
+			     char *link_rate, char *lane_count)
 {
 	bool valid;
 	drmModeConnector *temp;
diff --git a/lib/i915/i915_dp.h b/lib/i915/i915_dp.h
index 3ca596f78e93..65057cff4ff4 100644
--- a/lib/i915/i915_dp.h
+++ b/lib/i915/i915_dp.h
@@ -5,18 +5,18 @@
 
 #include "igt_kms.h"
 
-int igt_get_current_link_rate(int drm_fd, igt_output_t *output);
-int igt_get_current_lane_count(int drm_fd, igt_output_t *output);
-int igt_get_max_link_rate(int drm_fd, igt_output_t *output);
-int igt_get_max_lane_count(int drm_fd, igt_output_t *output);
-void igt_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count);
-void igt_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count);
-bool igt_get_dp_link_retrain_disabled(int drm_fd, igt_output_t *output);
-bool igt_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output);
-int igt_get_dp_pending_lt_failures(int drm_fd, igt_output_t *output);
-int igt_get_dp_pending_retrain(int drm_fd, igt_output_t *output);
-void igt_reset_link_params(int drm_fd, igt_output_t *output);
-void igt_set_link_params(int drm_fd, igt_output_t *output,
-			 char *link_rate, char *lane_count);
+int i915_dp_get_current_link_rate(int drm_fd, igt_output_t *output);
+int i915_dp_get_current_lane_count(int drm_fd, igt_output_t *output);
+int i915_dp_get_max_link_rate(int drm_fd, igt_output_t *output);
+int i915_dp_get_max_lane_count(int drm_fd, igt_output_t *output);
+void i915_dp_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count);
+void i915_dp_force_lt_failure(int drm_fd, igt_output_t *output, int failure_count);
+bool i915_dp_get_link_retrain_disabled(int drm_fd, igt_output_t *output);
+bool i915_dp_has_force_link_training_failure_debugfs(int drmfd, igt_output_t *output);
+int i915_dp_get_pending_lt_failures(int drm_fd, igt_output_t *output);
+int i915_dp_get_pending_retrain(int drm_fd, igt_output_t *output);
+void i915_dp_reset_link_params(int drm_fd, igt_output_t *output);
+void i915_dp_set_link_params(int drm_fd, igt_output_t *output,
+			     char *link_rate, char *lane_count);
 
 #endif
diff --git a/tests/intel/kms_dp_link_training.c b/tests/intel/kms_dp_link_training.c
index ddc98b7f570b..dec8dcb84d9b 100644
--- a/tests/intel/kms_dp_link_training.c
+++ b/tests/intel/kms_dp_link_training.c
@@ -201,20 +201,20 @@ static bool run_link_rate_test(data_t *data, bool mst, bool uhbr)
 	char lane_str[32];
 
 	igt_display_reset(&data->display);
-	igt_reset_link_params(data->drm_fd, data->output);
+	i915_dp_reset_link_params(data->drm_fd, data->output);
 	do_modeset(data, mst);
 
 	/* Retrain at default/driver parameters */
-	igt_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
+	i915_dp_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
 	igt_assert_eq(check_condition_with_timeout(data->drm_fd, data->output,
-						   igt_get_dp_pending_retrain,
+						   i915_dp_get_pending_retrain,
 						   1.0, 20.0), 0);
 	assert_link_status_good(data, mst);
 
 	/* FIXME : Driver may lie max link rate or max lane count */
 	/* Read max_link_rate and max_lane_count */
-	max_link_rate = igt_get_max_link_rate(data->drm_fd, data->output);
-	max_lane_count = igt_get_max_lane_count(data->drm_fd, data->output);
+	max_link_rate = i915_dp_get_max_link_rate(data->drm_fd, data->output);
+	max_lane_count = i915_dp_get_max_lane_count(data->drm_fd, data->output);
 
 	/* Check sink supports uhbr or not */
 	is_uhbr_output = (max_link_rate >= UHBR_LINK_RATE);
@@ -233,14 +233,14 @@ static bool run_link_rate_test(data_t *data, bool mst, bool uhbr)
 		 data->output->name, rate_str, max_lane_count);
 
 	/* Force retrain at max link params */
-	igt_set_link_params(data->drm_fd, data->output, rate_str, lane_str);
-	igt_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
+	i915_dp_set_link_params(data->drm_fd, data->output, rate_str, lane_str);
+	i915_dp_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
 	igt_assert_eq(check_condition_with_timeout(data->drm_fd, data->output,
-						   igt_get_dp_pending_retrain,
+						   i915_dp_get_pending_retrain,
 						   1.0, 20.0), 0);
 	assert_link_status_good(data, mst);
 
-	current_link_rate = igt_get_current_link_rate(data->drm_fd, data->output);
+	current_link_rate = i915_dp_get_current_link_rate(data->drm_fd, data->output);
 	igt_info("Current link rate is %d\n", current_link_rate);
 	igt_assert_f(current_link_rate == max_link_rate,
 		     "Link training did not succeed at max link rate.\n");
diff --git a/tests/intel/kms_dp_linktrain_fallback.c b/tests/intel/kms_dp_linktrain_fallback.c
index 80b113885e47..d69c1f2b606b 100644
--- a/tests/intel/kms_dp_linktrain_fallback.c
+++ b/tests/intel/kms_dp_linktrain_fallback.c
@@ -238,12 +238,12 @@ static bool force_failure_and_wait(data_t *data,
 				   double interval,
 				   double timeout)
 {
-	igt_force_lt_failure(data->drm_fd, output, failure_type);
-	igt_force_link_retrain(data->drm_fd, output, retrain_count);
+	i915_dp_force_lt_failure(data->drm_fd, output, failure_type);
+	i915_dp_force_link_retrain(data->drm_fd, output, retrain_count);
 
 	/* Wait until there's no pending retrain */
 	if (check_condition_with_timeout(data->drm_fd, output,
-					 igt_get_dp_pending_retrain,
+					 i915_dp_get_pending_retrain,
 					 interval, timeout)) {
 		igt_info("Timed out waiting for pending retrain\n");
 		return false;
@@ -251,7 +251,7 @@ static bool force_failure_and_wait(data_t *data,
 
 	/* Wait until there's no pending LT failures */
 	if (check_condition_with_timeout(data->drm_fd, output,
-					 igt_get_dp_pending_lt_failures,
+					 i915_dp_get_pending_lt_failures,
 					 interval, timeout)) {
 		igt_info("Timed out waiting for pending LT failures\n");
 		return false;
@@ -351,7 +351,7 @@ static void test_fallback(data_t *data, bool is_mst)
 	retries = SPURIOUS_HPD_RETRY;
 
 	igt_display_reset(&data->display);
-	igt_reset_link_params(data->drm_fd, data->output);
+	i915_dp_reset_link_params(data->drm_fd, data->output);
 	if (!setup_outputs(data, is_mst, outputs,
 			   &output_count, modes, fbs,
 			   primaries))
@@ -359,13 +359,13 @@ static void test_fallback(data_t *data, bool is_mst)
 
 	igt_info("Testing link training fallback on %s\n",
 		 igt_output_name(data->output));
-	max_link_rate = igt_get_max_link_rate(data->drm_fd, data->output);
-	max_lane_count = igt_get_max_lane_count(data->drm_fd, data->output);
-	prev_link_rate = igt_get_current_link_rate(data->drm_fd, data->output);
-	prev_lane_count = igt_get_current_lane_count(data->drm_fd, data->output);
+	max_link_rate = i915_dp_get_max_link_rate(data->drm_fd, data->output);
+	max_lane_count = i915_dp_get_max_lane_count(data->drm_fd, data->output);
+	prev_link_rate = i915_dp_get_current_link_rate(data->drm_fd, data->output);
+	prev_lane_count = i915_dp_get_current_lane_count(data->drm_fd, data->output);
 
-	while (!igt_get_dp_link_retrain_disabled(data->drm_fd,
-						 data->output)) {
+	while (!i915_dp_get_link_retrain_disabled(data->drm_fd,
+						  data->output)) {
 		igt_info("Current link rate: %d, Current lane count: %d\n",
 			 prev_link_rate,
 			 prev_lane_count);
@@ -377,8 +377,8 @@ static void test_fallback(data_t *data, bool is_mst)
 						    1.0, 20.0),
 						    "Link training failure steps timed out\n");
 
-		if (igt_get_dp_link_retrain_disabled(data->drm_fd,
-						     data->output)) {
+		if (i915_dp_get_link_retrain_disabled(data->drm_fd,
+						      data->output)) {
 			igt_reset_connectors();
 			return;
 		}
@@ -398,8 +398,8 @@ static void test_fallback(data_t *data, bool is_mst)
 							  fbs,
 							  primaries), "modeset failed\n");
 		igt_assert_eq(data->output->values[IGT_CONNECTOR_LINK_STATUS], DRM_MODE_LINK_STATUS_GOOD);
-		curr_link_rate = igt_get_current_link_rate(data->drm_fd, data->output);
-		curr_lane_count = igt_get_current_lane_count(data->drm_fd, data->output);
+		curr_link_rate = i915_dp_get_current_link_rate(data->drm_fd, data->output);
+		curr_lane_count = i915_dp_get_current_lane_count(data->drm_fd, data->output);
 
 		igt_assert_f((curr_link_rate < prev_link_rate ||
 			     curr_lane_count < prev_lane_count) ||
@@ -419,8 +419,8 @@ static bool run_lt_fallback_test(data_t *data)
 	for_each_connected_output(&data->display, output) {
 		data->output = output;
 
-		if (!igt_has_force_link_training_failure_debugfs(data->drm_fd,
-								 data->output)) {
+		if (!i915_dp_has_force_link_training_failure_debugfs(data->drm_fd,
+								     data->output)) {
 			igt_info("Output %s doesn't support forcing link training failure\n",
 				 igt_output_name(data->output));
 			continue;
@@ -463,8 +463,8 @@ static void test_dsc_sst_fallback(data_t *data)
 	data->pipe = PIPE_A;
 
 	igt_display_reset(&data->display);
-	igt_reset_link_params(data->drm_fd, data->output);
-	igt_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
+	i915_dp_reset_link_params(data->drm_fd, data->output);
+	i915_dp_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
 
 	/* Find a mode that doesn't require DSC initially */
 	for_each_connector_mode(data->output) {
@@ -499,8 +499,8 @@ static void test_dsc_sst_fallback(data_t *data)
 			igt_info("Found mode %dx%d@%d %s that doesn't need DSC with link rate %d and lane count %d\n",
 				 non_dsc_mode->hdisplay, non_dsc_mode->vdisplay,
 				 non_dsc_mode->vrefresh, non_dsc_mode->name,
-				 igt_get_current_link_rate(data->drm_fd, data->output),
-				 igt_get_current_lane_count(data->drm_fd, data->output));
+				 i915_dp_get_current_link_rate(data->drm_fd, data->output),
+				 i915_dp_get_current_lane_count(data->drm_fd, data->output));
 			non_dsc_mode_found = true;
 			break;
 		}
@@ -510,7 +510,7 @@ static void test_dsc_sst_fallback(data_t *data)
 		      igt_output_name(data->output));
 
 	/* Repeatedly force link failure until DSC is required (or link is disabled) */
-	while (!igt_get_dp_link_retrain_disabled(data->drm_fd, data->output)) {
+	while (!i915_dp_get_link_retrain_disabled(data->drm_fd, data->output)) {
 		mon = igt_watch_uevents();
 
 		igt_assert_f(force_failure_and_wait(data, data->output,
@@ -518,8 +518,8 @@ static void test_dsc_sst_fallback(data_t *data)
 						    RETRAIN_COUNT, 1.0, 20.0),
 			     "Forcing DSC fallback timed out\n");
 
-		if (igt_get_dp_link_retrain_disabled(data->drm_fd,
-						     data->output)) {
+		if (i915_dp_get_link_retrain_disabled(data->drm_fd,
+						      data->output)) {
 			igt_reset_connectors();
 			igt_flush_uevents(mon);
 			return;
@@ -543,8 +543,8 @@ static void test_dsc_sst_fallback(data_t *data)
 			igt_info("mode %dx%d@%d now requires DSC with link rate %d and lane count %d\n",
 				 mode_to_check->hdisplay, mode_to_check->vdisplay,
 				 mode_to_check->vrefresh,
-				 igt_get_current_link_rate(data->drm_fd, data->output),
-				 igt_get_current_lane_count(data->drm_fd, data->output));
+				 i915_dp_get_current_link_rate(data->drm_fd, data->output),
+				 i915_dp_get_current_lane_count(data->drm_fd, data->output));
 			igt_info("DSC fallback successful on %s\n",
 				 igt_output_name(data->output));
 			dsc_fallback_successful = true;
@@ -571,8 +571,8 @@ static bool run_dsc_sst_fallaback_test(data_t *data)
 	for_each_connected_output(&data->display, output) {
 		data->output = output;
 
-		if (!igt_has_force_link_training_failure_debugfs(data->drm_fd,
-								 data->output)) {
+		if (!i915_dp_has_force_link_training_failure_debugfs(data->drm_fd,
+								     data->output)) {
 			igt_info("Output %s doesn't support forcing link training.\n",
 				 igt_output_name(data->output));
 			continue;

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 41/46] lib/i915/dp: Add helper to get maximum supported rate
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (39 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 40/46] lib/i915/dp: Rename functions to avoid confusion Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 42/46] lib/igt_dp: Create generic helpers for DP information Louis Chauvet
                   ` (10 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Some GPU can't reach all the DP rates. To avoid false positive during
testing with unigraf, add an helper to filter tests based on the maximum
supported rate of the current GPU.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/i915/i915_dp.c | 35 +++++++++++++++++++++++++++++++++++
 lib/i915/i915_dp.h |  1 +
 2 files changed, 36 insertions(+)

diff --git a/lib/i915/i915_dp.c b/lib/i915/i915_dp.c
index c5b9273ebafd..219f3d29e362 100644
--- a/lib/i915/i915_dp.c
+++ b/lib/i915/i915_dp.c
@@ -1,7 +1,9 @@
 // SPDX-License-Identifier: MIT
 
 #include <ctype.h>
+#include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "i915_dp.h"
@@ -317,3 +319,36 @@ void i915_dp_set_link_params(int drm_fd, igt_output_t *output,
 	temp = drmModeGetConnector(drm_fd, output->config.connector->connector_id);
 	drmModeFreeConnector(temp);
 }
+
+/**
+ * i915_dp_get_max_supported_rate:
+ * @drm_fd: A drm file descriptor
+ * @output: Target output
+ *
+ * Returns: Max supported link rate available for output, else -1
+ */
+int i915_dp_get_max_supported_rate(int drm_fd, const igt_output_t *output)
+{
+	char buf[512];
+	int res, max_rate = -1;
+	char *token;
+
+	res = igt_debugfs_read_connector_file(drm_fd, igt_output_name(output),
+					      "i915_dp_force_link_rate",
+					      buf, sizeof(buf));
+	igt_assert_f(res == 0, "Unable to read %s/i915_dp_force_link_rate\n",
+		     igt_output_name(output));
+
+	token = strtok(buf, " ");
+	while (token) {
+		int rate;
+
+		errno = 0;
+		rate = strtol(token, NULL, 0);
+		if (errno == 0 && rate > max_rate)
+			max_rate = rate;
+		token = strtok(NULL, " ");
+	}
+
+	return max_rate;
+}
diff --git a/lib/i915/i915_dp.h b/lib/i915/i915_dp.h
index 65057cff4ff4..709684f564f9 100644
--- a/lib/i915/i915_dp.h
+++ b/lib/i915/i915_dp.h
@@ -18,5 +18,6 @@ int i915_dp_get_pending_retrain(int drm_fd, igt_output_t *output);
 void i915_dp_reset_link_params(int drm_fd, igt_output_t *output);
 void i915_dp_set_link_params(int drm_fd, igt_output_t *output,
 			     char *link_rate, char *lane_count);
+int i915_dp_get_max_supported_rate(int drm_fd, const igt_output_t *output);
 
 #endif

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 42/46] lib/igt_dp: Create generic helpers for DP information
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (40 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 41/46] lib/i915/dp: Add helper to get maximum supported rate Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 43/46] lib/igt_kms: Add asserts to avoid null pointer dereference Louis Chauvet
                   ` (9 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

With the introduction of unigraf tests, there is no reason to limit the
implementation to intel. Create easly extendable generic functions to
help supporting multiple GPU.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_dp.c    | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_dp.h    |  89 +++++++++++++++++++++++++++++++++++++++++++++++++
 lib/meson.build |   1 +
 3 files changed, 191 insertions(+)

diff --git a/lib/igt_dp.c b/lib/igt_dp.c
new file mode 100644
index 000000000000..ca344e4440cf
--- /dev/null
+++ b/lib/igt_dp.c
@@ -0,0 +1,101 @@
+// SPDX-License-Identifier: MIT
+//
+#include "drmtest.h"
+#include "i915/i915_dp.h"
+#include "igt_amd.h"
+#include "igt_core.h"
+#include "igt_kms.h"
+#include <stdint.h>
+#include "igt_dp.h"
+
+int igt_dp_get_current_link_rate(int drm_fd, igt_output_t *output)
+{
+	if (is_intel_device(drm_fd))
+		// i915_dp_get_current_link_rate returns the value in tens of kb/s because
+		// that what the kernel uses. Convert it to kb/s to be sane...
+		return i915_dp_get_current_link_rate(drm_fd, output) * 10;
+
+	igt_assert_f(false, "Current drm device is not able to report used link rate\n");
+	return -EINVAL;
+}
+
+int igt_dp_get_current_lane_count(int drm_fd, igt_output_t *output)
+{
+	if (is_intel_device(drm_fd))
+		return i915_dp_get_current_lane_count(drm_fd, output);
+
+	igt_assert_f(false, "Current drm device is not able to report used lane count\n");
+	return -EINVAL;
+}
+
+int igt_dp_get_max_link_rate(int drm_fd, igt_output_t *output)
+{
+	if (is_intel_device(drm_fd))
+		// i915_dp_get_current_link_rate returns the value in tens of kb/s because
+		// that what the kernel uses. Convert it to kb/s to be sane...
+		return i915_dp_get_max_link_rate(drm_fd, output) * 10;
+
+	igt_assert_f(false, "Current drm device is not able to report max link rate\n");
+	return -EINVAL;
+}
+
+int igt_dp_get_max_supported_rate(int drm_fd, igt_output_t *output)
+{
+	if (is_intel_device(drm_fd))
+		// i915_dp_get_current_link_rate returns the value in tens of kb/s because
+		// that what the kernel uses. Convert it to kb/s to be sane...
+		return i915_dp_get_max_supported_rate(drm_fd, output) * 10;
+
+	igt_assert_f(false, "Current drm device is not able to report max link rate\n");
+	return -EINVAL;
+}
+
+int igt_dp_get_max_lane_count(int drm_fd, igt_output_t *output)
+{
+	if (is_intel_device(drm_fd))
+		return i915_dp_get_max_lane_count(drm_fd, output);
+
+	igt_assert_f(false, "Current drm device is not able to report max lane count\n");
+	return -EINVAL;
+}
+
+void igt_dp_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count)
+{
+	if (is_intel_device(drm_fd)) {
+		i915_dp_force_link_retrain(drm_fd, output, retrain_count);
+		return;
+	}
+
+	igt_assert_f(false, "Current drm device does not support link retraining\n");
+}
+
+int igt_dp_get_pending_retrain(int drm_fd, igt_output_t *output)
+{
+	if (is_intel_device(drm_fd))
+		return i915_dp_get_pending_retrain(drm_fd, output);
+
+	igt_assert_f(false, "Current drm device does not support pending retrain count checking\n");
+	return -EINVAL;
+}
+
+void igt_dp_wait_pending_retrain(int drm_fd, igt_output_t *output)
+{
+	double timeout = igt_default_display_detect_timeout();
+	struct timespec start, now;
+	double elapsed;
+
+	clock_gettime(CLOCK_MONOTONIC, &start);
+
+	while (1) {
+		if (igt_dp_get_pending_retrain(drm_fd, output) == 0)
+			return;
+
+		clock_gettime(CLOCK_MONOTONIC, &now);
+		elapsed = (now.tv_sec - start.tv_sec) +
+					(now.tv_nsec - start.tv_nsec) / 1e9;
+
+		if (elapsed >= timeout)
+			break;
+	}
+	igt_assert_f(false, "Timeout waiting for pending retrain to complete\n");
+}
diff --git a/lib/igt_dp.h b/lib/igt_dp.h
new file mode 100644
index 000000000000..dacd0e598412
--- /dev/null
+++ b/lib/igt_dp.h
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef _IGT_DP_H_
+#define _IGT_DP_H_
+
+#include "igt_kms.h"
+
+/**
+ * igt_dp_get_current_link_rate: Get current link rate on a display port
+ * @drm_fd: DRM file descriptor
+ * @output: igt_output_t object representing the display port
+ *
+ * Returns:
+ * The current link rate in kb/s, or a negative error code on failure.
+ */
+int igt_dp_get_current_link_rate(int drm_fd, igt_output_t *output);
+
+/**
+ * igt_dp_get_current_lane_count: Get current lane count on a display port
+ * @drm_fd: DRM file descriptor
+ * @output: igt_output_t object representing the display port
+ *
+ * Returns:
+ * The number of active lanes, or a negative error code on failure.
+ */
+int igt_dp_get_current_lane_count(int drm_fd, igt_output_t *output);
+
+/**
+ * igt_dp_get_max_link_rate: Get maximum link rate on a display port
+ * @drm_fd:		DRM file descriptor
+ * @output:		igt_output_t object representing the display port
+ *
+ * Returns:
+ * The maximum link rate in kb/s, or a negative error code on failure.
+ */
+int igt_dp_get_max_link_rate(int drm_fd, igt_output_t *output);
+
+int igt_dp_get_max_supported_rate(int drm_fd, igt_output_t *output);
+
+/**
+ * igt_dp_get_max_lane_count: Get maximum lane count on a display port
+ * @drm_fd: DRM file descriptor
+ * @output: igt_output_t object representing the display port
+ *
+ * Returns:
+ * The maximum number of lanes, or a negative error code on failure.
+ */
+int igt_dp_get_max_lane_count(int drm_fd, igt_output_t *output);
+
+/**
+ * igt_dp_force_link_retrain: Force link retraining on a display port
+ * @drm_fd:		DRM file descriptor
+ * @output:		igt_output_t object representing the display port
+ * @retrain_count:	Number of times to retrain the link
+ */
+void igt_dp_force_link_retrain(int drm_fd, igt_output_t *output, int retrain_count);
+
+/**
+ * igt_dp_get_link_retrain_disabled: Check if link retraining is disabled
+ * @drm_fd:		DRM file descriptor
+ * @output:		igt_output_t object representing the display port
+ *
+ * Returns:
+ * true if link retraining is disabled, false otherwise
+ */
+bool igt_dp_get_link_retrain_disabled(int drm_fd, igt_output_t *output);
+
+/**
+ * igt_dp_get_pending_retrain: Get pending link retrain count
+ * @drm_fd:		DRM file descriptor
+ * @output:		igt_output_t object representing the display port
+ *
+ * Returns:
+ * The number of pending retrain operations, or a negative error code on failure.
+ */
+int igt_dp_get_pending_retrain(int drm_fd, igt_output_t *output);
+
+/**
+ * igt_dp_wait_pending_retrain: Wait for pending link retrain operations to complete
+ * @drm_fd:		DRM file descriptor
+ * @output:		igt_output_t object representing the display port
+ *
+ * This function waits for any pending link retrain operations to complete on the
+ * specified display port. It polls the debugfs interface for the pending retrain
+ * count until it reaches zero, indicating all retrain operations have completed.
+ */
+void igt_dp_wait_pending_retrain(int drm_fd, igt_output_t *output);
+
+#endif
diff --git a/lib/meson.build b/lib/meson.build
index fa4663abc0ab..cd5face9e943 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -29,6 +29,7 @@ lib_sources = [
 	'igt_drm_fdinfo.c',
         'igt_fs.c',
 	'igt_aux.c',
+	'igt_dp.c',
 	'igt_gt.c',
 	'igt_halffloat.c',
 	'igt_hwmon.c',

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 43/46] lib/igt_kms: Add asserts to avoid null pointer dereference
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (41 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 42/46] lib/igt_dp: Create generic helpers for DP information Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 44/46] lib/igt_kms: Add helper to get a pipe from an output Louis Chauvet
                   ` (8 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

To help debugging and avoid null pointer dereference, add some asserts in
igt_output_from_connector.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 326dde1fba33..b3178ace4a8c 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -3184,6 +3184,8 @@ igt_output_t *igt_output_from_connector(igt_display_t *display,
 {
 	int i;
 	igt_output_t *found = NULL;
+	igt_assert(display);
+	igt_assert(connector);
 
 	for (i = 0; i < display->n_outputs; i++) {
 		igt_output_t *output = &display->outputs[i];

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 44/46] lib/igt_kms: Add helper to get a pipe from an output
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (42 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 43/46] lib/igt_kms: Add asserts to avoid null pointer dereference Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 45/46] lib/unigraf: Add helpers to get the current LT status Louis Chauvet
                   ` (7 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

Grabbing a valid pipe from a specific output is useful when testing
the output.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/igt_kms.c | 22 ++++++++++++++++++++++
 lib/igt_kms.h |  4 ++++
 2 files changed, 26 insertions(+)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index b3178ace4a8c..a80849d2bae7 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -7564,3 +7564,25 @@ enum pipe igt_get_pipe_from_connector(int drm_fd, int connector_id)
 	}
 	return PIPE_NONE;
 }
+
+/*
+ * igt_get_pipe_for_output:
+ * @display: display to fetch the pipes
+ * @output: output to use
+ *
+ * Get a valid pipe for a specific output. The return value is the pipe first valid pipe for a
+ * specific output.
+ */
+enum pipe igt_get_pipe_for_output(igt_display_t *display,
+				  igt_output_t *output)
+{
+	enum pipe pipe;
+
+	for_each_pipe(display, pipe) {
+		if (igt_output_is_connected(output) &&
+		    (output->config.valid_crtc_idx_mask & (1 << (pipe))))
+			return pipe;
+	}
+
+	return PIPE_NONE;
+}
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 86e5b3224df3..79dd467f0252 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -1318,4 +1318,8 @@ get_list_diff(const uint32_t *list_a, int list_a_len, const uint32_t *list_b, in
  * Returns PIPE_NONE if the connector is not connected to any pipe
  */
 enum pipe igt_get_pipe_from_connector(int drm_fd, int connector_id);
+
+enum pipe igt_get_pipe_for_output(igt_display_t *display,
+				  igt_output_t *output);
+
 #endif /* __IGT_KMS_H__ */

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 45/46] lib/unigraf: Add helpers to get the current LT status
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (43 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 44/46] lib/igt_kms: Add helper to get a pipe from an output Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 13:39 ` [PATCH i-g-t v4 46/46] tests/unigraf/unigraf_lt: Add test for link training Louis Chauvet
                   ` (6 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

To ensure that the link training was correct, grab actual link
training status from unigraf.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 lib/unigraf/unigraf.c | 10 ++++++++++
 lib/unigraf/unigraf.h |  3 +++
 2 files changed, 13 insertions(+)

diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
index f1d6d809e216..a8a42953bdf3 100644
--- a/lib/unigraf/unigraf.c
+++ b/lib/unigraf/unigraf.c
@@ -718,6 +718,16 @@ int unigraf_get_max_lane_count(void)
 	return max_lanes;
 }
 
+uint32_t unigraf_get_lt_rate(void)
+{
+	return unigraf_read_u32(TSI_DPRX_LT_RATE_R);
+}
+
+uint32_t unigraf_get_lt_lane_count(void)
+{
+	return unigraf_read_u32(TSI_DPRX_LT_LANE_COUNT_R);
+}
+
 void unigraf_set_max_link_rate(int bandwidth)
 {
 	unigraf_write_u32(TSI_DPRX_MAX_LINK_RATE, bandwidth);
diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
index 721fd025924e..3b94eb9aca29 100644
--- a/lib/unigraf/unigraf.h
+++ b/lib/unigraf/unigraf.h
@@ -251,4 +251,7 @@ int unigraf_get_max_link_rate(void);
  */
 int unigraf_rate_to_kbs(enum unigraf_rate rate);
 
+uint32_t unigraf_get_lt_rate(void);
+uint32_t unigraf_get_lt_lane_count(void);
+
 #endif // UNIGRAF_H

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [PATCH i-g-t v4 46/46] tests/unigraf/unigraf_lt: Add test for link training
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (44 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 45/46] lib/unigraf: Add helpers to get the current LT status Louis Chauvet
@ 2025-11-10 13:39 ` Louis Chauvet
  2025-11-10 22:34 ` ✓ Xe.CI.BAT: success for Unigraf integration (rev3) Patchwork
                   ` (5 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2025-11-10 13:39 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, Louis Chauvet

To test link trianing on various situation, add multiple link
training scenarios.

Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
---
 tests/unigraf/meson.build  |   1 +
 tests/unigraf/unigraf_lt.c | 178 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 179 insertions(+)

diff --git a/tests/unigraf/meson.build b/tests/unigraf/meson.build
index 4ef8c32151e4..22e64c0f389d 100644
--- a/tests/unigraf/meson.build
+++ b/tests/unigraf/meson.build
@@ -1,5 +1,6 @@
 unigraf_progs = [
 	'unigraf_connectivity',
+	'unigraf_lt',
 ]
 
 foreach prog : unigraf_progs
diff --git a/tests/unigraf/unigraf_lt.c b/tests/unigraf/unigraf_lt.c
new file mode 100644
index 000000000000..649d665e8efb
--- /dev/null
+++ b/tests/unigraf/unigraf_lt.c
@@ -0,0 +1,178 @@
+// SPDX-License-Identifier: MIT
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <xf86drm.h>
+#include <xf86drmMode.h>
+
+#include "drm_fourcc.h"
+#include "drmtest.h"
+#include "igt_aux.h"
+#include "igt_core.h"
+#include "igt_dp.h"
+#include "igt_edid.h"
+#include "igt_kms.h"
+#include "unigraf/unigraf.h"
+
+/**
+ * TEST: unigraf link training
+ * Category: Core
+ * Description: Testing DP link training with a unigraf device
+ *
+ * SUBTEST: unigraf-dp-lane-count
+ * Description: Make sure that the link training goes well for different lane count
+ *
+ * SUBTEST: unigraf-dp-link-rate
+ * Description: Make sure that the link training goes well for different link rates
+ */
+
+static void init_output_and_display_pattern(igt_display_t *display, igt_output_t *output)
+{
+	enum pipe pipe;
+	struct igt_fb fb;
+	igt_plane_t *primary;
+	drmModeModeInfo *mode;
+	int fb_id;
+
+	igt_modeset_disable_all_outputs(display);
+	igt_display_reset(display);
+
+	igt_output_set_pipe(output, PIPE_NONE);
+
+	pipe = igt_get_pipe_for_output(display, output);
+	igt_output_set_pipe(output, pipe);
+
+	/* Get the current mode */
+	mode = igt_output_get_mode(output);
+	igt_assert(mode);
+
+	/* Create a framebuffer with a solid color pattern */
+	fb_id = igt_create_color_pattern_fb(display->drm_fd, mode->hdisplay,
+					    mode->vdisplay, DRM_FORMAT_XRGB8888,
+					    DRM_FORMAT_MOD_LINEAR, 0, 0, 0, &fb);
+	igt_assert(fb_id > 0);
+
+	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+
+	igt_assert(primary);
+
+	igt_plane_set_size(primary, mode->hdisplay, mode->vdisplay);
+	igt_plane_set_fb(primary, &fb);
+	igt_output_override_mode(output, mode);
+
+	igt_display_commit2(display, COMMIT_ATOMIC);
+
+	/* Set the framebuffer to the plane */
+	igt_plane_set_fb(primary, &fb);
+
+	/* Set the plane properties atomically */
+	igt_plane_set_prop_value(primary, IGT_PLANE_FB_ID, fb.fb_id);
+	igt_plane_set_prop_value(primary, IGT_PLANE_CRTC_X, 0);
+	igt_plane_set_prop_value(primary, IGT_PLANE_CRTC_Y, 0);
+	igt_plane_set_prop_value(primary, IGT_PLANE_CRTC_W, mode->hdisplay);
+	igt_plane_set_prop_value(primary, IGT_PLANE_CRTC_H, mode->vdisplay);
+
+	/* Commit the changes atomically */
+	igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+}
+
+IGT_TEST_DESCRIPTION("Test unigraf device functionality");
+igt_main
+{
+	int drm_fd = -1;
+	igt_display_t display;
+	igt_output_t *output;
+	drmModeConnectorPtr connector;
+	int i;
+
+	igt_fixture {
+		drm_fd = drm_open_driver(DRIVER_ANY);
+		igt_assert(drm_fd >= 0);
+
+		igt_display_require(&display, drm_fd);
+		unigraf_require_device(drm_fd);
+
+		connector = unigraf_get_connector(drm_fd);
+	}
+
+	igt_subtest_with_dynamic("unigraf-dp-lane-count") {
+		int lane_counts[3] = {1, 2, 4};
+		int current_lanes;
+
+		for (i = 0; i < ARRAY_SIZE(lane_counts); i++) {
+			igt_dynamic_f("unigraf-dp-lane-count-%d", lane_counts[i]) {
+				unigraf_reset();
+				unigraf_set_max_lane_count(lane_counts[i]);
+				unigraf_hpd_pulse(500000);
+
+				igt_display_require_output(&display);
+				output = igt_output_from_connector(&display, connector);
+				igt_assert(output);
+				igt_dp_force_link_retrain(drm_fd, output, 2);
+				init_output_and_display_pattern(&display, output);
+
+				current_lanes = igt_dp_get_current_lane_count(drm_fd, output);
+				igt_assert_eq(current_lanes, lane_counts[i]);
+			}
+		}
+	}
+
+	igt_subtest_with_dynamic("unigraf-dp-link-rate") {
+		int rates[] = {UNIGRAF_RATE_1_62_GHZ,
+			       UNIGRAF_RATE_2_7_GHZ,
+			       UNIGRAF_RATE_5_4_GHZ,
+			       UNIGRAF_RATE_6_75_GHZ,
+			       UNIGRAF_RATE_8_10_GHZ};
+		int current_rate;
+		int max_supported_rate;
+
+		for (i = 0; i < ARRAY_SIZE(rates); i++) {
+			igt_dynamic_f("unigraf-dp-link-rate-%d", rates[i]) {
+				unigraf_reset();
+				unigraf_set_max_link_rate(rates[i]);
+				unigraf_hpd_pulse(1000000);
+				igt_display_require_output(&display);
+				igt_display_reset(&display);
+				igt_display_require_output(&display);
+				output = igt_output_from_connector(&display, connector);
+				igt_assert(output);
+				igt_dp_force_link_retrain(drm_fd, output, 2);
+
+				init_output_and_display_pattern(&display, output);
+
+				current_rate = igt_dp_get_max_link_rate(drm_fd, output);
+				max_supported_rate = igt_dp_get_max_supported_rate(drm_fd, output);
+				igt_require(max_supported_rate >= unigraf_rate_to_kbs(rates[i]));
+				igt_assert_eq(current_rate, unigraf_rate_to_kbs(rates[i]));
+			}
+		}
+	}
+
+	igt_subtest("unigraf-dp-link-suspend-resume") {
+		int current_rate, current_lanes;
+
+		unigraf_reset();
+		igt_display_require_output(&display);
+		igt_display_reset(&display);
+		igt_display_require_output(&display);
+		output = igt_output_from_connector(&display, connector);
+		igt_assert(output);
+
+		/* Get initial link parameters */
+		current_rate = igt_dp_get_current_link_rate(drm_fd, output);
+		current_lanes = igt_dp_get_current_lane_count(drm_fd, output);
+
+		/* Suspend the system */
+		igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
+
+		/* Verify link parameters are maintained */
+		igt_assert_eq(igt_dp_get_current_link_rate(drm_fd, output), current_rate);
+		igt_assert_eq(igt_dp_get_current_lane_count(drm_fd, output), current_lanes);
+	}
+
+	igt_fixture {
+		igt_display_fini(&display);
+		close(drm_fd);
+	}
+}

-- 
2.51.0


^ permalink raw reply related	[flat|nested] 90+ messages in thread

* ✓ Xe.CI.BAT: success for Unigraf integration (rev3)
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (45 preceding siblings ...)
  2025-11-10 13:39 ` [PATCH i-g-t v4 46/46] tests/unigraf/unigraf_lt: Add test for link training Louis Chauvet
@ 2025-11-10 22:34 ` Patchwork
  2025-11-10 22:44 ` ✓ i915.CI.BAT: " Patchwork
                   ` (4 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Patchwork @ 2025-11-10 22:34 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 9228 bytes --]

== Series Details ==

Series: Unigraf integration (rev3)
URL   : https://patchwork.freedesktop.org/series/151772/
State : success

== Summary ==

CI Bug Log - changes from XEIGT_8618_BAT -> XEIGTPW_14032_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in XEIGTPW_14032_BAT that come from known issues:

### IGT changes ###

#### Possible fixes ####

  * igt@fbdev@nullptr:
    - bat-dg2-oem2:       [SKIP][1] ([Intel XE#2134]) -> [PASS][2] +4 other tests pass
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@fbdev@nullptr.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@fbdev@nullptr.html

  * igt@kms_frontbuffer_tracking@basic:
    - bat-dg2-oem2:       [SKIP][3] ([Intel XE#2351] / [Intel XE#6456]) -> [PASS][4]
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@kms_frontbuffer_tracking@basic.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@kms_frontbuffer_tracking@basic.html

  * igt@xe_dma_buf_sync@export-dma-buf-once-read-write-sync:
    - bat-dg2-oem2:       [SKIP][5] ([Intel XE#6456] / [Intel XE#6557]) -> [PASS][6] +7 other tests pass
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_dma_buf_sync@export-dma-buf-once-read-write-sync.html
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_dma_buf_sync@export-dma-buf-once-read-write-sync.html

  * igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit:
    - bat-dg2-oem2:       [SKIP][7] ([Intel XE#2229] / [Intel XE#455]) -> [PASS][8] +2 other tests pass
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html

  * igt@xe_module_load@load:
    - bat-dg2-oem2:       [FAIL][9] ([Intel XE#6456]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_module_load@load.html
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_module_load@load.html

  * igt@xe_prime_self_import@basic-with_fd_dup:
    - bat-dg2-oem2:       [SKIP][11] ([Intel XE#6456]) -> [PASS][12] +196 other tests pass
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_prime_self_import@basic-with_fd_dup.html
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_prime_self_import@basic-with_fd_dup.html

  
#### Warnings ####

  * igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
    - bat-dg2-oem2:       [SKIP][13] ([Intel XE#6456]) -> [SKIP][14] ([Intel XE#623])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html

  * igt@kms_dsc@dsc-basic:
    - bat-dg2-oem2:       [SKIP][15] ([Intel XE#2351] / [Intel XE#6456]) -> [SKIP][16] ([Intel XE#455])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@kms_dsc@dsc-basic.html
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@kms_dsc@dsc-basic.html

  * igt@kms_psr@psr-cursor-plane-move:
    - bat-dg2-oem2:       [SKIP][17] ([Intel XE#1406] / [Intel XE#2351] / [Intel XE#6456]) -> [SKIP][18] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +2 other tests skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@kms_psr@psr-cursor-plane-move.html
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@kms_psr@psr-cursor-plane-move.html

  * igt@sriov_basic@enable-vfs-autoprobe-off:
    - bat-dg2-oem2:       [SKIP][19] ([Intel XE#6456]) -> [SKIP][20] ([Intel XE#1091] / [Intel XE#2849]) +1 other test skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@sriov_basic@enable-vfs-autoprobe-off.html
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@sriov_basic@enable-vfs-autoprobe-off.html

  * igt@xe_exec_fault_mode@twice-bindexecqueue-userptr:
    - bat-dg2-oem2:       [SKIP][21] ([Intel XE#6456]) -> [SKIP][22] ([Intel XE#288]) +30 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_exec_fault_mode@twice-bindexecqueue-userptr.html
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_exec_fault_mode@twice-bindexecqueue-userptr.html

  * igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate:
    - bat-dg2-oem2:       [SKIP][23] ([Intel XE#6456] / [Intel XE#6557]) -> [SKIP][24] ([Intel XE#288]) +1 other test skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate.html
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_exec_fault_mode@twice-bindexecqueue-userptr-invalidate.html

  * igt@xe_huc_copy@huc_copy:
    - bat-dg2-oem2:       [SKIP][25] ([Intel XE#6456]) -> [SKIP][26] ([Intel XE#255])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_huc_copy@huc_copy.html
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_huc_copy@huc_copy.html

  * igt@xe_pat@pat-index-xe2:
    - bat-dg2-oem2:       [SKIP][27] ([Intel XE#6456]) -> [SKIP][28] ([Intel XE#977])
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_pat@pat-index-xe2.html
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_pat@pat-index-xe2.html

  * igt@xe_pat@pat-index-xehpc:
    - bat-dg2-oem2:       [SKIP][29] ([Intel XE#6456] / [Intel XE#6557]) -> [SKIP][30] ([Intel XE#2838] / [Intel XE#979])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_pat@pat-index-xehpc.html
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_pat@pat-index-xehpc.html

  * igt@xe_pat@pat-index-xelpg:
    - bat-dg2-oem2:       [SKIP][31] ([Intel XE#6456]) -> [SKIP][32] ([Intel XE#979])
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_pat@pat-index-xelpg.html
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_pat@pat-index-xelpg.html

  * igt@xe_sriov_flr@flr-vf1-clear:
    - bat-dg2-oem2:       [SKIP][33] ([Intel XE#6456]) -> [SKIP][34] ([Intel XE#3342])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_sriov_flr@flr-vf1-clear.html
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_sriov_flr@flr-vf1-clear.html

  * igt@xe_waitfence@engine:
    - bat-dg2-oem2:       [SKIP][35] ([Intel XE#6456]) -> [FAIL][36] ([Intel XE#6519])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/bat-dg2-oem2/igt@xe_waitfence@engine.html
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/bat-dg2-oem2/igt@xe_waitfence@engine.html

  
  [Intel XE#1091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1091
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#2134]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2134
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2351
  [Intel XE#255]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/255
  [Intel XE#2838]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2838
  [Intel XE#2849]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2849
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#623]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/623
  [Intel XE#6456]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6456
  [Intel XE#6519]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6519
  [Intel XE#6557]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6557
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#977]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/977
  [Intel XE#979]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/979


Build changes
-------------

  * IGT: IGT_8618 -> IGTPW_14032
  * Linux: xe-4083-f2aadc35c771894c27f9b742d2593a2e00bb6ebd -> xe-4084-a9792b1ab75123e4aceaba953a89809e745919c6

  IGTPW_14032: 14032
  IGT_8618: 8618
  xe-4083-f2aadc35c771894c27f9b742d2593a2e00bb6ebd: f2aadc35c771894c27f9b742d2593a2e00bb6ebd
  xe-4084-a9792b1ab75123e4aceaba953a89809e745919c6: a9792b1ab75123e4aceaba953a89809e745919c6

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/index.html

[-- Attachment #2: Type: text/html, Size: 11774 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* ✓ i915.CI.BAT: success for Unigraf integration (rev3)
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (46 preceding siblings ...)
  2025-11-10 22:34 ` ✓ Xe.CI.BAT: success for Unigraf integration (rev3) Patchwork
@ 2025-11-10 22:44 ` Patchwork
  2025-11-11  5:34 ` ✓ i915.CI.Full: " Patchwork
                   ` (3 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Patchwork @ 2025-11-10 22:44 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 3583 bytes --]

== Series Details ==

Series: Unigraf integration (rev3)
URL   : https://patchwork.freedesktop.org/series/151772/
State : success

== Summary ==

CI Bug Log - changes from IGT_8618 -> IGTPW_14032
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/index.html

Participating hosts (45 -> 44)
------------------------------

  Missing    (1): fi-snb-2520m 

Known issues
------------

  Here are the changes found in IGTPW_14032 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@dmabuf@all-tests@dma_fence_chain:
    - fi-bsw-n3050:       [PASS][1] -> [ABORT][2] ([i915#12904]) +1 other test abort
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/fi-bsw-n3050/igt@dmabuf@all-tests@dma_fence_chain.html

  * igt@i915_selftest@live:
    - bat-adlp-9:         [PASS][3] -> [ABORT][4] ([i915#14365]) +1 other test abort
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/bat-adlp-9/igt@i915_selftest@live.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/bat-adlp-9/igt@i915_selftest@live.html

  * igt@i915_selftest@live@workarounds:
    - bat-arlh-3:         [PASS][5] -> [DMESG-FAIL][6] ([i915#12061]) +1 other test dmesg-fail
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/bat-arlh-3/igt@i915_selftest@live@workarounds.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/bat-arlh-3/igt@i915_selftest@live@workarounds.html
    - bat-dg2-11:         [PASS][7] -> [DMESG-FAIL][8] ([i915#12061]) +1 other test dmesg-fail
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/bat-dg2-11/igt@i915_selftest@live@workarounds.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/bat-dg2-11/igt@i915_selftest@live@workarounds.html
    - bat-mtlp-9:         [PASS][9] -> [DMESG-FAIL][10] ([i915#12061]) +1 other test dmesg-fail
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/bat-mtlp-9/igt@i915_selftest@live@workarounds.html

  
#### Possible fixes ####

  * igt@i915_selftest@live:
    - bat-mtlp-8:         [DMESG-FAIL][11] ([i915#12061]) -> [PASS][12] +1 other test pass
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/bat-mtlp-8/igt@i915_selftest@live.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/bat-mtlp-8/igt@i915_selftest@live.html

  * igt@i915_selftest@live@workarounds:
    - bat-arls-5:         [DMESG-FAIL][13] ([i915#12061]) -> [PASS][14] +1 other test pass
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/bat-arls-5/igt@i915_selftest@live@workarounds.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/bat-arls-5/igt@i915_selftest@live@workarounds.html

  
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#12904]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12904
  [i915#14365]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14365


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_8618 -> IGTPW_14032

  CI-20190529: 20190529
  CI_DRM_17525: a9792b1ab75123e4aceaba953a89809e745919c6 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_14032: 14032
  IGT_8618: 8618

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/index.html

[-- Attachment #2: Type: text/html, Size: 4606 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* ✓ i915.CI.Full: success for Unigraf integration (rev3)
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (47 preceding siblings ...)
  2025-11-10 22:44 ` ✓ i915.CI.BAT: " Patchwork
@ 2025-11-11  5:34 ` Patchwork
  2025-11-11  5:49 ` ✗ Xe.CI.Full: failure " Patchwork
                   ` (2 subsequent siblings)
  51 siblings, 0 replies; 90+ messages in thread
From: Patchwork @ 2025-11-11  5:34 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 156072 bytes --]

== Series Details ==

Series: Unigraf integration (rev3)
URL   : https://patchwork.freedesktop.org/series/151772/
State : success

== Summary ==

CI Bug Log - changes from IGT_8618_full -> IGTPW_14032_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/index.html

Participating hosts (11 -> 11)
------------------------------

  No changes in participating hosts

Known issues
------------

  Here are the changes found in IGTPW_14032_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@device_reset@cold-reset-bound:
    - shard-rkl:          NOTRUN -> [SKIP][1] ([i915#11078])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@device_reset@cold-reset-bound.html

  * igt@drm_buddy@drm_buddy@drm_test_buddy_fragmentation_performance:
    - shard-glk10:        NOTRUN -> [DMESG-WARN][2] ([i915#15095]) +1 other test dmesg-warn
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk10/igt@drm_buddy@drm_buddy@drm_test_buddy_fragmentation_performance.html

  * igt@gem_ccs@block-multicopy-inplace:
    - shard-tglu-1:       NOTRUN -> [SKIP][3] ([i915#3555] / [i915#9323])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@gem_ccs@block-multicopy-inplace.html

  * igt@gem_ccs@suspend-resume:
    - shard-rkl:          NOTRUN -> [SKIP][4] ([i915#9323])
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gem_ccs@suspend-resume.html

  * igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-lmem0-lmem0:
    - shard-dg2:          [PASS][5] -> [INCOMPLETE][6] ([i915#12392] / [i915#13356])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-1/igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-lmem0-lmem0.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@gem_ccs@suspend-resume@linear-compressed-compfmt0-lmem0-lmem0.html

  * igt@gem_create@create-ext-cpu-access-big:
    - shard-dg2:          NOTRUN -> [ABORT][7] ([i915#13427])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-7/igt@gem_create@create-ext-cpu-access-big.html

  * igt@gem_create@create-ext-cpu-access-sanity-check:
    - shard-tglu:         NOTRUN -> [SKIP][8] ([i915#6335])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-5/igt@gem_create@create-ext-cpu-access-sanity-check.html

  * igt@gem_create@create-ext-set-pat:
    - shard-tglu:         NOTRUN -> [SKIP][9] ([i915#8562])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-2/igt@gem_create@create-ext-set-pat.html

  * igt@gem_ctx_persistence@heartbeat-hostile:
    - shard-dg2:          NOTRUN -> [SKIP][10] ([i915#8555])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@gem_ctx_persistence@heartbeat-hostile.html

  * igt@gem_ctx_persistence@legacy-engines-queued:
    - shard-snb:          NOTRUN -> [SKIP][11] ([i915#1099])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb5/igt@gem_ctx_persistence@legacy-engines-queued.html

  * igt@gem_ctx_sseu@mmap-args:
    - shard-rkl:          NOTRUN -> [SKIP][12] ([i915#280]) +1 other test skip
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@gem_ctx_sseu@mmap-args.html
    - shard-tglu:         NOTRUN -> [SKIP][13] ([i915#280])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-8/igt@gem_ctx_sseu@mmap-args.html

  * igt@gem_eio@in-flight-suspend:
    - shard-dg1:          [PASS][14] -> [DMESG-WARN][15] ([i915#4391] / [i915#4423])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-17/igt@gem_eio@in-flight-suspend.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-12/igt@gem_eio@in-flight-suspend.html

  * igt@gem_exec_balancer@bonded-true-hang:
    - shard-dg2:          NOTRUN -> [SKIP][16] ([i915#4812]) +1 other test skip
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@gem_exec_balancer@bonded-true-hang.html

  * igt@gem_exec_balancer@parallel-balancer:
    - shard-rkl:          NOTRUN -> [SKIP][17] ([i915#4525]) +2 other tests skip
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gem_exec_balancer@parallel-balancer.html

  * igt@gem_exec_balancer@parallel-contexts:
    - shard-tglu:         NOTRUN -> [SKIP][18] ([i915#4525])
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-2/igt@gem_exec_balancer@parallel-contexts.html

  * igt@gem_exec_big@single:
    - shard-tglu-1:       NOTRUN -> [ABORT][19] ([i915#11713])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@gem_exec_big@single.html

  * igt@gem_exec_flush@basic-uc-pro-default:
    - shard-dg2:          NOTRUN -> [SKIP][20] ([i915#3539] / [i915#4852]) +2 other tests skip
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-7/igt@gem_exec_flush@basic-uc-pro-default.html

  * igt@gem_exec_params@secure-non-master:
    - shard-dg2:          NOTRUN -> [SKIP][21] +7 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@gem_exec_params@secure-non-master.html
    - shard-mtlp:         NOTRUN -> [SKIP][22] +3 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-3/igt@gem_exec_params@secure-non-master.html

  * igt@gem_exec_reloc@basic-gtt-cpu-active:
    - shard-dg2:          NOTRUN -> [SKIP][23] ([i915#3281]) +5 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@gem_exec_reloc@basic-gtt-cpu-active.html
    - shard-rkl:          NOTRUN -> [SKIP][24] ([i915#3281]) +5 other tests skip
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@gem_exec_reloc@basic-gtt-cpu-active.html

  * igt@gem_exec_reloc@basic-wc-read-active:
    - shard-rkl:          NOTRUN -> [SKIP][25] ([i915#14544] / [i915#3281])
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_exec_reloc@basic-wc-read-active.html

  * igt@gem_exec_schedule@preempt-queue-chain:
    - shard-mtlp:         NOTRUN -> [SKIP][26] ([i915#4537] / [i915#4812])
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-6/igt@gem_exec_schedule@preempt-queue-chain.html
    - shard-dg2:          NOTRUN -> [SKIP][27] ([i915#4537] / [i915#4812])
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@gem_exec_schedule@preempt-queue-chain.html

  * igt@gem_exec_suspend@basic-s0:
    - shard-dg2:          NOTRUN -> [INCOMPLETE][28] ([i915#13356]) +1 other test incomplete
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@gem_exec_suspend@basic-s0.html
    - shard-rkl:          [PASS][29] -> [INCOMPLETE][30] ([i915#13356]) +1 other test incomplete
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@gem_exec_suspend@basic-s0.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gem_exec_suspend@basic-s0.html

  * igt@gem_fence_thrash@bo-write-verify-threaded-none:
    - shard-dg2:          NOTRUN -> [SKIP][31] ([i915#4860])
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@gem_fence_thrash@bo-write-verify-threaded-none.html

  * igt@gem_lmem_swapping@heavy-random:
    - shard-tglu-1:       NOTRUN -> [SKIP][32] ([i915#4613])
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@gem_lmem_swapping@heavy-random.html

  * igt@gem_lmem_swapping@parallel-random-verify-ccs:
    - shard-rkl:          NOTRUN -> [SKIP][33] ([i915#4613]) +2 other tests skip
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@gem_lmem_swapping@parallel-random-verify-ccs.html

  * igt@gem_lmem_swapping@random:
    - shard-glk:          NOTRUN -> [SKIP][34] ([i915#4613]) +3 other tests skip
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk9/igt@gem_lmem_swapping@random.html

  * igt@gem_lmem_swapping@smem-oom:
    - shard-tglu:         NOTRUN -> [SKIP][35] ([i915#4613]) +4 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-7/igt@gem_lmem_swapping@smem-oom.html

  * igt@gem_madvise@dontneed-before-pwrite:
    - shard-dg2:          NOTRUN -> [SKIP][36] ([i915#3282]) +1 other test skip
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@gem_madvise@dontneed-before-pwrite.html

  * igt@gem_mmap_gtt@fault-concurrent:
    - shard-rkl:          [PASS][37] -> [DMESG-WARN][38] ([i915#12964]) +25 other tests dmesg-warn
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_mmap_gtt@fault-concurrent.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@gem_mmap_gtt@fault-concurrent.html

  * igt@gem_mmap_offset@clear-via-pagefault:
    - shard-mtlp:         [PASS][39] -> [ABORT][40] ([i915#14809]) +1 other test abort
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-4/igt@gem_mmap_offset@clear-via-pagefault.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-6/igt@gem_mmap_offset@clear-via-pagefault.html

  * igt@gem_mmap_wc@close:
    - shard-dg2:          NOTRUN -> [SKIP][41] ([i915#4083]) +3 other tests skip
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@gem_mmap_wc@close.html

  * igt@gem_pwrite@basic-random:
    - shard-dg1:          NOTRUN -> [SKIP][42] ([i915#3282])
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-15/igt@gem_pwrite@basic-random.html

  * igt@gem_pxp@create-protected-buffer:
    - shard-dg2:          NOTRUN -> [SKIP][43] ([i915#4270])
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@gem_pxp@create-protected-buffer.html

  * igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted:
    - shard-rkl:          [PASS][44] -> [TIMEOUT][45] ([i915#12964]) +1 other test timeout
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_pxp@dmabuf-shared-protected-dst-is-context-refcounted.html

  * igt@gem_pxp@hw-rejects-pxp-buffer:
    - shard-tglu:         NOTRUN -> [SKIP][46] ([i915#13398])
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@gem_pxp@hw-rejects-pxp-buffer.html

  * igt@gem_pxp@protected-raw-src-copy-not-readible:
    - shard-rkl:          [PASS][47] -> [TIMEOUT][48] ([i915#12917] / [i915#12964])
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@gem_pxp@protected-raw-src-copy-not-readible.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@gem_pxp@protected-raw-src-copy-not-readible.html

  * igt@gem_pxp@verify-pxp-key-change-after-suspend-resume:
    - shard-rkl:          NOTRUN -> [SKIP][49] ([i915#4270])
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@gem_pxp@verify-pxp-key-change-after-suspend-resume.html

  * igt@gem_readwrite@beyond-eob:
    - shard-rkl:          NOTRUN -> [SKIP][50] ([i915#3282]) +1 other test skip
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@gem_readwrite@beyond-eob.html

  * igt@gem_render_copy@mixed-tiled-to-yf-tiled-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][51] ([i915#5190] / [i915#8428]) +3 other tests skip
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@gem_render_copy@mixed-tiled-to-yf-tiled-ccs.html

  * igt@gem_softpin@evict-snoop:
    - shard-dg2:          NOTRUN -> [SKIP][52] ([i915#4885])
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@gem_softpin@evict-snoop.html

  * igt@gem_softpin@evict-snoop-interruptible:
    - shard-rkl:          NOTRUN -> [SKIP][53] +8 other tests skip
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gem_softpin@evict-snoop-interruptible.html

  * igt@gem_userptr_blits@access-control:
    - shard-mtlp:         NOTRUN -> [SKIP][54] ([i915#3297]) +1 other test skip
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-6/igt@gem_userptr_blits@access-control.html

  * igt@gem_userptr_blits@coherency-sync:
    - shard-dg1:          NOTRUN -> [SKIP][55] ([i915#3297]) +2 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-17/igt@gem_userptr_blits@coherency-sync.html

  * igt@gem_userptr_blits@create-destroy-unsync:
    - shard-dg2:          NOTRUN -> [SKIP][56] ([i915#3297]) +4 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@gem_userptr_blits@create-destroy-unsync.html

  * igt@gem_userptr_blits@map-fixed-invalidate-overlap:
    - shard-dg2:          NOTRUN -> [SKIP][57] ([i915#3297] / [i915#4880])
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@gem_userptr_blits@map-fixed-invalidate-overlap.html

  * igt@gem_userptr_blits@unsync-overlap:
    - shard-rkl:          NOTRUN -> [SKIP][58] ([i915#3297]) +2 other tests skip
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@gem_userptr_blits@unsync-overlap.html

  * igt@gem_userptr_blits@unsync-unmap:
    - shard-tglu:         NOTRUN -> [SKIP][59] ([i915#3297]) +2 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-8/igt@gem_userptr_blits@unsync-unmap.html

  * igt@gen9_exec_parse@allowed-all:
    - shard-dg2:          NOTRUN -> [SKIP][60] ([i915#2856]) +3 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@gen9_exec_parse@allowed-all.html

  * igt@gen9_exec_parse@basic-rejected-ctx-param:
    - shard-snb:          NOTRUN -> [SKIP][61] +88 other tests skip
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb5/igt@gen9_exec_parse@basic-rejected-ctx-param.html

  * igt@gen9_exec_parse@bb-secure:
    - shard-rkl:          NOTRUN -> [SKIP][62] ([i915#2527]) +4 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gen9_exec_parse@bb-secure.html

  * igt@gen9_exec_parse@bb-start-cmd:
    - shard-tglu-1:       NOTRUN -> [SKIP][63] ([i915#2527] / [i915#2856]) +1 other test skip
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@gen9_exec_parse@bb-start-cmd.html

  * igt@gen9_exec_parse@unaligned-jump:
    - shard-tglu:         NOTRUN -> [SKIP][64] ([i915#2527] / [i915#2856]) +3 other tests skip
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-9/igt@gen9_exec_parse@unaligned-jump.html
    - shard-mtlp:         NOTRUN -> [SKIP][65] ([i915#2856]) +2 other tests skip
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-8/igt@gen9_exec_parse@unaligned-jump.html
    - shard-dg1:          NOTRUN -> [SKIP][66] ([i915#2527]) +1 other test skip
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-14/igt@gen9_exec_parse@unaligned-jump.html

  * igt@gen9_exec_parse@valid-registers:
    - shard-rkl:          NOTRUN -> [SKIP][67] ([i915#14544] / [i915#2527]) +1 other test skip
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gen9_exec_parse@valid-registers.html

  * igt@i915_drm_fdinfo@isolation@rcs0:
    - shard-dg2:          NOTRUN -> [SKIP][68] ([i915#14073]) +7 other tests skip
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@i915_drm_fdinfo@isolation@rcs0.html

  * igt@i915_drm_fdinfo@virtual-busy:
    - shard-dg2:          NOTRUN -> [SKIP][69] ([i915#14118])
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@i915_drm_fdinfo@virtual-busy.html

  * igt@i915_module_load@reload-no-display:
    - shard-dg2:          NOTRUN -> [DMESG-WARN][70] ([i915#13029] / [i915#14545])
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@i915_module_load@reload-no-display.html

  * igt@i915_module_load@resize-bar:
    - shard-rkl:          NOTRUN -> [SKIP][71] ([i915#6412])
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@i915_module_load@resize-bar.html

  * igt@i915_pm_freq_api@freq-reset:
    - shard-rkl:          NOTRUN -> [SKIP][72] ([i915#8399])
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@i915_pm_freq_api@freq-reset.html

  * igt@i915_pm_freq_api@freq-suspend:
    - shard-tglu:         NOTRUN -> [SKIP][73] ([i915#8399]) +2 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-3/igt@i915_pm_freq_api@freq-suspend.html

  * igt@i915_pm_rc6_residency@rc6-accuracy:
    - shard-dg2:          [PASS][74] -> [FAIL][75] ([i915#12964]) +1 other test fail
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-4/igt@i915_pm_rc6_residency@rc6-accuracy.html
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-7/igt@i915_pm_rc6_residency@rc6-accuracy.html

  * igt@i915_pm_rc6_residency@rc6-fence:
    - shard-tglu:         NOTRUN -> [WARN][76] ([i915#13790] / [i915#2681]) +1 other test warn
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-9/igt@i915_pm_rc6_residency@rc6-fence.html

  * igt@i915_pm_rpm@system-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][77] ([i915#13356])
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk6/igt@i915_pm_rpm@system-suspend.html

  * igt@i915_pm_rpm@system-suspend-execbuf:
    - shard-rkl:          [PASS][78] -> [ABORT][79] ([i915#15060])
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@i915_pm_rpm@system-suspend-execbuf.html
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@i915_pm_rpm@system-suspend-execbuf.html

  * igt@i915_query@test-query-geometry-subslices:
    - shard-tglu:         NOTRUN -> [SKIP][80] ([i915#5723])
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-8/igt@i915_query@test-query-geometry-subslices.html

  * igt@i915_selftest@live@workarounds:
    - shard-dg2:          [PASS][81] -> [DMESG-FAIL][82] ([i915#12061]) +1 other test dmesg-fail
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-7/igt@i915_selftest@live@workarounds.html
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@i915_selftest@live@workarounds.html

  * igt@i915_suspend@debugfs-reader:
    - shard-rkl:          [PASS][83] -> [INCOMPLETE][84] ([i915#4817])
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@i915_suspend@debugfs-reader.html
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@i915_suspend@debugfs-reader.html

  * igt@i915_suspend@fence-restore-untiled:
    - shard-dg1:          NOTRUN -> [SKIP][85] ([i915#4077]) +2 other tests skip
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-17/igt@i915_suspend@fence-restore-untiled.html
    - shard-mtlp:         NOTRUN -> [SKIP][86] ([i915#4077]) +1 other test skip
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-2/igt@i915_suspend@fence-restore-untiled.html

  * igt@i915_suspend@forcewake:
    - shard-glk:          NOTRUN -> [INCOMPLETE][87] ([i915#4817]) +1 other test incomplete
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk9/igt@i915_suspend@forcewake.html

  * igt@intel_hwmon@hwmon-read:
    - shard-tglu:         NOTRUN -> [SKIP][88] ([i915#7707])
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@intel_hwmon@hwmon-read.html

  * igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
    - shard-dg2:          NOTRUN -> [SKIP][89] ([i915#5190]) +2 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
    - shard-snb:          NOTRUN -> [SKIP][90] ([i915#1769])
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb1/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html

  * igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-edp-1:
    - shard-mtlp:         [PASS][91] -> [FAIL][92] ([i915#5956]) +1 other test fail
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-8/igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-edp-1.html
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-7/igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-edp-1.html

  * igt@kms_big_fb@4-tiled-16bpp-rotate-90:
    - shard-rkl:          NOTRUN -> [SKIP][93] ([i915#5286]) +3 other tests skip
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_big_fb@4-tiled-16bpp-rotate-90.html
    - shard-dg1:          NOTRUN -> [SKIP][94] ([i915#4538] / [i915#5286]) +1 other test skip
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-18/igt@kms_big_fb@4-tiled-16bpp-rotate-90.html

  * igt@kms_big_fb@4-tiled-32bpp-rotate-0:
    - shard-tglu:         NOTRUN -> [SKIP][95] ([i915#5286]) +5 other tests skip
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_big_fb@4-tiled-32bpp-rotate-0.html

  * igt@kms_big_fb@4-tiled-64bpp-rotate-180:
    - shard-mtlp:         [PASS][96] -> [FAIL][97] ([i915#5138])
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-7/igt@kms_big_fb@4-tiled-64bpp-rotate-180.html
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-2/igt@kms_big_fb@4-tiled-64bpp-rotate-180.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180:
    - shard-tglu-1:       NOTRUN -> [SKIP][98] ([i915#5286]) +2 other tests skip
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180.html

  * igt@kms_big_fb@linear-16bpp-rotate-90:
    - shard-rkl:          NOTRUN -> [SKIP][99] ([i915#3638])
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_big_fb@linear-16bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-addfb-size-overflow:
    - shard-mtlp:         NOTRUN -> [SKIP][100] ([i915#6187])
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-4/igt@kms_big_fb@y-tiled-addfb-size-overflow.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - shard-dg2:          NOTRUN -> [SKIP][101] ([i915#4538] / [i915#5190]) +7 other tests skip
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-7/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180:
    - shard-tglu-1:       NOTRUN -> [SKIP][102] +21 other tests skip
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-180.html

  * igt@kms_busy@basic:
    - shard-rkl:          NOTRUN -> [SKIP][103] ([i915#11190] / [i915#14544])
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_busy@basic.html

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-4:
    - shard-dg1:          NOTRUN -> [SKIP][104] ([i915#6095]) +118 other tests skip
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-16/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-4.html

  * igt@kms_ccs@bad-pixel-format-4-tiled-mtl-mc-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][105] ([i915#10307] / [i915#6095]) +137 other tests skip
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@kms_ccs@bad-pixel-format-4-tiled-mtl-mc-ccs.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-bmg-ccs:
    - shard-tglu:         NOTRUN -> [SKIP][106] ([i915#12313]) +2 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_ccs@bad-rotation-90-4-tiled-bmg-ccs.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][107] ([i915#6095]) +42 other tests skip
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-2.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs:
    - shard-rkl:          NOTRUN -> [SKIP][108] ([i915#12313])
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html

  * igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-b-hdmi-a-1:
    - shard-tglu:         NOTRUN -> [SKIP][109] ([i915#6095]) +69 other tests skip
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-3/igt@kms_ccs@ccs-on-another-bo-y-tiled-gen12-mc-ccs@pipe-b-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-bmg-ccs:
    - shard-tglu-1:       NOTRUN -> [SKIP][110] ([i915#12313])
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_ccs@crc-primary-basic-4-tiled-bmg-ccs.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-mc-ccs:
    - shard-glk10:        NOTRUN -> [SKIP][111] +123 other tests skip
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk10/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-bmg-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][112] ([i915#12313])
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@kms_ccs@crc-primary-rotation-180-4-tiled-bmg-ccs.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-mc-ccs@pipe-c-hdmi-a-2:
    - shard-glk:          NOTRUN -> [SKIP][113] +169 other tests skip
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk5/igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-mc-ccs@pipe-c-hdmi-a-2.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-c-hdmi-a-1:
    - shard-tglu-1:       NOTRUN -> [SKIP][114] ([i915#6095]) +29 other tests skip
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-c-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs@pipe-d-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][115] ([i915#6095]) +20 other tests skip
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs@pipe-d-hdmi-a-3.html

  * igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs:
    - shard-glk:          NOTRUN -> [INCOMPLETE][116] ([i915#12796]) +1 other test incomplete
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk5/igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs.html

  * igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc@pipe-d-hdmi-a-1:
    - shard-dg2:          NOTRUN -> [SKIP][117] ([i915#10307] / [i915#10434] / [i915#6095])
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-rc-ccs-cc@pipe-d-hdmi-a-1.html

  * igt@kms_ccs@crc-sprite-planes-basic-yf-tiled-ccs@pipe-d-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][118] ([i915#6095]) +9 other tests skip
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-4/igt@kms_ccs@crc-sprite-planes-basic-yf-tiled-ccs@pipe-d-edp-1.html

  * igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][119] ([i915#14098] / [i915#6095]) +41 other tests skip
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-3/igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-2.html

  * igt@kms_cdclk@mode-transition@pipe-d-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][120] ([i915#13781]) +3 other tests skip
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@kms_cdclk@mode-transition@pipe-d-hdmi-a-3.html

  * igt@kms_chamelium_audio@dp-audio:
    - shard-tglu:         NOTRUN -> [SKIP][121] ([i915#11151] / [i915#7828]) +8 other tests skip
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-4/igt@kms_chamelium_audio@dp-audio.html

  * igt@kms_chamelium_frames@dp-crc-fast:
    - shard-rkl:          NOTRUN -> [SKIP][122] ([i915#11151] / [i915#14544] / [i915#7828]) +3 other tests skip
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_chamelium_frames@dp-crc-fast.html

  * igt@kms_chamelium_frames@dp-crc-multiple:
    - shard-mtlp:         NOTRUN -> [SKIP][123] ([i915#11151] / [i915#7828])
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-3/igt@kms_chamelium_frames@dp-crc-multiple.html

  * igt@kms_chamelium_frames@dp-frame-dump:
    - shard-dg2:          NOTRUN -> [SKIP][124] ([i915#11151] / [i915#7828]) +6 other tests skip
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-7/igt@kms_chamelium_frames@dp-frame-dump.html

  * igt@kms_chamelium_frames@vga-frame-dump:
    - shard-dg1:          NOTRUN -> [SKIP][125] ([i915#11151] / [i915#7828]) +1 other test skip
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-19/igt@kms_chamelium_frames@vga-frame-dump.html

  * igt@kms_chamelium_hpd@vga-hpd-fast:
    - shard-rkl:          NOTRUN -> [SKIP][126] ([i915#11151] / [i915#7828]) +3 other tests skip
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-3/igt@kms_chamelium_hpd@vga-hpd-fast.html
    - shard-tglu-1:       NOTRUN -> [SKIP][127] ([i915#11151] / [i915#7828]) +3 other tests skip
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_chamelium_hpd@vga-hpd-fast.html

  * igt@kms_chamelium_sharpness_filter@filter-basic:
    - shard-tglu:         NOTRUN -> [SKIP][128] ([i915#2575])
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-9/igt@kms_chamelium_sharpness_filter@filter-basic.html

  * igt@kms_color@ctm-green-to-red:
    - shard-dg1:          [PASS][129] -> [DMESG-WARN][130] ([i915#4423])
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-12/igt@kms_color@ctm-green-to-red.html
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-19/igt@kms_color@ctm-green-to-red.html

  * igt@kms_content_protection@dp-mst-lic-type-1:
    - shard-dg2:          NOTRUN -> [SKIP][131] ([i915#3299])
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@kms_content_protection@dp-mst-lic-type-1.html
    - shard-rkl:          NOTRUN -> [SKIP][132] ([i915#3116])
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_content_protection@dp-mst-lic-type-1.html
    - shard-dg1:          NOTRUN -> [SKIP][133] ([i915#3299])
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-13/igt@kms_content_protection@dp-mst-lic-type-1.html
    - shard-tglu:         NOTRUN -> [SKIP][134] ([i915#3116] / [i915#3299]) +1 other test skip
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_content_protection@dp-mst-lic-type-1.html
    - shard-mtlp:         NOTRUN -> [SKIP][135] ([i915#3299])
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-8/igt@kms_content_protection@dp-mst-lic-type-1.html

  * igt@kms_content_protection@lic-type-1:
    - shard-tglu-1:       NOTRUN -> [SKIP][136] ([i915#6944] / [i915#9424])
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_content_protection@lic-type-1.html

  * igt@kms_content_protection@type1:
    - shard-tglu:         NOTRUN -> [SKIP][137] ([i915#6944] / [i915#7116] / [i915#7118] / [i915#9424])
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-7/igt@kms_content_protection@type1.html

  * igt@kms_cursor_crc@cursor-offscreen-512x170:
    - shard-tglu:         NOTRUN -> [SKIP][138] ([i915#13049]) +3 other tests skip
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-5/igt@kms_cursor_crc@cursor-offscreen-512x170.html

  * igt@kms_cursor_crc@cursor-onscreen-128x42:
    - shard-rkl:          NOTRUN -> [DMESG-WARN][139] ([i915#12964]) +8 other tests dmesg-warn
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_cursor_crc@cursor-onscreen-128x42.html

  * igt@kms_cursor_crc@cursor-onscreen-64x21:
    - shard-rkl:          [PASS][140] -> [FAIL][141] ([i915#13566]) +1 other test fail
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_cursor_crc@cursor-onscreen-64x21.html
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_cursor_crc@cursor-onscreen-64x21.html

  * igt@kms_cursor_crc@cursor-onscreen-max-size:
    - shard-tglu-1:       NOTRUN -> [SKIP][142] ([i915#3555]) +1 other test skip
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_cursor_crc@cursor-onscreen-max-size.html

  * igt@kms_cursor_crc@cursor-random-512x170:
    - shard-dg2:          NOTRUN -> [SKIP][143] ([i915#13049]) +1 other test skip
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@kms_cursor_crc@cursor-random-512x170.html
    - shard-rkl:          NOTRUN -> [SKIP][144] ([i915#13049])
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_cursor_crc@cursor-random-512x170.html
    - shard-dg1:          NOTRUN -> [SKIP][145] ([i915#13049]) +1 other test skip
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-13/igt@kms_cursor_crc@cursor-random-512x170.html
    - shard-mtlp:         NOTRUN -> [SKIP][146] ([i915#13049])
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-8/igt@kms_cursor_crc@cursor-random-512x170.html

  * igt@kms_cursor_crc@cursor-sliding-256x85:
    - shard-tglu:         [PASS][147] -> [FAIL][148] ([i915#13566]) +3 other tests fail
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-tglu-6/igt@kms_cursor_crc@cursor-sliding-256x85.html
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-4/igt@kms_cursor_crc@cursor-sliding-256x85.html

  * igt@kms_cursor_crc@cursor-sliding-256x85@pipe-a-hdmi-a-1:
    - shard-rkl:          NOTRUN -> [FAIL][149] ([i915#13566]) +1 other test fail
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_cursor_crc@cursor-sliding-256x85@pipe-a-hdmi-a-1.html

  * igt@kms_cursor_crc@cursor-sliding-32x32:
    - shard-tglu:         NOTRUN -> [SKIP][150] ([i915#3555]) +7 other tests skip
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-8/igt@kms_cursor_crc@cursor-sliding-32x32.html

  * igt@kms_cursor_crc@cursor-sliding-512x512:
    - shard-tglu-1:       NOTRUN -> [SKIP][151] ([i915#13049])
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_cursor_crc@cursor-sliding-512x512.html

  * igt@kms_cursor_legacy@basic-flip-after-cursor-varying-size:
    - shard-rkl:          [PASS][152] -> [SKIP][153] ([i915#11190] / [i915#14544]) +1 other test skip
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_cursor_legacy@basic-flip-after-cursor-varying-size.html
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_cursor_legacy@basic-flip-after-cursor-varying-size.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-toggle:
    - shard-dg2:          NOTRUN -> [SKIP][154] ([i915#13046] / [i915#5354]) +2 other tests skip
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@kms_cursor_legacy@cursora-vs-flipb-toggle.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic:
    - shard-rkl:          NOTRUN -> [SKIP][155] ([i915#14544]) +24 other tests skip
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@flip-vs-cursor-varying-size:
    - shard-rkl:          [PASS][156] -> [FAIL][157] ([i915#2346])
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_cursor_legacy@flip-vs-cursor-varying-size.html
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_cursor_legacy@flip-vs-cursor-varying-size.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-dg2:          NOTRUN -> [SKIP][158] ([i915#4103] / [i915#4213])
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html
    - shard-tglu-1:       NOTRUN -> [SKIP][159] ([i915#4103])
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_dirtyfb@psr-dirtyfb-ioctl:
    - shard-tglu:         NOTRUN -> [SKIP][160] ([i915#9723])
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-5/igt@kms_dirtyfb@psr-dirtyfb-ioctl.html

  * igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][161] ([i915#3804])
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_dither@fb-8bpc-vs-panel-6bpc@pipe-a-hdmi-a-2.html

  * igt@kms_dp_aux_dev:
    - shard-tglu:         NOTRUN -> [SKIP][162] ([i915#1257])
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_dp_aux_dev.html

  * igt@kms_dp_link_training@non-uhbr-mst:
    - shard-dg2:          NOTRUN -> [SKIP][163] ([i915#13749])
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_dp_link_training@non-uhbr-mst.html
    - shard-tglu:         NOTRUN -> [SKIP][164] ([i915#13749])
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-4/igt@kms_dp_link_training@non-uhbr-mst.html

  * igt@kms_draw_crc@draw-method-mmap-wc:
    - shard-dg2:          NOTRUN -> [SKIP][165] ([i915#8812]) +1 other test skip
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@kms_draw_crc@draw-method-mmap-wc.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][166] ([i915#9878])
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk1/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_fbcon_fbt@psr-suspend:
    - shard-tglu-1:       NOTRUN -> [SKIP][167] ([i915#3469])
   [167]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_fbcon_fbt@psr-suspend.html

  * igt@kms_feature_discovery@display-3x:
    - shard-tglu:         NOTRUN -> [SKIP][168] ([i915#1839])
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-5/igt@kms_feature_discovery@display-3x.html

  * igt@kms_feature_discovery@psr2:
    - shard-tglu:         NOTRUN -> [SKIP][169] ([i915#658])
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-10/igt@kms_feature_discovery@psr2.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank:
    - shard-tglu:         NOTRUN -> [SKIP][170] ([i915#3637] / [i915#9934]) +6 other tests skip
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-7/igt@kms_flip@2x-flip-vs-absolute-wf_vblank.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop:
    - shard-tglu:         NOTRUN -> [SKIP][171] ([i915#9934])
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-2/igt@kms_flip@2x-flip-vs-dpms-on-nop.html

  * igt@kms_flip@2x-flip-vs-panning:
    - shard-dg2:          NOTRUN -> [SKIP][172] ([i915#9934]) +5 other tests skip
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@kms_flip@2x-flip-vs-panning.html

  * igt@kms_flip@2x-flip-vs-panning-interruptible:
    - shard-rkl:          NOTRUN -> [SKIP][173] ([i915#14544] / [i915#9934])
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip@2x-flip-vs-panning-interruptible.html
    - shard-dg1:          NOTRUN -> [SKIP][174] ([i915#9934])
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-12/igt@kms_flip@2x-flip-vs-panning-interruptible.html
    - shard-mtlp:         NOTRUN -> [SKIP][175] ([i915#3637] / [i915#9934])
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-6/igt@kms_flip@2x-flip-vs-panning-interruptible.html

  * igt@kms_flip@2x-flip-vs-suspend-interruptible:
    - shard-snb:          NOTRUN -> [TIMEOUT][176] ([i915#14033] / [i915#14350])
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb5/igt@kms_flip@2x-flip-vs-suspend-interruptible.html

  * igt@kms_flip@2x-flip-vs-suspend-interruptible@ab-vga1-hdmi-a1:
    - shard-snb:          NOTRUN -> [TIMEOUT][177] ([i915#14033])
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb5/igt@kms_flip@2x-flip-vs-suspend-interruptible@ab-vga1-hdmi-a1.html

  * igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset-interruptible:
    - shard-rkl:          NOTRUN -> [SKIP][178] ([i915#9934]) +2 other tests skip
   [178]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset-interruptible.html

  * igt@kms_flip@basic-flip-vs-wf_vblank:
    - shard-rkl:          [PASS][179] -> [SKIP][180] ([i915#14544] / [i915#3637]) +3 other tests skip
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_flip@basic-flip-vs-wf_vblank.html
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip@basic-flip-vs-wf_vblank.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-rkl:          [PASS][181] -> [INCOMPLETE][182] ([i915#6113])
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_flip@flip-vs-suspend-interruptible.html
   [182]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible@a-hdmi-a1:
    - shard-rkl:          NOTRUN -> [INCOMPLETE][183] ([i915#6113])
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@kms_flip@flip-vs-suspend-interruptible@a-hdmi-a1.html

  * igt@kms_flip@plain-flip-interruptible:
    - shard-rkl:          NOTRUN -> [SKIP][184] ([i915#14544] / [i915#3637]) +1 other test skip
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip@plain-flip-interruptible.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
    - shard-tglu:         NOTRUN -> [SKIP][185] ([i915#2587] / [i915#2672]) +3 other tests skip
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-4/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling:
    - shard-tglu:         NOTRUN -> [SKIP][186] ([i915#2672] / [i915#3555]) +3 other tests skip
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-4/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling.html
    - shard-mtlp:         NOTRUN -> [SKIP][187] ([i915#2672] / [i915#3555] / [i915#8813])
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-2/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling.html
    - shard-dg2:          NOTRUN -> [SKIP][188] ([i915#2672] / [i915#3555])
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling.html
    - shard-dg1:          NOTRUN -> [SKIP][189] ([i915#2672] / [i915#3555])
   [189]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-18/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][190] ([i915#2672] / [i915#8813])
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-2/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][191] ([i915#2672])
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-valid-mode.html
    - shard-rkl:          NOTRUN -> [SKIP][192] ([i915#2672]) +5 other tests skip
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-valid-mode.html
    - shard-dg1:          NOTRUN -> [SKIP][193] ([i915#2587] / [i915#2672])
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-18/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling:
    - shard-rkl:          NOTRUN -> [SKIP][194] ([i915#14544] / [i915#3555])
   [194]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling:
    - shard-tglu-1:       NOTRUN -> [SKIP][195] ([i915#2587] / [i915#2672] / [i915#3555])
   [195]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling@pipe-a-valid-mode:
    - shard-tglu-1:       NOTRUN -> [SKIP][196] ([i915#2587] / [i915#2672])
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling:
    - shard-rkl:          [PASS][197] -> [SKIP][198] ([i915#14544] / [i915#3555]) +4 other tests skip
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling:
    - shard-rkl:          NOTRUN -> [SKIP][199] ([i915#2672] / [i915#3555]) +2 other tests skip
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-offscreen-pri-shrfb-draw-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][200] ([i915#15104]) +1 other test skip
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_frontbuffer_tracking@fbc-1p-offscreen-pri-shrfb-draw-mmap-gtt.html
    - shard-mtlp:         NOTRUN -> [SKIP][201] ([i915#15104])
   [201]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-7/igt@kms_frontbuffer_tracking@fbc-1p-offscreen-pri-shrfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-onoff:
    - shard-dg2:          NOTRUN -> [FAIL][202] ([i915#6880])
   [202]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbc-1p-shrfb-fliptrack-mmap-gtt:
    - shard-dg1:          NOTRUN -> [SKIP][203] ([i915#8708])
   [203]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-14/igt@kms_frontbuffer_tracking@fbc-1p-shrfb-fliptrack-mmap-gtt.html
    - shard-mtlp:         NOTRUN -> [SKIP][204] ([i915#8708])
   [204]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-6/igt@kms_frontbuffer_tracking@fbc-1p-shrfb-fliptrack-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt:
    - shard-dg2:          NOTRUN -> [SKIP][205] ([i915#5354]) +13 other tests skip
   [205]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt:
    - shard-mtlp:         NOTRUN -> [SKIP][206] ([i915#1825]) +4 other tests skip
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-3/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-mmap-gtt:
    - shard-rkl:          NOTRUN -> [SKIP][207] ([i915#1825]) +20 other tests skip
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-shrfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][208] ([i915#8708]) +15 other tests skip
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@kms_frontbuffer_tracking@fbc-rgb101010-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-shrfb-scaledprimary:
    - shard-rkl:          [PASS][209] -> [SKIP][210] ([i915#14544] / [i915#1849] / [i915#5354]) +9 other tests skip
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_frontbuffer_tracking@fbc-shrfb-scaledprimary.html
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-shrfb-scaledprimary.html

  * igt@kms_frontbuffer_tracking@fbc-suspend:
    - shard-rkl:          [PASS][211] -> [INCOMPLETE][212] ([i915#10056])
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@kms_frontbuffer_tracking@fbc-suspend.html
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-3/igt@kms_frontbuffer_tracking@fbc-suspend.html
    - shard-glk10:        NOTRUN -> [INCOMPLETE][213] ([i915#10056])
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk10/igt@kms_frontbuffer_tracking@fbc-suspend.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw:
    - shard-rkl:          NOTRUN -> [SKIP][214] ([i915#15102] / [i915#3023]) +11 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-mmap-cpu:
    - shard-dg2:          NOTRUN -> [SKIP][215] ([i915#15102] / [i915#3458]) +9 other tests skip
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-onoff:
    - shard-rkl:          NOTRUN -> [SKIP][216] ([i915#14544] / [i915#1849] / [i915#5354]) +14 other tests skip
   [216]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-render:
    - shard-dg1:          NOTRUN -> [SKIP][217] ([i915#15102] / [i915#3458]) +2 other tests skip
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-14/igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-4:
    - shard-tglu:         NOTRUN -> [SKIP][218] ([i915#5439])
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-4/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-indfb-draw-mmap-gtt:
    - shard-tglu-1:       NOTRUN -> [SKIP][219] ([i915#15102]) +7 other tests skip
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-indfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-indfb-draw-render:
    - shard-tglu:         NOTRUN -> [SKIP][220] ([i915#15102]) +26 other tests skip
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-9/igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-mmap-cpu:
    - shard-dg2:          NOTRUN -> [SKIP][221] ([i915#15102]) +1 other test skip
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-pwrite:
    - shard-dg1:          NOTRUN -> [SKIP][222] ([i915#15102])
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-14/igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-wc:
    - shard-tglu:         NOTRUN -> [SKIP][223] +66 other tests skip
   [223]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-10/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-cpu:
    - shard-dg1:          NOTRUN -> [SKIP][224] +5 other tests skip
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-18/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-mmap-cpu.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-dg2:          NOTRUN -> [SKIP][225] ([i915#12713])
   [225]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_hdr@static-toggle:
    - shard-tglu:         NOTRUN -> [SKIP][226] ([i915#3555] / [i915#8228])
   [226]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-8/igt@kms_hdr@static-toggle.html

  * igt@kms_hdr@static-toggle-dpms:
    - shard-rkl:          NOTRUN -> [SKIP][227] ([i915#3555] / [i915#8228])
   [227]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_hdr@static-toggle-dpms.html

  * igt@kms_hdr@static-toggle-suspend:
    - shard-dg2:          [PASS][228] -> [SKIP][229] ([i915#3555] / [i915#8228]) +2 other tests skip
   [228]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-11/igt@kms_hdr@static-toggle-suspend.html
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@kms_hdr@static-toggle-suspend.html

  * igt@kms_invalid_mode@bad-hsync-start:
    - shard-rkl:          [PASS][230] -> [SKIP][231] ([i915#14544] / [i915#3555] / [i915#8826])
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_invalid_mode@bad-hsync-start.html
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_invalid_mode@bad-hsync-start.html

  * igt@kms_joiner@basic-force-big-joiner:
    - shard-tglu:         NOTRUN -> [SKIP][232] ([i915#12388])
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-2/igt@kms_joiner@basic-force-big-joiner.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-rkl:          NOTRUN -> [SKIP][233] ([i915#13688])
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_joiner@basic-max-non-joiner.html

  * igt@kms_joiner@invalid-modeset-big-joiner:
    - shard-rkl:          NOTRUN -> [SKIP][234] ([i915#10656] / [i915#14544])
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_joiner@invalid-modeset-big-joiner.html

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - shard-dg2:          NOTRUN -> [SKIP][235] ([i915#10656])
   [235]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html

  * igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
    - shard-tglu:         NOTRUN -> [SKIP][236] ([i915#13522])
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-rkl:          NOTRUN -> [SKIP][237] ([i915#4816])
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_panel_fitting@atomic-fastset:
    - shard-dg2:          NOTRUN -> [SKIP][238] ([i915#6301])
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@kms_panel_fitting@atomic-fastset.html

  * igt@kms_panel_fitting@legacy:
    - shard-tglu:         NOTRUN -> [SKIP][239] ([i915#6301]) +1 other test skip
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-2/igt@kms_panel_fitting@legacy.html

  * igt@kms_pipe_stress@stress-xrgb8888-xtiled:
    - shard-rkl:          [PASS][240] -> [SKIP][241] ([i915#14544]) +47 other tests skip
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_pipe_stress@stress-xrgb8888-xtiled.html
   [241]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_pipe_stress@stress-xrgb8888-xtiled.html

  * igt@kms_plane@plane-position-hole:
    - shard-rkl:          NOTRUN -> [SKIP][242] ([i915#14544] / [i915#8825])
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane@plane-position-hole.html

  * igt@kms_plane@plane-position-hole-dpms:
    - shard-rkl:          [PASS][243] -> [SKIP][244] ([i915#14544] / [i915#8825])
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_plane@plane-position-hole-dpms.html
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane@plane-position-hole-dpms.html

  * igt@kms_plane_multiple@2x-tiling-4:
    - shard-rkl:          NOTRUN -> [SKIP][245] ([i915#13958])
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_plane_multiple@2x-tiling-4.html

  * igt@kms_plane_multiple@2x-tiling-y:
    - shard-dg2:          NOTRUN -> [SKIP][246] ([i915#13958])
   [246]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-7/igt@kms_plane_multiple@2x-tiling-y.html

  * igt@kms_plane_multiple@tiling-yf:
    - shard-rkl:          NOTRUN -> [SKIP][247] ([i915#14259])
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_plane_multiple@tiling-yf.html

  * igt@kms_plane_scaling@intel-max-src-size:
    - shard-dg2:          NOTRUN -> [SKIP][248] ([i915#6953] / [i915#9423])
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@kms_plane_scaling@intel-max-src-size.html

  * igt@kms_plane_scaling@invalid-num-scalers:
    - shard-rkl:          [PASS][249] -> [SKIP][250] ([i915#14544] / [i915#3555] / [i915#6953] / [i915#8152])
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_plane_scaling@invalid-num-scalers.html
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane_scaling@invalid-num-scalers.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a:
    - shard-rkl:          NOTRUN -> [SKIP][251] ([i915#12247]) +2 other tests skip
   [251]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a.html
    - shard-dg1:          NOTRUN -> [SKIP][252] ([i915#12247]) +4 other tests skip
   [252]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-19/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a.html
    - shard-tglu:         NOTRUN -> [SKIP][253] ([i915#12247]) +4 other tests skip
   [253]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_plane_scaling@plane-downscale-factor-0-75-with-rotation@pipe-a.html

  * igt@kms_plane_scaling@planes-scaler-unity-scaling:
    - shard-rkl:          [PASS][254] -> [SKIP][255] ([i915#14544] / [i915#3555] / [i915#8152])
   [254]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_plane_scaling@planes-scaler-unity-scaling.html
   [255]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane_scaling@planes-scaler-unity-scaling.html

  * igt@kms_plane_scaling@planes-scaler-unity-scaling@pipe-a:
    - shard-rkl:          [PASS][256] -> [SKIP][257] ([i915#12247] / [i915#14544]) +2 other tests skip
   [256]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_plane_scaling@planes-scaler-unity-scaling@pipe-a.html
   [257]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane_scaling@planes-scaler-unity-scaling@pipe-a.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5:
    - shard-rkl:          [PASS][258] -> [SKIP][259] ([i915#12247] / [i915#14544] / [i915#3555] / [i915#6953] / [i915#8152])
   [258]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-4/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5.html
   [259]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75:
    - shard-rkl:          [PASS][260] -> [SKIP][261] ([i915#12247] / [i915#14544] / [i915#6953] / [i915#8152])
   [260]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html
   [261]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-b:
    - shard-rkl:          [PASS][262] -> [SKIP][263] ([i915#12247] / [i915#14544] / [i915#8152]) +2 other tests skip
   [262]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-b.html
   [263]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-b.html

  * igt@kms_pm_backlight@basic-brightness:
    - shard-tglu-1:       NOTRUN -> [SKIP][264] ([i915#9812])
   [264]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_pm_backlight@fade-with-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][265] ([i915#5354])
   [265]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_pm_backlight@fade-with-suspend.html
    - shard-tglu:         NOTRUN -> [SKIP][266] ([i915#9812])
   [266]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-9/igt@kms_pm_backlight@fade-with-suspend.html

  * igt@kms_pm_dc@dc3co-vpb-simulation:
    - shard-dg2:          NOTRUN -> [SKIP][267] ([i915#9685])
   [267]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@kms_pm_dc@dc3co-vpb-simulation.html
    - shard-rkl:          NOTRUN -> [SKIP][268] ([i915#14544] / [i915#9685])
   [268]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_pm_dc@dc3co-vpb-simulation.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-rkl:          NOTRUN -> [DMESG-FAIL][269] ([i915#12964])
   [269]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_dc@dc9-dpms:
    - shard-tglu-1:       NOTRUN -> [SKIP][270] ([i915#4281])
   [270]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_pm_dc@dc9-dpms.html

  * igt@kms_pm_lpsp@kms-lpsp:
    - shard-rkl:          NOTRUN -> [SKIP][271] ([i915#14544] / [i915#9340])
   [271]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_pm_lpsp@kms-lpsp.html
    - shard-tglu:         NOTRUN -> [SKIP][272] ([i915#3828])
   [272]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-9/igt@kms_pm_lpsp@kms-lpsp.html

  * igt@kms_pm_lpsp@screens-disabled:
    - shard-dg2:          NOTRUN -> [SKIP][273] ([i915#8430])
   [273]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@kms_pm_lpsp@screens-disabled.html

  * igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
    - shard-rkl:          NOTRUN -> [SKIP][274] ([i915#15073])
   [274]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
    - shard-tglu:         NOTRUN -> [SKIP][275] ([i915#15073])
   [275]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-4/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
    - shard-mtlp:         NOTRUN -> [SKIP][276] ([i915#15073])
   [276]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-4/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html

  * igt@kms_pm_rpm@dpms-non-lpsp:
    - shard-rkl:          [PASS][277] -> [SKIP][278] ([i915#15073])
   [277]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_pm_rpm@dpms-non-lpsp.html
   [278]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_pm_rpm@dpms-non-lpsp.html

  * igt@kms_pm_rpm@fences-dpms:
    - shard-dg2:          NOTRUN -> [SKIP][279] ([i915#4077]) +11 other tests skip
   [279]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@kms_pm_rpm@fences-dpms.html

  * igt@kms_pm_rpm@modeset-lpsp-stress:
    - shard-dg2:          [PASS][280] -> [SKIP][281] ([i915#15073])
   [280]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-4/igt@kms_pm_rpm@modeset-lpsp-stress.html
   [281]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@kms_pm_rpm@modeset-lpsp-stress.html

  * igt@kms_pm_rpm@modeset-lpsp-stress-no-wait:
    - shard-dg2:          NOTRUN -> [SKIP][282] ([i915#15073])
   [282]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@kms_pm_rpm@modeset-lpsp-stress-no-wait.html

  * igt@kms_pm_rpm@system-suspend-modeset:
    - shard-glk:          NOTRUN -> [INCOMPLETE][283] ([i915#10553])
   [283]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk5/igt@kms_pm_rpm@system-suspend-modeset.html

  * igt@kms_properties@plane-properties-legacy:
    - shard-rkl:          NOTRUN -> [SKIP][284] ([i915#11521] / [i915#14544])
   [284]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_properties@plane-properties-legacy.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-sf:
    - shard-glk:          NOTRUN -> [SKIP][285] ([i915#11520]) +2 other tests skip
   [285]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk9/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@fbc-pr-primary-plane-update-sf-dmg-area:
    - shard-rkl:          NOTRUN -> [SKIP][286] ([i915#11520]) +6 other tests skip
   [286]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_psr2_sf@fbc-pr-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-fully-sf@pipe-a-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][287] ([i915#9808])
   [287]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-8/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-fully-sf@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-fully-sf@pipe-b-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][288] ([i915#12316]) +2 other tests skip
   [288]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-8/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-fully-sf@pipe-b-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-sf:
    - shard-dg2:          NOTRUN -> [SKIP][289] ([i915#11520]) +6 other tests skip
   [289]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf:
    - shard-tglu-1:       NOTRUN -> [SKIP][290] ([i915#11520])
   [290]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_psr2_sf@fbc-psr2-overlay-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf:
    - shard-snb:          NOTRUN -> [SKIP][291] ([i915#11520]) +3 other tests skip
   [291]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb4/igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf.html
    - shard-dg1:          NOTRUN -> [SKIP][292] ([i915#11520]) +1 other test skip
   [292]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-14/igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf.html

  * igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-sf:
    - shard-tglu:         NOTRUN -> [SKIP][293] ([i915#11520]) +6 other tests skip
   [293]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-10/igt@kms_psr2_sf@psr2-overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area-big-fb:
    - shard-glk10:        NOTRUN -> [SKIP][294] ([i915#11520]) +3 other tests skip
   [294]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk10/igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area-big-fb.html

  * igt@kms_psr2_su@frontbuffer-xrgb8888:
    - shard-dg2:          NOTRUN -> [SKIP][295] ([i915#9683])
   [295]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@kms_psr2_su@frontbuffer-xrgb8888.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-rkl:          NOTRUN -> [SKIP][296] ([i915#14544] / [i915#9683])
   [296]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@fbc-pr-basic:
    - shard-mtlp:         NOTRUN -> [SKIP][297] ([i915#9688]) +3 other tests skip
   [297]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-7/igt@kms_psr@fbc-pr-basic.html

  * igt@kms_psr@fbc-psr-cursor-mmap-gtt:
    - shard-dg1:          NOTRUN -> [SKIP][298] ([i915#1072] / [i915#9732]) +3 other tests skip
   [298]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-17/igt@kms_psr@fbc-psr-cursor-mmap-gtt.html

  * igt@kms_psr@fbc-psr-dpms:
    - shard-tglu-1:       NOTRUN -> [SKIP][299] ([i915#9732]) +4 other tests skip
   [299]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_psr@fbc-psr-dpms.html

  * igt@kms_psr@pr-cursor-mmap-cpu:
    - shard-rkl:          NOTRUN -> [SKIP][300] ([i915#1072] / [i915#14544] / [i915#9732]) +1 other test skip
   [300]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_psr@pr-cursor-mmap-cpu.html

  * igt@kms_psr@pr-primary-mmap-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][301] ([i915#1072] / [i915#9732]) +15 other tests skip
   [301]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@kms_psr@pr-primary-mmap-gtt.html

  * igt@kms_psr@psr-cursor-render:
    - shard-rkl:          NOTRUN -> [SKIP][302] ([i915#1072] / [i915#9732]) +14 other tests skip
   [302]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-3/igt@kms_psr@psr-cursor-render.html

  * igt@kms_psr@psr-sprite-blt:
    - shard-tglu:         NOTRUN -> [SKIP][303] ([i915#9732]) +22 other tests skip
   [303]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_psr@psr-sprite-blt.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-rkl:          NOTRUN -> [SKIP][304] ([i915#5289])
   [304]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
    - shard-tglu:         NOTRUN -> [SKIP][305] ([i915#5289]) +1 other test skip
   [305]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-8/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-tglu-1:       NOTRUN -> [SKIP][306] ([i915#5289])
   [306]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@sprite-rotation-270:
    - shard-dg2:          NOTRUN -> [SKIP][307] ([i915#12755])
   [307]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@kms_rotation_crc@sprite-rotation-270.html

  * igt@kms_setmode@basic@pipe-b-edp-1:
    - shard-mtlp:         [PASS][308] -> [FAIL][309] ([i915#15106]) +2 other tests fail
   [308]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-6/igt@kms_setmode@basic@pipe-b-edp-1.html
   [309]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-5/igt@kms_setmode@basic@pipe-b-edp-1.html

  * igt@kms_setmode@invalid-clone-single-crtc:
    - shard-dg2:          NOTRUN -> [SKIP][310] ([i915#3555]) +2 other tests skip
   [310]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@kms_setmode@invalid-clone-single-crtc.html
    - shard-rkl:          NOTRUN -> [SKIP][311] ([i915#3555]) +4 other tests skip
   [311]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_setmode@invalid-clone-single-crtc.html
    - shard-dg1:          NOTRUN -> [SKIP][312] ([i915#3555]) +1 other test skip
   [312]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-16/igt@kms_setmode@invalid-clone-single-crtc.html
    - shard-mtlp:         NOTRUN -> [SKIP][313] ([i915#3555] / [i915#8809])
   [313]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-7/igt@kms_setmode@invalid-clone-single-crtc.html

  * igt@kms_sharpness_filter@filter-dpms:
    - shard-tglu:         NOTRUN -> [SKIP][314] ([i915#15232]) +2 other tests skip
   [314]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-5/igt@kms_sharpness_filter@filter-dpms.html

  * igt@kms_sharpness_filter@filter-tap:
    - shard-tglu-1:       NOTRUN -> [SKIP][315] ([i915#15232]) +1 other test skip
   [315]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@kms_sharpness_filter@filter-tap.html

  * igt@kms_sharpness_filter@invalid-filter-with-plane:
    - shard-dg2:          NOTRUN -> [SKIP][316] ([i915#15232])
   [316]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@kms_sharpness_filter@invalid-filter-with-plane.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-tglu:         NOTRUN -> [SKIP][317] ([i915#8623]) +1 other test skip
   [317]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-10/igt@kms_tiled_display@basic-test-pattern.html
    - shard-rkl:          NOTRUN -> [SKIP][318] ([i915#8623])
   [318]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_vrr@flip-basic:
    - shard-dg2:          NOTRUN -> [SKIP][319] ([i915#15243] / [i915#3555]) +1 other test skip
   [319]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@kms_vrr@flip-basic.html

  * igt@kms_vrr@flip-dpms:
    - shard-rkl:          NOTRUN -> [SKIP][320] ([i915#15243] / [i915#3555]) +1 other test skip
   [320]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_vrr@flip-dpms.html

  * igt@kms_vrr@flip-suspend:
    - shard-mtlp:         NOTRUN -> [SKIP][321] ([i915#3555] / [i915#8808])
   [321]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-2/igt@kms_vrr@flip-suspend.html

  * igt@kms_vrr@max-min:
    - shard-tglu:         NOTRUN -> [SKIP][322] ([i915#9906])
   [322]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_vrr@max-min.html

  * igt@kms_vrr@negative-basic:
    - shard-dg2:          [PASS][323] -> [SKIP][324] ([i915#3555] / [i915#9906])
   [323]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-11/igt@kms_vrr@negative-basic.html
   [324]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-7/igt@kms_vrr@negative-basic.html

  * igt@kms_vrr@seamless-rr-switch-vrr:
    - shard-dg2:          NOTRUN -> [SKIP][325] ([i915#9906])
   [325]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@kms_vrr@seamless-rr-switch-vrr.html

  * igt@kms_writeback@writeback-check-output:
    - shard-rkl:          NOTRUN -> [SKIP][326] ([i915#2437])
   [326]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_writeback@writeback-check-output.html

  * igt@kms_writeback@writeback-check-output-xrgb2101010:
    - shard-rkl:          NOTRUN -> [SKIP][327] ([i915#2437] / [i915#9412])
   [327]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_writeback@writeback-check-output-xrgb2101010.html

  * igt@kms_writeback@writeback-fb-id-xrgb2101010:
    - shard-glk:          NOTRUN -> [SKIP][328] ([i915#2437])
   [328]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-glk5/igt@kms_writeback@writeback-fb-id-xrgb2101010.html

  * igt@kms_writeback@writeback-invalid-parameters:
    - shard-tglu:         NOTRUN -> [SKIP][329] ([i915#2437])
   [329]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_writeback@writeback-invalid-parameters.html

  * igt@panthor/panthor_gem@bo_mmap_offset:
    - shard-dg2:          NOTRUN -> [SKIP][330] ([i915#15265]) +1 other test skip
   [330]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-3/igt@panthor/panthor_gem@bo_mmap_offset.html

  * igt@panthor/panthor_gem@bo_mmap_offset_invalid_handle:
    - shard-tglu-1:       NOTRUN -> [SKIP][331] ([i915#2575])
   [331]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@panthor/panthor_gem@bo_mmap_offset_invalid_handle.html

  * igt@panthor/panthor_vm@vm_create_destroy:
    - shard-rkl:          NOTRUN -> [SKIP][332] ([i915#15265]) +1 other test skip
   [332]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@panthor/panthor_vm@vm_create_destroy.html

  * igt@perf_pmu@module-unload:
    - shard-dg2:          NOTRUN -> [FAIL][333] ([i915#14433])
   [333]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@perf_pmu@module-unload.html

  * igt@perf_pmu@most-busy-idle-check-all:
    - shard-dg2:          [PASS][334] -> [FAIL][335] ([i915#11943]) +1 other test fail
   [334]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-1/igt@perf_pmu@most-busy-idle-check-all.html
   [335]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-6/igt@perf_pmu@most-busy-idle-check-all.html
    - shard-dg1:          [PASS][336] -> [FAIL][337] ([i915#11943]) +1 other test fail
   [336]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-18/igt@perf_pmu@most-busy-idle-check-all.html
   [337]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-16/igt@perf_pmu@most-busy-idle-check-all.html
    - shard-mtlp:         [PASS][338] -> [FAIL][339] ([i915#11943]) +1 other test fail
   [338]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-2/igt@perf_pmu@most-busy-idle-check-all.html
   [339]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-7/igt@perf_pmu@most-busy-idle-check-all.html

  * igt@perf_pmu@rc6-all-gts:
    - shard-dg2:          NOTRUN -> [SKIP][340] ([i915#8516])
   [340]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@perf_pmu@rc6-all-gts.html

  * igt@prime_vgem@basic-fence-mmap:
    - shard-dg2:          NOTRUN -> [SKIP][341] ([i915#3708] / [i915#4077])
   [341]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@prime_vgem@basic-fence-mmap.html

  * igt@prime_vgem@basic-write:
    - shard-rkl:          NOTRUN -> [SKIP][342] ([i915#14544] / [i915#3291] / [i915#3708])
   [342]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@prime_vgem@basic-write.html

  * igt@sriov_basic@bind-unbind-vf:
    - shard-rkl:          NOTRUN -> [SKIP][343] ([i915#9917])
   [343]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@sriov_basic@bind-unbind-vf.html

  * igt@sriov_basic@bind-unbind-vf@vf-4:
    - shard-tglu:         NOTRUN -> [FAIL][344] ([i915#12910]) +9 other tests fail
   [344]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-2/igt@sriov_basic@bind-unbind-vf@vf-4.html

  * igt@sriov_basic@enable-vfs-bind-unbind-each@numvfs-2:
    - shard-tglu-1:       NOTRUN -> [FAIL][345] ([i915#12910]) +8 other tests fail
   [345]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-1/igt@sriov_basic@enable-vfs-bind-unbind-each@numvfs-2.html

  
#### Possible fixes ####

  * igt@gem_eio@in-flight-suspend:
    - shard-rkl:          [ABORT][346] ([i915#15131]) -> [PASS][347]
   [346]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-4/igt@gem_eio@in-flight-suspend.html
   [347]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@gem_eio@in-flight-suspend.html

  * igt@gem_eio@kms:
    - shard-tglu:         [DMESG-WARN][348] ([i915#13363]) -> [PASS][349]
   [348]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-tglu-5/igt@gem_eio@kms.html
   [349]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@gem_eio@kms.html

  * igt@gem_exec_schedule@wide:
    - shard-rkl:          [DMESG-WARN][350] ([i915#12964]) -> [PASS][351] +25 other tests pass
   [350]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@gem_exec_schedule@wide.html
   [351]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@gem_exec_schedule@wide.html

  * igt@gem_pxp@create-protected-buffer:
    - shard-rkl:          [TIMEOUT][352] ([i915#12964]) -> [PASS][353]
   [352]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@gem_pxp@create-protected-buffer.html
   [353]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@gem_pxp@create-protected-buffer.html

  * igt@gem_pxp@protected-encrypted-src-copy-not-readible:
    - shard-rkl:          [TIMEOUT][354] ([i915#12917] / [i915#12964]) -> [PASS][355]
   [354]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_pxp@protected-encrypted-src-copy-not-readible.html
   [355]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@gem_pxp@protected-encrypted-src-copy-not-readible.html

  * igt@i915_pm_freq_api@freq-suspend@gt0:
    - shard-dg2:          [INCOMPLETE][356] ([i915#13356] / [i915#13820]) -> [PASS][357] +1 other test pass
   [356]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-5/igt@i915_pm_freq_api@freq-suspend@gt0.html
   [357]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-8/igt@i915_pm_freq_api@freq-suspend@gt0.html

  * igt@i915_power@sanity:
    - shard-mtlp:         [SKIP][358] ([i915#7984]) -> [PASS][359]
   [358]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-4/igt@i915_power@sanity.html
   [359]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-3/igt@i915_power@sanity.html

  * igt@i915_selftest@live@workarounds:
    - shard-mtlp:         [DMESG-FAIL][360] ([i915#12061]) -> [PASS][361] +1 other test pass
   [360]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-8/igt@i915_selftest@live@workarounds.html
   [361]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-2/igt@i915_selftest@live@workarounds.html

  * igt@i915_suspend@basic-s2idle-without-i915:
    - shard-dg1:          [DMESG-WARN][362] ([i915#4391] / [i915#4423]) -> [PASS][363]
   [362]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-19/igt@i915_suspend@basic-s2idle-without-i915.html
   [363]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-16/igt@i915_suspend@basic-s2idle-without-i915.html

  * igt@kms_async_flips@async-flip-suspend-resume:
    - shard-dg2:          [FAIL][364] -> [PASS][365]
   [364]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-11/igt@kms_async_flips@async-flip-suspend-resume.html
   [365]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-1/igt@kms_async_flips@async-flip-suspend-resume.html

  * igt@kms_async_flips@crc:
    - shard-rkl:          [SKIP][366] ([i915#14544]) -> [PASS][367] +38 other tests pass
   [366]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_async_flips@crc.html
   [367]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_async_flips@crc.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip:
    - shard-mtlp:         [FAIL][368] ([i915#5138]) -> [PASS][369] +1 other test pass
   [368]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-5/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
   [369]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-4/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-0-hflip.html

  * igt@kms_color@legacy-gamma:
    - shard-rkl:          [SKIP][370] ([i915#12655] / [i915#14544]) -> [PASS][371]
   [370]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_color@legacy-gamma.html
   [371]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_color@legacy-gamma.html

  * igt@kms_cursor_crc@cursor-onscreen-128x42:
    - shard-tglu:         [FAIL][372] ([i915#13566]) -> [PASS][373] +5 other tests pass
   [372]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-tglu-10/igt@kms_cursor_crc@cursor-onscreen-128x42.html
   [373]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-5/igt@kms_cursor_crc@cursor-onscreen-128x42.html

  * igt@kms_cursor_crc@cursor-sliding-64x21@pipe-a-hdmi-a-2:
    - shard-rkl:          [FAIL][374] ([i915#13566]) -> [PASS][375] +2 other tests pass
   [374]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_cursor_crc@cursor-sliding-64x21@pipe-a-hdmi-a-2.html
   [375]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_cursor_crc@cursor-sliding-64x21@pipe-a-hdmi-a-2.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-rkl:          [FAIL][376] ([i915#2346]) -> [PASS][377]
   [376]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [377]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_dp_linktrain_fallback@dp-fallback:
    - shard-dg2:          [SKIP][378] ([i915#13707]) -> [PASS][379]
   [378]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-7/igt@kms_dp_linktrain_fallback@dp-fallback.html
   [379]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_dp_linktrain_fallback@dp-fallback.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-rkl:          [SKIP][380] ([i915#14544] / [i915#14561]) -> [PASS][381]
   [380]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_fbcon_fbt@fbc-suspend.html
   [381]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_feature_discovery@display-1x:
    - shard-rkl:          [SKIP][382] ([i915#14544] / [i915#9738]) -> [PASS][383]
   [382]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_feature_discovery@display-1x.html
   [383]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_feature_discovery@display-1x.html

  * igt@kms_flip@2x-flip-vs-suspend@ab-vga1-hdmi-a1:
    - shard-snb:          [TIMEOUT][384] ([i915#14033]) -> [PASS][385] +1 other test pass
   [384]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-snb5/igt@kms_flip@2x-flip-vs-suspend@ab-vga1-hdmi-a1.html
   [385]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb6/igt@kms_flip@2x-flip-vs-suspend@ab-vga1-hdmi-a1.html

  * igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible:
    - shard-rkl:          [SKIP][386] ([i915#14544] / [i915#3637]) -> [PASS][387] +2 other tests pass
   [386]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible.html
   [387]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_flip@flip-vs-dpms-off-vs-modeset-interruptible.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-rkl:          [INCOMPLETE][388] ([i915#6113]) -> [PASS][389] +1 other test pass
   [388]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-3/igt@kms_flip@flip-vs-suspend.html
   [389]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling:
    - shard-rkl:          [SKIP][390] ([i915#14544] / [i915#3555]) -> [PASS][391] +1 other test pass
   [390]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling.html
   [391]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_flip_scaled_crc@flip-64bpp-xtile-to-32bpp-xtile-upscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite:
    - shard-dg1:          [DMESG-WARN][392] ([i915#4423]) -> [PASS][393]
   [392]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-14/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html
   [393]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-14/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render:
    - shard-rkl:          [SKIP][394] ([i915#14544] / [i915#1849] / [i915#5354]) -> [PASS][395] +6 other tests pass
   [394]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render.html
   [395]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-suspend:
    - shard-snb:          [ABORT][396] ([i915#14849] / [i915#14871]) -> [PASS][397]
   [396]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-snb6/igt@kms_frontbuffer_tracking@fbc-suspend.html
   [397]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb4/igt@kms_frontbuffer_tracking@fbc-suspend.html

  * igt@kms_hdmi_inject@inject-audio:
    - shard-snb:          [SKIP][398] -> [PASS][399]
   [398]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-snb5/igt@kms_hdmi_inject@inject-audio.html
   [399]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-snb1/igt@kms_hdmi_inject@inject-audio.html

  * igt@kms_hdr@bpc-switch:
    - shard-dg2:          [SKIP][400] ([i915#3555] / [i915#8228]) -> [PASS][401]
   [400]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-4/igt@kms_hdr@bpc-switch.html
   [401]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_hdr@bpc-switch.html

  * igt@kms_joiner@basic-force-big-joiner:
    - shard-dg2:          [SKIP][402] ([i915#12388]) -> [PASS][403]
   [402]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-6/igt@kms_joiner@basic-force-big-joiner.html
   [403]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@kms_joiner@basic-force-big-joiner.html

  * igt@kms_pipe_crc_basic@hang-read-crc:
    - shard-rkl:          [SKIP][404] ([i915#11190] / [i915#14544]) -> [PASS][405] +1 other test pass
   [404]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_pipe_crc_basic@hang-read-crc.html
   [405]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_pipe_crc_basic@hang-read-crc.html

  * igt@kms_plane_alpha_blend@constant-alpha-mid:
    - shard-rkl:          [SKIP][406] ([i915#14544] / [i915#7294]) -> [PASS][407] +2 other tests pass
   [406]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_alpha_blend@constant-alpha-mid.html
   [407]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_plane_alpha_blend@constant-alpha-mid.html

  * igt@kms_plane_scaling@plane-upscale-20x20-with-pixel-format:
    - shard-rkl:          [SKIP][408] ([i915#14544] / [i915#8152]) -> [PASS][409]
   [408]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_scaling@plane-upscale-20x20-with-pixel-format.html
   [409]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_plane_scaling@plane-upscale-20x20-with-pixel-format.html

  * igt@kms_plane_scaling@plane-upscale-20x20-with-pixel-format@pipe-b:
    - shard-rkl:          [SKIP][410] ([i915#12247] / [i915#14544] / [i915#8152]) -> [PASS][411] +3 other tests pass
   [410]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_scaling@plane-upscale-20x20-with-pixel-format@pipe-b.html
   [411]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_plane_scaling@plane-upscale-20x20-with-pixel-format@pipe-b.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-20x20@pipe-a:
    - shard-rkl:          [SKIP][412] ([i915#12247] / [i915#14544]) -> [PASS][413] +2 other tests pass
   [412]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-20x20@pipe-a.html
   [413]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-20x20@pipe-a.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25:
    - shard-rkl:          [SKIP][414] ([i915#14544] / [i915#6953] / [i915#8152]) -> [PASS][415]
   [414]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25.html
   [415]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_plane_scaling@planes-downscale-factor-0-75-upscale-factor-0-25.html

  * igt@perf_pmu@busy-double-start@ccs0:
    - shard-mtlp:         [FAIL][416] ([i915#4349]) -> [PASS][417]
   [416]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-mtlp-7/igt@perf_pmu@busy-double-start@ccs0.html
   [417]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-mtlp-7/igt@perf_pmu@busy-double-start@ccs0.html

  * igt@perf_pmu@frequency:
    - shard-dg2:          [FAIL][418] ([i915#12549] / [i915#6806]) -> [PASS][419] +1 other test pass
   [418]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-7/igt@perf_pmu@frequency.html
   [419]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-11/igt@perf_pmu@frequency.html
    - shard-dg1:          [FAIL][420] ([i915#12549] / [i915#6806]) -> [PASS][421] +1 other test pass
   [420]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-19/igt@perf_pmu@frequency.html
   [421]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-18/igt@perf_pmu@frequency.html

  
#### Warnings ####

  * igt@api_intel_bb@object-reloc-keep-cache:
    - shard-rkl:          [SKIP][422] ([i915#8411]) -> [SKIP][423] ([i915#14544] / [i915#8411])
   [422]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@api_intel_bb@object-reloc-keep-cache.html
   [423]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@api_intel_bb@object-reloc-keep-cache.html

  * igt@gem_ccs@block-copy-compressed:
    - shard-rkl:          [SKIP][424] ([i915#3555] / [i915#9323]) -> [SKIP][425] ([i915#14544] / [i915#3555] / [i915#9323])
   [424]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@gem_ccs@block-copy-compressed.html
   [425]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_ccs@block-copy-compressed.html

  * igt@gem_ccs@block-multicopy-compressed:
    - shard-rkl:          [SKIP][426] ([i915#9323]) -> [SKIP][427] ([i915#14544] / [i915#9323])
   [426]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@gem_ccs@block-multicopy-compressed.html
   [427]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_ccs@block-multicopy-compressed.html

  * igt@gem_ccs@block-multicopy-inplace:
    - shard-rkl:          [SKIP][428] ([i915#14544] / [i915#3555] / [i915#9323]) -> [SKIP][429] ([i915#3555] / [i915#9323])
   [428]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_ccs@block-multicopy-inplace.html
   [429]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@gem_ccs@block-multicopy-inplace.html

  * igt@gem_create@create-ext-cpu-access-sanity-check:
    - shard-rkl:          [SKIP][430] ([i915#6335]) -> [SKIP][431] ([i915#14544] / [i915#6335])
   [430]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@gem_create@create-ext-cpu-access-sanity-check.html
   [431]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_create@create-ext-cpu-access-sanity-check.html

  * igt@gem_ctx_sseu@invalid-args:
    - shard-rkl:          [SKIP][432] ([i915#14544] / [i915#280]) -> [SKIP][433] ([i915#280])
   [432]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_ctx_sseu@invalid-args.html
   [433]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gem_ctx_sseu@invalid-args.html

  * igt@gem_exec_balancer@parallel-out-fence:
    - shard-rkl:          [SKIP][434] ([i915#14544] / [i915#4525]) -> [SKIP][435] ([i915#4525])
   [434]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_exec_balancer@parallel-out-fence.html
   [435]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@gem_exec_balancer@parallel-out-fence.html

  * igt@gem_exec_capture@capture-recoverable:
    - shard-rkl:          [SKIP][436] ([i915#6344]) -> [SKIP][437] ([i915#14544] / [i915#6344])
   [436]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@gem_exec_capture@capture-recoverable.html
   [437]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_exec_capture@capture-recoverable.html

  * igt@gem_exec_flush@basic-batch-kernel-default-cmd:
    - shard-rkl:          [SKIP][438] -> [SKIP][439] ([i915#14544]) +16 other tests skip
   [438]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@gem_exec_flush@basic-batch-kernel-default-cmd.html
   [439]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_exec_flush@basic-batch-kernel-default-cmd.html

  * igt@gem_exec_reloc@basic-gtt-wc-noreloc:
    - shard-rkl:          [SKIP][440] ([i915#3281]) -> [SKIP][441] ([i915#14544] / [i915#3281]) +9 other tests skip
   [440]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@gem_exec_reloc@basic-gtt-wc-noreloc.html
   [441]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_exec_reloc@basic-gtt-wc-noreloc.html

  * igt@gem_exec_reloc@basic-softpin:
    - shard-rkl:          [SKIP][442] ([i915#14544] / [i915#3281]) -> [SKIP][443] ([i915#3281]) +2 other tests skip
   [442]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_exec_reloc@basic-softpin.html
   [443]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@gem_exec_reloc@basic-softpin.html

  * igt@gem_lmem_swapping@heavy-verify-random-ccs:
    - shard-rkl:          [SKIP][444] ([i915#4613]) -> [SKIP][445] ([i915#14544] / [i915#4613]) +4 other tests skip
   [444]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@gem_lmem_swapping@heavy-verify-random-ccs.html
   [445]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_lmem_swapping@heavy-verify-random-ccs.html

  * igt@gem_lmem_swapping@parallel-random-verify:
    - shard-rkl:          [SKIP][446] ([i915#14544] / [i915#4613]) -> [SKIP][447] ([i915#4613]) +2 other tests skip
   [446]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_lmem_swapping@parallel-random-verify.html
   [447]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@gem_lmem_swapping@parallel-random-verify.html

  * igt@gem_media_vme:
    - shard-rkl:          [SKIP][448] ([i915#284]) -> [SKIP][449] ([i915#14544] / [i915#284])
   [448]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@gem_media_vme.html
   [449]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_media_vme.html

  * igt@gem_partial_pwrite_pread@reads-uncached:
    - shard-rkl:          [SKIP][450] ([i915#14544] / [i915#3282]) -> [SKIP][451] ([i915#3282]) +6 other tests skip
   [450]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_partial_pwrite_pread@reads-uncached.html
   [451]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gem_partial_pwrite_pread@reads-uncached.html

  * igt@gem_partial_pwrite_pread@writes-after-reads:
    - shard-rkl:          [SKIP][452] ([i915#3282]) -> [SKIP][453] ([i915#14544] / [i915#3282]) +3 other tests skip
   [452]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@gem_partial_pwrite_pread@writes-after-reads.html
   [453]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_partial_pwrite_pread@writes-after-reads.html

  * igt@gem_pxp@hw-rejects-pxp-buffer:
    - shard-rkl:          [TIMEOUT][454] ([i915#12917] / [i915#12964]) -> [FAIL][455] ([i915#15138])
   [454]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@gem_pxp@hw-rejects-pxp-buffer.html
   [455]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_pxp@hw-rejects-pxp-buffer.html

  * igt@gem_pxp@hw-rejects-pxp-context:
    - shard-rkl:          [SKIP][456] ([i915#13717]) -> [TIMEOUT][457] ([i915#12917] / [i915#12964])
   [456]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@gem_pxp@hw-rejects-pxp-context.html
   [457]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@gem_pxp@hw-rejects-pxp-context.html

  * igt@gem_set_tiling_vs_blt@tiled-to-untiled:
    - shard-rkl:          [SKIP][458] ([i915#14544] / [i915#8411]) -> [SKIP][459] ([i915#8411]) +2 other tests skip
   [458]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_set_tiling_vs_blt@tiled-to-untiled.html
   [459]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@gem_set_tiling_vs_blt@tiled-to-untiled.html

  * igt@gem_userptr_blits@coherency-sync:
    - shard-rkl:          [SKIP][460] ([i915#14544] / [i915#3297]) -> [SKIP][461] ([i915#3297])
   [460]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gem_userptr_blits@coherency-sync.html
   [461]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@gem_userptr_blits@coherency-sync.html

  * igt@gem_userptr_blits@dmabuf-unsync:
    - shard-rkl:          [SKIP][462] ([i915#3297]) -> [SKIP][463] ([i915#14544] / [i915#3297]) +1 other test skip
   [462]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@gem_userptr_blits@dmabuf-unsync.html
   [463]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gem_userptr_blits@dmabuf-unsync.html

  * igt@gem_workarounds@suspend-resume-context:
    - shard-rkl:          [ABORT][464] ([i915#15131]) -> [INCOMPLETE][465] ([i915#13356])
   [464]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-4/igt@gem_workarounds@suspend-resume-context.html
   [465]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-3/igt@gem_workarounds@suspend-resume-context.html

  * igt@gen9_exec_parse@allowed-all:
    - shard-rkl:          [SKIP][466] ([i915#2527]) -> [SKIP][467] ([i915#14544] / [i915#2527])
   [466]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@gen9_exec_parse@allowed-all.html
   [467]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@gen9_exec_parse@allowed-all.html

  * igt@gen9_exec_parse@allowed-single:
    - shard-rkl:          [SKIP][468] ([i915#14544] / [i915#2527]) -> [SKIP][469] ([i915#2527]) +1 other test skip
   [468]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@gen9_exec_parse@allowed-single.html
   [469]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@gen9_exec_parse@allowed-single.html

  * igt@i915_pm_freq_api@freq-reset-multiple:
    - shard-rkl:          [SKIP][470] ([i915#8399]) -> [SKIP][471] ([i915#14544] / [i915#8399])
   [470]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@i915_pm_freq_api@freq-reset-multiple.html
   [471]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@i915_pm_freq_api@freq-reset-multiple.html

  * igt@i915_power@sanity:
    - shard-rkl:          [SKIP][472] ([i915#7984]) -> [SKIP][473] ([i915#14544] / [i915#7984])
   [472]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-3/igt@i915_power@sanity.html
   [473]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@i915_power@sanity.html

  * igt@i915_query@hwconfig_table:
    - shard-rkl:          [SKIP][474] ([i915#6245]) -> [SKIP][475] ([i915#14544] / [i915#6245])
   [474]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@i915_query@hwconfig_table.html
   [475]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@i915_query@hwconfig_table.html

  * igt@kms_big_fb@4-tiled-32bpp-rotate-0:
    - shard-rkl:          [SKIP][476] ([i915#5286]) -> [SKIP][477] ([i915#14544]) +3 other tests skip
   [476]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_big_fb@4-tiled-32bpp-rotate-0.html
   [477]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_big_fb@4-tiled-32bpp-rotate-0.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-90:
    - shard-rkl:          [SKIP][478] ([i915#14544]) -> [SKIP][479] ([i915#5286]) +3 other tests skip
   [478]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_big_fb@4-tiled-8bpp-rotate-90.html
   [479]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_big_fb@4-tiled-8bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-32bpp-rotate-270:
    - shard-rkl:          [SKIP][480] ([i915#14544]) -> [SKIP][481] ([i915#3638])
   [480]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_big_fb@x-tiled-32bpp-rotate-270.html
   [481]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_big_fb@x-tiled-32bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-8bpp-rotate-90:
    - shard-rkl:          [SKIP][482] ([i915#3638]) -> [SKIP][483] ([i915#14544]) +3 other tests skip
   [482]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_big_fb@x-tiled-8bpp-rotate-90.html
   [483]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_big_fb@x-tiled-8bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-async-flip:
    - shard-rkl:          [SKIP][484] ([i915#14544]) -> [SKIP][485] +9 other tests skip
   [484]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-async-flip.html
   [485]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180-async-flip.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs:
    - shard-rkl:          [SKIP][486] ([i915#14098] / [i915#6095]) -> [SKIP][487] ([i915#14544]) +12 other tests skip
   [486]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs.html
   [487]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-mc-ccs@pipe-b-hdmi-a-2:
    - shard-rkl:          [SKIP][488] ([i915#6095]) -> [SKIP][489] ([i915#14098] / [i915#6095]) +1 other test skip
   [488]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-mc-ccs@pipe-b-hdmi-a-2.html
   [489]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-mc-ccs@pipe-b-hdmi-a-2.html

  * igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs:
    - shard-rkl:          [SKIP][490] ([i915#14544]) -> [SKIP][491] ([i915#14098] / [i915#6095]) +7 other tests skip
   [490]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs.html
   [491]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_ccs@missing-ccs-buffer-4-tiled-mtl-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-bmg-ccs:
    - shard-rkl:          [SKIP][492] ([i915#14544]) -> [SKIP][493] ([i915#12313]) +1 other test skip
   [492]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_ccs@random-ccs-data-4-tiled-bmg-ccs.html
   [493]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_ccs@random-ccs-data-4-tiled-bmg-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
    - shard-rkl:          [SKIP][494] ([i915#12313]) -> [SKIP][495] ([i915#14544])
   [494]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html
   [495]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html

  * igt@kms_cdclk@mode-transition:
    - shard-rkl:          [SKIP][496] ([i915#3742]) -> [SKIP][497] ([i915#14544] / [i915#3742])
   [496]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_cdclk@mode-transition.html
   [497]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_cdclk@mode-transition.html

  * igt@kms_chamelium_edid@dp-mode-timings:
    - shard-dg1:          [SKIP][498] ([i915#11151] / [i915#4423] / [i915#7828]) -> [SKIP][499] ([i915#11151] / [i915#7828])
   [498]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-14/igt@kms_chamelium_edid@dp-mode-timings.html
   [499]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-13/igt@kms_chamelium_edid@dp-mode-timings.html

  * igt@kms_chamelium_frames@hdmi-cmp-planar-formats:
    - shard-rkl:          [SKIP][500] ([i915#11151] / [i915#14544] / [i915#7828]) -> [SKIP][501] ([i915#11151] / [i915#7828]) +4 other tests skip
   [500]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_chamelium_frames@hdmi-cmp-planar-formats.html
   [501]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_chamelium_frames@hdmi-cmp-planar-formats.html

  * igt@kms_chamelium_hpd@hdmi-hpd-storm:
    - shard-rkl:          [SKIP][502] ([i915#11151] / [i915#7828]) -> [SKIP][503] ([i915#11151] / [i915#14544] / [i915#7828]) +4 other tests skip
   [502]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_chamelium_hpd@hdmi-hpd-storm.html
   [503]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_chamelium_hpd@hdmi-hpd-storm.html

  * igt@kms_color@deep-color:
    - shard-rkl:          [SKIP][504] ([i915#12655] / [i915#14544] / [i915#3555]) -> [SKIP][505] ([i915#12655] / [i915#3555])
   [504]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_color@deep-color.html
   [505]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_color@deep-color.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-rkl:          [SKIP][506] ([i915#3116]) -> [SKIP][507] ([i915#14544])
   [506]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-3/igt@kms_content_protection@dp-mst-lic-type-0.html
   [507]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_content_protection@lic-type-1:
    - shard-rkl:          [SKIP][508] ([i915#14544]) -> [SKIP][509] ([i915#9424])
   [508]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_content_protection@lic-type-1.html
   [509]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_content_protection@lic-type-1.html

  * igt@kms_content_protection@mei-interface:
    - shard-dg1:          [SKIP][510] ([i915#9433]) -> [SKIP][511] ([i915#9424])
   [510]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-13/igt@kms_content_protection@mei-interface.html
   [511]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-18/igt@kms_content_protection@mei-interface.html

  * igt@kms_content_protection@srm:
    - shard-rkl:          [SKIP][512] ([i915#14544]) -> [SKIP][513] ([i915#7118])
   [512]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_content_protection@srm.html
   [513]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-4/igt@kms_content_protection@srm.html

  * igt@kms_content_protection@type1:
    - shard-rkl:          [SKIP][514] ([i915#7118] / [i915#9424]) -> [SKIP][515] ([i915#14544]) +1 other test skip
   [514]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_content_protection@type1.html
   [515]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_content_protection@type1.html

  * igt@kms_cursor_crc@cursor-onscreen-32x32:
    - shard-rkl:          [SKIP][516] ([i915#3555]) -> [SKIP][517] ([i915#14544]) +3 other tests skip
   [516]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_cursor_crc@cursor-onscreen-32x32.html
   [517]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_cursor_crc@cursor-onscreen-32x32.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x10:
    - shard-rkl:          [SKIP][518] ([i915#14544]) -> [SKIP][519] ([i915#3555]) +1 other test skip
   [518]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html
   [519]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html

  * igt@kms_cursor_crc@cursor-rapid-movement-512x170:
    - shard-rkl:          [SKIP][520] ([i915#13049]) -> [SKIP][521] ([i915#14544]) +3 other tests skip
   [520]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_cursor_crc@cursor-rapid-movement-512x170.html
   [521]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_cursor_crc@cursor-rapid-movement-512x170.html

  * igt@kms_cursor_crc@cursor-rapid-movement-512x512:
    - shard-rkl:          [SKIP][522] ([i915#14544]) -> [SKIP][523] ([i915#13049])
   [522]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_cursor_crc@cursor-rapid-movement-512x512.html
   [523]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_cursor_crc@cursor-rapid-movement-512x512.html

  * igt@kms_cursor_crc@cursor-sliding-256x85:
    - shard-rkl:          [SKIP][524] ([i915#14544]) -> [FAIL][525] ([i915#13566])
   [524]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_cursor_crc@cursor-sliding-256x85.html
   [525]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_cursor_crc@cursor-sliding-256x85.html

  * igt@kms_cursor_crc@cursor-sliding-32x32:
    - shard-dg1:          [SKIP][526] ([i915#3555]) -> [SKIP][527] ([i915#3555] / [i915#4423])
   [526]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-15/igt@kms_cursor_crc@cursor-sliding-32x32.html
   [527]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-13/igt@kms_cursor_crc@cursor-sliding-32x32.html

  * igt@kms_cursor_legacy@cursora-vs-flipa-atomic:
    - shard-rkl:          [DMESG-WARN][528] ([i915#12964]) -> [SKIP][529] ([i915#14544]) +1 other test skip
   [528]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_cursor_legacy@cursora-vs-flipa-atomic.html
   [529]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_cursor_legacy@cursora-vs-flipa-atomic.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle:
    - shard-rkl:          [SKIP][530] ([i915#14544]) -> [SKIP][531] ([i915#4103])
   [530]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html
   [531]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_cursor_legacy@short-busy-flip-before-cursor-toggle.html

  * igt@kms_dp_aux_dev:
    - shard-rkl:          [SKIP][532] ([i915#1257]) -> [SKIP][533] ([i915#1257] / [i915#14544])
   [532]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_dp_aux_dev.html
   [533]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_dp_aux_dev.html

  * igt@kms_dsc@dsc-with-bpc:
    - shard-rkl:          [SKIP][534] ([i915#14544]) -> [SKIP][535] ([i915#3555] / [i915#3840])
   [534]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_dsc@dsc-with-bpc.html
   [535]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_dsc@dsc-with-bpc.html

  * igt@kms_dsc@dsc-with-bpc-formats:
    - shard-rkl:          [SKIP][536] ([i915#3555] / [i915#3840]) -> [SKIP][537] ([i915#14544])
   [536]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_dsc@dsc-with-bpc-formats.html
   [537]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_dsc@dsc-with-bpc-formats.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc:
    - shard-rkl:          [SKIP][538] ([i915#14544]) -> [SKIP][539] ([i915#3840] / [i915#9053])
   [538]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_dsc@dsc-with-output-formats-with-bpc.html
   [539]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_dsc@dsc-with-output-formats-with-bpc.html

  * igt@kms_feature_discovery@chamelium:
    - shard-rkl:          [SKIP][540] ([i915#4854]) -> [SKIP][541] ([i915#14544] / [i915#4854])
   [540]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_feature_discovery@chamelium.html
   [541]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_feature_discovery@chamelium.html

  * igt@kms_feature_discovery@display-4x:
    - shard-rkl:          [SKIP][542] ([i915#14544] / [i915#1839]) -> [SKIP][543] ([i915#1839])
   [542]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_feature_discovery@display-4x.html
   [543]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_feature_discovery@display-4x.html

  * igt@kms_feature_discovery@psr1:
    - shard-rkl:          [SKIP][544] ([i915#658]) -> [SKIP][545] ([i915#14544] / [i915#658])
   [544]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-4/igt@kms_feature_discovery@psr1.html
   [545]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_feature_discovery@psr1.html

  * igt@kms_flip@2x-blocking-wf_vblank:
    - shard-rkl:          [SKIP][546] ([i915#14544] / [i915#9934]) -> [SKIP][547] ([i915#9934]) +3 other tests skip
   [546]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_flip@2x-blocking-wf_vblank.html
   [547]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_flip@2x-blocking-wf_vblank.html

  * igt@kms_flip@2x-flip-vs-wf_vblank-interruptible:
    - shard-rkl:          [SKIP][548] ([i915#9934]) -> [SKIP][549] ([i915#14544] / [i915#9934]) +8 other tests skip
   [548]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_flip@2x-flip-vs-wf_vblank-interruptible.html
   [549]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip@2x-flip-vs-wf_vblank-interruptible.html

  * igt@kms_flip@blocking-wf_vblank:
    - shard-rkl:          [DMESG-WARN][550] ([i915#12964]) -> [SKIP][551] ([i915#14544] / [i915#3637])
   [550]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_flip@blocking-wf_vblank.html
   [551]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip@blocking-wf_vblank.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling:
    - shard-rkl:          [SKIP][552] ([i915#14544] / [i915#3555]) -> [SKIP][553] ([i915#2672] / [i915#3555]) +2 other tests skip
   [552]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling.html
   [553]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-16bpp-4tile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
    - shard-rkl:          [SKIP][554] ([i915#2672] / [i915#3555]) -> [SKIP][555] ([i915#14544] / [i915#3555]) +3 other tests skip
   [554]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html
   [555]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-rkl:          [DMESG-WARN][556] ([i915#12964]) -> [SKIP][557] ([i915#14544] / [i915#1849] / [i915#5354])
   [556]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc.html
   [557]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt:
    - shard-rkl:          [SKIP][558] ([i915#1825]) -> [SKIP][559] ([i915#14544] / [i915#1849] / [i915#5354]) +24 other tests skip
   [558]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt.html
   [559]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-tiling-4:
    - shard-rkl:          [SKIP][560] ([i915#5439]) -> [SKIP][561] ([i915#14544] / [i915#1849] / [i915#5354])
   [560]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_frontbuffer_tracking@fbc-tiling-4.html
   [561]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-tiling-4.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscreen-pri-indfb-draw-pwrite:
    - shard-rkl:          [SKIP][562] ([i915#15102]) -> [SKIP][563] ([i915#14544]) +2 other tests skip
   [562]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscreen-pri-indfb-draw-pwrite.html
   [563]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscreen-pri-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-move:
    - shard-dg2:          [SKIP][564] ([i915#15102] / [i915#3458]) -> [SKIP][565] ([i915#10433] / [i915#15102] / [i915#3458])
   [564]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-1/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-move.html
   [565]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-move.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-render:
    - shard-dg1:          [SKIP][566] ([i915#15102] / [i915#3458] / [i915#4423]) -> [SKIP][567] ([i915#15102] / [i915#3458])
   [566]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg1-13/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-render.html
   [567]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg1-17/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt:
    - shard-dg2:          [SKIP][568] ([i915#10433] / [i915#15102] / [i915#3458]) -> [SKIP][569] ([i915#15102] / [i915#3458]) +1 other test skip
   [568]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-dg2-4/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt.html
   [569]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-dg2-5/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-shrfb-fliptrack-mmap-gtt:
    - shard-rkl:          [SKIP][570] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][571]
   [570]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-shrfb-fliptrack-mmap-gtt.html
   [571]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_frontbuffer_tracking@fbcpsr-2p-shrfb-fliptrack-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-gtt:
    - shard-rkl:          [SKIP][572] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][573] ([i915#15102] / [i915#3023]) +12 other tests skip
   [572]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-gtt.html
   [573]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_frontbuffer_tracking@fbcpsr-rgb565-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@psr-1p-rte:
    - shard-rkl:          [SKIP][574] ([i915#15102] / [i915#3023]) -> [SKIP][575] ([i915#14544] / [i915#1849] / [i915#5354]) +16 other tests skip
   [574]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-1p-rte.html
   [575]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-1p-rte.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-render:
    - shard-rkl:          [SKIP][576] ([i915#14544] / [i915#1849] / [i915#5354]) -> [SKIP][577] ([i915#1825]) +24 other tests skip
   [576]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-render.html
   [577]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-draw-render.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-rkl:          [SKIP][578] ([i915#12713]) -> [SKIP][579] ([i915#14544])
   [578]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@kms_hdr@brightness-with-hdr.html
   [579]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-rkl:          [SKIP][580] ([i915#3555] / [i915#8228]) -> [SKIP][581] ([i915#14544])
   [580]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_hdr@invalid-metadata-sizes.html
   [581]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_hdr@static-swap:
    - shard-rkl:          [SKIP][582] ([i915#14544]) -> [SKIP][583] ([i915#3555] / [i915#8228]) +1 other test skip
   [582]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_hdr@static-swap.html
   [583]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_hdr@static-swap.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-rkl:          [SKIP][584] ([i915#12388]) -> [SKIP][585] ([i915#12388] / [i915#14544])
   [584]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_joiner@invalid-modeset-force-big-joiner.html
   [585]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_joiner@invalid-modeset-ultra-joiner:
    - shard-rkl:          [SKIP][586] ([i915#12339] / [i915#14544]) -> [SKIP][587] ([i915#12339])
   [586]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_joiner@invalid-modeset-ultra-joiner.html
   [587]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_joiner@invalid-modeset-ultra-joiner.html

  * igt@kms_panel_fitting@atomic-fastset:
    - shard-rkl:          [SKIP][588] ([i915#6301]) -> [SKIP][589] ([i915#14544])
   [588]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_panel_fitting@atomic-fastset.html
   [589]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_panel_fitting@atomic-fastset.html

  * igt@kms_plane@pixel-format:
    - shard-rkl:          [DMESG-WARN][590] ([i915#12964]) -> [SKIP][591] ([i915#14544] / [i915#8825])
   [590]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_plane@pixel-format.html
   [591]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_plane@pixel-format.html

  * igt@kms_plane_multiple@2x-tiling-x:
    - shard-rkl:          [SKIP][592] ([i915#14544]) -> [SKIP][593] ([i915#13958])
   [592]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_multiple@2x-tiling-x.html
   [593]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_plane_multiple@2x-tiling-x.html

  * igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-a:
    - shard-rkl:          [SKIP][594] ([i915#12247] / [i915#14544]) -> [SKIP][595] ([i915#12247])
   [594]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-a.html
   [595]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-a.html

  * igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-b:
    - shard-rkl:          [SKIP][596] ([i915#12247] / [i915#14544] / [i915#8152]) -> [SKIP][597] ([i915#12247]) +1 other test skip
   [596]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-b.html
   [597]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_plane_scaling@plane-scaler-unity-scaling-with-rotation@pipe-b.html

  * igt@kms_pm_backlight@bad-brightness:
    - shard-rkl:          [SKIP][598] ([i915#5354]) -> [SKIP][599] ([i915#14544] / [i915#5354])
   [598]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_pm_backlight@bad-brightness.html
   [599]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_pm_backlight@bad-brightness.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-tglu:         [FAIL][600] ([i915#9295]) -> [SKIP][601] ([i915#15128])
   [600]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-tglu-10/igt@kms_pm_dc@dc6-dpms.html
   [601]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-tglu-6/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_dc@dc6-psr:
    - shard-rkl:          [SKIP][602] ([i915#14544] / [i915#9685]) -> [SKIP][603] ([i915#9685])
   [602]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_pm_dc@dc6-psr.html
   [603]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_pm_dc@dc6-psr.html

  * igt@kms_pm_dc@dc9-dpms:
    - shard-rkl:          [SKIP][604] ([i915#3361]) -> [SKIP][605] ([i915#4281])
   [604]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_pm_dc@dc9-dpms.html
   [605]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_pm_dc@dc9-dpms.html

  * igt@kms_pm_rpm@dpms-mode-unset-lpsp:
    - shard-rkl:          [SKIP][606] ([i915#15073]) -> [SKIP][607] ([i915#12916] / [i915#14544])
   [606]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html
   [607]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html

  * igt@kms_pm_rpm@modeset-lpsp-stress:
    - shard-rkl:          [SKIP][608] ([i915#15073]) -> [SKIP][609] ([i915#14544] / [i915#15073]) +1 other test skip
   [608]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_pm_rpm@modeset-lpsp-stress.html
   [609]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_pm_rpm@modeset-lpsp-stress.html

  * igt@kms_prime@basic-crc-hybrid:
    - shard-rkl:          [SKIP][610] ([i915#6524]) -> [SKIP][611] ([i915#14544] / [i915#6524])
   [610]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@kms_prime@basic-crc-hybrid.html
   [611]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_prime@basic-crc-hybrid.html

  * igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area:
    - shard-rkl:          [SKIP][612] ([i915#11520]) -> [SKIP][613] ([i915#11520] / [i915#14544]) +7 other tests skip
   [612]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-4/igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area.html
   [613]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area.html

  * igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf:
    - shard-rkl:          [SKIP][614] ([i915#11520] / [i915#14544]) -> [SKIP][615] ([i915#11520]) +5 other tests skip
   [614]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf.html
   [615]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@kms_psr2_sf@pr-cursor-plane-move-continuous-sf.html

  * igt@kms_psr@fbc-pr-suspend:
    - shard-rkl:          [SKIP][616] ([i915#1072] / [i915#9732]) -> [SKIP][617] ([i915#1072] / [i915#14544] / [i915#9732]) +18 other tests skip
   [616]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@kms_psr@fbc-pr-suspend.html
   [617]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_psr@fbc-pr-suspend.html

  * igt@kms_psr@psr-sprite-plane-move:
    - shard-rkl:          [SKIP][618] ([i915#1072] / [i915#14544] / [i915#9732]) -> [SKIP][619] ([i915#1072] / [i915#9732]) +15 other tests skip
   [618]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_psr@psr-sprite-plane-move.html
   [619]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@kms_psr@psr-sprite-plane-move.html

  * igt@kms_rotation_crc@multiplane-rotation:
    - shard-rkl:          [SKIP][620] ([i915#14544]) -> [DMESG-WARN][621] ([i915#12964]) +1 other test dmesg-warn
   [620]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_rotation_crc@multiplane-rotation.html
   [621]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_rotation_crc@multiplane-rotation.html

  * igt@kms_rotation_crc@primary-4-tiled-reflect-x-0:
    - shard-rkl:          [SKIP][622] ([i915#5289]) -> [SKIP][623] ([i915#14544])
   [622]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@kms_rotation_crc@primary-4-tiled-reflect-x-0.html
   [623]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_rotation_crc@primary-4-tiled-reflect-x-0.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-rkl:          [SKIP][624] ([i915#14544]) -> [SKIP][625] ([i915#5289])
   [624]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
   [625]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_setmode@clone-exclusive-crtc:
    - shard-rkl:          [SKIP][626] ([i915#14544] / [i915#3555]) -> [SKIP][627] ([i915#3555])
   [626]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_setmode@clone-exclusive-crtc.html
   [627]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_setmode@clone-exclusive-crtc.html

  * igt@kms_setmode@invalid-clone-exclusive-crtc:
    - shard-rkl:          [SKIP][628] ([i915#3555]) -> [SKIP][629] ([i915#14544] / [i915#3555])
   [628]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_setmode@invalid-clone-exclusive-crtc.html
   [629]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_setmode@invalid-clone-exclusive-crtc.html

  * igt@kms_sharpness_filter@filter-scaler-upscale:
    - shard-rkl:          [SKIP][630] ([i915#14544]) -> [SKIP][631] ([i915#15232])
   [630]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_sharpness_filter@filter-scaler-upscale.html
   [631]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-2/igt@kms_sharpness_filter@filter-scaler-upscale.html

  * igt@kms_sharpness_filter@invalid-filter-with-scaling-mode:
    - shard-rkl:          [SKIP][632] ([i915#15232]) -> [SKIP][633] ([i915#14544])
   [632]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-2/igt@kms_sharpness_filter@invalid-filter-with-scaling-mode.html
   [633]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_sharpness_filter@invalid-filter-with-scaling-mode.html

  * igt@kms_writeback@writeback-fb-id:
    - shard-rkl:          [SKIP][634] ([i915#14544] / [i915#2437]) -> [SKIP][635] ([i915#2437])
   [634]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@kms_writeback@writeback-fb-id.html
   [635]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@kms_writeback@writeback-fb-id.html

  * igt@kms_writeback@writeback-fb-id-xrgb2101010:
    - shard-rkl:          [SKIP][636] ([i915#2437] / [i915#9412]) -> [SKIP][637] ([i915#14544] / [i915#2437] / [i915#9412])
   [636]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-4/igt@kms_writeback@writeback-fb-id-xrgb2101010.html
   [637]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_writeback@writeback-fb-id-xrgb2101010.html

  * igt@kms_writeback@writeback-invalid-parameters:
    - shard-rkl:          [SKIP][638] ([i915#2437]) -> [SKIP][639] ([i915#14544] / [i915#2437])
   [638]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@kms_writeback@writeback-invalid-parameters.html
   [639]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@kms_writeback@writeback-invalid-parameters.html

  * igt@panthor/panthor_gem@bo_create_round_size:
    - shard-rkl:          [SKIP][640] ([i915#15265]) -> [SKIP][641] ([i915#14544] / [i915#15265]) +2 other tests skip
   [640]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-7/igt@panthor/panthor_gem@bo_create_round_size.html
   [641]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@panthor/panthor_gem@bo_create_round_size.html

  * igt@panthor/panthor_group@group_create:
    - shard-rkl:          [SKIP][642] ([i915#14544] / [i915#15265]) -> [SKIP][643] ([i915#15265])
   [642]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@panthor/panthor_group@group_create.html
   [643]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-7/igt@panthor/panthor_group@group_create.html

  * igt@perf@unprivileged-single-ctx-counters:
    - shard-rkl:          [SKIP][644] ([i915#2433]) -> [SKIP][645] ([i915#14544] / [i915#2433])
   [644]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-5/igt@perf@unprivileged-single-ctx-counters.html
   [645]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@perf@unprivileged-single-ctx-counters.html

  * igt@prime_vgem@basic-fence-read:
    - shard-rkl:          [SKIP][646] ([i915#14544] / [i915#3291] / [i915#3708]) -> [SKIP][647] ([i915#3291] / [i915#3708])
   [646]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@prime_vgem@basic-fence-read.html
   [647]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@prime_vgem@basic-fence-read.html

  * igt@prime_vgem@fence-read-hang:
    - shard-rkl:          [SKIP][648] ([i915#3708]) -> [SKIP][649] ([i915#14544] / [i915#3708])
   [648]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-8/igt@prime_vgem@fence-read-hang.html
   [649]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-6/igt@prime_vgem@fence-read-hang.html

  * igt@prime_vgem@fence-write-hang:
    - shard-rkl:          [SKIP][650] ([i915#14544] / [i915#3708]) -> [SKIP][651] ([i915#3708])
   [650]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@prime_vgem@fence-write-hang.html
   [651]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-5/igt@prime_vgem@fence-write-hang.html

  * igt@sriov_basic@enable-vfs-autoprobe-off:
    - shard-rkl:          [SKIP][652] ([i915#14544] / [i915#9917]) -> [SKIP][653] ([i915#9917])
   [652]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8618/shard-rkl-6/igt@sriov_basic@enable-vfs-autoprobe-off.html
   [653]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/shard-rkl-8/igt@sriov_basic@enable-vfs-autoprobe-off.html

  
  [i915#10056]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10056
  [i915#10307]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10307
  [i915#10433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10433
  [i915#10434]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10434
  [i915#10553]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10553
  [i915#10656]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10656
  [i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
  [i915#1099]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1099
  [i915#11078]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11078
  [i915#11151]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11151
  [i915#11190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11190
  [i915#11520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11520
  [i915#11521]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11521
  [i915#11713]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11713
  [i915#11943]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11943
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#12247]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12247
  [i915#12313]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12313
  [i915#12316]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12316
  [i915#12339]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12339
  [i915#12388]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12388
  [i915#12392]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12392
  [i915#12549]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12549
  [i915#1257]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1257
  [i915#12655]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12655
  [i915#12713]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12713
  [i915#12755]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12755
  [i915#12796]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12796
  [i915#12910]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12910
  [i915#12916]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12916
  [i915#12917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12917
  [i915#12964]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12964
  [i915#13029]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13029
  [i915#13046]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13046
  [i915#13049]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13049
  [i915#13356]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13356
  [i915#13363]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13363
  [i915#13398]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13398
  [i915#13427]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13427
  [i915#13522]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13522
  [i915#13566]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13566
  [i915#13688]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13688
  [i915#13707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13707
  [i915#13717]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13717
  [i915#13749]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13749
  [i915#13781]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13781
  [i915#13790]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13790
  [i915#13820]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13820
  [i915#13958]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13958
  [i915#14033]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14033
  [i915#14073]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14073
  [i915#14098]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14098
  [i915#14118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14118
  [i915#14259]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14259
  [i915#14350]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14350
  [i915#14433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14433
  [i915#14544]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14544
  [i915#14545]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14545
  [i915#14561]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14561
  [i915#14809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14809
  [i915#14849]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14849
  [i915#14871]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14871
  [i915#15060]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15060
  [i915#15073]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15073
  [i915#15095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15095
  [i915#15102]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15102
  [i915#15104]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15104
  [i915#15106]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15106
  [i915#15128]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15128
  [i915#15131]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15131
  [i915#15138]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15138
  [i915#15232]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15232
  [i915#15243]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15243
  [i915#15265]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15265
  [i915#1769]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1769
  [i915#1825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1825
  [i915#1839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1839
  [i915#1849]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1849
  [i915#2346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2346
  [i915#2433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2433
  [i915#2437]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2437
  [i915#2527]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2527
  [i915#2575]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2575
  [i915#2587]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2587
  [i915#2672]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2672
  [i915#2681]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2681
  [i915#280]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/280
  [i915#284]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/284
  [i915#2856]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2856
  [i915#3023]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3023
  [i915#3116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3116
  [i915#3281]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3282
  [i915#3291]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3291
  [i915#3297]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3297
  [i915#3299]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3299
  [i915#3361]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3361
  [i915#3458]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3458
  [i915#3469]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3469
  [i915#3539]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3539
  [i915#3555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3555
  [i915#3637]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3637
  [i915#3638]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3638
  [i915#3708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3708
  [i915#3742]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3742
  [i915#3804]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3804
  [i915#3828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3828
  [i915#3840]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3840
  [i915#4077]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4077
  [i915#4083]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4083
  [i915#4103]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4103
  [i915#4213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4213
  [i915#4270]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4270
  [i915#4281]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4281
  [i915#4349]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4349
  [i915#4391]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4391
  [i915#4423]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4423
  [i915#4525]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4525
  [i915#4537]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4537
  [i915#4538]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4538
  [i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613
  [i915#4812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4812
  [i915#4816]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4816
  [i915#4817]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4817
  [i915#4852]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4852
  [i915#4854]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4854
  [i915#4860]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4860
  [i915#4880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4880
  [i915#4885]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4885
  [i915#5138]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5138
  [i915#5190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5190
  [i915#5286]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5286
  [i915#5289]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5289
  [i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
  [i915#5439]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5439
  [i915#5723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5723
  [i915#5956]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5956
  [i915#6095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6095
  [i915#6113]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6113
  [i915#6187]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6187
  [i915#6245]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6245
  [i915#6301]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6301
  [i915#6335]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6335
  [i915#6344]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6344
  [i915#6412]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6412
  [i915#6524]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6524
  [i915#658]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/658
  [i915#6806]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6806
  [i915#6880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6880
  [i915#6944]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6944
  [i915#6953]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6953
  [i915#7116]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7116
  [i915#7118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7118
  [i915#7294]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7294
  [i915#7707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7707
  [i915#7828]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7828
  [i915#7984]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7984
  [i915#8152]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8152
  [i915#8228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8228
  [i915#8399]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8399
  [i915#8411]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8411
  [i915#8428]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8428
  [i915#8430]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8430
  [i915#8516]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8516
  [i915#8555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8555
  [i915#8562]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8562
  [i915#8623]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8623
  [i915#8708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8708
  [i915#8808]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8808
  [i915#8809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8809
  [i915#8812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8812
  [i915#8813]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8813
  [i915#8825]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8825
  [i915#8826]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8826
  [i915#9053]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9053
  [i915#9295]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9295
  [i915#9323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9323
  [i915#9340]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9340
  [i915#9412]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9412
  [i915#9423]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9423
  [i915#9424]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9424
  [i915#9433]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9433
  [i915#9683]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9683
  [i915#9685]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9685
  [i915#9688]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9688
  [i915#9723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9723
  [i915#9732]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9732
  [i915#9738]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9738
  [i915#9808]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9808
  [i915#9812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9812
  [i915#9878]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9878
  [i915#9906]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9906
  [i915#9917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9917
  [i915#9934]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9934


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_8618 -> IGTPW_14032

  CI-20190529: 20190529
  CI_DRM_17525: a9792b1ab75123e4aceaba953a89809e745919c6 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_14032: 14032
  IGT_8618: 8618

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_14032/index.html

[-- Attachment #2: Type: text/html, Size: 212435 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* ✗ Xe.CI.Full: failure for Unigraf integration (rev3)
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (48 preceding siblings ...)
  2025-11-11  5:34 ` ✓ i915.CI.Full: " Patchwork
@ 2025-11-11  5:49 ` Patchwork
  2025-12-18 14:50 ` [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
  2026-01-20 21:09 ` Luca Ceresoli
  51 siblings, 0 replies; 90+ messages in thread
From: Patchwork @ 2025-11-11  5:49 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev

[-- Attachment #1: Type: text/plain, Size: 53643 bytes --]

== Series Details ==

Series: Unigraf integration (rev3)
URL   : https://patchwork.freedesktop.org/series/151772/
State : failure

== Summary ==

CI Bug Log - changes from XEIGT_8618_FULL -> XEIGTPW_14032_FULL
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with XEIGTPW_14032_FULL absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in XEIGTPW_14032_FULL, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
  to document this new failure mode, which will reduce false positives in CI.

  

Participating hosts (4 -> 3)
------------------------------

  Missing    (1): shard-adlp 

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in XEIGTPW_14032_FULL:

### IGT changes ###

#### Possible regressions ####

  * igt@xe_peer2peer@write@write-gpua-vram01-gpub-system-p2p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][1]
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-432/igt@xe_peer2peer@write@write-gpua-vram01-gpub-system-p2p.html

  
#### Warnings ####

  * igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p:
    - shard-dg2-set2:     [SKIP][2] ([Intel XE#6566]) -> [SKIP][3]
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-dg2-466/igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p.html
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@xe_peer2peer@read@read-gpua-vram01-gpub-system-p2p.html

  
Known issues
------------

  Here are the changes found in XEIGTPW_14032_FULL that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_async_flips@async-flip-with-page-flip-events-linear-atomic@pipe-c-edp-1:
    - shard-lnl:          [PASS][4] -> [FAIL][5] ([Intel XE#6054]) +3 other tests fail
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-lnl-1/igt@kms_async_flips@async-flip-with-page-flip-events-linear-atomic@pipe-c-edp-1.html
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-8/igt@kms_async_flips@async-flip-with-page-flip-events-linear-atomic@pipe-c-edp-1.html

  * igt@kms_big_fb@4-tiled-32bpp-rotate-90:
    - shard-bmg:          NOTRUN -> [SKIP][6] ([Intel XE#2327])
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_big_fb@4-tiled-32bpp-rotate-90.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][7] ([Intel XE#316])
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-432/igt@kms_big_fb@4-tiled-32bpp-rotate-90.html
    - shard-lnl:          NOTRUN -> [SKIP][8] ([Intel XE#1407]) +1 other test skip
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-3/igt@kms_big_fb@4-tiled-32bpp-rotate-90.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip:
    - shard-lnl:          NOTRUN -> [SKIP][9] ([Intel XE#3658])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-8/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@y-tiled-addfb:
    - shard-dg2-set2:     NOTRUN -> [SKIP][10] ([Intel XE#619])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_big_fb@y-tiled-addfb.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0:
    - shard-lnl:          NOTRUN -> [SKIP][11] ([Intel XE#1124]) +3 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-2/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-64bpp-rotate-180:
    - shard-dg2-set2:     NOTRUN -> [SKIP][12] ([Intel XE#1124]) +9 other tests skip
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@kms_big_fb@yf-tiled-64bpp-rotate-180.html

  * igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
    - shard-bmg:          NOTRUN -> [SKIP][13] ([Intel XE#607])
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-4/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][14] ([Intel XE#607])
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html
    - shard-lnl:          NOTRUN -> [SKIP][15] ([Intel XE#1477])
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180:
    - shard-bmg:          NOTRUN -> [SKIP][16] ([Intel XE#1124]) +5 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-180.html

  * igt@kms_bw@connected-linear-tiling-3-displays-2160x1440p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][17] ([Intel XE#2191]) +1 other test skip
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@kms_bw@connected-linear-tiling-3-displays-2160x1440p.html

  * igt@kms_bw@linear-tiling-1-displays-1920x1080p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][18] ([Intel XE#367]) +3 other tests skip
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_bw@linear-tiling-1-displays-1920x1080p.html

  * igt@kms_bw@linear-tiling-2-displays-3840x2160p:
    - shard-bmg:          NOTRUN -> [SKIP][19] ([Intel XE#367]) +1 other test skip
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_bw@linear-tiling-2-displays-3840x2160p.html

  * igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][20] ([Intel XE#2887]) +4 other tests skip
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_ccs@crc-primary-basic-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_ccs@crc-primary-basic-y-tiled-gen12-rc-ccs-cc:
    - shard-lnl:          NOTRUN -> [SKIP][21] ([Intel XE#2887]) +1 other test skip
   [21]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-1/igt@kms_ccs@crc-primary-basic-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs@pipe-b-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][22] ([Intel XE#2652] / [Intel XE#787]) +3 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs@pipe-b-dp-2.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][23] ([Intel XE#3432]) +1 other test skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc.html
    - shard-lnl:          NOTRUN -> [SKIP][24] ([Intel XE#3432])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-d-dp-4:
    - shard-dg2-set2:     NOTRUN -> [SKIP][25] ([Intel XE#455] / [Intel XE#787]) +19 other tests skip
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs-cc@pipe-d-dp-4.html

  * igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-mc-ccs@pipe-b-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [SKIP][26] ([Intel XE#787]) +69 other tests skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@kms_ccs@crc-sprite-planes-basic-y-tiled-gen12-mc-ccs@pipe-b-hdmi-a-6.html

  * igt@kms_chamelium_color@ctm-0-75:
    - shard-dg2-set2:     NOTRUN -> [SKIP][27] ([Intel XE#306]) +2 other tests skip
   [27]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@kms_chamelium_color@ctm-0-75.html
    - shard-lnl:          NOTRUN -> [SKIP][28] ([Intel XE#306])
   [28]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-2/igt@kms_chamelium_color@ctm-0-75.html
    - shard-bmg:          NOTRUN -> [SKIP][29] ([Intel XE#2325])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-4/igt@kms_chamelium_color@ctm-0-75.html

  * igt@kms_chamelium_frames@dp-crc-single:
    - shard-bmg:          NOTRUN -> [SKIP][30] ([Intel XE#2252]) +3 other tests skip
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-4/igt@kms_chamelium_frames@dp-crc-single.html

  * igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe:
    - shard-dg2-set2:     NOTRUN -> [SKIP][31] ([Intel XE#373]) +5 other tests skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe.html
    - shard-lnl:          NOTRUN -> [SKIP][32] ([Intel XE#373]) +1 other test skip
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-1/igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe.html

  * igt@kms_content_protection@dp-mst-lic-type-1:
    - shard-bmg:          NOTRUN -> [SKIP][33] ([Intel XE#2390])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-4/igt@kms_content_protection@dp-mst-lic-type-1.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][34] ([Intel XE#307])
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-463/igt@kms_content_protection@dp-mst-lic-type-1.html

  * igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
    - shard-bmg:          NOTRUN -> [FAIL][35] ([Intel XE#1178])
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html

  * igt@kms_content_protection@uevent:
    - shard-dg2-set2:     NOTRUN -> [FAIL][36] ([Intel XE#1188]) +1 other test fail
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_crc@cursor-offscreen-512x170:
    - shard-bmg:          NOTRUN -> [SKIP][37] ([Intel XE#2321])
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@kms_cursor_crc@cursor-offscreen-512x170.html

  * igt@kms_cursor_crc@cursor-onscreen-512x170:
    - shard-dg2-set2:     NOTRUN -> [SKIP][38] ([Intel XE#308]) +1 other test skip
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-464/igt@kms_cursor_crc@cursor-onscreen-512x170.html

  * igt@kms_cursor_crc@cursor-sliding-32x10:
    - shard-bmg:          NOTRUN -> [SKIP][39] ([Intel XE#2320])
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_cursor_crc@cursor-sliding-32x10.html

  * igt@kms_cursor_legacy@cursor-vs-flip-varying-size:
    - shard-bmg:          [PASS][40] -> [DMESG-WARN][41] ([Intel XE#5354])
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-7/igt@kms_cursor_legacy@cursor-vs-flip-varying-size.html
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-7/igt@kms_cursor_legacy@cursor-vs-flip-varying-size.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-legacy:
    - shard-bmg:          [PASS][42] -> [SKIP][43] ([Intel XE#2291]) +2 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-5/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic:
    - shard-bmg:          [PASS][44] -> [FAIL][45] ([Intel XE#1475])
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_cursor_legacy@flip-vs-cursor-atomic.html

  * igt@kms_cursor_legacy@flip-vs-cursor-legacy:
    - shard-bmg:          NOTRUN -> [FAIL][46] ([Intel XE#4633])
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_cursor_legacy@flip-vs-cursor-legacy.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
    - shard-dg2-set2:     NOTRUN -> [SKIP][47] ([Intel XE#323])
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

  * igt@kms_dsc@dsc-with-formats:
    - shard-lnl:          NOTRUN -> [SKIP][48] ([Intel XE#2244])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-1/igt@kms_dsc@dsc-with-formats.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc:
    - shard-dg2-set2:     NOTRUN -> [SKIP][49] ([Intel XE#455]) +16 other tests skip
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-435/igt@kms_dsc@dsc-with-output-formats-with-bpc.html

  * igt@kms_feature_discovery@psr1:
    - shard-bmg:          NOTRUN -> [SKIP][50] ([Intel XE#2374])
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@kms_feature_discovery@psr1.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][51] ([Intel XE#1135])
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-433/igt@kms_feature_discovery@psr1.html

  * igt@kms_flip@2x-busy-flip:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#2316])
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_flip@2x-busy-flip.html

  * igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible:
    - shard-bmg:          [PASS][53] -> [SKIP][54] ([Intel XE#2316]) +1 other test skip
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-2/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-on-nop-interruptible.html

  * igt@kms_flip@2x-plain-flip-fb-recreate:
    - shard-lnl:          NOTRUN -> [SKIP][55] ([Intel XE#1421]) +2 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-4/igt@kms_flip@2x-plain-flip-fb-recreate.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-lnl:          [PASS][56] -> [FAIL][57] ([Intel XE#301]) +1 other test fail
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-3/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling:
    - shard-bmg:          NOTRUN -> [SKIP][58] ([Intel XE#2293] / [Intel XE#2380]) +1 other test skip
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html
    - shard-lnl:          NOTRUN -> [SKIP][59] ([Intel XE#1401] / [Intel XE#1745]) +2 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][60] ([Intel XE#1401]) +2 other tests skip
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-16bpp-yftile-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode:
    - shard-bmg:          NOTRUN -> [SKIP][61] ([Intel XE#2293]) +1 other test skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-7/igt@kms_flip_scaled_crc@flip-64bpp-yftile-to-32bpp-yftile-upscaling@pipe-a-valid-mode.html

  * igt@kms_frontbuffer_tracking@drrs-slowdraw:
    - shard-lnl:          NOTRUN -> [SKIP][62] ([Intel XE#651]) +2 other tests skip
   [62]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-1/igt@kms_frontbuffer_tracking@drrs-slowdraw.html

  * igt@kms_frontbuffer_tracking@fbc-1p-offscreen-pri-indfb-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][63] ([Intel XE#6313])
   [63]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-1p-offscreen-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff:
    - shard-bmg:          NOTRUN -> [SKIP][64] ([Intel XE#5390]) +2 other tests skip
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-5/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][65] ([Intel XE#2311]) +7 other tests skip
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][66] ([Intel XE#651]) +13 other tests skip
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-blt.html
    - shard-lnl:          NOTRUN -> [SKIP][67] ([Intel XE#656]) +5 other tests skip
   [67]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][68] ([Intel XE#653]) +24 other tests skip
   [68]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][69] ([Intel XE#6312]) +3 other tests skip
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-435/igt@kms_frontbuffer_tracking@psr-1p-offscreen-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-bmg:          NOTRUN -> [SKIP][70] ([Intel XE#2313]) +13 other tests skip
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-5/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-lnl:          NOTRUN -> [SKIP][71] ([Intel XE#1503])
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-2/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_joiner@basic-big-joiner:
    - shard-dg2-set2:     NOTRUN -> [SKIP][72] ([Intel XE#346])
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@kms_joiner@basic-big-joiner.html

  * igt@kms_joiner@basic-ultra-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][73] ([Intel XE#2927])
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_joiner@basic-ultra-joiner.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][74] ([Intel XE#2927])
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_joiner@basic-ultra-joiner.html

  * igt@kms_plane_multiple@2x-tiling-x:
    - shard-bmg:          [PASS][75] -> [SKIP][76] ([Intel XE#4596])
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-8/igt@kms_plane_multiple@2x-tiling-x.html
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-x.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-5:
    - shard-lnl:          NOTRUN -> [SKIP][77] ([Intel XE#2763]) +3 other tests skip
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-3/igt@kms_plane_scaling@planes-downscale-factor-0-5.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-5@pipe-c:
    - shard-bmg:          NOTRUN -> [SKIP][78] ([Intel XE#2763]) +4 other tests skip
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_plane_scaling@planes-downscale-factor-0-5@pipe-c.html

  * igt@kms_pm_backlight@basic-brightness:
    - shard-bmg:          NOTRUN -> [SKIP][79] ([Intel XE#870])
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-5/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_pm_backlight@fade:
    - shard-dg2-set2:     NOTRUN -> [SKIP][80] ([Intel XE#870]) +1 other test skip
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_pm_backlight@fade.html

  * igt@kms_pm_dc@dc5-dpms:
    - shard-lnl:          NOTRUN -> [FAIL][81] ([Intel XE#718])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@kms_pm_dc@dc5-dpms.html

  * igt@kms_pm_lpsp@kms-lpsp:
    - shard-bmg:          NOTRUN -> [SKIP][82] ([Intel XE#2499])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_pm_lpsp@kms-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-update-sf-dmg-area:
    - shard-dg2-set2:     NOTRUN -> [SKIP][83] ([Intel XE#1406] / [Intel XE#1489]) +8 other tests skip
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-433/igt@kms_psr2_sf@fbc-pr-overlay-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf:
    - shard-lnl:          NOTRUN -> [SKIP][84] ([Intel XE#1406] / [Intel XE#2893] / [Intel XE#4608])
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-2/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][85] ([Intel XE#1406] / [Intel XE#4608]) +1 other test skip
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-2/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-b-edp-1.html

  * igt@kms_psr2_sf@pr-cursor-plane-update-sf:
    - shard-lnl:          NOTRUN -> [SKIP][86] ([Intel XE#1406] / [Intel XE#2893])
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-3/igt@kms_psr2_sf@pr-cursor-plane-update-sf.html

  * igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area:
    - shard-bmg:          NOTRUN -> [SKIP][87] ([Intel XE#1406] / [Intel XE#1489]) +2 other tests skip
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr@fbc-psr2-cursor-plane-move:
    - shard-lnl:          NOTRUN -> [SKIP][88] ([Intel XE#1406])
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-1/igt@kms_psr@fbc-psr2-cursor-plane-move.html

  * igt@kms_psr@fbc-psr2-cursor-plane-move@edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][89] ([Intel XE#1406] / [Intel XE#4609])
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-1/igt@kms_psr@fbc-psr2-cursor-plane-move@edp-1.html

  * igt@kms_psr@psr-primary-page-flip:
    - shard-bmg:          NOTRUN -> [SKIP][90] ([Intel XE#1406] / [Intel XE#2234] / [Intel XE#2850]) +3 other tests skip
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@kms_psr@psr-primary-page-flip.html

  * igt@kms_psr@psr2-basic:
    - shard-dg2-set2:     NOTRUN -> [SKIP][91] ([Intel XE#1406] / [Intel XE#2850] / [Intel XE#929]) +7 other tests skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-433/igt@kms_psr@psr2-basic.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-bmg:          NOTRUN -> [SKIP][92] ([Intel XE#1406] / [Intel XE#2414])
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][93] ([Intel XE#1406] / [Intel XE#2939])
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@primary-x-tiled-reflect-x-180:
    - shard-lnl:          NOTRUN -> [FAIL][94] ([Intel XE#4689])
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-3/igt@kms_rotation_crc@primary-x-tiled-reflect-x-180.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-bmg:          NOTRUN -> [SKIP][95] ([Intel XE#3414] / [Intel XE#3904])
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][96] ([Intel XE#3414])
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-464/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_sharpness_filter@filter-scaler-upscale:
    - shard-bmg:          NOTRUN -> [SKIP][97] ([Intel XE#6503])
   [97]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_sharpness_filter@filter-scaler-upscale.html

  * igt@kms_vrr@lobf:
    - shard-bmg:          NOTRUN -> [SKIP][98] ([Intel XE#2168])
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-4/igt@kms_vrr@lobf.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][99] ([Intel XE#2168])
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-463/igt@kms_vrr@lobf.html

  * igt@xe_compute_preempt@compute-preempt-many-vram-evict:
    - shard-dg2-set2:     NOTRUN -> [SKIP][100] ([Intel XE#6360])
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@xe_compute_preempt@compute-preempt-many-vram-evict.html

  * igt@xe_copy_basic@mem-copy-linear-0xfffe:
    - shard-dg2-set2:     NOTRUN -> [SKIP][101] ([Intel XE#1123])
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@xe_copy_basic@mem-copy-linear-0xfffe.html

  * igt@xe_copy_basic@mem-set-linear-0x3fff:
    - shard-dg2-set2:     NOTRUN -> [SKIP][102] ([Intel XE#1126])
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@xe_copy_basic@mem-set-linear-0x3fff.html

  * igt@xe_copy_basic@mem-set-linear-0x8fffe:
    - shard-dg2-set2:     NOTRUN -> [SKIP][103] ([Intel XE#5503])
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-463/igt@xe_copy_basic@mem-set-linear-0x8fffe.html

  * igt@xe_eu_stall@invalid-gt-id:
    - shard-dg2-set2:     NOTRUN -> [SKIP][104] ([Intel XE#5626])
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-432/igt@xe_eu_stall@invalid-gt-id.html

  * igt@xe_eudebug_online@interrupt-all-set-breakpoint:
    - shard-dg2-set2:     NOTRUN -> [SKIP][105] ([Intel XE#4837]) +7 other tests skip
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-432/igt@xe_eudebug_online@interrupt-all-set-breakpoint.html
    - shard-lnl:          NOTRUN -> [SKIP][106] ([Intel XE#4837]) +2 other tests skip
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-3/igt@xe_eudebug_online@interrupt-all-set-breakpoint.html

  * igt@xe_eudebug_online@set-breakpoint:
    - shard-bmg:          NOTRUN -> [SKIP][107] ([Intel XE#4837]) +4 other tests skip
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@xe_eudebug_online@set-breakpoint.html

  * igt@xe_evict@evict-beng-mixed-threads-large:
    - shard-lnl:          NOTRUN -> [SKIP][108] ([Intel XE#688]) +2 other tests skip
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-3/igt@xe_evict@evict-beng-mixed-threads-large.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][109] ([Intel XE#2322]) +2 other tests skip
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-5/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-rebind.html
    - shard-lnl:          NOTRUN -> [SKIP][110] ([Intel XE#1392])
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-5/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-rebind.html

  * igt@xe_exec_fault_mode@twice-userptr-invalidate-race:
    - shard-dg2-set2:     NOTRUN -> [SKIP][111] ([Intel XE#288]) +13 other tests skip
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-463/igt@xe_exec_fault_mode@twice-userptr-invalidate-race.html

  * igt@xe_exec_system_allocator@many-execqueues-mmap-new-huge:
    - shard-lnl:          NOTRUN -> [SKIP][112] ([Intel XE#4943]) +3 other tests skip
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-8/igt@xe_exec_system_allocator@many-execqueues-mmap-new-huge.html

  * igt@xe_exec_system_allocator@process-many-large-mmap-huge-nomemset:
    - shard-bmg:          NOTRUN -> [SKIP][113] ([Intel XE#4943]) +4 other tests skip
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-7/igt@xe_exec_system_allocator@process-many-large-mmap-huge-nomemset.html

  * igt@xe_exec_system_allocator@process-many-stride-mmap-prefetch-shared:
    - shard-dg2-set2:     NOTRUN -> [SKIP][114] ([Intel XE#4915]) +220 other tests skip
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-433/igt@xe_exec_system_allocator@process-many-stride-mmap-prefetch-shared.html

  * igt@xe_exec_system_allocator@twice-large-malloc-prefetch-madvise:
    - shard-lnl:          NOTRUN -> [WARN][115] ([Intel XE#5786])
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@xe_exec_system_allocator@twice-large-malloc-prefetch-madvise.html

  * igt@xe_live_ktest@xe_eudebug:
    - shard-lnl:          NOTRUN -> [SKIP][116] ([Intel XE#2833])
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-5/igt@xe_live_ktest@xe_eudebug.html

  * igt@xe_media_fill@media-fill:
    - shard-bmg:          NOTRUN -> [SKIP][117] ([Intel XE#2459] / [Intel XE#2596])
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-4/igt@xe_media_fill@media-fill.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][118] ([Intel XE#560])
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-463/igt@xe_media_fill@media-fill.html

  * igt@xe_oa@oa-tlb-invalidate:
    - shard-lnl:          NOTRUN -> [SKIP][119] ([Intel XE#2248])
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@xe_oa@oa-tlb-invalidate.html
    - shard-bmg:          NOTRUN -> [SKIP][120] ([Intel XE#2248])
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@xe_oa@oa-tlb-invalidate.html

  * igt@xe_oa@polling-small-buf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][121] ([Intel XE#3573]) +5 other tests skip
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@xe_oa@polling-small-buf.html

  * igt@xe_peer2peer@write:
    - shard-bmg:          NOTRUN -> [SKIP][122] ([Intel XE#2427])
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-5/igt@xe_peer2peer@write.html
    - shard-lnl:          NOTRUN -> [SKIP][123] ([Intel XE#1061])
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-5/igt@xe_peer2peer@write.html

  * igt@xe_pmu@engine-activity-accuracy-90:
    - shard-lnl:          [PASS][124] -> [FAIL][125] ([Intel XE#6251]) +3 other tests fail
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-lnl-1/igt@xe_pmu@engine-activity-accuracy-90.html
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-2/igt@xe_pmu@engine-activity-accuracy-90.html

  * igt@xe_query@multigpu-query-invalid-cs-cycles:
    - shard-bmg:          NOTRUN -> [SKIP][126] ([Intel XE#944]) +2 other tests skip
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@xe_query@multigpu-query-invalid-cs-cycles.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][127] ([Intel XE#944]) +3 other tests skip
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-432/igt@xe_query@multigpu-query-invalid-cs-cycles.html

  * igt@xe_query@multigpu-query-uc-fw-version-huc:
    - shard-lnl:          NOTRUN -> [SKIP][128] ([Intel XE#944])
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-7/igt@xe_query@multigpu-query-uc-fw-version-huc.html

  * igt@xe_render_copy@render-stress-2-copies:
    - shard-dg2-set2:     NOTRUN -> [SKIP][129] ([Intel XE#4814])
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-466/igt@xe_render_copy@render-stress-2-copies.html

  * igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling:
    - shard-dg2-set2:     NOTRUN -> [SKIP][130] ([Intel XE#4130]) +1 other test skip
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-433/igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling.html

  * igt@xe_sriov_auto_provisioning@selfconfig-reprovision-increase-numvfs:
    - shard-lnl:          NOTRUN -> [SKIP][131] ([Intel XE#4130])
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-2/igt@xe_sriov_auto_provisioning@selfconfig-reprovision-increase-numvfs.html

  * igt@xe_sriov_vram@vf-access-beyond:
    - shard-dg2-set2:     NOTRUN -> [SKIP][132] ([Intel XE#6318])
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-464/igt@xe_sriov_vram@vf-access-beyond.html

  
#### Possible fixes ####

  * igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p:
    - shard-bmg:          [SKIP][133] ([Intel XE#2314] / [Intel XE#2894]) -> [PASS][134] +1 other test pass
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs:
    - shard-dg2-set2:     [INCOMPLETE][135] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#4345] / [Intel XE#6168]) -> [PASS][136]
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-dp-4:
    - shard-dg2-set2:     [INCOMPLETE][137] ([Intel XE#4345] / [Intel XE#6168]) -> [PASS][138]
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-dp-4.html
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-dp-4.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-6:
    - shard-dg2-set2:     [DMESG-WARN][139] ([Intel XE#1727] / [Intel XE#3113]) -> [PASS][140]
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-6.html
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-6.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
    - shard-bmg:          [SKIP][141] ([Intel XE#2291]) -> [PASS][142] +3 other tests pass
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-5/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html

  * igt@kms_cursor_legacy@single-bo:
    - shard-bmg:          [DMESG-WARN][143] ([Intel XE#5354]) -> [PASS][144] +1 other test pass
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-8/igt@kms_cursor_legacy@single-bo.html
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_cursor_legacy@single-bo.html

  * igt@kms_dp_aux_dev:
    - shard-bmg:          [SKIP][145] ([Intel XE#3009]) -> [PASS][146]
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_dp_aux_dev.html
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_dp_aux_dev.html

  * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible:
    - shard-bmg:          [SKIP][147] ([Intel XE#2316]) -> [PASS][148] +2 other tests pass
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-bmg:          [INCOMPLETE][149] ([Intel XE#2049] / [Intel XE#2597]) -> [PASS][150] +1 other test pass
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-7/igt@kms_flip@flip-vs-suspend.html
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-8/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-bmg:          [SKIP][151] ([Intel XE#3012]) -> [PASS][152]
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_joiner@invalid-modeset-force-big-joiner.html
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-5/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_plane_multiple@2x-tiling-none:
    - shard-bmg:          [SKIP][153] ([Intel XE#4596]) -> [PASS][154]
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_plane_multiple@2x-tiling-none.html
   [154]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_plane_multiple@2x-tiling-none.html

  * igt@kms_setmode@basic@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [FAIL][155] ([Intel XE#6361]) -> [PASS][156] +6 other tests pass
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-dg2-435/igt@kms_setmode@basic@pipe-a-hdmi-a-6.html
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-436/igt@kms_setmode@basic@pipe-a-hdmi-a-6.html

  * igt@kms_vrr@cmrr@pipe-a-edp-1:
    - shard-lnl:          [FAIL][157] ([Intel XE#4459]) -> [PASS][158] +1 other test pass
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-lnl-2/igt@kms_vrr@cmrr@pipe-a-edp-1.html
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-lnl-4/igt@kms_vrr@cmrr@pipe-a-edp-1.html

  * igt@xe_exec_system_allocator@many-stride-malloc-prefetch:
    - shard-bmg:          [WARN][159] ([Intel XE#5786]) -> [PASS][160]
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-2/igt@xe_exec_system_allocator@many-stride-malloc-prefetch.html
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@xe_exec_system_allocator@many-stride-malloc-prefetch.html

  * igt@xe_pmu@gt-c6-idle:
    - shard-dg2-set2:     [FAIL][161] ([Intel XE#6366]) -> [PASS][162]
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-dg2-436/igt@xe_pmu@gt-c6-idle.html
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-435/igt@xe_pmu@gt-c6-idle.html

  * igt@xe_pmu@gt-frequency:
    - shard-dg2-set2:     [FAIL][163] ([Intel XE#5166]) -> [PASS][164] +1 other test pass
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-dg2-435/igt@xe_pmu@gt-frequency.html
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-dg2-434/igt@xe_pmu@gt-frequency.html

  * igt@xe_sriov_auto_provisioning@selfconfig-reprovision-reduce-numvfs:
    - shard-bmg:          [FAIL][165] ([Intel XE#5937]) -> [PASS][166] +1 other test pass
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-8/igt@xe_sriov_auto_provisioning@selfconfig-reprovision-reduce-numvfs.html
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@xe_sriov_auto_provisioning@selfconfig-reprovision-reduce-numvfs.html

  * igt@xe_sriov_flr@flr-twice:
    - shard-bmg:          [FAIL][167] -> [PASS][168]
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-1/igt@xe_sriov_flr@flr-twice.html
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@xe_sriov_flr@flr-twice.html

  
#### Warnings ####

  * igt@kms_content_protection@lic-type-0:
    - shard-bmg:          [SKIP][169] ([Intel XE#2341]) -> [FAIL][170] ([Intel XE#1178])
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_content_protection@lic-type-0.html
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_content_protection@lic-type-0.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][171] ([Intel XE#2311]) -> [SKIP][172] ([Intel XE#2312]) +13 other tests skip
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][173] ([Intel XE#2312]) -> [SKIP][174] ([Intel XE#2311]) +11 other tests skip
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-msflip-blt:
    - shard-bmg:          [SKIP][175] ([Intel XE#2312]) -> [SKIP][176] ([Intel XE#5390]) +5 other tests skip
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-msflip-blt.html
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-render:
    - shard-bmg:          [SKIP][177] ([Intel XE#5390]) -> [SKIP][178] ([Intel XE#2312]) +7 other tests skip
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-7/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-render.html
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff:
    - shard-bmg:          [SKIP][179] ([Intel XE#2312]) -> [SKIP][180] ([Intel XE#2313]) +10 other tests skip
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff.html
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt:
    - shard-bmg:          [SKIP][181] ([Intel XE#2313]) -> [SKIP][182] ([Intel XE#2312]) +8 other tests skip
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-8/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          [FAIL][183] ([Intel XE#1729]) -> [SKIP][184] ([Intel XE#2426])
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-5/igt@kms_tiled_display@basic-test-pattern.html
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-2/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-bmg:          [SKIP][185] ([Intel XE#2509]) -> [SKIP][186] ([Intel XE#2426])
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8618/shard-bmg-5/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/shard-bmg-6/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  
  [Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
  [Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
  [Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
  [Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
  [Intel XE#1135]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1135
  [Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
  [Intel XE#1188]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1188
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1401]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1401
  [Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
  [Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
  [Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
  [Intel XE#1475]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1475
  [Intel XE#1477]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1477
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1729]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1729
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
  [Intel XE#2168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2168
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
  [Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
  [Intel XE#2248]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2248
  [Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
  [Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
  [Intel XE#2293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2293
  [Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
  [Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
  [Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
  [Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
  [Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
  [Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
  [Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
  [Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
  [Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
  [Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
  [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2374
  [Intel XE#2380]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2380
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2414
  [Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
  [Intel XE#2427]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2427
  [Intel XE#2459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2459
  [Intel XE#2499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2499
  [Intel XE#2509]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2509
  [Intel XE#2596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2596
  [Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
  [Intel XE#2833]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2833
  [Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
  [Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
  [Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
  [Intel XE#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
  [Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
  [Intel XE#2927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2927
  [Intel XE#2939]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2939
  [Intel XE#3009]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3009
  [Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
  [Intel XE#3012]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3012
  [Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
  [Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
  [Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
  [Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
  [Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
  [Intel XE#346]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/346
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
  [Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
  [Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
  [Intel XE#4345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4345
  [Intel XE#4459]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4459
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
  [Intel XE#4608]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4608
  [Intel XE#4609]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4609
  [Intel XE#4633]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4633
  [Intel XE#4689]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4689
  [Intel XE#4814]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4814
  [Intel XE#4837]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4837
  [Intel XE#4915]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4915
  [Intel XE#4943]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4943
  [Intel XE#5166]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5166
  [Intel XE#5354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5354
  [Intel XE#5390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5390
  [Intel XE#5503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5503
  [Intel XE#560]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/560
  [Intel XE#5626]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5626
  [Intel XE#5786]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5786
  [Intel XE#5937]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5937
  [Intel XE#6054]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6054
  [Intel XE#607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/607
  [Intel XE#6168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6168
  [Intel XE#619]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/619
  [Intel XE#6251]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6251
  [Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
  [Intel XE#6313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6313
  [Intel XE#6318]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6318
  [Intel XE#6360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6360
  [Intel XE#6361]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6361
  [Intel XE#6366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6366
  [Intel XE#6503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6503
  [Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
  [Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
  [Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
  [Intel XE#6566]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6566
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/718
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944


Build changes
-------------

  * IGT: IGT_8618 -> IGTPW_14032
  * Linux: xe-4083-f2aadc35c771894c27f9b742d2593a2e00bb6ebd -> xe-4084-a9792b1ab75123e4aceaba953a89809e745919c6

  IGTPW_14032: 14032
  IGT_8618: 8618
  xe-4083-f2aadc35c771894c27f9b742d2593a2e00bb6ebd: f2aadc35c771894c27f9b742d2593a2e00bb6ebd
  xe-4084-a9792b1ab75123e4aceaba953a89809e745919c6: a9792b1ab75123e4aceaba953a89809e745919c6

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_14032/index.html

[-- Attachment #2: Type: text/html, Size: 61370 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 00/46] Unigraf integration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (49 preceding siblings ...)
  2025-11-11  5:49 ` ✗ Xe.CI.Full: failure " Patchwork
@ 2025-12-18 14:50 ` Louis Chauvet
  2025-12-18 15:59   ` Mark Yacoub
  2026-01-20 21:09 ` Luca Ceresoli
  51 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2025-12-18 14:50 UTC (permalink / raw)
  To: igt-dev; +Cc: thomas.petazzoni, markyacoub, khaled.almahallawy

Hi everyone,

Small ping on this series, I understand this is a big series, so if you 
think this is useful I can try to split it in multiple sub-series and 
resend them.

Thanks a lot,
Louis Chauvet

On 11/10/25 14:39, Louis Chauvet wrote:
> Hi everyone,
> 
> I am excited to share I currently have access to a Unigraf device,
> which I believe could significantly enhance the capabilities within IGT.
> This device has the potential to enable testing of low-level hardware
> features that are currently not covered. Specifically, Unigraf devices can
> assist in testing link training, signal integrity, HDCP, DSC, and more.
> 
> It's important to note that the Unigraf SDK is not open-source, and the
> communication protocol with the device is proprietary. As a result, I have
> utilized the libTSI.so library, which can be downloaded from [1]. In this
> RFC, I have not used the official TSI_types.h header because it was
> incompatible with C, so I hardcoded some necessary values. The next
> iteration will use the official TSI_types.h (they plan to fix it for the
> next release).
> 
> This RFC is intentionally concise to gather initial feedback from the
> community regarding the integration of a proprietary device into the test
> suite. I plan to expand on this work by adding more features and pushing
> the developments upstream.
> 
> I have also started to work on MST testing (hotplug, link training,
> bandwith limitation), but I have a big issue: connector detection is very
> strange when changing MST configurat (MST->SST, sink count...).
> 
> If I use the Unigraf GUI or my own C script outside IGT, everything seems
> fine: `watch -n0 modetest -c` update connector status almost immediatly
> after a HDP pulse, never hang and always have the correct result.
> 
> But if I do the same in IGT (same script in igt_main), igt have too
> much/not all connectors, and some of them are broken (no EDID property
> for example). I tried to run `watch -n0 modetest -c` in parallel, but
> modetest can:
> - hang
> - only update once igt test is finished.
> 
> Do you have any hint about something I missed in IGT to properly enumerate
> connectors? I tried close/open the DRM device, added a lot of delay
> everywhere, emulate plug/unplug... I used kms_wait_for_new_connectors (in
> this series) and for_each_connected_output to get list the connectors.
> 
> Looking forward to your thoughts and suggestions!
> 
> Thanks,
> Louis Chauvet
> 
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
> Changes in v4:
> - Rebased on master
> - Fixed multiple unigraf callbacks
> - Created link training tests
> - Link to v3: https://lore.kernel.org/r/20250823-unigraf-integration-v3-0-cdc36d5fab4c@bootlin.com
> 
> Changes in v3:
> - Rebased on master
> - Added support for MST
> - Repair autodetection and CRC usage
> - Link to v2: https://lore.kernel.org/r/20250717-unigraf-integration-v2-0-77dc329e584c@bootlin.com
> 
> Changes in v2:
> - Splitted in many commits
> - Add CRC support
> - Link to v1: https://lore.kernel.org/r/20250517-unigraf-integration-v1-1-044acd2133dd@bootlin.com
> 
> ---
> Louis Chauvet (46):
>        lib/igt_kms: Add a detect timeout value
>        lib/igt_kms: Add helper to wait for a specific status on a connector
>        lib/igt_kms: Add function to list connected connectors
>        lib/igt_kms: Add helper to obtain a connector by its name or MST path
>        lib/igt_kms: Add helper to wait for new connectors
>        lib/igt_kms: Add helper to get a pipe from a connector
>        lib/igt_kms: Expose dump_connector_attrs
>        lib/igt_kms: Expose reset_connectors_at_exit
>        lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set
>        lib/igt_debugfs: Move debugfs helpers to the proper location
>        lib/igt_debugfs: Add const when make sense
>        lib/igt_amd: Add const when make sense
>        lib/igt_kms: Add const when make sense
>        lib/monitor_edids: Add helper functions for using monitor_edid objects
>        lib/monitor_edids: Add helper to get an EDID by its name
>        lib/monitor_edids: Add helper to print all available EDID names
>        lib/unigraf: Add used defines for TSI_Types
>        lib/unigraf: Add TSI.h
>        lib/unigraf: Initial Unigraf support
>        lib/igt_kms: Automatically connect unigraf on display require
>        lib/unigraf: Introduce device configuration
>        lib/unigraf: Introduce role configuration
>        lib/unigraf: Introduce input configuration
>        lib/unigraf: Add reset function
>        lib/unigraf: Add unigraf assert and deassert helpers
>        lib/unigraf: Add plug/unplug helpers
>        lib/unigraf: Allows sst/mst configuration
>        lib/unigraf: Add helpers to read and write edid
>        lib/unigraf: Add connector configuration
>        tests/unigraf: Add basic unigraf tests
>        lib/unigraf: Add unigraf CRC capture
>        lib/unigraf: Add configuration for CRC usage
>        lib/unigraf: add unigraf_get_connector_by_stream
>        lib/unigraf: Add helper to check timings received by unigraf
>        lib/igt_pipe_crc: Add ungiraf crc calculation
>        lib/unigraf: Add lane count configuration
>        docs/unigraf: Add unigraf documentation
>        lib/unigraf: Add helpers to set maximum link rate
>        lib/i915/dp: Move DP-related function for i915 to proper folder
>        lib/i915/dp: Rename functions to avoid confusion
>        lib/i915/dp: Add helper to get maximum supported rate
>        lib/igt_dp: Create generic helpers for DP information
>        lib/igt_kms: Add asserts to avoid null pointer dereference
>        lib/igt_kms: Add helper to get a pipe from an output
>        lib/unigraf: Add helpers to get the current LT status
>        tests/unigraf/unigraf_lt: Add test for link training
> 
>   docs/unigraf.txt                         |  81 +++
>   lib/i915/i915_dp.c                       | 354 +++++++++++++
>   lib/i915/i915_dp.h                       |  23 +
>   lib/igt_amd.c                            |   2 +-
>   lib/igt_amd.h                            |   2 +-
>   lib/igt_core.c                           |   4 +
>   lib/igt_debugfs.c                        |  96 +++-
>   lib/igt_debugfs.h                        |  15 +-
>   lib/igt_dp.c                             | 101 ++++
>   lib/igt_dp.h                             |  89 ++++
>   lib/igt_kms.c                            | 825 ++++++++++++++++---------------
>   lib/igt_kms.h                            |  58 ++-
>   lib/igt_pipe_crc.c                       |  28 ++
>   lib/meson.build                          |  12 +
>   lib/monitor_edids/dp_edids.h             |   3 +
>   lib/monitor_edids/hdmi_edids.h           |   3 +
>   lib/monitor_edids/monitor_edids_helper.c | 126 +++++
>   lib/monitor_edids/monitor_edids_helper.h |  10 +-
>   lib/unigraf/TSI.h                        | 226 +++++++++
>   lib/unigraf/TSI_types.h                  | 117 +++++
>   lib/unigraf/unigraf.c                    | 758 ++++++++++++++++++++++++++++
>   lib/unigraf/unigraf.h                    | 257 ++++++++++
>   meson.build                              |  14 +
>   tests/intel/kms_dp_link_training.c       |  19 +-
>   tests/intel/kms_dp_linktrain_fallback.c  |  57 +--
>   tests/meson.build                        |   4 +
>   tests/unigraf/meson.build                |  13 +
>   tests/unigraf/unigraf_connectivity.c     | 123 +++++
>   tests/unigraf/unigraf_lt.c               | 178 +++++++
>   29 files changed, 3130 insertions(+), 468 deletions(-)
> ---
> base-commit: bfab3ea5fab190f4ebf083db4dfe703f6d4f40c6
> change-id: 20250425-unigraf-integration-11ed330755d5
> 
> Best regards,


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 00/46] Unigraf integration
  2025-12-18 14:50 ` [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
@ 2025-12-18 15:59   ` Mark Yacoub
  0 siblings, 0 replies; 90+ messages in thread
From: Mark Yacoub @ 2025-12-18 15:59 UTC (permalink / raw)
  To: Louis Chauvet, ville.syrjala, jani.nikula@intel.com,
	Kamil Konieczny, Juha-Pekka Heikkila
  Cc: igt-dev, thomas.petazzoni, khaled.almahallawy

[-- Attachment #1: Type: text/plain, Size: 8570 bytes --]

Hello maintainers,
These patches are needed by the Display team to enable IGT on our UCDs in
the lab, leveraging its testing capabilities for the intel driver with
external monitors. I will ask Louis' team to do the reviews. But feel free
to interject at any point if things don't look right to you.
Thanks!

On Thu, Dec 18, 2025 at 9:50 AM Louis Chauvet <louis.chauvet@bootlin.com>
wrote:

> Hi everyone,
>
> Small ping on this series, I understand this is a big series, so if you
> think this is useful I can try to split it in multiple sub-series and
> resend them.
>
> Thanks a lot,
> Louis Chauvet
>
> On 11/10/25 14:39, Louis Chauvet wrote:
> > Hi everyone,
> >
> > I am excited to share I currently have access to a Unigraf device,
> > which I believe could significantly enhance the capabilities within IGT.
> > This device has the potential to enable testing of low-level hardware
> > features that are currently not covered. Specifically, Unigraf devices
> can
> > assist in testing link training, signal integrity, HDCP, DSC, and more.
> >
> > It's important to note that the Unigraf SDK is not open-source, and the
> > communication protocol with the device is proprietary. As a result, I
> have
> > utilized the libTSI.so library, which can be downloaded from [1]. In this
> > RFC, I have not used the official TSI_types.h header because it was
> > incompatible with C, so I hardcoded some necessary values. The next
> > iteration will use the official TSI_types.h (they plan to fix it for the
> > next release).
> >
> > This RFC is intentionally concise to gather initial feedback from the
> > community regarding the integration of a proprietary device into the test
> > suite. I plan to expand on this work by adding more features and pushing
> > the developments upstream.
> >
> > I have also started to work on MST testing (hotplug, link training,
> > bandwith limitation), but I have a big issue: connector detection is very
> > strange when changing MST configurat (MST->SST, sink count...).
> >
> > If I use the Unigraf GUI or my own C script outside IGT, everything seems
> > fine: `watch -n0 modetest -c` update connector status almost immediatly
> > after a HDP pulse, never hang and always have the correct result.
> >
> > But if I do the same in IGT (same script in igt_main), igt have too
> > much/not all connectors, and some of them are broken (no EDID property
> > for example). I tried to run `watch -n0 modetest -c` in parallel, but
> > modetest can:
> > - hang
> > - only update once igt test is finished.
> >
> > Do you have any hint about something I missed in IGT to properly
> enumerate
> > connectors? I tried close/open the DRM device, added a lot of delay
> > everywhere, emulate plug/unplug... I used kms_wait_for_new_connectors (in
> > this series) and for_each_connected_output to get list the connectors.
> >
> > Looking forward to your thoughts and suggestions!
> >
> > Thanks,
> > Louis Chauvet
> >
> > Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> > ---
> > Changes in v4:
> > - Rebased on master
> > - Fixed multiple unigraf callbacks
> > - Created link training tests
> > - Link to v3:
> https://lore.kernel.org/r/20250823-unigraf-integration-v3-0-cdc36d5fab4c@bootlin.com
> >
> > Changes in v3:
> > - Rebased on master
> > - Added support for MST
> > - Repair autodetection and CRC usage
> > - Link to v2:
> https://lore.kernel.org/r/20250717-unigraf-integration-v2-0-77dc329e584c@bootlin.com
> >
> > Changes in v2:
> > - Splitted in many commits
> > - Add CRC support
> > - Link to v1:
> https://lore.kernel.org/r/20250517-unigraf-integration-v1-1-044acd2133dd@bootlin.com
> >
> > ---
> > Louis Chauvet (46):
> >        lib/igt_kms: Add a detect timeout value
> >        lib/igt_kms: Add helper to wait for a specific status on a
> connector
> >        lib/igt_kms: Add function to list connected connectors
> >        lib/igt_kms: Add helper to obtain a connector by its name or MST
> path
> >        lib/igt_kms: Add helper to wait for new connectors
> >        lib/igt_kms: Add helper to get a pipe from a connector
> >        lib/igt_kms: Expose dump_connector_attrs
> >        lib/igt_kms: Expose reset_connectors_at_exit
> >        lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set
> >        lib/igt_debugfs: Move debugfs helpers to the proper location
> >        lib/igt_debugfs: Add const when make sense
> >        lib/igt_amd: Add const when make sense
> >        lib/igt_kms: Add const when make sense
> >        lib/monitor_edids: Add helper functions for using monitor_edid
> objects
> >        lib/monitor_edids: Add helper to get an EDID by its name
> >        lib/monitor_edids: Add helper to print all available EDID names
> >        lib/unigraf: Add used defines for TSI_Types
> >        lib/unigraf: Add TSI.h
> >        lib/unigraf: Initial Unigraf support
> >        lib/igt_kms: Automatically connect unigraf on display require
> >        lib/unigraf: Introduce device configuration
> >        lib/unigraf: Introduce role configuration
> >        lib/unigraf: Introduce input configuration
> >        lib/unigraf: Add reset function
> >        lib/unigraf: Add unigraf assert and deassert helpers
> >        lib/unigraf: Add plug/unplug helpers
> >        lib/unigraf: Allows sst/mst configuration
> >        lib/unigraf: Add helpers to read and write edid
> >        lib/unigraf: Add connector configuration
> >        tests/unigraf: Add basic unigraf tests
> >        lib/unigraf: Add unigraf CRC capture
> >        lib/unigraf: Add configuration for CRC usage
> >        lib/unigraf: add unigraf_get_connector_by_stream
> >        lib/unigraf: Add helper to check timings received by unigraf
> >        lib/igt_pipe_crc: Add ungiraf crc calculation
> >        lib/unigraf: Add lane count configuration
> >        docs/unigraf: Add unigraf documentation
> >        lib/unigraf: Add helpers to set maximum link rate
> >        lib/i915/dp: Move DP-related function for i915 to proper folder
> >        lib/i915/dp: Rename functions to avoid confusion
> >        lib/i915/dp: Add helper to get maximum supported rate
> >        lib/igt_dp: Create generic helpers for DP information
> >        lib/igt_kms: Add asserts to avoid null pointer dereference
> >        lib/igt_kms: Add helper to get a pipe from an output
> >        lib/unigraf: Add helpers to get the current LT status
> >        tests/unigraf/unigraf_lt: Add test for link training
> >
> >   docs/unigraf.txt                         |  81 +++
> >   lib/i915/i915_dp.c                       | 354 +++++++++++++
> >   lib/i915/i915_dp.h                       |  23 +
> >   lib/igt_amd.c                            |   2 +-
> >   lib/igt_amd.h                            |   2 +-
> >   lib/igt_core.c                           |   4 +
> >   lib/igt_debugfs.c                        |  96 +++-
> >   lib/igt_debugfs.h                        |  15 +-
> >   lib/igt_dp.c                             | 101 ++++
> >   lib/igt_dp.h                             |  89 ++++
> >   lib/igt_kms.c                            | 825
> ++++++++++++++++---------------
> >   lib/igt_kms.h                            |  58 ++-
> >   lib/igt_pipe_crc.c                       |  28 ++
> >   lib/meson.build                          |  12 +
> >   lib/monitor_edids/dp_edids.h             |   3 +
> >   lib/monitor_edids/hdmi_edids.h           |   3 +
> >   lib/monitor_edids/monitor_edids_helper.c | 126 +++++
> >   lib/monitor_edids/monitor_edids_helper.h |  10 +-
> >   lib/unigraf/TSI.h                        | 226 +++++++++
> >   lib/unigraf/TSI_types.h                  | 117 +++++
> >   lib/unigraf/unigraf.c                    | 758
> ++++++++++++++++++++++++++++
> >   lib/unigraf/unigraf.h                    | 257 ++++++++++
> >   meson.build                              |  14 +
> >   tests/intel/kms_dp_link_training.c       |  19 +-
> >   tests/intel/kms_dp_linktrain_fallback.c  |  57 +--
> >   tests/meson.build                        |   4 +
> >   tests/unigraf/meson.build                |  13 +
> >   tests/unigraf/unigraf_connectivity.c     | 123 +++++
> >   tests/unigraf/unigraf_lt.c               | 178 +++++++
> >   29 files changed, 3130 insertions(+), 468 deletions(-)
> > ---
> > base-commit: bfab3ea5fab190f4ebf083db4dfe703f6d4f40c6
> > change-id: 20250425-unigraf-integration-11ed330755d5
> >
> > Best regards,
>
>

[-- Attachment #2: Type: text/html, Size: 10680 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 00/46] Unigraf integration
  2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
                   ` (50 preceding siblings ...)
  2025-12-18 14:50 ` [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
@ 2026-01-20 21:09 ` Luca Ceresoli
  51 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:09 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

Hi Louis,

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Hi everyone,
>
> I am excited to share I currently have access to a Unigraf device,
> which I believe could significantly enhance the capabilities within IGT.
> This device has the potential to enable testing of low-level hardware
> features that are currently not covered. Specifically, Unigraf devices can
> assist in testing link training, signal integrity, HDCP, DSC, and more.
>
> It's important to note that the Unigraf SDK is not open-source, and the
> communication protocol with the device is proprietary. As a result, I have
> utilized the libTSI.so library, which can be downloaded from [1]. In this

Where is [1]? :)

> RFC, I have not used the official TSI_types.h header because it was
  ^^^
Is this still an RFC? The Subject: suggests it is not.

> incompatible with C, so I hardcoded some necessary values. The next
> iteration will use the official TSI_types.h (they plan to fix it for the
> next release).
>
> This RFC is intentionally concise to gather initial feedback from the
       ^^^
As above.

> community regarding the integration of a proprietary device into the test
> suite. I plan to expand on this work by adding more features and pushing
> the developments upstream.
>
> I have also started to work on MST testing (hotplug, link training,
> bandwith limitation), but I have a big issue: connector detection is very
> strange when changing MST configurat (MST->SST, sink count...).
                                     ^+ion

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 01/46] lib/igt_kms: Add a detect timeout value
  2025-11-10 13:39 ` [PATCH i-g-t v4 01/46] lib/igt_kms: Add a detect timeout value Louis Chauvet
@ 2026-01-20 21:09   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:09 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Some tests need to wait for a specific connector status. In order to make
> the timeout customisable for each target, add an option in the
> configuration file.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 02/46] lib/igt_kms: Add helper to wait for a specific status on a connector
  2025-11-10 13:39 ` [PATCH i-g-t v4 02/46] lib/igt_kms: Add helper to wait for a specific status on a connector Louis Chauvet
@ 2026-01-20 21:09   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:09 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> During testing with chamelium, it is frequent to wait for a specific
> connector status. This new helper is polling the DRM API to wait for this
> status. This allows detecting it without notifier systems which can fail
> if hot plug detection is not working properly on the device under test.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 04/46] lib/igt_kms: Add helper to obtain a connector by its name or MST path
  2025-11-10 13:39 ` [PATCH i-g-t v4 04/46] lib/igt_kms: Add helper to obtain a connector by its name or MST path Louis Chauvet
@ 2026-01-20 21:10   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:10 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, 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@bootlin.com>
> ---
>  lib/igt_kms.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_kms.h |   3 ++
>  2 files changed, 110 insertions(+)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 6392999bb341..6f2a8abbaf7d 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -93,6 +93,10 @@
>  #define MAX_CONNECTORS 32
>  #define MAX_EDID 2
>  #define DISPLAY_TILE_BLOCK 0x12
> +/**
> + * define IGT_KMS_CONNECTOR_NAME_SIZE - Size used when a connector name is needed
> + */
> +#define IGT_KMS_CONNECTOR_NAME_SIZE 50
>
>  typedef bool (*igt_connector_attr_set)(int dir, const char *attr, const char *value);
>
> @@ -7726,3 +7730,106 @@ int igt_get_connected_connectors(int drm_fd, uint32_t **connector_ids)
>
>  	return connected_count;
>  }
> +
> +/**
> + * igt_get_connector_from_name:
> + * @drm_fd: DRM file descriptor
> + * @port_name: Port name to search
> + *
> + * Returns: The connector if found, NULL otherwise. The pointer must
> + * be freed with drmModeFreeConnector()
> + */
> +drmModeConnectorPtr igt_get_connector_from_name(int drm_fd, const char *port_name)
> +{
> +	drmModeResPtr res = drmModeGetResources(drm_fd);
> +	double timeout = igt_default_display_detect_timeout();
> +	int i, len;
> +
> +	if (!res)
> +		return NULL;
> +
> +	for (i = 0; i < res->count_connectors; i++) {
> +		char name[IGT_KMS_CONNECTOR_NAME_SIZE];
> +
> +		drmModeConnectorPtr connector = igt_wait_for_connector(drm_fd, res->connectors[i],
> +								       timeout);
> +
> +		if (connector) {
> +			/* We have to generate the connector name on our own */
> +			len = snprintf(name, ARRAY_SIZE(name), "%s-%u",

Any reason you prefer ARRAY_SIZE() over sizeof(), which I'd have expected
to see here??

Also, I see you are declaring most variables in the inner scope using them
instead of all at function scope. This is good, but you missed the 'len'
variable, which can be moved inside this scope.

> +				       kmstest_connector_type_str(connector->connector_type),
> +				       connector->connector_type_id);
> +			name[len] = 0;
> +
> +			if (strcmp(port_name, name) == 0) {
> +				drmModeFreeResources(res);
> +
> +				return connector;
> +			}
> +
> +			drmModeFreeConnector(connector);
> +		}
> +	}
> +
> +	drmModeFreeResources(res);
> +
> +	return NULL;
> +}

With those fixed:
 Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>


--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 05/46] lib/igt_kms: Add helper to wait for new connectors
  2025-11-10 13:39 ` [PATCH i-g-t v4 05/46] lib/igt_kms: Add helper to wait for new connectors Louis Chauvet
@ 2026-01-20 21:10   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:10 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Add list comparison utilities and a new function to wait for new
> connectors to appear on the system.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/igt_kms.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_kms.h |  6 ++++
>  2 files changed, 99 insertions(+)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 6f2a8abbaf7d..c77c94d7c437 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -7833,3 +7833,96 @@ uint32_t igt_get_connector_id_from_mst_path(int drm_fd, const void *mst_path)
>
>  	return 0;
>  }
> +
> +/**
> + * list_contains() - Search an element in the list
> + *
> + * @list: Pointer to the list to search into
> + * @list_len: Length of the list
> + * @value: Value to search in the list
> + *
> + * Returns true if @list contains @value
> + */
> +static bool list_contains(const uint32_t *list, int list_len, uint32_t value)
> +{
> +	igt_assert((!list && list_len == 0) || list);
> +	for (int i = 0; i < list_len; i++) {
> +		if (list[i] == value)
> +			return true;
> +	}
> +	return false;
> +}
> +
> +/**
> + * get_list_diff() - Compute and return the difference between two lists

Maybe s/difference/set difference/, because it's really what this function
does: a set difference.

> + *
> + * @list_a: Pointer to the first list to compare
> + * @list_a_len: Length of the first list
> + * @list_b: Pointer to the second list to compare
> + * @list_b_len: Length of the second list
> + * @diff: Out pointer for the difference. Can be null to only count new elements.

"new elements" here makes sense if you use this function in a given way:
list_a is new "new" list and list_b is the "old" list. So I'd rephrase
like:

 * @diff: Out pointer returning a list of items in list_a but not in
          list_b. Can be NULL to only count the elements.

> + *
> + * Returns the number of element which are in @list_a but not in @list_b.
> + */
> +int
> +get_list_diff(const uint32_t *list_a, int list_a_len, const uint32_t *list_b, int list_b_len,
> +	      uint32_t **diff)
> +{
> +	int diff_len = 0;
> +
> +	igt_assert((!list_a && list_a_len == 0) || list_a);
> +	igt_assert((!list_b && list_b_len == 0) || list_b);
> +
> +	if (diff)
> +		*diff = malloc(sizeof(**diff));
> +
> +	for (int i = 0; i < list_a_len; i++) {
> +		if (!list_contains(list_b, list_b_len, list_a[i])) {
> +			if (diff) {
> +				*diff = reallocarray(*diff, diff_len + 1, sizeof(**diff));
> +				igt_assert(*diff);
> +				(*diff)[diff_len] = list_a[i];
> +			}
> +
> +			diff_len++;
> +		}
> +	}
> +
> +	return diff_len;
> +}
> +
> +/**
> + * kms_wait_for_new_connectors() - Wait for new connector to appear
> + *
> + * @list_a: Pointer to the first list to compare
> + * @list_a_len: Length of the first list
> + * @list_b: Pointer to the second list to compare
> + * @list_b_len: Length of the second list
> + * @diff: Out pointer for the difference. Can be null.
> + *
> + * Returns the number of element which differ between the two lists.

These docs are a copy of the get_list_diff() docs, perhaps you forgot to
update them after copy-paste.

Based on the implementation I think this should sound like:

 * @newly_connected: Out pointer returning the list of connectors currently found connected
 * @already_connected: Input pointer to list of connectors previously connected
 * @already_connected_count: Length of @already_connected
 * @drm_fd: DRM file descriptor
 *
 * Returns the number of connectors not in @already_connected and currently
 * found connected.

> + */
> +int kms_wait_for_new_connectors(uint32_t **newly_connected,
> +				const uint32_t *already_connected,
> +				int already_connected_count, int drm_fd)
> +{
> +	int newly_connected_count;
> +	struct timespec start, end;
> +
> +	igt_assert(newly_connected);
> +	igt_assert(drm_fd);
> +
> +	clock_gettime(CLOCK_MONOTONIC, &start);
> +	clock_gettime(CLOCK_MONOTONIC, &end);
> +	do {
> +		if (*newly_connected)
> +			free(*newly_connected);
> +		newly_connected_count = igt_get_connected_connectors(drm_fd, newly_connected);
> +		clock_gettime(CLOCK_MONOTONIC, &end);
> +	} while (get_list_diff(*newly_connected, newly_connected_count,
> +			       already_connected, already_connected_count,
> +			       NULL) == 0 &&
> +		 igt_time_elapsed(&start, &end) <= igt_default_display_detect_timeout());
> +
> +	return newly_connected_count;
> +}

With the above fixed:
 Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 03/46] lib/igt_kms: Add function to list connected connectors
  2025-11-10 13:39 ` [PATCH i-g-t v4 03/46] lib/igt_kms: Add function to list connected connectors Louis Chauvet
@ 2026-01-20 21:10   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:10 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, 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@bootlin.com>
> ---
>  lib/igt_kms.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_kms.h |  1 +
>  2 files changed, 68 insertions(+)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index f5bcd6d6b573..6392999bb341 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -7621,6 +7621,29 @@ double igt_default_display_detect_timeout(void)
>  	return timeout;
>  }
>
> +static drmModeConnectorPtr igt_wait_for_connector(int drm_fd, unsigned int connector_id,
> +						  double timeout)
> +{
> +	drmModeConnectorPtr connector = NULL;
> +	struct timespec start, end;
> +
> +	connector = drmModeGetConnector(drm_fd, connector_id);
> +	/*
> +	 * 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) <= timeout) {
> +		connector = drmModeGetConnector(drm_fd, connector_id);
> +		clock_gettime(CLOCK_MONOTONIC, &end);
> +	}
> +
> +	return connector;
> +}
> +
>  /**
>   * igt_wait_for_connector_status:
>   * @drm_fd: drm file descriptor
> @@ -7659,3 +7682,47 @@ 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
                        descriptor

With that fixed:
 Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 06/46] lib/igt_kms: Add helper to get a pipe from a connector
  2025-11-10 13:39 ` [PATCH i-g-t v4 06/46] lib/igt_kms: Add helper to get a pipe from a connector Louis Chauvet
@ 2026-01-20 21:10   ` Luca Ceresoli
  2026-01-22 15:50     ` Louis Chauvet
  0 siblings, 1 reply; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:10 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Currently there is no way to get a pipe from the connector. Add this tiny
> helper that will try to get the currently used pipe for a specific
> connector.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/igt_kms.c | 34 ++++++++++++++++++++++++++++++++++
>  lib/igt_kms.h |  8 ++++++++
>  2 files changed, 42 insertions(+)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index c77c94d7c437..f8d4037a68bf 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -7926,3 +7926,37 @@ int kms_wait_for_new_connectors(uint32_t **newly_connected,
>
>  	return newly_connected_count;
>  }
> +
> +enum pipe igt_get_pipe_from_connector(int drm_fd, int connector_id)

The function name suggests it takes a connector (a drmModeConnectorPtr
perhaps), but it takes a connector ID. I suggest renaming the function to
igt_get_pipe_from_connector_id() so that in case you need in the future a
function that takes a connector it will be intuitively named
igt_get_pipe_from_connector().

> +{
> +	drmModeObjectPropertiesPtr proplist;
> +	drmModePropertyPtr crtc_id_prop;
> +	drmModePropertyPtr prop;
> +	uint32_t crtc_id;
> +	enum pipe pipe_id;
> +	int i;
> +
> +	proplist = drmModeObjectGetProperties(drm_fd, connector_id, DRM_MODE_OBJECT_CONNECTOR);
> +	crtc_id_prop = NULL;
> +
> +	for (i = 0; i < proplist->count_props; i++) {
> +		prop = drmModeGetProperty(drm_fd, proplist->props[i]);
> +
> +		if (strcmp(prop->name, "CRTC_ID") == 0) {
> +			crtc_id_prop = prop;
> +			break;
> +		}
> +		drmModeFreeProperty(prop);
> +	}
> +
> +	igt_assert(crtc_id_prop);
> +	igt_assert((crtc_id_prop->flags & DRM_MODE_PROP_EXTENDED_TYPE) == DRM_MODE_PROP_OBJECT);
> +	crtc_id = proplist->prop_values[i];
> +	drmModeFreeProperty(crtc_id_prop);
> +	drmModeFreeObjectProperties(proplist);
> +	if (crtc_id != 0) {
> +		pipe_id = kmstest_get_pipe_from_crtc_id(drm_fd, crtc_id);
> +		return pipe_id;
> +	}
> +	return PIPE_NONE;
> +}
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 7b1d01efebf2..4184c3930cbd 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -1315,4 +1315,12 @@ int kms_wait_for_new_connectors(uint32_t **newly_connected,
>  int
>  get_list_diff(const uint32_t *list_a, int list_a_len, const uint32_t *list_b, int list_b_len,
>  	      uint32_t **diff);
> +/**
> + * igt_get_pipe_from_connector() - Get a pipe from the connector id
> + * @drm_fd: drm file descriptor to which the connector belongs
> + * @connector_id: connector to inspect
> + *
> + * Returns PIPE_NONE if the connector is not connected to any pipe
> + */

Documentation is before the function definition (.c) elsewhere, why at the
declaration in this case?

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 07/46] lib/igt_kms: Expose dump_connector_attrs
  2025-11-10 13:39 ` [PATCH i-g-t v4 07/46] lib/igt_kms: Expose dump_connector_attrs Louis Chauvet
@ 2026-01-20 21:10   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:10 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> dump_connector_attrs is used by i915 DP helpers, so expose it from igt_kms
> to be able to reuse them.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/igt_kms.c | 2 +-
>  lib/igt_kms.h | 1 +
>  2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index f8d4037a68bf..a5b840e5aed3 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -1682,7 +1682,7 @@ static bool connector_attr_set_debugfs(int drm_fd,
>  	return true;
>  }
>
> -static void dump_connector_attrs(void)
> +void dump_connector_attrs(void)

As you make this public, adding some docs would be a good idea. Same for
patches 8 and 9.

Otherwise looks good.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 10/46] lib/igt_debugfs: Move debugfs helpers to the proper location
  2025-11-10 13:39 ` [PATCH i-g-t v4 10/46] lib/igt_debugfs: Move debugfs helpers to the proper location Louis Chauvet
@ 2026-01-20 21:10   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:10 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> igt_debugfs_read_connector_file and igt_debugfs_write_connector_file are
> debugfs related helpers. To avoid mixing everything in igt_kms, move them
> to igt_debugfs.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 11/46] lib/igt_debugfs: Add const when make sense
  2025-11-10 13:39 ` [PATCH i-g-t v4 11/46] lib/igt_debugfs: Add const when make sense Louis Chauvet
@ 2026-01-20 21:11   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:11 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Const qualifier avoid unwanted modifications. Add const at place where
> it make sense.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 12/46] lib/igt_amd: Add const when make sense
  2025-11-10 13:39 ` [PATCH i-g-t v4 12/46] lib/igt_amd: " Louis Chauvet
@ 2026-01-20 21:11   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:11 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Const qualifier helps to avoid unwanted modification of a pointer.
> To help avoiding those errors, modify the function signature to
> use const.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 13/46] lib/igt_kms: Add const when make sense
  2025-11-10 13:39 ` [PATCH i-g-t v4 13/46] lib/igt_kms: " Louis Chauvet
@ 2026-01-20 21:11   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:11 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Const qualifier helps to avoid unwanted modification of a pointer.
> To help avoiding those errors, modify the function signature to
> use const.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 14/46] lib/monitor_edids: Add helper functions for using monitor_edid objects
  2025-11-10 13:39 ` [PATCH i-g-t v4 14/46] lib/monitor_edids: Add helper functions for using monitor_edid objects Louis Chauvet
@ 2026-01-20 21:11   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:11 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Introduce the functions edid_from_monitor_edid() and
> get_edids_for_connector_type(). The former converts a monitor_edid object
> to a struct edid, which can then be utilized by igt_kms helpers. The
> latter returns a list of monitor_edid objects for a specific connector
> with certain characteristics
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 15/46] lib/monitor_edids: Add helper to get an EDID by its name
  2025-11-10 13:39 ` [PATCH i-g-t v4 15/46] lib/monitor_edids: Add helper to get an EDID by its name Louis Chauvet
@ 2026-01-20 21:11   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:11 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> For testing specific EDID, it is useful to be able to retrieve an EDID by
> a verbose name.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 16/46] lib/monitor_edids: Add helper to print all available EDID names
  2025-11-10 13:39 ` [PATCH i-g-t v4 16/46] lib/monitor_edids: Add helper to print all available EDID names Louis Chauvet
@ 2026-01-20 21:11   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-20 21:11 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> During the unigraf configuration, it may be required to know the list
> of supported EDID names, so add an helper to print them.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h
  2025-11-10 13:39 ` [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h Louis Chauvet
@ 2026-01-21 17:49   ` Luca Ceresoli
  2026-01-22 16:53     ` Louis Chauvet
  0 siblings, 1 reply; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-21 17:49 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Unigraf does not provide header for the libTSI.so file, only dynamic
> library loading helpers for windows.
>
> In order to link against this library and use unigraf devices, add the
> function declaration used in the dynamic library loading wrappers.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/unigraf/TSI.h | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 234 insertions(+)
>
> diff --git a/lib/unigraf/TSI.h b/lib/unigraf/TSI.h
> new file mode 100644
> index 000000000000..62daaab6300e
> --- /dev/null
> +++ b/lib/unigraf/TSI.h
> @@ -0,0 +1,234 @@
> +/* SPDX-License-Identifier: MIT */
> +
> +/*
> + * tsi.h - Header for libTSI.so
> + * Documentation here is taken from official documentation and developer observation.
> + */
> +
> +#ifndef TSI_H
> +#define TSI_H
> +
> +#define TSI_CURRENT_VERSION	12
> +#define MAX_EDID_SIZE		4096
> +
> +#define TSI_SUCCESS		0
> +
> +typedef unsigned int		TSI_VERSION_ID;
> +typedef unsigned int		TSI_SEARCH_OPTIONS;
> +typedef unsigned int		TSI_DEVICE_CAPS;
> +typedef unsigned int		TSI_CONFIG_ID;
> +typedef unsigned int		TSI_DEVICE_ID;
> +typedef unsigned int		TSI_INPUT_ID;
> +typedef int			TSI_RESULT;
> +typedef void			*TSI_HANDLE;
> +typedef int			TSI_FLAGS;
> +
> +/**
> + * TSI_Init() - Initialize the TSI library
> + * @ClientVersion: Indicates the version used to call the libTSI.so functions.
> + *
> + * Initialize libTSI for use and sets up internal state. It can be called
> + * multiple times, but TSI_Clean must be called the exact same number of time.
                                                                            times
> + *
> + * Returns:
> + * - In case of success: Reference count to the API (number of times to call TSI_Clean)
> + * - TSI_ERROR_NOT_COMPATIBLE if the requested client version is not supported
> + *   by the library
> + * - TSI_ERROR_COMPATIBILITY_MISMATCH if TSI_Init is called twice with
> + *   different client version
> + */
> +TSI_RESULT TSI_Init(TSI_VERSION_ID ClientVersion);
> +
> +/**
> + * TSI_Clean() - Cleans and closes the TSI library
> + *
> + * When TSI_Clean is called for the last time, cleanup the internal state. It
> + * should be called exactly the same number of time as TSI_Init
                                                  times

> + */
> +TSI_RESULT TSI_Clean(void);
> +
> +/**
> + * TSI_MISC_GetErrorDescription() - Get a human readable error message
> + * @ErrorCode: Error code for which you want the message
> + * @ErrorString: Pointer where to copy the message
> + * @StringMaxLen: Size of the allocated string @ErrorString
> + *
> + * The official documentation states: If the function succeeds, the
> + * return value is the number of characters required for the complete
> + * error description string.
> + * In reality, this function always returns 0 or error, so there is no way to

On error it returns 0...

> + * tell if the allocated memory was big enough
> + *
> + * Returns:
> + * - >= 0 on success, theorically the required string len to store the message
> + * - < 0 on failure

...or <0?

> + */
> +TSI_RESULT TSI_MISC_GetErrorDescription(TSI_RESULT ErrorCode,
> +					char *ErrorString,
> +					unsigned int StringMaxLen);
> +
> +/**
> + * TSIX_TS_GetConfigItem() - Read a configuration item from the UCD device
> + * @Device: Device handle to read config from. Can be NULL for certain configuration items.

For which items it can be NULL? I can guess some global config items, not
device-specific. Is it the case?

> + * @ConfigItemID: Identifier of the requested configuration item.
> + * @ConfigItemData: Pointer to store the read value.
> + * @ItemMaxSize: Size of the allocated memory for @ConfigItemData.
> + *
> + * Returns: The size of the raw data. If the return value is larger than ItemMaxSize, no data
> + *          is copied to ConfigItemData.
> + * Note:
> + * - Some configurations require specific size and alignment for the allocated buffer. Refer to
> + *   the specific item configuration documentation for details.
> + * - Data may still be written to @ConfigItemData even if the return value is larger than
> + *   @ItemMaxSize, potentially causing buffer overflow.

Oh, amazing!

> + */
> +TSI_RESULT TSIX_TS_GetConfigItem(TSI_HANDLE Device, TSI_CONFIG_ID ConfigItemID,
> +				 void *ConfigItemData,
> +				 unsigned int ItemMaxSize);
> +
> +/**
> + * TSIX_DEV_RescanDevices() - Refresh the internal list of devices for libTSI
> + * @SearchOptions: Options to filter the list of devices (e.g.,
> + *                 TSI_SEARCHOPTIONS_SHOW_DEVICES_IN_USE to include
> + *                 devices already in use).
> + * @RequiredCaps: Filter to list only devices with specific capabilities.
> + * @UnallowedCaps: Filter to list only devices without specific capabilities.
> + *
> + * Returns: >=0 in case of success.

The returned value is not the amount of devices found? It's just some
arbitrary non-negative number?

Being a closed source blob I can well understand a "don't know" answer of
course.

Also, maybe add "<0 on error"?

> + *
> + * This function should be called every time you need to update the list of connected devices,
> + * and it must be called at least once before calling TSI_DEV_GetDeviceCount.
> + */
> +TSI_RESULT TSIX_DEV_RescanDevices(TSI_SEARCH_OPTIONS SearchOptions,
> +				  TSI_DEVICE_CAPS RequiredCaps,
> +				  TSI_DEVICE_CAPS UnallowedCaps);
> +/**
> + * TSIX_DEV_GetDeviceCount() - Get the count of scanned devices
> + * Returns: the number of devices that the previous call to TSIX_DEV_RescanDevices() detected
> + *
> + * Must be called after a TSIX_DEV_RescanDevices.
> + */
> +TSI_RESULT TSIX_DEV_GetDeviceCount(void);
> +
> +/**
> + * TSIX_DEV_OpenDevice() - Open a device from the scanned list
> + * @DeviceID: index in the TSI_DEV_RescanDevices list
> + * @Result: Pointer to store the error code returned while opening the device
> + * Returns: if the device is found, an opaque pointer that can be used for other
> + * API calls. If some error occurred during the detection, the status code is
> + * written in the pointer @Result.

Not in the pointer, I believe! :-)

Maybe "is written in *@Result."? But the sentence is actually redundant,
it's implicit in the @Result parameter description. I'd rather add what is
returned on error. Just guessing that's NULL:

 * Returns: if the device is found, an opaque pointer that can be used for other
 * API calls, or NULL on error.


> + */
> +TSI_HANDLE TSIX_DEV_OpenDevice(TSI_DEVICE_ID DeviceID, TSI_RESULT *Result);
> +
> +/**
> + * TSIX_DEV_CloseDevice() - Close the device handle when finished
> + * @Device: Device handle to close
> + * Returns: >=0 in case of success
> + */
> +TSI_RESULT TSIX_DEV_CloseDevice(TSI_HANDLE Device);

Why not moving TSIX_TS_GetConfigItem() and TSIX_TS_SetConfigItem() here,
alsop keeping them nearby? It looks to me logical: first the init/open
functions, then the get/set config, then the various video operations.

> +
> +/**
> + * TSIX_VIN_Disable() - Disable video input on the specified device
> + * @Device: Device handle to disable video input on
> + * Returns: >=0 in case of success
> + */
> +TSI_RESULT TSIX_VIN_Disable(TSI_HANDLE Device);
> +
> +/**
> + * TSIX_VIN_Select() - Select a specific video input on the specified device
> + * @Device: Device handle on which to select the input
> + * @InputID: Identifier of the input to select
> + * Returns: >=0 in case of success
> + */
> +TSI_RESULT TSIX_VIN_Select(TSI_HANDLE Device, TSI_INPUT_ID InputID);
> +
> +/**
> + * TSIX_DEV_SelectRole() - Select a specific role for the specified device
> + * @Device: Device handle on which to assign the role
> + * @RoleIndex: Index of the role to assign

Is there an enum telling us which values mean what?

PS: I see you can get a list and the names from
TSIX_DEV_GetDeviceRoleCount/Name(), below. One more reason to keep related
functions together...

> +/**
> + * TSIX_DEV_GetDeviceRoleName() - Get the name of a specific role for a device
> + * @Device: Device handle to query
> + * @RoleIndex: Index of the role to get the name for
> + * @RoleNameString: Pointer to store the role name
> + * @RoleStringMaxLength: Size of the allocated memory for @RoleNameString
> + *
> + * Returns: >=0 in case of success, the length of the role name string
> + * Note: If the return value is larger than RoleStringMaxLength, the string may be truncated
> + */
> +TSI_RESULT TSIX_DEV_GetDeviceRoleName(TSI_HANDLE Device, int RoleIndex,
> +				      char *RoleNameString, unsigned int RoleStringMaxLength);
> +

...as said above, TSIX_DEV_SelectRole() should probably be here.

> +TSI_RESULT TSIX_VIN_GetInputName(TSI_HANDLE Device, TSI_INPUT_ID InputID,
> +				 char *InputNameString, unsigned int NameStringMaxLen);
> +
> +#endif

As for patch 17, I'd add:

   #endif /* TSI_H */



--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 17/46] lib/unigraf: Add used defines for TSI_Types
  2025-11-10 13:39 ` [PATCH i-g-t v4 17/46] lib/unigraf: Add used defines for TSI_Types Louis Chauvet
@ 2026-01-21 17:49   ` Luca Ceresoli
  2026-01-22 16:40     ` Louis Chauvet
  0 siblings, 1 reply; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-21 17:49 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

Hi Louis,

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Current unigraf public release are not c-compatible, this file hardcode
> some values. One future release of libTSI may include a c-compatible
> TSI_types.h file with full structure definition, but until then.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/unigraf/TSI_types.h | 117 ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 117 insertions(+)
>
> diff --git a/lib/unigraf/TSI_types.h b/lib/unigraf/TSI_types.h
> new file mode 100644
> index 000000000000..f854c500a82c
> --- /dev/null
> +++ b/lib/unigraf/TSI_types.h
> @@ -0,0 +1,117 @@
> +/* SPDX-License-Identifier: MIT */
> +
> +// DO NOT MERGE THIS FILE

What do you mean? Shoudl this patch be applied or not? Maybe it's a
leftover from the RFC v1?

> +//
> +// Current unigraf public release are not c-compatible, this file hardcode some values

Add a '.' at end of sentence.

> +// The next release of libTSI should include a c-compatible TSI_types.h file, that will
> +// be directly used in place of this file

Here too.

> +
> +#include <stdbool.h>
> +#include <stdint.h>
> +#ifndef TSI_REG_H

If I got what you mena here, this should be before the includes, and should
be followed by a #define TSI_REG_H.

> +
> +#define TSI_VERSION_TEXT			0x80000001
> +#define TSI_DEVCAP_VIDEO_CAPTURE		0x00000001
> +#define TSI_SEARCHOPTIONS_SHOW_DEVICES_IN_USE	0x00000001
> +
> +#define TSI_EDID_TE_INPUT			0x1100
> +#define TSI_EDID_SELECT_STREAM			0x1102
> +
> +#define TSI_BASE_LEGACY_GENERIC(offset)		(0x210 + (offset))
> +#define	TSI_FORCE_HOT_PLUG_STATE_W		TSI_BASE_LEGACY_GENERIC(0x2)
           ^
Tab instead of space

> +
> +#define TSI_BASE_LEGACY_DPRX_MSA(offset)		(0x260 + (offset))
> +#define	TSI_DPRX_MSA_COMMAND_W				TSI_BASE_LEGACY_DPRX_MSA(0x0)
           ^
Tab instead of space


> +#define TSI_DPRX_MSA_STREAM_COUNT_R			TSI_BASE_LEGACY_DPRX_MSA(0x1)
> +#define TSI_DPRX_MSA_STREAM_SELECT			TSI_BASE_LEGACY_DPRX_MSA(0x3)
> +#define TSI_DPRX_MSA_HTOTAL_R				TSI_BASE_LEGACY_DPRX_MSA(0x6)
> +#define TSI_DPRX_MSA_VTOTAL_R				TSI_BASE_LEGACY_DPRX_MSA(0x7)
> +#define TSI_DPRX_MSA_HACTIVE_R				TSI_BASE_LEGACY_DPRX_MSA(0x8)
> +#define TSI_DPRX_MSA_VACTIVE_R				TSI_BASE_LEGACY_DPRX_MSA(0x9)
> +#define TSI_DPRX_MSA_HSYNC_WIDTH_R			TSI_BASE_LEGACY_DPRX_MSA(0xa)
> +#define TSI_DPRX_MSA_VSYNC_WIDTH_R			TSI_BASE_LEGACY_DPRX_MSA(0xb)
> +#define TSI_DPRX_MSA_HSTART_R				TSI_BASE_LEGACY_DPRX_MSA(0xc)
> +#define TSI_DPRX_MSA_VSTART_R				TSI_BASE_LEGACY_DPRX_MSA(0xd)
> +
> +#define TSI_DPRX_LINK_FLAGS_MST				0x01
> +#define TSI_DPRX_LINK_FLAGS_TPS3			0x02
> +#define TSI_DPRX_LINK_FLAGS_TPS4			0x03
> +#define TSI_DPRX_LINK_FLAGS_EDP				0x04
> +#define TSI_DPRX_NOT_DOCUMENTED_DP_128_132_SUPPORTED	0x10
> +#define TSI_DPRX_NOT_DOCUMENTED_SIDEBAND_MSG_SUPPORT	0x20
> +
> +#define TSI_BASE_DPRX(offset)			(0x50000000u + 0x21000 + (offset))
> +#define TSI_DPRX_HW_CAPS_R			TSI_BASE_DPRX(0x4)
> +
> +/**
> + * struct TSI_DPRX_HW_CAPS_R_s - Structure representing the hardware capabilities of the DP RX.
> + *
> + * This structure defines the bitfields and fields that describe the hardware
> + * capabilities of the DP RX (DisplayPort Receiver) interface. Each field
> + * corresponds to a specific capability or feature supported by the hardware.
> + *
> + * This structure is used to interpret the value read from the
> + * TSI_DPRX_HW_CAPS_R register.
> + *
> + * @mst: MST support
> + * @hdcp_1_x: HDCP 1.x support.
> + * @hdcp_2_x: HDCP 2.x support.
> + * @fec_8_10_b: FEC for 8/10 link support.
> + * @dsc_8_10_b: DSC for 8/10 link support.
> + * @three_lanes: Three lane link configuration support.
> + * @edp_link_rate: eDP link rate support.

I thought this was a rate (an amount of bits per time unit or so) but it's
a bool, so perhaps it means "eDP link rates are supported" or similar I
guess. Can you clarify?

If my guess is right, this could be renamed edp_link_rates_supported for
clarity.

> + * @mst_stream_count: Number of MST streams supported.
> + * @max_link_rate: Maximum link rate supported.

And I guess it is an amount (it's not a bool), so what's the unit?

> + * @force_link_config: Forced link configuration support.
> + * @power_provision: Power provision support on DP_PWR pin of receptacle connector.
> + * @aux_swing_voltage_control: AUX output voltage swing control support.
> + * @custom_dp_rate: Custom DP 2.0 rate support.
> + * @custom_bit_rate: Custom bit rate support.
> + * @fec_128_132_b: FEC for 128/132 link support.
> + * @dsc_128_132_b: DSC for 128/132 link support.
> + */
> +struct TSI_DPRX_HW_CAPS_R_s {
> +	bool mst:1;
> +	bool hdcp_1_x:1;
> +	bool hdcp_2_x:1;
> +	bool fec_8_10_b:1;
> +	bool dsc_8_10_b:1;
> +	bool reserved_1:1;
> +	bool three_lanes:1;
> +	bool edp_link_rate:1;

Sure the rate is bool? BTW knowing the unit would help finding the
answer. :)

> +	uint8_t mst_stream_count:3;
> +	uint8_t reserved_2:5;
> +	uint8_t max_link_rate;
> +	bool force_link_config:1;
> +	bool reserved_3:1;
> +	bool power_provision:1;
> +	bool aux_swing_voltage_control:1;
> +	bool custom_dp_rate:1;
> +	bool custom_bit_rate:1;
> +	bool fec_128_132_b:1;
> +	bool dsc_128_132_b:1;
> +};
> +
> +#define TSI_DPRX_LT_LANE_COUNT_R		TSI_BASE_DPRX(0x0B)
> +#define TSI_DPRX_LT_RATE_R			TSI_BASE_DPRX(0x0C)
> +#define TSI_DPRX_HPD_FORCE			TSI_BASE_DPRX(0x12)
> +#define TSI_DPRX_MST_SINK_COUNT			TSI_BASE_DPRX(0x9D)
> +
> +#define TSI_BASE_DP_RX(offset)                  (0x00010100 + (offset))
> +#define TSI_DP_RX_DUT_MAX_LANE_COUNT		TSI_BASE_DP_RX(0xf)
> +
> +#define TSI_BASE_DP_LTT(offset)                 (0x00010700 + (offset))
> +#define TSI_DP_LTT_MAX_LANE_COUNT		TSI_BASE_DP_LTT(0x01)
> +
> +#define TSI_BASE_LEGACY_DPRX(offset)		(0x2b0 + (offset))
> +#define TSI_DPRX_DPCD_BASE_W			TSI_BASE_LEGACY_DPRX(0x9)
> +#define TSI_DPRX_DPCD_DATA			TSI_BASE_LEGACY_DPRX(0xA)
> +#define TSI_DPRX_MAX_LANES			TSI_BASE_LEGACY_DPRX(0x10)
> +#define TSI_DPRX_MAX_LINK_RATE			TSI_BASE_LEGACY_DPRX(0x11)
> +#define TSI_DPRX_LINK_FLAGS			TSI_BASE_LEGACY_DPRX(0x12)
> +#define TSI_DPRX_STREAM_SELECT			TSI_BASE_LEGACY_DPRX(0x13)
> +#define TSI_DPRX_CRC_R_R			TSI_BASE_LEGACY_DPRX(0x14)
> +#define TSI_DPRX_CRC_G_R			TSI_BASE_LEGACY_DPRX(0x15)
> +#define TSI_DPRX_CRC_B_R			TSI_BASE_LEGACY_DPRX(0x16)
> +#define TSI_DPRX_HPD_PULSE_W			TSI_BASE_LEGACY_DPRX(0x1B)
> +#endif

A comment would be nice:

  #endif /* TSI_REG_H */

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support
  2025-11-10 13:39 ` [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support Louis Chauvet
@ 2026-01-21 18:23   ` Luca Ceresoli
  2026-01-21 18:30   ` Luca Ceresoli
  1 sibling, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-21 18:23 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> This introduce the basic boilerplate to connect to a unigraf device.
>
> This integration currently only supports one device openned to simplify
> its usage and cleanup.
>
> The functions unigraf_open_device and unigraf_require_device will register
> a handler to do proper cleanup on IGT exit.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> --- a/lib/unigraf/TSI.h
> +++ b/lib/unigraf/TSI.h
> @@ -210,14 +210,6 @@ TSI_RESULT TSIX_DEV_GetDeviceRoleCount(TSI_HANDLE Device);
>  TSI_RESULT TSIX_DEV_GetDeviceRoleName(TSI_HANDLE Device, int RoleIndex,
>  				      char *RoleNameString, unsigned int RoleStringMaxLength);
>
> -/**
> - * TSIX_VIN_GetInputCount() - Get the number of video inputs available on a device
> - * @Device: Device handle to query
> - *
> - * Returns: >=0 in case of success, the number of video inputs available on the device
> - */
> -TSI_RESULT TSIX_VIN_GetInputCount(TSI_HANDLE Device);

Why?

Otherwise LGTM.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support
  2025-11-10 13:39 ` [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support Louis Chauvet
  2026-01-21 18:23   ` Luca Ceresoli
@ 2026-01-21 18:30   ` Luca Ceresoli
  1 sibling, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-21 18:30 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

Hi Louis,

I had replied LGTM but now noticed an issue, see below.

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> This introduce the basic boilerplate to connect to a unigraf device.
>
> This integration currently only supports one device openned to simplify
> its usage and cleanup.
>
> The functions unigraf_open_device and unigraf_require_device will register
> a handler to do proper cleanup on IGT exit.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

[...]

> +static int unigraf_open_count;

[...]

> +static void unigraf_exit_handler(int sig)
> +{
> +	if (unigraf_open_count)

This file-scope variable is never set.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 06/46] lib/igt_kms: Add helper to get a pipe from a connector
  2026-01-20 21:10   ` Luca Ceresoli
@ 2026-01-22 15:50     ` Louis Chauvet
  0 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2026-01-22 15:50 UTC (permalink / raw)
  To: Luca Ceresoli, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev



On 1/20/26 22:10, Luca Ceresoli wrote:
> On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
>> Currently there is no way to get a pipe from the connector. Add this tiny
>> helper that will try to get the currently used pipe for a specific
>> connector.
>>
>> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
>> ---
>>   lib/igt_kms.c | 34 ++++++++++++++++++++++++++++++++++
>>   lib/igt_kms.h |  8 ++++++++
>>   2 files changed, 42 insertions(+)
>>
>> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
>> index c77c94d7c437..f8d4037a68bf 100644
>> --- a/lib/igt_kms.c
>> +++ b/lib/igt_kms.c
>> @@ -7926,3 +7926,37 @@ int kms_wait_for_new_connectors(uint32_t **newly_connected,
>>
>>   	return newly_connected_count;
>>   }
>> +
>> +enum pipe igt_get_pipe_from_connector(int drm_fd, int connector_id)
> 
> The function name suggests it takes a connector (a drmModeConnectorPtr
> perhaps), but it takes a connector ID. I suggest renaming the function to
> igt_get_pipe_from_connector_id() so that in case you need in the future a
> function that takes a connector it will be intuitively named
> igt_get_pipe_from_connector().

Ack

>> +{
>> +	drmModeObjectPropertiesPtr proplist;
>> +	drmModePropertyPtr crtc_id_prop;
>> +	drmModePropertyPtr prop;
>> +	uint32_t crtc_id;
>> +	enum pipe pipe_id;
>> +	int i;
>> +
>> +	proplist = drmModeObjectGetProperties(drm_fd, connector_id, DRM_MODE_OBJECT_CONNECTOR);
>> +	crtc_id_prop = NULL;
>> +
>> +	for (i = 0; i < proplist->count_props; i++) {
>> +		prop = drmModeGetProperty(drm_fd, proplist->props[i]);
>> +
>> +		if (strcmp(prop->name, "CRTC_ID") == 0) {
>> +			crtc_id_prop = prop;
>> +			break;
>> +		}
>> +		drmModeFreeProperty(prop);
>> +	}
>> +
>> +	igt_assert(crtc_id_prop);
>> +	igt_assert((crtc_id_prop->flags & DRM_MODE_PROP_EXTENDED_TYPE) == DRM_MODE_PROP_OBJECT);
>> +	crtc_id = proplist->prop_values[i];
>> +	drmModeFreeProperty(crtc_id_prop);
>> +	drmModeFreeObjectProperties(proplist);
>> +	if (crtc_id != 0) {
>> +		pipe_id = kmstest_get_pipe_from_crtc_id(drm_fd, crtc_id);
>> +		return pipe_id;
>> +	}
>> +	return PIPE_NONE;
>> +}
>> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
>> index 7b1d01efebf2..4184c3930cbd 100644
>> --- a/lib/igt_kms.h
>> +++ b/lib/igt_kms.h
>> @@ -1315,4 +1315,12 @@ int kms_wait_for_new_connectors(uint32_t **newly_connected,
>>   int
>>   get_list_diff(const uint32_t *list_a, int list_a_len, const uint32_t *list_b, int list_b_len,
>>   	      uint32_t **diff);
>> +/**
>> + * igt_get_pipe_from_connector() - Get a pipe from the connector id
>> + * @drm_fd: drm file descriptor to which the connector belongs
>> + * @connector_id: connector to inspect
>> + *
>> + * Returns PIPE_NONE if the connector is not connected to any pipe
>> + */
> 
> Documentation is before the function definition (.c) elsewhere, why at the
> declaration in this case?

There are no reason at all, I just wrote it in the wrong place.

> --
> Luca Ceresoli, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 17/46] lib/unigraf: Add used defines for TSI_Types
  2026-01-21 17:49   ` Luca Ceresoli
@ 2026-01-22 16:40     ` Louis Chauvet
  0 siblings, 0 replies; 90+ messages in thread
From: Louis Chauvet @ 2026-01-22 16:40 UTC (permalink / raw)
  To: Luca Ceresoli, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev



On 1/21/26 18:49, Luca Ceresoli wrote:
> Hi Louis,
> 
> On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
>> Current unigraf public release are not c-compatible, this file hardcode
>> some values. One future release of libTSI may include a c-compatible
>> TSI_types.h file with full structure definition, but until then.
>>
>> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
>> ---
>>   lib/unigraf/TSI_types.h | 117 ++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 117 insertions(+)
>>
>> diff --git a/lib/unigraf/TSI_types.h b/lib/unigraf/TSI_types.h
>> new file mode 100644
>> index 000000000000..f854c500a82c
>> --- /dev/null
>> +++ b/lib/unigraf/TSI_types.h
>> @@ -0,0 +1,117 @@
>> +/* SPDX-License-Identifier: MIT */
>> +
>> +// DO NOT MERGE THIS FILE
> 
> What do you mean? Shoudl this patch be applied or not? Maybe it's a
> leftover from the RFC v1?

This patch must be applied, the SDK is very annoying to install and the 
last time I tried the compilation issue was not solved.

>> +//
>> +// Current unigraf public release are not c-compatible, this file hardcode some values
> 
> Add a '.' at end of sentence.
> 
>> +// The next release of libTSI should include a c-compatible TSI_types.h file, that will
>> +// be directly used in place of this file
> 
> Here too.
> 
>> +
>> +#include <stdbool.h>
>> +#include <stdint.h>
>> +#ifndef TSI_REG_H
> 
> If I got what you mena here, this should be before the includes, and should
> be followed by a #define TSI_REG_H.
> 
>> +
>> +#define TSI_VERSION_TEXT			0x80000001
>> +#define TSI_DEVCAP_VIDEO_CAPTURE		0x00000001
>> +#define TSI_SEARCHOPTIONS_SHOW_DEVICES_IN_USE	0x00000001
>> +
>> +#define TSI_EDID_TE_INPUT			0x1100
>> +#define TSI_EDID_SELECT_STREAM			0x1102
>> +
>> +#define TSI_BASE_LEGACY_GENERIC(offset)		(0x210 + (offset))
>> +#define	TSI_FORCE_HOT_PLUG_STATE_W		TSI_BASE_LEGACY_GENERIC(0x2)
>             ^
> Tab instead of space
> 
>> +
>> +#define TSI_BASE_LEGACY_DPRX_MSA(offset)		(0x260 + (offset))
>> +#define	TSI_DPRX_MSA_COMMAND_W				TSI_BASE_LEGACY_DPRX_MSA(0x0)
>             ^
> Tab instead of space
> 

Good catch, I can't "see" it on my editor, thanks!

>> +#define TSI_DPRX_MSA_STREAM_COUNT_R			TSI_BASE_LEGACY_DPRX_MSA(0x1)
>> +#define TSI_DPRX_MSA_STREAM_SELECT			TSI_BASE_LEGACY_DPRX_MSA(0x3)
>> +#define TSI_DPRX_MSA_HTOTAL_R				TSI_BASE_LEGACY_DPRX_MSA(0x6)
>> +#define TSI_DPRX_MSA_VTOTAL_R				TSI_BASE_LEGACY_DPRX_MSA(0x7)
>> +#define TSI_DPRX_MSA_HACTIVE_R				TSI_BASE_LEGACY_DPRX_MSA(0x8)
>> +#define TSI_DPRX_MSA_VACTIVE_R				TSI_BASE_LEGACY_DPRX_MSA(0x9)
>> +#define TSI_DPRX_MSA_HSYNC_WIDTH_R			TSI_BASE_LEGACY_DPRX_MSA(0xa)
>> +#define TSI_DPRX_MSA_VSYNC_WIDTH_R			TSI_BASE_LEGACY_DPRX_MSA(0xb)
>> +#define TSI_DPRX_MSA_HSTART_R				TSI_BASE_LEGACY_DPRX_MSA(0xc)
>> +#define TSI_DPRX_MSA_VSTART_R				TSI_BASE_LEGACY_DPRX_MSA(0xd)
>> +
>> +#define TSI_DPRX_LINK_FLAGS_MST				0x01
>> +#define TSI_DPRX_LINK_FLAGS_TPS3			0x02
>> +#define TSI_DPRX_LINK_FLAGS_TPS4			0x03
>> +#define TSI_DPRX_LINK_FLAGS_EDP				0x04
>> +#define TSI_DPRX_NOT_DOCUMENTED_DP_128_132_SUPPORTED	0x10
>> +#define TSI_DPRX_NOT_DOCUMENTED_SIDEBAND_MSG_SUPPORT	0x20
>> +
>> +#define TSI_BASE_DPRX(offset)			(0x50000000u + 0x21000 + (offset))
>> +#define TSI_DPRX_HW_CAPS_R			TSI_BASE_DPRX(0x4)
>> +
>> +/**
>> + * struct TSI_DPRX_HW_CAPS_R_s - Structure representing the hardware capabilities of the DP RX.
>> + *
>> + * This structure defines the bitfields and fields that describe the hardware
>> + * capabilities of the DP RX (DisplayPort Receiver) interface. Each field
>> + * corresponds to a specific capability or feature supported by the hardware.
>> + *
>> + * This structure is used to interpret the value read from the
>> + * TSI_DPRX_HW_CAPS_R register.
>> + *
>> + * @mst: MST support
>> + * @hdcp_1_x: HDCP 1.x support.
>> + * @hdcp_2_x: HDCP 2.x support.
>> + * @fec_8_10_b: FEC for 8/10 link support.
>> + * @dsc_8_10_b: DSC for 8/10 link support.
>> + * @three_lanes: Three lane link configuration support.
>> + * @edp_link_rate: eDP link rate support.
> 
> I thought this was a rate (an amount of bits per time unit or so) but it's
> a bool, so perhaps it means "eDP link rates are supported" or similar I
> guess. Can you clarify?
> 
> If my guess is right, this could be renamed edp_link_rates_supported for
> clarity.

Ack

>> + * @mst_stream_count: Number of MST streams supported.
>> + * @max_link_rate: Maximum link rate supported.
> 
> And I guess it is an amount (it's not a bool), so what's the unit?

No unit are specified in the documentation. I hope it is the same as the 
other config options: rate = value * 0.27GHz.

I will add a comment

>> + * @force_link_config: Forced link configuration support.
>> + * @power_provision: Power provision support on DP_PWR pin of receptacle connector.
>> + * @aux_swing_voltage_control: AUX output voltage swing control support.
>> + * @custom_dp_rate: Custom DP 2.0 rate support.
>> + * @custom_bit_rate: Custom bit rate support.
>> + * @fec_128_132_b: FEC for 128/132 link support.
>> + * @dsc_128_132_b: DSC for 128/132 link support.
>> + */
>> +struct TSI_DPRX_HW_CAPS_R_s {
>> +	bool mst:1;
>> +	bool hdcp_1_x:1;
>> +	bool hdcp_2_x:1;
>> +	bool fec_8_10_b:1;
>> +	bool dsc_8_10_b:1;
>> +	bool reserved_1:1;
>> +	bool three_lanes:1;
>> +	bool edp_link_rate:1;
> 
> Sure the rate is bool? BTW knowing the unit would help finding the
> answer. :)

You are right, this is "is link rate modificatino supported":

	eDP link rate support. 0 = Not supported, 1 = Supported

>> +	uint8_t mst_stream_count:3;
>> +	uint8_t reserved_2:5;
>> +	uint8_t max_link_rate;
>> +	bool force_link_config:1;
>> +	bool reserved_3:1;
>> +	bool power_provision:1;
>> +	bool aux_swing_voltage_control:1;
>> +	bool custom_dp_rate:1;
>> +	bool custom_bit_rate:1;
>> +	bool fec_128_132_b:1;
>> +	bool dsc_128_132_b:1;
>> +};
>> +
>> +#define TSI_DPRX_LT_LANE_COUNT_R		TSI_BASE_DPRX(0x0B)
>> +#define TSI_DPRX_LT_RATE_R			TSI_BASE_DPRX(0x0C)
>> +#define TSI_DPRX_HPD_FORCE			TSI_BASE_DPRX(0x12)
>> +#define TSI_DPRX_MST_SINK_COUNT			TSI_BASE_DPRX(0x9D)
>> +
>> +#define TSI_BASE_DP_RX(offset)                  (0x00010100 + (offset))
>> +#define TSI_DP_RX_DUT_MAX_LANE_COUNT		TSI_BASE_DP_RX(0xf)
>> +
>> +#define TSI_BASE_DP_LTT(offset)                 (0x00010700 + (offset))
>> +#define TSI_DP_LTT_MAX_LANE_COUNT		TSI_BASE_DP_LTT(0x01)
>> +
>> +#define TSI_BASE_LEGACY_DPRX(offset)		(0x2b0 + (offset))
>> +#define TSI_DPRX_DPCD_BASE_W			TSI_BASE_LEGACY_DPRX(0x9)
>> +#define TSI_DPRX_DPCD_DATA			TSI_BASE_LEGACY_DPRX(0xA)
>> +#define TSI_DPRX_MAX_LANES			TSI_BASE_LEGACY_DPRX(0x10)
>> +#define TSI_DPRX_MAX_LINK_RATE			TSI_BASE_LEGACY_DPRX(0x11)
>> +#define TSI_DPRX_LINK_FLAGS			TSI_BASE_LEGACY_DPRX(0x12)
>> +#define TSI_DPRX_STREAM_SELECT			TSI_BASE_LEGACY_DPRX(0x13)
>> +#define TSI_DPRX_CRC_R_R			TSI_BASE_LEGACY_DPRX(0x14)
>> +#define TSI_DPRX_CRC_G_R			TSI_BASE_LEGACY_DPRX(0x15)
>> +#define TSI_DPRX_CRC_B_R			TSI_BASE_LEGACY_DPRX(0x16)
>> +#define TSI_DPRX_HPD_PULSE_W			TSI_BASE_LEGACY_DPRX(0x1B)
>> +#endif
> 
> A comment would be nice:
> 
>    #endif /* TSI_REG_H */

Ack

> Luca
> 
> --
> Luca Ceresoli, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h
  2026-01-21 17:49   ` Luca Ceresoli
@ 2026-01-22 16:53     ` Louis Chauvet
  2026-01-23 14:04       ` Luca Ceresoli
  0 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2026-01-22 16:53 UTC (permalink / raw)
  To: Luca Ceresoli, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev



On 1/21/26 18:49, Luca Ceresoli wrote:
> On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
>> Unigraf does not provide header for the libTSI.so file, only dynamic
>> library loading helpers for windows.
>>
>> In order to link against this library and use unigraf devices, add the
>> function declaration used in the dynamic library loading wrappers.
>>
>> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
>> ---
>>   lib/unigraf/TSI.h | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 234 insertions(+)
>>
>> diff --git a/lib/unigraf/TSI.h b/lib/unigraf/TSI.h
>> new file mode 100644
>> index 000000000000..62daaab6300e
>> --- /dev/null
>> +++ b/lib/unigraf/TSI.h
>> @@ -0,0 +1,234 @@
>> +/* SPDX-License-Identifier: MIT */
>> +
>> +/*
>> + * tsi.h - Header for libTSI.so
>> + * Documentation here is taken from official documentation and developer observation.
>> + */
>> +
>> +#ifndef TSI_H
>> +#define TSI_H
>> +
>> +#define TSI_CURRENT_VERSION	12
>> +#define MAX_EDID_SIZE		4096
>> +
>> +#define TSI_SUCCESS		0
>> +
>> +typedef unsigned int		TSI_VERSION_ID;
>> +typedef unsigned int		TSI_SEARCH_OPTIONS;
>> +typedef unsigned int		TSI_DEVICE_CAPS;
>> +typedef unsigned int		TSI_CONFIG_ID;
>> +typedef unsigned int		TSI_DEVICE_ID;
>> +typedef unsigned int		TSI_INPUT_ID;
>> +typedef int			TSI_RESULT;
>> +typedef void			*TSI_HANDLE;
>> +typedef int			TSI_FLAGS;
>> +
>> +/**
>> + * TSI_Init() - Initialize the TSI library
>> + * @ClientVersion: Indicates the version used to call the libTSI.so functions.
>> + *
>> + * Initialize libTSI for use and sets up internal state. It can be called
>> + * multiple times, but TSI_Clean must be called the exact same number of time.
>                                                                              times
>> + *
>> + * Returns:
>> + * - In case of success: Reference count to the API (number of times to call TSI_Clean)
>> + * - TSI_ERROR_NOT_COMPATIBLE if the requested client version is not supported
>> + *   by the library
>> + * - TSI_ERROR_COMPATIBILITY_MISMATCH if TSI_Init is called twice with
>> + *   different client version
>> + */
>> +TSI_RESULT TSI_Init(TSI_VERSION_ID ClientVersion);
>> +
>> +/**
>> + * TSI_Clean() - Cleans and closes the TSI library
>> + *
>> + * When TSI_Clean is called for the last time, cleanup the internal state. It
>> + * should be called exactly the same number of time as TSI_Init
>                                                    times
> 
>> + */
>> +TSI_RESULT TSI_Clean(void);
>> +
>> +/**
>> + * TSI_MISC_GetErrorDescription() - Get a human readable error message
>> + * @ErrorCode: Error code for which you want the message
>> + * @ErrorString: Pointer where to copy the message
>> + * @StringMaxLen: Size of the allocated string @ErrorString
>> + *
>> + * The official documentation states: If the function succeeds, the
>> + * return value is the number of characters required for the complete
>> + * error description string.
>> + * In reality, this function always returns 0 or error, so there is no way to
> 
> On error it returns 0...

0 *or* error (<0):

	If the function succeeds, the return value is the number of
	characters required for the complete error description string.
	If the return value is EQUAL or HIGHER than StringMaxLen
	parameter's value, it means that the string was truncated.
	If the function fails, the return value is a negative error
	code.

>> + * tell if the allocated memory was big enough
>> + *
>> + * Returns:
>> + * - >= 0 on success, theorically the required string len to store the message
>> + * - < 0 on failure
> 
> ...or <0?
>
>> + */
>> +TSI_RESULT TSI_MISC_GetErrorDescription(TSI_RESULT ErrorCode,
>> +					char *ErrorString,
>> +					unsigned int StringMaxLen);
>> +
>> +/**
>> + * TSIX_TS_GetConfigItem() - Read a configuration item from the UCD device
>> + * @Device: Device handle to read config from. Can be NULL for certain configuration items.
> 
> For which items it can be NULL? I can guess some global config items, not
> device-specific. Is it the case?

Yes, at least for `TSI_VERSION_TEXT` according to the examples provided 
by unigraf.

>> + * @ConfigItemID: Identifier of the requested configuration item.
>> + * @ConfigItemData: Pointer to store the read value.
>> + * @ItemMaxSize: Size of the allocated memory for @ConfigItemData.
>> + *
>> + * Returns: The size of the raw data. If the return value is larger than ItemMaxSize, no data
>> + *          is copied to ConfigItemData.
>> + * Note:
>> + * - Some configurations require specific size and alignment for the allocated buffer. Refer to
>> + *   the specific item configuration documentation for details.
>> + * - Data may still be written to @ConfigItemData even if the return value is larger than
>> + *   @ItemMaxSize, potentially causing buffer overflow.
> 
> Oh, amazing!
>>> + */
>> +TSI_RESULT TSIX_TS_GetConfigItem(TSI_HANDLE Device, TSI_CONFIG_ID ConfigItemID,
>> +				 void *ConfigItemData,
>> +				 unsigned int ItemMaxSize);
>> +
>> +/**
>> + * TSIX_DEV_RescanDevices() - Refresh the internal list of devices for libTSI
>> + * @SearchOptions: Options to filter the list of devices (e.g.,
>> + *                 TSI_SEARCHOPTIONS_SHOW_DEVICES_IN_USE to include
>> + *                 devices already in use).
>> + * @RequiredCaps: Filter to list only devices with specific capabilities.
>> + * @UnallowedCaps: Filter to list only devices without specific capabilities.
>> + *
>> + * Returns: >=0 in case of success.
> 
> The returned value is not the amount of devices found? It's just some
> arbitrary non-negative number?
> 
> Being a closed source blob I can well understand a "don't know" answer of
> course.

That what the documentation tell me (the documentation is a PDF provided 
with the unigraf SDK)

	If the function succeeds, the return value is zero. Please note
	that future versions may return non-zero positive value to
	indicate success.


> Also, maybe add "<0 on error"?

Good idea!

>> + *
>> + * This function should be called every time you need to update the list of connected devices,
>> + * and it must be called at least once before calling TSI_DEV_GetDeviceCount.
>> + */
>> +TSI_RESULT TSIX_DEV_RescanDevices(TSI_SEARCH_OPTIONS SearchOptions,
>> +				  TSI_DEVICE_CAPS RequiredCaps,
>> +				  TSI_DEVICE_CAPS UnallowedCaps);
>> +/**
>> + * TSIX_DEV_GetDeviceCount() - Get the count of scanned devices
>> + * Returns: the number of devices that the previous call to TSIX_DEV_RescanDevices() detected
>> + *
>> + * Must be called after a TSIX_DEV_RescanDevices.
>> + */
>> +TSI_RESULT TSIX_DEV_GetDeviceCount(void);
>> +
>> +/**
>> + * TSIX_DEV_OpenDevice() - Open a device from the scanned list
>> + * @DeviceID: index in the TSI_DEV_RescanDevices list
>> + * @Result: Pointer to store the error code returned while opening the device
>> + * Returns: if the device is found, an opaque pointer that can be used for other
>> + * API calls. If some error occurred during the detection, the status code is
>> + * written in the pointer @Result.
> 
> Not in the pointer, I believe! :-)
> 
> Maybe "is written in *@Result."? But the sentence is actually redundant,
> it's implicit in the @Result parameter description. I'd rather add what is
> returned on error. Just guessing that's NULL:
> 
>   * Returns: if the device is found, an opaque pointer that can be used for other
>   * API calls, or NULL on error.

That a good formulation, I will copy it!

> 
>> + */
>> +TSI_HANDLE TSIX_DEV_OpenDevice(TSI_DEVICE_ID DeviceID, TSI_RESULT *Result);
>> +
>> +/**
>> + * TSIX_DEV_CloseDevice() - Close the device handle when finished
>> + * @Device: Device handle to close
>> + * Returns: >=0 in case of success
>> + */
>> +TSI_RESULT TSIX_DEV_CloseDevice(TSI_HANDLE Device);
> 
> Why not moving TSIX_TS_GetConfigItem() and TSIX_TS_SetConfigItem() here,
> alsop keeping them nearby? It looks to me logical: first the init/open
> functions, then the get/set config, then the various video operations.

For unigraf the logic is: open, role select, VIN select, your stuff, VIN 
disable, close. VIN stuff is part of the "init".

>> +
>> +/**
>> + * TSIX_VIN_Disable() - Disable video input on the specified device
>> + * @Device: Device handle to disable video input on
>> + * Returns: >=0 in case of success
>> + */
>> +TSI_RESULT TSIX_VIN_Disable(TSI_HANDLE Device);
>> +
>> +/**
>> + * TSIX_VIN_Select() - Select a specific video input on the specified device
>> + * @Device: Device handle on which to select the input
>> + * @InputID: Identifier of the input to select
>> + * Returns: >=0 in case of success
>> + */
>> +TSI_RESULT TSIX_VIN_Select(TSI_HANDLE Device, TSI_INPUT_ID InputID);
>> +
>> +/**
>> + * TSIX_DEV_SelectRole() - Select a specific role for the specified device
>> + * @Device: Device handle on which to assign the role
>> + * @RoleIndex: Index of the role to assign
> 
> Is there an enum telling us which values mean what?

That would be too easy:

	A numeric value identifying the queried role. Valid RoleIndex
	values range from zero to the number of roles returned
	by TSIX_DEV_GetDeviceRoleCount minus one.

The only "identifier" for a role is the Name...

Role name is something like "UCD-500 DP Input,DP Output", "UCD 500, USBC 
Input,DP Output"...

> PS: I see you can get a list and the names from
> TSIX_DEV_GetDeviceRoleCount/Name(), below. One more reason to keep related
> functions together...
 >
>> +/**
>> + * TSIX_DEV_GetDeviceRoleName() - Get the name of a specific role for a device
>> + * @Device: Device handle to query
>> + * @RoleIndex: Index of the role to get the name for
>> + * @RoleNameString: Pointer to store the role name
>> + * @RoleStringMaxLength: Size of the allocated memory for @RoleNameString
>> + *
>> + * Returns: >=0 in case of success, the length of the role name string
>> + * Note: If the return value is larger than RoleStringMaxLength, the string may be truncated
>> + */
>> +TSI_RESULT TSIX_DEV_GetDeviceRoleName(TSI_HANDLE Device, int RoleIndex,
>> +				      char *RoleNameString, unsigned int RoleStringMaxLength);
>> +
> 
> ...as said above, TSIX_DEV_SelectRole() should probably be here.

Ack, I will reorder properly

Thanks for all your reviews!

>> +TSI_RESULT TSIX_VIN_GetInputName(TSI_HANDLE Device, TSI_INPUT_ID InputID,
>> +				 char *InputNameString, unsigned int NameStringMaxLen);
>> +
>> +#endif
> 
> As for patch 17, I'd add:
> 
>     #endif /* TSI_H */
> 
> 
> 
> --
> Luca Ceresoli, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 20/46] lib/igt_kms: Automatically connect unigraf on display require
  2025-11-10 13:39 ` [PATCH i-g-t v4 20/46] lib/igt_kms: Automatically connect unigraf on display require Louis Chauvet
@ 2026-01-22 20:26   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-22 20:26 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> As Unigraf can emualte a display, automatically connect it for all
> devices. If a test is already using unigraf, this have no effect.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h
  2026-01-22 16:53     ` Louis Chauvet
@ 2026-01-23 14:04       ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 14:04 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

Hi Louis,

On Thu Jan 22, 2026 at 5:53 PM CET, Louis Chauvet wrote:
>>> + */
>>> +TSI_RESULT TSI_Clean(void);
>>> +
>>> +/**
>>> + * TSI_MISC_GetErrorDescription() - Get a human readable error message
>>> + * @ErrorCode: Error code for which you want the message
>>> + * @ErrorString: Pointer where to copy the message
>>> + * @StringMaxLen: Size of the allocated string @ErrorString
>>> + *
>>> + * The official documentation states: If the function succeeds, the
>>> + * return value is the number of characters required for the complete
>>> + * error description string.
>>> + * In reality, this function always returns 0 or error, so there is no way to
>>
>> On error it returns 0...
>
> 0 *or* error (<0):

Aaah, sorry for the noise, I must have misread "0 on error".

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 21/46] lib/unigraf: Introduce device configuration
  2025-11-10 13:39 ` [PATCH i-g-t v4 21/46] lib/unigraf: Introduce device configuration Louis Chauvet
@ 2026-01-23 17:38   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 17:38 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> As there could be multiple devices detected by libTSI, add a configuration
> field to ensure that igt will use the proper unigraf device.
>
> The unigraf integration will search for a [Unigraf] entry containing a
> Device=
>
> For example, it can look like:
>
> [Unigraf]
> Device=UCD-500 [2434C620]
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/unigraf/unigraf.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 69 insertions(+), 7 deletions(-)
>
> diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
> index 55c3c445fa5e..304567467b27 100644
> --- a/lib/unigraf/unigraf.c
> +++ b/lib/unigraf/unigraf.c
> @@ -1,21 +1,16 @@
>  // SPDX-License-Identifier: MIT
>
> -#include "drmtest.h"
>  #include "glib.h"
>  #include "igt_core.h"
> -#include "igt_edid.h"
>  #include <stdint.h>
>  #include <stdio.h>
>  #include <string.h>
>  #include <time.h>
>
>  #include "unigraf.h"
> -#include "TSI.h"
>  #include "TSI_types.h"
> -#include "igt_kms.h"
> -#include "igt_pipe_crc.h"
> +#include "TSI.h"
>  #include "igt_rc.h"
> -#include "monitor_edids/monitor_edids_helper.h"

Why all these removals? Perhaps you should not include them in the first
place in patch 19?

>
>  #define unigraf_debug(fmt, ...)	igt_debug("TSI:%p: " fmt, unigraf_device, ##__VA_ARGS__)
>
> @@ -24,6 +19,19 @@ static TSI_HANDLE unigraf_device;
>  static char *unigraf_default_edid;
>  static char *unigraf_connector_name;
>
> +/**
> + * UNIGRAF_CONFIG_GROUP - Name of the unigraf group in the configuration file
> + */
> +#define UNIGRAF_CONFIG_GROUP "Unigraf"
> +/**
> + * UNIGRAF_CONFIG_DEVICE_NAME - Key of the device name in the configuration file
> + */
> +#define UNIGRAF_CONFIG_DEVICE_NAME "Device"
> +/**
> + * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
> + */
> +#define UNIGRAF_NAME_MAX 1024

In the next patch you move this define on top. Just define it on top here
and avoid moving it around later.

Otherwise LGTM.

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 23/46] lib/unigraf: Introduce input configuration
  2025-11-10 13:39 ` [PATCH i-g-t v4 23/46] lib/unigraf: Introduce input configuration Louis Chauvet
@ 2026-01-23 17:38   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 17:38 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> As multiple input can be present on unigraf devices, add a configuration
> field to select the proper input. By default it will take the first
> available.
>
> The configuration can look like:
>
> [Unigraf]
> Device=UCD-500 [2434C620]
> Role=DisplayPort Source and Sink
> Input=DP RX
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function
  2025-11-10 13:39 ` [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function Louis Chauvet
@ 2026-01-23 17:39   ` Luca Ceresoli
  2026-01-26 10:45     ` Louis Chauvet
  0 siblings, 1 reply; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 17:39 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> To have a consistent state at the beginning of tests, add a unigraf_reset
> function that will restore a known state.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/unigraf/unigraf.c | 5 +++++
>  lib/unigraf/unigraf.h | 9 +++++++++
>  2 files changed, 14 insertions(+)
>
> diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
> index 59a85e1b84c9..e96c7fc3a91e 100644
> --- a/lib/unigraf/unigraf.c
> +++ b/lib/unigraf/unigraf.c
> @@ -278,6 +278,8 @@ bool unigraf_open_device(int drm_fd)
>  	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
>  	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));
>
> +	unigraf_reset();
> +
>  	return true;
>  }
>
> @@ -285,3 +287,6 @@ void unigraf_require_device(int drm_fd)
>  {
>  	igt_require(unigraf_open_device(drm_fd));
>  }
> +
> +void unigraf_reset(void)
> +{}

Weird implementation :) But OK, code is added in patch 26.

> diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
> index a93bd464bac3..76f4f8878c2c 100644
> --- a/lib/unigraf/unigraf.h
> +++ b/lib/unigraf/unigraf.h
> @@ -48,4 +48,13 @@ bool unigraf_open_device(int drm_fd);
>   */
>  void unigraf_require_device(int drm_fd);
>
> +/**
> + * unigraf_reset() - Reset the Unigraf device
> + *
> + * This function performs a hardware reset of the Unigraf device, restoring it to a
> + * default state. This includes resetting all configuration parameters, stream settings,
> + * and link parameters to default values.
> + */
> +void unigraf_reset(void);

Why declaring it in a header file when it's implemented and used in the
same .c file? It should rather be static.

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 25/46] lib/unigraf: Add unigraf assert and deassert helpers
  2025-11-10 13:39 ` [PATCH i-g-t v4 25/46] lib/unigraf: Add unigraf assert and deassert helpers Louis Chauvet
@ 2026-01-23 17:40   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 17:40 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Unigraf is able to manipulate the HPD line of the connector, add few
> helpers to manipulate them.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

[...]

> @@ -290,3 +310,23 @@ void unigraf_require_device(int drm_fd)
>
>  void unigraf_reset(void)
>  {}
> +
> +void unigraf_hpd_assert(void)
> +{
> +	unigraf_write_u32(TSI_FORCE_HOT_PLUG_STATE_W, 1);
> +}
> +
> +void unigraf_hpd_pulse(int duration)
> +{
> +	// In theory this should work:
> +	// unigraf_write_u32(TSI_DPRX_HPD_PULSE_W, duration);
> +	// But this seems to be broken and this work:
                                                works

> --- a/lib/unigraf/unigraf.h
> +++ b/lib/unigraf/unigraf.h
> @@ -57,4 +57,26 @@ void unigraf_require_device(int drm_fd);
>   */
>  void unigraf_reset(void);
>
> +/**
> + * unigraf_hpd_deassert() - Deassert Hot Plug Detect signal
> + *
> + * This function deasserts the HPD signal, simulating a device disconnection.
> + */
> +void unigraf_hpd_deassert(void);
> +
> +/**
> + * unigraf_hpd_pulse() - Pulse the Hot Plug Detect signal
> + * @duration: The duration in milliseconds for which the HPD signal should be pulsed
> + *
> + * This function pulses the HPD signal for the specified duration.
> + */

Maybe it's obvious to IGT developers, but not to me, whether the pulse is
deassert-wait-assert or assert-wait-deassert.

Also, as for other patches, should the docs be in the .c?

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 26/46] lib/unigraf: Add plug/unplug helpers
  2025-11-10 13:39 ` [PATCH i-g-t v4 26/46] lib/unigraf: Add plug/unplug helpers Louis Chauvet
@ 2026-01-23 17:40   ` Luca Ceresoli
  2026-01-26 11:28     ` Luca Ceresoli
  0 siblings, 1 reply; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 17:40 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> The unigraf can emulate a full cable plug/unplug, so add helper to emulate
> this.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>



--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 27/46] lib/unigraf: Allows sst/mst configuration
  2025-11-10 13:39 ` [PATCH i-g-t v4 27/46] lib/unigraf: Allows sst/mst configuration Louis Chauvet
@ 2026-01-23 17:40   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 17:40 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Unigraf devices can emulate both SST and MST display port. In order to
> write tests using both, add fews helper to manipulate them.
>
> The define TSI_DPRX_NOT_DOCUMENTED_SIDEBAND_MSG_SUPPORT is taken from the
> python SDK, as it was not defined by the C sdk nor documented.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---

[...]

> +bool unigraf_set_mst_stream_count(int count)
> +{
> +	int new_count;
> +
> +	igt_assert_lte(count, unigraf_get_mst_stream_max_count());
> +
> +	unigraf_write_u32(TSI_DPRX_MST_SINK_COUNT, count);
> +	new_count = unigraf_get_mst_stream_count();
> +
> +	igt_warn_on_f(count != new_count,
> +		      "IGT:%p: Requested MST stream count (%d) differ from what was applied by the device (%d)\n",
                                                               differs

> diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
> index 14e5fd984159..9fcae674b1d5 100644
> --- a/lib/unigraf/unigraf.h
> +++ b/lib/unigraf/unigraf.h
> @@ -93,4 +93,42 @@ void unigraf_plug(void);
>   */
>  void unigraf_unplug(void);
>
> +/**
> + * unigraf_set_sst() - Configure the device for Single Stream Transport mode
> + *
> + * This function sets the device to operate in Single Stream Transport (SST) mode.
> + */
> +void unigraf_set_sst(void);
> +
> +/**
> + * unigraf_set_mst() - Configure the device for Multi Stream Transport mode
> + *
> + * This function sets the device to operate in Multi Stream Transport (MST) mode.
> + */
> +void unigraf_set_mst(void);
> +
> +/**
> + * unigraf_get_mst_stream_count() - Get the current number of MST streams
> + *
> + * Returns: The current number of MST streams configured on the device.
> + */
> +int unigraf_get_mst_stream_count(void);
> +
> +/**
> + * unigraf_set_mst_stream_count() - Set the number of accepted stream count
> + *
> + * Returns true when the stream count was properly applied, false if the final stream count
> + * is not the one requested
> + */
> +bool unigraf_set_mst_stream_count(int count);
> +
> +/**
> + * unigraf_get_mst_stream_max_count() - Get the maximum number of stream count accepted by the
> + * device
> + * Caution: This function can be destructive to some configuration: the only way to get the
> + * information is to try and read the new value.
> + */
> +int unigraf_get_mst_stream_max_count(void);
> +void unigraf_select_stream(int stream);

This function is not documented.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 28/46] lib/unigraf: Add helpers to read and write edid
  2025-11-10 13:39 ` [PATCH i-g-t v4 28/46] lib/unigraf: Add helpers to read and write edid Louis Chauvet
@ 2026-01-23 17:40   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-23 17:40 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Read and writing EDID on unigraf can be useful to emulate different
> screens, add helpers to read and write them.
>
> There is a limitation on the libTSI.so, it is only possible to read EDID
> using buffers of size multiple of 128 bytes, and there is no way to query
> the actual EDID size. The current implementation can only read EDID up to
> 2048 bytes.
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/unigraf/unigraf.c | 40 ++++++++++++++++++++++++++++++++++++++++
>  lib/unigraf/unigraf.h | 21 +++++++++++++++++++++
>  2 files changed, 61 insertions(+)
>
> diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
> index 9e77a052d755..2229202ea868 100644
> --- a/lib/unigraf/unigraf.c
> +++ b/lib/unigraf/unigraf.c
> @@ -125,6 +125,21 @@ static uint32_t _unigraf_read_u32(TSI_CONFIG_ID config_id)
>  		value;								\
>  	})
>
> +/**
> + * unigraf_write() - Helper to write a value to unigraf
> + * @dev: device handle, can be null for some config id

This function has no @dev parameter.

> + * @config: config id to write
> + * @data: data to write
> + * @data_len: length of the data
> + * Returns
> + */
> +static void unigraf_write(TSI_CONFIG_ID config, const void *data, size_t data_len)
> +{
> +	unigraf_debug("Writing %zu bytes to 0x%x\n", data_len, config);
> +
> +	unigraf_assert(TSIX_TS_SetConfigItem(unigraf_device, config, data, data_len));
> +}
> +
>  /**
>   * unigraf_device_count() - Return the number of scanned devices
>   *
> @@ -332,6 +347,31 @@ void unigraf_reset(void)
>  	unigraf_set_sst();
>  }
>
> +struct edid *unigraf_read_edid(uint32_t stream, uint32_t *edid_size)
> +{
> +	void *edid;
> +
> +	unigraf_debug("Read EDID for stream %d...\n", stream);
> +
> +	edid = malloc(2048);
> +	memset(edid, 0, 2048);
> +
> +	unigraf_write_u32(TSI_EDID_SELECT_STREAM, stream);
> +	*edid_size = unigraf_assert(TSIX_TS_GetConfigItem(unigraf_device,
> +							  TSI_EDID_TE_INPUT,
> +							  edid, 2048));
> +
> +	return edid;
> +}
> +
> +void unigraf_write_edid(uint32_t stream, const struct edid *edid, uint32_t edid_size)
> +{
> +	unigraf_debug("Write EDID for stream %d...\n", stream);
> +
> +	unigraf_write_u32(TSI_EDID_SELECT_STREAM, stream);
> +	unigraf_write(TSI_EDID_TE_INPUT, edid, 2048);
> +}
> +
>  void unigraf_hpd_assert(void)
>  {
>  	unigraf_write_u32(TSI_FORCE_HOT_PLUG_STATE_W, 1);
> diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
> index 9fcae674b1d5..983a21bbd61b 100644
> --- a/lib/unigraf/unigraf.h
> +++ b/lib/unigraf/unigraf.h
> @@ -57,6 +57,27 @@ void unigraf_require_device(int drm_fd);
>   */
>  void unigraf_reset(void);
>
> +/**
> + * unigraf_read_edid() - Read the EDID from the specified input

"from the specified stream"?

> + * @dev: The device handle

This function has no @dev parameter.

> + * @stream: The stream ID to read the EDID from
> + * @edid_size: Pointer to an integer where the size of the EDID will be stored
> + *
> + * Returns: A pointer to the EDID structure, or NULL if the operation failed. The caller
> + * is responsible to free this pointer.
> + */
> +struct edid *unigraf_read_edid(uint32_t stream, uint32_t *edid_size);

With the two @dev lines removed and the unigraf_read_edid() description fixed:
 Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function
  2026-01-23 17:39   ` Luca Ceresoli
@ 2026-01-26 10:45     ` Louis Chauvet
  2026-01-26 11:28       ` Luca Ceresoli
  0 siblings, 1 reply; 90+ messages in thread
From: Louis Chauvet @ 2026-01-26 10:45 UTC (permalink / raw)
  To: Luca Ceresoli, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev



On 1/23/26 18:39, Luca Ceresoli wrote:
> On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
>> To have a consistent state at the beginning of tests, add a unigraf_reset
>> function that will restore a known state.
>>
>> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
>> ---
>>   lib/unigraf/unigraf.c | 5 +++++
>>   lib/unigraf/unigraf.h | 9 +++++++++
>>   2 files changed, 14 insertions(+)
>>
>> diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
>> index 59a85e1b84c9..e96c7fc3a91e 100644
>> --- a/lib/unigraf/unigraf.c
>> +++ b/lib/unigraf/unigraf.c
>> @@ -278,6 +278,8 @@ bool unigraf_open_device(int drm_fd)
>>   	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
>>   	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));
>>
>> +	unigraf_reset();
>> +
>>   	return true;
>>   }
>>
>> @@ -285,3 +287,6 @@ void unigraf_require_device(int drm_fd)
>>   {
>>   	igt_require(unigraf_open_device(drm_fd));
>>   }
>> +
>> +void unigraf_reset(void)
>> +{}
> 
> Weird implementation :) But OK, code is added in patch 26.

Patch 26 also introduce a different set of features. I wanted to avoid 
mixing the reset creation with it to simplify review and rebases.

>> diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
>> index a93bd464bac3..76f4f8878c2c 100644
>> --- a/lib/unigraf/unigraf.h
>> +++ b/lib/unigraf/unigraf.h
>> @@ -48,4 +48,13 @@ bool unigraf_open_device(int drm_fd);
>>    */
>>   void unigraf_require_device(int drm_fd);
>>
>> +/**
>> + * unigraf_reset() - Reset the Unigraf device
>> + *
>> + * This function performs a hardware reset of the Unigraf device, restoring it to a
>> + * default state. This includes resetting all configuration parameters, stream settings,
>> + * and link parameters to default values.
>> + */
>> +void unigraf_reset(void);
> 
> Why declaring it in a header file when it's implemented and used in the
> same .c file? It should rather be static.

Because I use it in the last patch of the series in 
tests/unigraf/unigraf_lt and I wanted to avoid changing the function later.

> --
> Luca Ceresoli, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com


^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function
  2026-01-26 10:45     ` Louis Chauvet
@ 2026-01-26 11:28       ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-26 11:28 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Jan 26, 2026 at 11:45 AM CET, Louis Chauvet wrote:
>
>
> On 1/23/26 18:39, Luca Ceresoli wrote:
>> On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
>>> To have a consistent state at the beginning of tests, add a unigraf_reset
>>> function that will restore a known state.
>>>
>>> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
>>> ---
>>>   lib/unigraf/unigraf.c | 5 +++++
>>>   lib/unigraf/unigraf.h | 9 +++++++++
>>>   2 files changed, 14 insertions(+)
>>>
>>> diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
>>> index 59a85e1b84c9..e96c7fc3a91e 100644
>>> --- a/lib/unigraf/unigraf.c
>>> +++ b/lib/unigraf/unigraf.c
>>> @@ -278,6 +278,8 @@ bool unigraf_open_device(int drm_fd)
>>>   	unigraf_assert(TSIX_VIN_Select(unigraf_device, chosen_input));
>>>   	unigraf_assert(TSIX_VIN_Enable(unigraf_device, chosen_input));
>>>
>>> +	unigraf_reset();
>>> +
>>>   	return true;
>>>   }
>>>
>>> @@ -285,3 +287,6 @@ void unigraf_require_device(int drm_fd)
>>>   {
>>>   	igt_require(unigraf_open_device(drm_fd));
>>>   }
>>> +
>>> +void unigraf_reset(void)
>>> +{}
>>
>> Weird implementation :) But OK, code is added in patch 26.
>
> Patch 26 also introduce a different set of features. I wanted to avoid
> mixing the reset creation with it to simplify review and rebases.

Yes, sure, make sense! I was just looking funny :)

>>> diff --git a/lib/unigraf/unigraf.h b/lib/unigraf/unigraf.h
>>> index a93bd464bac3..76f4f8878c2c 100644
>>> --- a/lib/unigraf/unigraf.h
>>> +++ b/lib/unigraf/unigraf.h
>>> @@ -48,4 +48,13 @@ bool unigraf_open_device(int drm_fd);
>>>    */
>>>   void unigraf_require_device(int drm_fd);
>>>
>>> +/**
>>> + * unigraf_reset() - Reset the Unigraf device
>>> + *
>>> + * This function performs a hardware reset of the Unigraf device, restoring it to a
>>> + * default state. This includes resetting all configuration parameters, stream settings,
>>> + * and link parameters to default values.
>>> + */
>>> +void unigraf_reset(void);
>>
>> Why declaring it in a header file when it's implemented and used in the
>> same .c file? It should rather be static.
>
> Because I use it in the last patch of the series in
> tests/unigraf/unigraf_lt and I wanted to avoid changing the function later.

Ah, OK, it's fine then. I still haven't reached patch 46.

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 22/46] lib/unigraf: Introduce role configuration
  2025-11-10 13:39 ` [PATCH i-g-t v4 22/46] lib/unigraf: Introduce role configuration Louis Chauvet
@ 2026-01-26 11:28   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-26 11:28 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Some unigraf devices, like the UCD-500 can have multiple hardware
> configurations: displayport input/output, usbc input/output.
>
> The device configuration can look like:
>
> [Unigraf]
> Device=UCD-500 [2434C620]
> Role=DisplayPort Source and Sink
>
> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>
> ---
>  lib/unigraf/unigraf.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 62 insertions(+), 3 deletions(-)
>
> diff --git a/lib/unigraf/unigraf.c b/lib/unigraf/unigraf.c
> index 304567467b27..0b8fe11a957b 100644
> --- a/lib/unigraf/unigraf.c
> +++ b/lib/unigraf/unigraf.c
> @@ -19,18 +19,30 @@ static TSI_HANDLE unigraf_device;
>  static char *unigraf_default_edid;
>  static char *unigraf_connector_name;
>
> +/**
> + * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
> + */
> +#define UNIGRAF_NAME_MAX 1024
> +
>  /**
>   * UNIGRAF_CONFIG_GROUP - Name of the unigraf group in the configuration file
>   */
>  #define UNIGRAF_CONFIG_GROUP "Unigraf"
> +
>  /**
>   * UNIGRAF_CONFIG_DEVICE_NAME - Key of the device name in the configuration file
>   */
>  #define UNIGRAF_CONFIG_DEVICE_NAME "Device"
> +
>  /**
> - * UNIGRAF_NAME_MAX - Maximum name length to be used for TSI functions
> + * UNIGRAF_CONFIG_DEVICE_ROLE - Key of the device role in the configuration file
>   */
> -#define UNIGRAF_NAME_MAX 1024
> +#define UNIGRAF_CONFIG_DEVICE_ROLE "Role"

Based on my comment to patch 21 you won't need to move or touch
UNIGRAF_NAME_MAX at all in this patch. The diff about
UNIGRAF_CONFIG_DEVICE_ROLE will also become clean after that.

With that done you can add:

 Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 26/46] lib/unigraf: Add plug/unplug helpers
  2026-01-23 17:40   ` Luca Ceresoli
@ 2026-01-26 11:28     ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-26 11:28 UTC (permalink / raw)
  To: Luca Ceresoli, Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Fri Jan 23, 2026 at 6:40 PM CET, Luca Ceresoli wrote:
> On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
>> The unigraf can emulate a full cable plug/unplug, so add helper to emulate
>> this.
>>
>> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

Oops, missing line in my reply, sorry about that!

Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 29/46] lib/unigraf: Add connector configuration
  2025-11-10 13:39 ` [PATCH i-g-t v4 29/46] lib/unigraf: Add connector configuration Louis Chauvet
@ 2026-01-26 11:40   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-26 11:40 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

Hi Louis,

You are adding a connector config but also an EDID config, so the commit
message should mention both.

So:
-Subject: Add connector configuration
+Subject: Add connector and EDID configuration
?

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> As multiple connectors can be present on the DUT, add a configuration to
> tell which connector is used by the Unigraf.

+ "and which EDID to use." ?

>
> The configuration will look like:
>
> [Unigraf]
> Device=UCD-500 [2434C620]
> Role=DisplayPort Source and Sink
> Input=DP RX
> Connector=DP-4

+EDID=<some example string that makes sense>?

The code diff looks good.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [PATCH i-g-t v4 30/46] tests/unigraf: Add basic unigraf tests
  2025-11-10 13:39 ` [PATCH i-g-t v4 30/46] tests/unigraf: Add basic unigraf tests Louis Chauvet
@ 2026-01-26 12:00   ` Luca Ceresoli
  0 siblings, 0 replies; 90+ messages in thread
From: Luca Ceresoli @ 2026-01-26 12:00 UTC (permalink / raw)
  To: Louis Chauvet, igt-dev
  Cc: thomas.petazzoni, markyacoub, khaled.almahallawy, igt-dev

On Mon Nov 10, 2025 at 2:39 PM CET, Louis Chauvet wrote:
> Adds two tests to validate unigraf communication.
>
> unigraf-connected checks if the device is connected and if the EDID is
> properly applied.
>
> ungiraf-disconnect checks if the device can be connected/reconnected using
> SST and MST configurations.

Nit: why not using the same verb tense for the tewo tests? Either both
imperative ("connect" and "disconnect") or both past participle
("connected" and "disconnected"). Perhaps the imperative is better unless
there are different conventions in IGT.

> +++ b/tests/unigraf/unigraf_connectivity.c
> @@ -0,0 +1,123 @@
> +// SPDX-License-Identifier: MIT
> +
> +#include <stdint.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <xf86drmMode.h>
> +
> +#include "drmtest.h"
> +#include "igt_aux.h"
> +#include "igt_core.h"
> +#include "igt_kms.h"
> +#include "unigraf/unigraf.h"
> +
> +/**
> + * TEST: unigraf connectivity
> + * Category: Core
> + * Description: Testing connectivity with a unigraf device
> + *
> + * SUBTEST: unigraf-open
> + * Description: Make sure that a unigraf device can be accessed
> + *
> + * SUBTEST: unigraf-connected
> + * Description: Make sure that the unigraf device is connected to the DUT

The "unigraf-open" test does not exist, and you missed the
"unigraf-disconnect[ed]" test.

> +IGT_TEST_DESCRIPTION("Test basic unigraf connectivity");
> +igt_main
> +{
> +	int drm_fd;
> +
> +	igt_fixture {
> +		drm_fd = drm_open_driver_master(DRIVER_ANY);
> +	}
> +
> +	igt_describe("Make sure that the unigraf device is connected to the DUT");
> +	igt_subtest("unigraf-connected") {
> +		drmModePropertyBlobPtr edid_blob = NULL;
> +		struct igt_display display;
> +		uint64_t edid_blob_id;
> +		igt_output_t *output;
> +		uint32_t unigraf_edid_len;
> +		void *unigraf_edid;
> +		bool found = false;
> +
> +		unigraf_require_device(drm_fd);
> +		unigraf_hpd_deassert();
> +		sleep(1);
> +		unigraf_set_sst();
> +		unigraf_hpd_assert();
> +
> +		sleep(5);
> +
> +		igt_display_require(&display, drm_fd);
> +		sleep(5);
> +
> +		unigraf_edid = unigraf_read_edid(0, &unigraf_edid_len);
> +
> +		for_each_connected_output(&display, output) {
> +			if (output->config.connector->connector_type ==
> +			    DRM_MODE_CONNECTOR_DisplayPort) {
> +				igt_assert(kmstest_get_property(drm_fd,
> +								output->config.connector->connector_id,
> +								DRM_MODE_OBJECT_CONNECTOR, "EDID",
> +								NULL, &edid_blob_id, NULL));
> +				edid_blob = drmModeGetPropertyBlob(drm_fd, edid_blob_id);
> +				if (!edid_blob)
> +					continue;
> +
> +				found |= memcmp(unigraf_edid, edid_blob->data,
> +						min(edid_blob->length, unigraf_edid_len)) == 0;

Even though it would work, using a bitwise OR is strange here. @found is
not really a bitmask, and the == operator does not return one. I'd use a
more intuitive form:

				if (memcmp(...) == 0)
					  found = true;

> +
> +				drmModeFreePropertyBlob(edid_blob);

Why not breaking the loop when found?

	if (found)
		break;

> +			}
> +		}
> +		igt_assert_f(found, "No output with the correct EDID was found\n");
> +
> +		free(unigraf_edid);
> +	}
> +
> +	igt_describe("Make sure that the unigraf device can be deconnected/reconnected");
                                                               disconnected

> +	igt_subtest("ungiraf-disconnect") {
> +		int newly_connected_count, already_connected_count, diff_len;
> +		uint32_t *newly_connected = NULL, *already_connected = NULL, *diff = NULL;
> +		int max_count;
> +
> +		unigraf_require_device(drm_fd);
> +		max_count = unigraf_get_mst_stream_max_count();
> +
> +		unigraf_hpd_deassert();
> +
> +		already_connected_count = igt_get_connected_connectors(drm_fd, &already_connected);
> +
> +		igt_debug("Already connected count: %d\n", already_connected_count);
> +
> +		// i = 0 is SST

If I got what you mean with this comment, I'd clarify it as:

		// i = 0 is SST so we need to process max_count + 1 streams

Otherwise looks good.

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 90+ messages in thread

end of thread, other threads:[~2026-01-26 12:00 UTC | newest]

Thread overview: 90+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-10 13:39 [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 01/46] lib/igt_kms: Add a detect timeout value Louis Chauvet
2026-01-20 21:09   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 02/46] lib/igt_kms: Add helper to wait for a specific status on a connector Louis Chauvet
2026-01-20 21:09   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 03/46] lib/igt_kms: Add function to list connected connectors Louis Chauvet
2026-01-20 21:10   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 04/46] lib/igt_kms: Add helper to obtain a connector by its name or MST path Louis Chauvet
2026-01-20 21:10   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 05/46] lib/igt_kms: Add helper to wait for new connectors Louis Chauvet
2026-01-20 21:10   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 06/46] lib/igt_kms: Add helper to get a pipe from a connector Louis Chauvet
2026-01-20 21:10   ` Luca Ceresoli
2026-01-22 15:50     ` Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 07/46] lib/igt_kms: Expose dump_connector_attrs Louis Chauvet
2026-01-20 21:10   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 08/46] lib/igt_kms: Expose reset_connectors_at_exit Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 09/46] lib/igt_kms: Expose connector_attr_set and igt_connector_attr_set Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 10/46] lib/igt_debugfs: Move debugfs helpers to the proper location Louis Chauvet
2026-01-20 21:10   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 11/46] lib/igt_debugfs: Add const when make sense Louis Chauvet
2026-01-20 21:11   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 12/46] lib/igt_amd: " Louis Chauvet
2026-01-20 21:11   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 13/46] lib/igt_kms: " Louis Chauvet
2026-01-20 21:11   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 14/46] lib/monitor_edids: Add helper functions for using monitor_edid objects Louis Chauvet
2026-01-20 21:11   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 15/46] lib/monitor_edids: Add helper to get an EDID by its name Louis Chauvet
2026-01-20 21:11   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 16/46] lib/monitor_edids: Add helper to print all available EDID names Louis Chauvet
2026-01-20 21:11   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 17/46] lib/unigraf: Add used defines for TSI_Types Louis Chauvet
2026-01-21 17:49   ` Luca Ceresoli
2026-01-22 16:40     ` Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 18/46] lib/unigraf: Add TSI.h Louis Chauvet
2026-01-21 17:49   ` Luca Ceresoli
2026-01-22 16:53     ` Louis Chauvet
2026-01-23 14:04       ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 19/46] lib/unigraf: Initial Unigraf support Louis Chauvet
2026-01-21 18:23   ` Luca Ceresoli
2026-01-21 18:30   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 20/46] lib/igt_kms: Automatically connect unigraf on display require Louis Chauvet
2026-01-22 20:26   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 21/46] lib/unigraf: Introduce device configuration Louis Chauvet
2026-01-23 17:38   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 22/46] lib/unigraf: Introduce role configuration Louis Chauvet
2026-01-26 11:28   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 23/46] lib/unigraf: Introduce input configuration Louis Chauvet
2026-01-23 17:38   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 24/46] lib/unigraf: Add reset function Louis Chauvet
2026-01-23 17:39   ` Luca Ceresoli
2026-01-26 10:45     ` Louis Chauvet
2026-01-26 11:28       ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 25/46] lib/unigraf: Add unigraf assert and deassert helpers Louis Chauvet
2026-01-23 17:40   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 26/46] lib/unigraf: Add plug/unplug helpers Louis Chauvet
2026-01-23 17:40   ` Luca Ceresoli
2026-01-26 11:28     ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 27/46] lib/unigraf: Allows sst/mst configuration Louis Chauvet
2026-01-23 17:40   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 28/46] lib/unigraf: Add helpers to read and write edid Louis Chauvet
2026-01-23 17:40   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 29/46] lib/unigraf: Add connector configuration Louis Chauvet
2026-01-26 11:40   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 30/46] tests/unigraf: Add basic unigraf tests Louis Chauvet
2026-01-26 12:00   ` Luca Ceresoli
2025-11-10 13:39 ` [PATCH i-g-t v4 31/46] lib/unigraf: Add unigraf CRC capture Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 32/46] lib/unigraf: Add configuration for CRC usage Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 33/46] lib/unigraf: add unigraf_get_connector_by_stream Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 34/46] lib/unigraf: Add helper to check timings received by unigraf Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 35/46] lib/igt_pipe_crc: Add ungiraf crc calculation Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 36/46] lib/unigraf: Add lane count configuration Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 37/46] docs/unigraf: Add unigraf documentation Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 38/46] lib/unigraf: Add helpers to set maximum link rate Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 39/46] lib/i915/dp: Move DP-related function for i915 to proper folder Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 40/46] lib/i915/dp: Rename functions to avoid confusion Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 41/46] lib/i915/dp: Add helper to get maximum supported rate Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 42/46] lib/igt_dp: Create generic helpers for DP information Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 43/46] lib/igt_kms: Add asserts to avoid null pointer dereference Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 44/46] lib/igt_kms: Add helper to get a pipe from an output Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 45/46] lib/unigraf: Add helpers to get the current LT status Louis Chauvet
2025-11-10 13:39 ` [PATCH i-g-t v4 46/46] tests/unigraf/unigraf_lt: Add test for link training Louis Chauvet
2025-11-10 22:34 ` ✓ Xe.CI.BAT: success for Unigraf integration (rev3) Patchwork
2025-11-10 22:44 ` ✓ i915.CI.BAT: " Patchwork
2025-11-11  5:34 ` ✓ i915.CI.Full: " Patchwork
2025-11-11  5:49 ` ✗ Xe.CI.Full: failure " Patchwork
2025-12-18 14:50 ` [PATCH i-g-t v4 00/46] Unigraf integration Louis Chauvet
2025-12-18 15:59   ` Mark Yacoub
2026-01-20 21:09 ` Luca Ceresoli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox