Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH i-g-t 00/39] VKMS configfs tests
@ 2025-02-18 16:49 José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type José Expósito
                   ` (43 more replies)
  0 siblings, 44 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Hi everyone,

This series add tests for the VKMS + configfs work Louis Chauvet and I are doing
in the kernel.

This new functionality allows to configure one or more VKMS instances without
having to reload the driver using configfs.

For more details, have a look to the kernel patchset and the documentation in
"vkms.rst" (not merged yet).

There was a previous attempt to implement this tests [1] and I kept copyright
were required.

Best wishes,
José Expósito

[1] https://lists.freedesktop.org/archives/igt-dev/2023-September/060717.html

José Expósito (39):
  lib/drmtest: Add VKMS as a known driver type
  lib/igt_debugfs: Move is_mountpoint() to igt_aux
  lib/igt_configfs: Add helper to mount configfs
  lib/vkms: Add minimal VKMS library and test device default files
  lib/vkms: Allow to enable/disable VKMS devices
  tests/vkms_configfs: Test device invalid values
  lib/vkms: Test plane default files
  lib/vkms: Test plane default values
  lib/vkms: Test plane invalid values
  lib/vkms: Test CRTC default files
  lib/vkms: Test CRTC default values
  lib/vkms: Test CRTC invalid values
  lib/vkms: Test encoder default files
  lib/vkms: Test connector default files
  lib/vkms: Test connector default values
  lib/vkms: Test plane connector invalid values
  lib/vkms: Test attaching planes to CRTCs
  lib/vkms: Test attaching encoders to CRTCs
  lib/vkms: Test attaching connectors to encoders
  tests/vkms_configfs: Test enablement without pipeline items
  lib/vkms: Create VKMS device from static config
  tests/vkms_configfs: Test adding too many planes
  tests/vkms_configfs: Test not adding a primary plane
  tests/vkms_configfs: Test adding multiple primary planes
  tests/vkms_configfs: Test adding multiple cursor planes
  tests/vkms_configfs: Test adding a plane without possible CRTCs
  tests/vkms_configfs: Test enabling a device without CRTCs
  tests/vkms_configfs: Test enabling a device with too many CRTCs
  tests/vkms_configfs: Test enabling a device without encoders
  tests/vkms_configfs: Test enabling a device with too many encoders
  tests/vkms_configfs: Test adding an encoder without possible CRTCs
  tests/vkms_configfs: Test adding a CRTC without encoders
  tests/vkms_configfs: Test enabling a device without connectors
  tests/vkms_configfs: Test enabling a device with too many connectors
  lib/vkms: Test changing enabled device planes
  lib/vkms: Test changing enabled device CRTCs
  lib/vkms: Test changing enabled device encoders
  lib/vkms: Test changing enabled device connectors
  tests/vkms_configfs: Test connector hot-plug

 docs/testplan/meson.build        |    7 +-
 lib/drmtest.c                    |   18 +
 lib/drmtest.h                    |    8 +-
 lib/igt.h                        |    1 +
 lib/igt_aux.c                    |   25 +
 lib/igt_aux.h                    |    2 +
 lib/igt_configfs.c               |   57 +
 lib/igt_configfs.h               |   13 +
 lib/igt_debugfs.c                |   29 +-
 lib/igt_vkms.c                   |  794 +++++++++++++
 lib/igt_vkms.h                   |  109 ++
 lib/meson.build                  |    2 +
 meson.build                      |    8 +
 tests/meson.build                |    2 +
 tests/vkms/meson.build           |   13 +
 tests/vkms/vkms_configfs.c       | 1884 ++++++++++++++++++++++++++++++
 tests/vkms/vkms_test_config.json |   72 ++
 17 files changed, 3013 insertions(+), 31 deletions(-)
 create mode 100644 lib/igt_configfs.c
 create mode 100644 lib/igt_configfs.h
 create mode 100644 lib/igt_vkms.c
 create mode 100644 lib/igt_vkms.h
 create mode 100644 tests/vkms/meson.build
 create mode 100644 tests/vkms/vkms_configfs.c
 create mode 100644 tests/vkms/vkms_test_config.json

-- 
2.48.1


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

* [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:12   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 02/39] lib/igt_debugfs: Move is_mountpoint() to igt_aux José Expósito
                   ` (42 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito, Jim Shargo, Marius Vlad

As we are going to add VKMS specific tests, allow to check if it is
available.

Co-developed-by: Jim Shargo <jshargo@chromium.org>
Signed-off-by: Jim Shargo <jshargo@chromium.org>
Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/drmtest.c | 18 ++++++++++++++++++
 lib/drmtest.h |  8 ++++++--
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 436b6de78..2cc6e0c29 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -971,3 +971,21 @@ void igt_require_xe(int fd)
 {
 	igt_require(is_xe_device(fd));
 }
+
+void igt_require_vkms(void)
+{
+	/*
+	 * Since VKMS can create and destroy virtual drivers at will, instead
+	 * look to make sure the driver is installed.
+	 */
+	struct stat s = {};
+	int ret;
+	const char *vkms_module_dir = "/sys/module/vkms";
+
+	ret = stat(vkms_module_dir, &s);
+
+	igt_require_f(ret == 0, "VKMS stat of %s returned %d (%s)\n",
+		      vkms_module_dir, ret, strerror(ret));
+	igt_require_f(S_ISDIR(s.st_mode),
+		      "VKMS stat of %s was not a directory\n", vkms_module_dir);
+}
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 27e5a18e2..1b57e49ec 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -54,15 +54,18 @@ int __get_drm_device_name(int fd, char *name, int name_size);
 #define DRIVER_PANFROST	(1 << 5)
 #define DRIVER_MSM	(1 << 6)
 #define DRIVER_XE	(1 << 7)
-#define DRIVER_VMWGFX   (1 << 8)
+#define DRIVER_VKMS	(1 << 8)
+#define DRIVER_VMWGFX	(1 << 9)
 
 /*
  * Exclude DRVER_VGEM from DRIVER_ANY since if you run on a system
  * with vgem as well as a supported driver, you can end up with a
  * near-100% skip rate if you don't explicitly specify the device,
  * depending on device-load ordering.
+ *
+ * Exclude VKMS to prefer hardware drivers.
  */
-#define DRIVER_ANY 	~(DRIVER_VGEM)
+#define DRIVER_ANY	~(DRIVER_VGEM | DRIVER_VKMS)
 
 /*
  * Compile friendly enum for i915/xe.
@@ -135,6 +138,7 @@ void igt_require_i915(int fd);
 void igt_require_nouveau(int fd);
 void igt_require_vc4(int fd);
 void igt_require_xe(int fd);
+void igt_require_vkms(void);
 
 bool is_amdgpu_device(int fd);
 bool is_i915_device(int fd);
-- 
2.48.1


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

* [PATCH i-g-t 02/39] lib/igt_debugfs: Move is_mountpoint() to igt_aux
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:12   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 03/39] lib/igt_configfs: Add helper to mount configfs José Expósito
                   ` (41 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito, Jim Shargo, Marius Vlad

Rename is_mountpoint() to igt_is_mountpoint() and make it available in
igt_aux.h/c.

Refactor, no functional change.

Co-developed-by: Jim Shargo <jshargo@chromium.org>
Signed-off-by: Jim Shargo <jshargo@chromium.org>
Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_aux.c     | 25 +++++++++++++++++++++++++
 lib/igt_aux.h     |  2 ++
 lib/igt_debugfs.c | 29 ++---------------------------
 3 files changed, 29 insertions(+), 27 deletions(-)

diff --git a/lib/igt_aux.c b/lib/igt_aux.c
index f5bf48da6..d8f1f6982 100644
--- a/lib/igt_aux.c
+++ b/lib/igt_aux.c
@@ -1374,6 +1374,31 @@ static bool get_process_ids(struct igt_process *prcs)
 	return prcs->tid != 0;
 }
 
+bool igt_is_mountpoint(const char *path)
+{
+	char buf[strlen(path) + 4];
+	struct stat st;
+	dev_t dev;
+
+	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/.", path), sizeof(buf));
+	if (stat(buf, &st))
+		return false;
+
+	if (!S_ISDIR(st.st_mode))
+		return false;
+
+	dev = st.st_dev;
+
+	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/..", path), sizeof(buf));
+	if (stat(buf, &st))
+		return false;
+
+	if (!S_ISDIR(st.st_mode))
+		return false;
+
+	return dev != st.st_dev;
+}
+
 /**
  * igt_is_process_running:
  * @comm: Name of process in the form found in /proc/pid/comm (limited to 15
diff --git a/lib/igt_aux.h b/lib/igt_aux.h
index bfd83adca..e8a1788b2 100644
--- a/lib/igt_aux.h
+++ b/lib/igt_aux.h
@@ -314,6 +314,8 @@ double igt_stop_siglatency(struct igt_mean *result);
 
 bool igt_allow_unlimited_files(void);
 
+bool igt_is_mountpoint(const char *path);
+
 int igt_is_process_running(const char *comm);
 int igt_terminate_process(int sig, const char *comm);
 void igt_lsof(const char *dpath);
diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index 8ac215a76..210a9cea0 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -67,37 +67,12 @@
  * General debugfs helpers
  */
 
-static bool is_mountpoint(const char *path)
-{
-	char buf[strlen(path) + 4];
-	struct stat st;
-	dev_t dev;
-
-	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/.", path), sizeof(buf));
-	if (stat(buf, &st))
-		return false;
-
-	if (!S_ISDIR(st.st_mode))
-		return false;
-
-	dev = st.st_dev;
-
-	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/..", path), sizeof(buf));
-	if (stat(buf, &st))
-		return false;
-
-	if (!S_ISDIR(st.st_mode))
-		return false;
-
-	return dev != st.st_dev;
-}
-
 static const char *__igt_debugfs_mount(void)
 {
-	if (is_mountpoint("/sys/kernel/debug"))
+	if (igt_is_mountpoint("/sys/kernel/debug"))
 		return "/sys/kernel/debug";
 
-	if (is_mountpoint("/debug"))
+	if (igt_is_mountpoint("/debug"))
 		return "/debug";
 
 	if (mount("debug", "/sys/kernel/debug", "debugfs", 0, 0))
-- 
2.48.1


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

* [PATCH i-g-t 03/39] lib/igt_configfs: Add helper to mount configfs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 02/39] lib/igt_debugfs: Move is_mountpoint() to igt_aux José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:14   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 04/39] lib/vkms: Add minimal VKMS library and test device default files José Expósito
                   ` (40 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito, Jim Shargo, Marius Vlad

Add a new helper function to mount configfs. Required to test VKMS
configuration.

Co-developed-by: Jim Shargo <jshargo@chromium.org>
Signed-off-by: Jim Shargo <jshargo@chromium.org>
Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt.h          |  1 +
 lib/igt_configfs.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_configfs.h | 13 +++++++++++
 lib/meson.build    |  1 +
 4 files changed, 72 insertions(+)
 create mode 100644 lib/igt_configfs.c
 create mode 100644 lib/igt_configfs.h

diff --git a/lib/igt.h b/lib/igt.h
index 58c39e098..173ca70bf 100644
--- a/lib/igt.h
+++ b/lib/igt.h
@@ -27,6 +27,7 @@
 #include "drmtest.h"
 #include "i915_3d.h"
 #include "igt_aux.h"
+#include "igt_configfs.h"
 #include "igt_core.h"
 #include "igt_debugfs.h"
 #include "igt_draw.h"
diff --git a/lib/igt_configfs.c b/lib/igt_configfs.c
new file mode 100644
index 000000000..cd8674cb5
--- /dev/null
+++ b/lib/igt_configfs.c
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Google LLC.
+ * Copyright © 2023 Collabora, Ltd.
+ * Copyright © 2024 Red Hat, Inc.
+ */
+
+#include <sys/mount.h>
+
+#include "igt_aux.h"
+#include "igt_configfs.h"
+
+/**
+ * SECTION:igt_configfs
+ * @short_description: Support code for configfs features
+ * @title: configfs
+ * @include: igt_configfs.h
+ *
+ * This library provides helpers to access configfs features.
+ */
+
+/*
+ * General configfs helpers
+ */
+
+static const char *__igt_configfs_mount(void)
+{
+	if (igt_is_mountpoint("/sys/kernel/config"))
+		return "/sys/kernel/config";
+
+	if (igt_is_mountpoint("/config"))
+		return "/config";
+
+	if (mount("config", "/sys/kernel/config", "configfs", 0, 0))
+		return NULL;
+
+	return "/sys/kernel/config";
+}
+
+/**
+ * igt_configfs_mount:
+ *
+ * This attempts to locate where configfs is mounted on the filesystem,
+ * and if not found, will then try to mount configfs at /sys/kernel/config.
+ *
+ * Returns:
+ * The path to the configfs mount point (e.g. /sys/kernel/config)
+ */
+const char *igt_configfs_mount(void)
+{
+	static const char *path;
+
+	if (!path)
+		path = __igt_configfs_mount();
+
+	return path;
+}
diff --git a/lib/igt_configfs.h b/lib/igt_configfs.h
new file mode 100644
index 000000000..4cbe9001e
--- /dev/null
+++ b/lib/igt_configfs.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Google LLC.
+ * Copyright © 2023 Collabora, Ltd.
+ * Copyright © 2024 Red Hat, Inc.
+ */
+
+#ifndef __IGT_CONFIGFS_H__
+#define __IGT_CONFIGFS_H__
+
+const char *igt_configfs_mount(void);
+
+#endif /* __IGT_CONFIGFS_H__ */
diff --git a/lib/meson.build b/lib/meson.build
index 9fffdd3c6..201b1fbb4 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -18,6 +18,7 @@ lib_sources = [
 	'i915/i915_crc.c',
 	'igt_collection.c',
 	'igt_color_encoding.c',
+	'igt_configfs.c',
 	'igt_facts.c',
 	'igt_crc.c',
 	'igt_debugfs.c',
-- 
2.48.1


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

* [PATCH i-g-t 04/39] lib/vkms: Add minimal VKMS library and test device default files
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (2 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 03/39] lib/igt_configfs: Add helper to mount configfs José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:12   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 05/39] lib/vkms: Allow to enable/disable VKMS devices José Expósito
                   ` (39 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito, Jim Shargo, Marius Vlad

Create a library containing helpers for creating VKMS devices and
configuring them dynamically using configfs.
For the moment, add the minimal number of helpers to be able to start
testing VKMS's configfs support: Create device, destroy device and
destroy all devices.

Also, include the simplest possible test using those helpers (checking
the device's default files) and the scaffolding required to generate
the documentation.

Co-developed-by: Jim Shargo <jshargo@chromium.org>
Signed-off-by: Jim Shargo <jshargo@chromium.org>
Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 docs/testplan/meson.build        |   7 +-
 lib/igt_vkms.c                   | 191 +++++++++++++++++++++++++++++++
 lib/igt_vkms.h                   |  27 +++++
 lib/meson.build                  |   1 +
 meson.build                      |   8 ++
 tests/meson.build                |   2 +
 tests/vkms/meson.build           |  13 +++
 tests/vkms/vkms_configfs.c       | 122 ++++++++++++++++++++
 tests/vkms/vkms_test_config.json |  72 ++++++++++++
 9 files changed, 441 insertions(+), 2 deletions(-)
 create mode 100644 lib/igt_vkms.c
 create mode 100644 lib/igt_vkms.h
 create mode 100644 tests/vkms/meson.build
 create mode 100644 tests/vkms/vkms_configfs.c
 create mode 100644 tests/vkms/vkms_test_config.json

diff --git a/docs/testplan/meson.build b/docs/testplan/meson.build
index 5560347f1..9e22f4c7d 100644
--- a/docs/testplan/meson.build
+++ b/docs/testplan/meson.build
@@ -11,6 +11,7 @@ stylesheet = join_paths(meson.current_source_dir(), 'testplan.css')
 xe_test_config = join_paths(source_root, 'tests', 'intel', 'xe_test_config.json')
 kms_test_config = join_paths(source_root, 'tests', 'intel', 'kms_test_config.json')
 i915_test_config = join_paths(source_root, 'tests', 'intel', 'i915_test_config.json')
+vkms_test_config = join_paths(source_root, 'tests', 'vkms', 'vkms_test_config.json')
 
 check_testlist = []
 kms_check_testlist = []
@@ -37,12 +38,14 @@ if build_xe
 	test_dict = {
 		'i915_tests': { 'input': i915_test_config, 'extra_args': check_testlist },
 		'kms_tests': { 'input': kms_test_config, 'extra_args': kms_check_testlist },
-		'xe_tests': { 'input': xe_test_config, 'extra_args': check_testlist }
+		'xe_tests': { 'input': xe_test_config, 'extra_args': check_testlist },
+		'vkms_tests': { 'input': vkms_test_config, 'extra_args': check_testlist }
 	    }
 else
 	test_dict = {
 	      'i915_tests': { 'input': i915_test_config, 'extra_args': check_testlist },
-	      'kms_tests': { 'input': kms_test_config, 'extra_args': kms_check_testlist }
+	      'kms_tests': { 'input': kms_test_config, 'extra_args': kms_check_testlist },
+	      'vkms_tests': { 'input': vkms_test_config, 'extra_args': check_testlist }
 	    }
 endif
 
diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
new file mode 100644
index 000000000..8cea94901
--- /dev/null
+++ b/lib/igt_vkms.c
@@ -0,0 +1,191 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Google LLC.
+ * Copyright © 2023 Collabora, Ltd.
+ * Copyright © 2024 Red Hat, Inc.
+ */
+
+#include <dirent.h>
+#include <errno.h>
+#include <string.h>
+
+#include <ftw.h>
+#include <linux/limits.h>
+#include <sys/stat.h>
+
+#include "igt.h"
+#include "igt_vkms.h"
+
+#define VKMS_ROOT_DIR_NAME		"vkms"
+
+/**
+ * SECTION:igt_vkms
+ * @short_description: Helpers to create and configure VKMS devices
+ * @title: VKMS
+ * @include: igt_vkms.h
+ *
+ * Helpers for creating VKMS devices and configuring them dynamically.
+ *
+ * First, create a VKMS device, next, add pipeline items (planes, CRTCs,
+ * encoders, CRTCs and connectors) compose the pipeline by attaching each item
+ * using the _attach_ functions and finally, enable the VKMS device.
+ */
+
+static const char *mount_vkms_configfs(void)
+{
+	static char vkms_root_path[PATH_MAX];
+	const char *configfs_path;
+
+	configfs_path = igt_configfs_mount();
+	igt_assert_f(configfs_path, "Error mounting configfs");
+
+	snprintf(vkms_root_path, sizeof(vkms_root_path), "%s/%s", configfs_path,
+		 VKMS_ROOT_DIR_NAME);
+
+	return vkms_root_path;
+}
+
+/**
+ * igt_require_vkms_configfs:
+ *
+ * Require that VKMS supports configfs configuration.
+ */
+void igt_require_vkms_configfs(void)
+{
+	const char *vkms_root_path;
+	DIR *dir;
+
+	vkms_root_path = mount_vkms_configfs();
+
+	dir = opendir(vkms_root_path);
+	igt_require(dir);
+	if (dir)
+		closedir(dir);
+}
+
+/**
+ * igt_vkms_device_create:
+ * @name: VKMS device name
+ *
+ * Create a directory in the ConfigFS VKMS root directory, where the entire
+ * pipeline will be configured.
+ */
+igt_vkms_t *igt_vkms_device_create(const char *name)
+{
+	igt_vkms_t *dev;
+	const char *vkms_root_path;
+	size_t path_len;
+	DIR *dir;
+	int ret;
+
+	dev = calloc(1, sizeof(*dev));
+
+	vkms_root_path = mount_vkms_configfs();
+
+	path_len = strlen(vkms_root_path) + strlen(name) + 2;
+	dev->path = malloc(path_len);
+	snprintf(dev->path, path_len, "%s/%s", vkms_root_path, name);
+
+	dir = opendir(dev->path);
+	if (dir) {
+		closedir(dir);
+	} else {
+		ret = mkdir(dev->path, 0777);
+		if (ret != 0) {
+			free(dev->path);
+			free(dev);
+			dev = NULL;
+		}
+	}
+
+	return dev;
+}
+
+static int detach_pipeline_items(const char *path, const struct stat *info,
+				 const int typeflag, struct FTW *pathinfo)
+{
+	/* Level 4 are the links in the possible_* directories */
+	if (pathinfo->level == 4 && typeflag == FTW_SL)
+		return unlink(path);
+
+	/* Ignore the other files, they are removed by remove_pipeline_items */
+	return 0;
+}
+
+static int remove_pipeline_items(const char *path, const struct stat *info,
+				 const int typeflag, struct FTW *pathinfo)
+{
+	/* Level 0 is the device root directory */
+	if (pathinfo->level == 0)
+		return rmdir(path);
+
+	/* Level 2 directories are the pipeline items */
+	if (pathinfo->level == 2 && typeflag == FTW_DP)
+		return rmdir(path);
+
+	/* Ignore the other files, they are removed by VKMS */
+	return 0;
+}
+
+static int remove_device_dir(igt_vkms_t *dev)
+{
+	int ret;
+
+	ret = nftw(dev->path, detach_pipeline_items, 64, FTW_DEPTH | FTW_PHYS);
+	if (ret)
+		return ret;
+
+	ret = nftw(dev->path, remove_pipeline_items, 64, FTW_DEPTH | FTW_PHYS);
+	return ret;
+}
+
+/**
+ * igt_vkms_device_destroy:
+ * @dev: Device to destroy
+ *
+ * Remove and free the VKMS device.
+ */
+void igt_vkms_device_destroy(igt_vkms_t *dev)
+{
+	int ret;
+
+	igt_assert(dev);
+
+	ret = remove_device_dir(dev);
+	igt_assert_f(ret == 0,
+		     "Unable to rmdir device directory '%s'. Got errno=%d (%s)\n",
+		     dev->path, errno, strerror(errno));
+
+	free(dev->path);
+	free(dev);
+}
+
+/**
+ * igt_vkms_destroy_all_devices:
+ *
+ * Remove all VKMS devices created via configfs.
+ */
+void igt_vkms_destroy_all_devices(void)
+{
+	igt_vkms_t *dev;
+	const char *vkms_root_path;
+	DIR *dir;
+	struct dirent *ent;
+
+	vkms_root_path = mount_vkms_configfs();
+	dir = opendir(vkms_root_path);
+	igt_assert_f(dir, "VKMS configfs directory not available at '%s'. "
+		     "Got errno=%d (%s)\n", vkms_root_path, errno,
+		     strerror(errno));
+
+	while ((ent = readdir(dir)) != NULL) {
+		if (strcmp(ent->d_name, ".") == 0 ||
+		    strcmp(ent->d_name, "..") == 0)
+			continue;
+
+		dev = igt_vkms_device_create(ent->d_name);
+		igt_vkms_device_destroy(dev);
+	}
+
+	closedir(dir);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
new file mode 100644
index 000000000..48c48f296
--- /dev/null
+++ b/lib/igt_vkms.h
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Google LLC.
+ * Copyright © 2023 Collabora, Ltd.
+ * Copyright © 2024 Red Hat, Inc.
+ */
+
+#ifndef __IGT_VKMS_H__
+#define __IGT_VKMS_H__
+
+/**
+ * igt_vkms_t:
+ * @path: VKMS root directory inside configfs mounted directory
+ *
+ * A struct representing a VKMS device.
+ */
+typedef struct igt_vkms {
+	char *path;
+} igt_vkms_t;
+
+void igt_require_vkms_configfs(void);
+
+igt_vkms_t *igt_vkms_device_create(const char *name);
+void igt_vkms_device_destroy(igt_vkms_t *dev);
+void igt_vkms_destroy_all_devices(void);
+
+#endif /* __IGT_VKMS_H__ */
diff --git a/lib/meson.build b/lib/meson.build
index 201b1fbb4..8e0b4b7e3 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -50,6 +50,7 @@ lib_sources = [
 	'igt_types.c',
 	'igt_vec.c',
 	'igt_vgem.c',
+	'igt_vkms.c',
 	'igt_x86.c',
 	'instdone.c',
 	'intel_allocator.c',
diff --git a/meson.build b/meson.build
index 2f663dc03..aec49152b 100644
--- a/meson.build
+++ b/meson.build
@@ -287,6 +287,7 @@ msmdir = join_paths(libexecdir, 'msm')
 panfrostdir = join_paths(libexecdir, 'panfrost')
 v3ddir = join_paths(libexecdir, 'v3d')
 vc4dir = join_paths(libexecdir, 'vc4')
+vkmsdir = join_paths(libexecdir, 'vkms')
 vmwgfxdir = join_paths(libexecdir, 'vmwgfx')
 mandir = get_option('mandir')
 pkgconfigdir = join_paths(libdir, 'pkgconfig')
@@ -348,6 +349,12 @@ if get_option('use_rpath')
 	endforeach
 	vc4_rpathdir = join_paths(vc4_rpathdir, libdir)
 
+	vkms_rpathdir = '$ORIGIN'
+	foreach p : vkmsdir.split('/')
+		vkms_rpathdir = join_paths(vkms_rpathdir, '..')
+	endforeach
+	vkms_rpathdir = join_paths(vkms_rpathdir, libdir)
+
 	vmwgfx_rpathdir = '$ORIGIN'
 	foreach p : vmwgfxdir.split('/')
 		vmwgfx_rpathdir = join_paths(vmwgfx_rpathdir, '..')
@@ -361,6 +368,7 @@ else
 	panfrost_rpathdir = ''
 	v3d_rpathdir = ''
 	vc4_rpathdir = ''
+	vkms_rpathdir = ''
 	vmwgfx_rpathdir = ''
 endif
 
diff --git a/tests/meson.build b/tests/meson.build
index f8a0ab836..b2ec1361d 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -474,6 +474,8 @@ subdir('v3d')
 
 subdir('vc4')
 
+subdir('vkms')
+
 subdir('vmwgfx')
 
 gen_testlist = find_program('generate_testlist.sh')
diff --git a/tests/vkms/meson.build b/tests/vkms/meson.build
new file mode 100644
index 000000000..e55ba32ba
--- /dev/null
+++ b/tests/vkms/meson.build
@@ -0,0 +1,13 @@
+vkms_progs = [
+	'vkms_configfs',
+]
+vkms_deps = test_deps
+
+foreach prog : vkms_progs
+	test_executables += executable(prog, prog + '.c',
+				       dependencies : vkms_deps,
+				       install_dir : vkmsdir,
+				       install_rpath : vkms_rpathdir,
+				       install : true)
+	test_list += join_paths('vkms', prog)
+endforeach
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
new file mode 100644
index 000000000..441c39a47
--- /dev/null
+++ b/tests/vkms/vkms_configfs.c
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Google LLC.
+ * Copyright © 2023 Collabora, Ltd.
+ * Copyright © 2024 Red Hat, Inc.
+ */
+
+/**
+ * TEST: Tests for VKMS configfs support.
+ * Category: Display
+ * Mega feature: General Display Features
+ * Sub-category: uapi
+ * Functionality: vkms,configfs
+ * Test category: functionality test
+ */
+
+#include <dirent.h>
+#include <string.h>
+
+#include <linux/limits.h>
+#include <sys/stat.h>
+
+#include "drmtest.h"
+#include "igt.h"
+#include "igt_vkms.h"
+
+static void assert_default_files(const char *path,
+				 const char **files, size_t n_files,
+				 const char **dirs, size_t n_dirs)
+{
+	DIR *dir;
+	struct dirent *ent;
+	int total = 0;
+
+	/* Check that the number of files/directories matches the expected.
+	 * Plus 2 because of "." and "..".
+	 */
+	dir = opendir(path);
+	igt_assert(dir);
+	while ((ent = readdir(dir)) != NULL)
+		total++;
+	igt_assert_eq(total, n_dirs + n_files + 2);
+	closedir(dir);
+
+	/* Check that the files/directories are present */
+	for (int i = 0; i < n_files; i++) {
+		char file_path[PATH_MAX];
+		struct stat buf;
+
+		snprintf(file_path, sizeof(file_path), "%s/%s", path, files[i]);
+
+		igt_assert_eq(stat(file_path, &buf), 0);
+	}
+
+	for (int i = 0; i < n_dirs; i++) {
+		char dir_path[PATH_MAX];
+
+		snprintf(dir_path, sizeof(dir_path), "%s/%s", path, dirs[i]);
+
+		dir = opendir(dir_path);
+		igt_assert(dir);
+		closedir(dir);
+	}
+}
+
+/**
+ * SUBTEST: device-default-files
+ * Description: Test that creating a VKMS device creates the default files and
+ *              directories.
+ */
+
+static void test_device_default_files(void)
+{
+	igt_vkms_t *dev;
+
+	const char *files[] = {
+		"enabled",
+	};
+
+	const char *dirs[] = {
+		"planes",
+		"crtcs",
+		"encoders",
+		"connectors",
+	};
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	assert_default_files(dev->path,
+			     files, ARRAY_SIZE(files),
+			     dirs, ARRAY_SIZE(dirs));
+
+	igt_vkms_device_destroy(dev);
+}
+
+igt_main
+{
+	struct {
+		const char *name;
+		void (*fn)(void);
+	} tests[] = {
+		{ "device-default-files", test_device_default_files },
+	};
+
+	igt_fixture {
+		igt_require_vkms();
+		igt_require_vkms_configfs();
+		igt_vkms_destroy_all_devices();
+	}
+
+	for (int i = 0; i < ARRAY_SIZE(tests); i++) {
+		igt_subtest(tests[i].name)
+			tests[i].fn();
+	}
+
+	igt_fixture {
+		igt_require_vkms();
+		igt_require_vkms_configfs();
+		igt_vkms_destroy_all_devices();
+	}
+}
diff --git a/tests/vkms/vkms_test_config.json b/tests/vkms/vkms_test_config.json
new file mode 100644
index 000000000..4e84e184a
--- /dev/null
+++ b/tests/vkms/vkms_test_config.json
@@ -0,0 +1,72 @@
+{
+    "description": "JSON file to be used to parse VKMS documentation",
+    "name": "Tests for VKMS Driver",
+    "drivers": [ "vkms" ],
+    "files": [ "*.c" ],
+    "fields": {
+        "Run type": {
+            "_properties_": {
+                "mandatory": true
+            },
+            "Category": {
+                "_properties_": {
+                    "description": "Contains the major group for the tested functionality 'Display'"
+                },
+                "Mega feature": {
+                    "_properties_": {
+                        "mandatory": true,
+                        "description": "Contains the mega feature for end to end use case"
+                    },
+                    "Sub-category": {
+                        "_properties_": {
+                            "mandatory": true,
+                            "description": "Contains the technical feature/functionality"
+                        },
+                        "Functionality": {
+                            "_properties_": {
+                                "mandatory": true,
+                                "description": "Groups page table tests on buckets containing more detailed functionality"
+                            },
+                            "Feature": {
+                                "_properties_": {
+                                    "description": "Describes the lowest level feature bucket"
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        "Test category": {
+            "_properties_": {
+                "description": "Defines the test category. Usually used at subtest level."
+            }
+        },
+        "Test requirement": {
+            "_properties_": {
+                "description": "Defines Kernel parameters required for the test to run"
+            }
+        },
+        "Issue": {
+            "_properties_": {
+                "description": "If the test is used to solve an issue, point to the URL containing the issue."
+            }
+        },
+        "Depends on": {
+            "_properties_": {
+                "description": "List other subtests that are required to not be skipped before calling this one."
+            }
+        },
+        "TODO": {
+            "_properties_": {
+                "description": "Point to known missing features at the test or subtest."
+            }
+        },
+        "Description": {
+            "_properties_": {
+                "mandatory": true,
+                "description": "Provides a description for the test/subtest."
+            }
+        }
+    }
+}
-- 
2.48.1


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

* [PATCH i-g-t 05/39] lib/vkms: Allow to enable/disable VKMS devices
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (3 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 04/39] lib/vkms: Add minimal VKMS library and test device default files José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:15   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 06/39] tests/vkms_configfs: Test device invalid values José Expósito
                   ` (38 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add helper to enable, disable and check the enabled status of a VKMS
device and add a test to ensure that the default value is correctly set.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 80 ++++++++++++++++++++++++++++++++++++++
 lib/igt_vkms.h             |  5 +++
 tests/vkms/vkms_configfs.c | 18 +++++++++
 3 files changed, 103 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 8cea94901..1fdfb09f7 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -7,7 +7,12 @@
 
 #include <dirent.h>
 #include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include <ftw.h>
 #include <linux/limits.h>
@@ -17,6 +22,7 @@
 #include "igt_vkms.h"
 
 #define VKMS_ROOT_DIR_NAME		"vkms"
+#define VKMS_FILE_ENABLED		"enabled"
 
 /**
  * SECTION:igt_vkms
@@ -45,6 +51,48 @@ static const char *mount_vkms_configfs(void)
 	return vkms_root_path;
 }
 
+static int read_int(const char *path)
+{
+	FILE *file;
+	int value;
+	int ret;
+
+	file = fopen(path, "r");
+	igt_assert_f(file, "Error opening '%s'\n", path);
+
+	ret = fscanf(file, "%d", &value);
+	fclose(file);
+	igt_assert_f(ret == 1, "Error reading integer from '%s'\n", path);
+
+	return value;
+}
+
+static bool read_bool(const char *path)
+{
+	int ret;
+
+	ret = read_int(path);
+
+	return !!ret;
+}
+
+static void write_int(const char *path, int value)
+{
+	FILE *file;
+
+	file = fopen(path, "w");
+	igt_assert_f(file, "Error opening '%s'\n", path);
+
+	fprintf(file, "%d", value);
+
+	fclose(file);
+}
+
+static void write_bool(const char *path, bool value)
+{
+	write_int(path, value ? 1 : 0);
+}
+
 /**
  * igt_require_vkms_configfs:
  *
@@ -151,6 +199,8 @@ void igt_vkms_device_destroy(igt_vkms_t *dev)
 
 	igt_assert(dev);
 
+	igt_vkms_device_set_enabled(dev, false);
+
 	ret = remove_device_dir(dev);
 	igt_assert_f(ret == 0,
 		     "Unable to rmdir device directory '%s'. Got errno=%d (%s)\n",
@@ -189,3 +239,33 @@ void igt_vkms_destroy_all_devices(void)
 
 	closedir(dir);
 }
+
+/**
+ * igt_vkms_device_is_enabled:
+ * @dev: The device to check
+ *
+ * Indicate whether a VKMS device is enabled or not.
+ */
+bool igt_vkms_device_is_enabled(igt_vkms_t *dev)
+{
+	char path[PATH_MAX];
+
+	snprintf(path, sizeof(path), "%s/%s", dev->path, VKMS_FILE_ENABLED);
+
+	return read_bool(path);
+}
+
+/**
+ * igt_vkms_device_set_enabled:
+ * @dev: Device to enable or disable
+ *
+ * Enable or disable a VKMS device.
+ */
+void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled)
+{
+	char path[PATH_MAX];
+
+	snprintf(path, sizeof(path), "%s/%s", dev->path, VKMS_FILE_ENABLED);
+
+	write_bool(path, enabled);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 48c48f296..dab51852a 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -8,6 +8,8 @@
 #ifndef __IGT_VKMS_H__
 #define __IGT_VKMS_H__
 
+#include <stdbool.h>
+
 /**
  * igt_vkms_t:
  * @path: VKMS root directory inside configfs mounted directory
@@ -24,4 +26,7 @@ igt_vkms_t *igt_vkms_device_create(const char *name);
 void igt_vkms_device_destroy(igt_vkms_t *dev);
 void igt_vkms_destroy_all_devices(void);
 
+bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
+void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
+
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 441c39a47..6c7d0310c 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -94,6 +94,23 @@ static void test_device_default_files(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: device-default-values
+ * Description: Check that the default values for the device are correct.
+ */
+
+static void test_device_default_values(void)
+{
+	igt_vkms_t *dev;
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -101,6 +118,7 @@ igt_main
 		void (*fn)(void);
 	} tests[] = {
 		{ "device-default-files", test_device_default_files },
+		{ "device-default-values", test_device_default_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 06/39] tests/vkms_configfs: Test device invalid values
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (4 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 05/39] lib/vkms: Allow to enable/disable VKMS devices José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:14   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 07/39] lib/vkms: Test plane default files José Expósito
                   ` (37 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

For a VKMS device, it is only possible to set invalid values in two
places:

- The device name: The "vkms" name is reserved for the default device
  created by the driver.
- The device enabled status: It should only accept boolean values.

Test that setting wrong values fails and that the device is not
accidentally enabled.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 60 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 6c7d0310c..79023359a 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -24,6 +24,11 @@
 #include "igt.h"
 #include "igt_vkms.h"
 
+struct invalid_value {
+	const char *value;
+	int size;
+};
+
 static void assert_default_files(const char *path,
 				 const char **files, size_t n_files,
 				 const char **dirs, size_t n_dirs)
@@ -63,6 +68,32 @@ static void assert_default_files(const char *path,
 	}
 }
 
+static void assert_wrong_bool_values(const char *path)
+{
+	struct invalid_value invalid_bool_values[] = {
+		{ "", 0 },
+		{ "\0", 1 },
+		{ "-1", 2 },
+		{ "2", 1 },
+		{ "o", 1 },
+		{ "invalid", 8 },
+	};
+	int fd;
+	int ret;
+
+	for (int i = 0; i < ARRAY_SIZE(invalid_bool_values); i++) {
+		struct invalid_value v = invalid_bool_values[i];
+
+		fd = open(path, O_WRONLY);
+		igt_assert_f(fd >= 0, "Error opening '%s'\n", path);
+
+		ret = write(fd, v.value, v.size);
+		igt_assert(ret <= 0);
+
+		close(fd);
+	}
+}
+
 /**
  * SUBTEST: device-default-files
  * Description: Test that creating a VKMS device creates the default files and
@@ -111,6 +142,34 @@ static void test_device_default_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: device-wrong-values
+ * Description: Check that setting unexpected values doesn't work.
+ */
+
+static void test_device_wrong_values(void)
+{
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+
+	/* It is not possible to create devices named "vkms" to avoid clashes
+	 * with the default device created by VKMS
+	 */
+	dev = igt_vkms_device_create("vkms");
+	igt_assert(!dev);
+
+	/* Test invalid values for "enabled" */
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	snprintf(path, sizeof(path), "%s/enabled", dev->path);
+
+	assert_wrong_bool_values(path);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -119,6 +178,7 @@ igt_main
 	} tests[] = {
 		{ "device-default-files", test_device_default_files },
 		{ "device-default-values", test_device_default_values },
+		{ "device-wrong-values", test_device_wrong_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 07/39] lib/vkms: Test plane default files
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (5 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 06/39] tests/vkms_configfs: Test device invalid values José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:15   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 08/39] lib/vkms: Test plane default values José Expósito
                   ` (36 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add a helper to create a plane and a test checking that the default
files and directories are created.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 52 ++++++++++++++++++++++++++++++++++++++
 lib/igt_vkms.h             |  2 ++
 tests/vkms/vkms_configfs.c | 33 ++++++++++++++++++++++++
 3 files changed, 87 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 1fdfb09f7..a7b395a71 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -24,6 +24,13 @@
 #define VKMS_ROOT_DIR_NAME		"vkms"
 #define VKMS_FILE_ENABLED		"enabled"
 
+enum vkms_pipeline_item {
+	VKMS_PIPELINE_ITEM_PLANE,
+	VKMS_PIPELINE_ITEM_CRTC,
+	VKMS_PIPELINE_ITEM_ENCODER,
+	VKMS_PIPELINE_ITEM_CONNECTOR,
+};
+
 /**
  * SECTION:igt_vkms
  * @short_description: Helpers to create and configure VKMS devices
@@ -93,6 +100,39 @@ static void write_bool(const char *path, bool value)
 	write_int(path, value ? 1 : 0);
 }
 
+static const char *get_pipeline_item_dir_name(enum vkms_pipeline_item item)
+{
+	switch (item) {
+	case VKMS_PIPELINE_ITEM_PLANE:
+		return "planes";
+	case VKMS_PIPELINE_ITEM_CRTC:
+		return "crtcs";
+	case VKMS_PIPELINE_ITEM_ENCODER:
+		return "encoders";
+	case VKMS_PIPELINE_ITEM_CONNECTOR:
+		return "connectors";
+	}
+
+	igt_assert(!"Cannot be reached: Unknown VKMS pipeline item type");
+}
+
+static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
+			      const char *name)
+{
+	const char *item_dir_name;
+	char path[PATH_MAX];
+	int ret;
+
+	item_dir_name = get_pipeline_item_dir_name(item);
+	snprintf(path, sizeof(path), "%s/%s/%s", dev->path, item_dir_name,
+		 name);
+
+	ret = mkdir(path, 0777);
+	igt_assert_f(ret == 0,
+		     "Unable to mkdir directory '%s'. Got errno=%d (%s)\n",
+		     path, errno, strerror(errno));
+}
+
 /**
  * igt_require_vkms_configfs:
  *
@@ -269,3 +309,15 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled)
 
 	write_bool(path, enabled);
 }
+
+/**
+ * igt_vkms_device_add_plane:
+ * @dev: Device to add the plane to
+ * @name: Plane name
+ *
+ * Add a new plane to the VKMS device.
+ */
+void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name)
+{
+	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index dab51852a..9e16ae7eb 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -29,4 +29,6 @@ void igt_vkms_destroy_all_devices(void);
 bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
 void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
 
+void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
+
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 79023359a..ec334641f 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -170,6 +170,38 @@ static void test_device_wrong_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: plane-default-files
+ * Description: Test that creating a plane creates the default files and
+ *              directories.
+ */
+
+static void test_plane_default_files(void)
+{
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+
+	const char *files[] = {
+		"type",
+	};
+
+	const char *dirs[] = {
+		"possible_crtcs",
+	};
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_plane(dev, "plane0");
+
+	snprintf(path, sizeof(path), "%s/planes/plane0", dev->path);
+	assert_default_files(path,
+			     files, ARRAY_SIZE(files),
+			     dirs, ARRAY_SIZE(dirs));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -179,6 +211,7 @@ igt_main
 		{ "device-default-files", test_device_default_files },
 		{ "device-default-values", test_device_default_values },
 		{ "device-wrong-values", test_device_wrong_values },
+		{ "plane-default-files", test_plane_default_files },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 08/39] lib/vkms: Test plane default values
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (6 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 07/39] lib/vkms: Test plane default files José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:15   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 09/39] lib/vkms: Test plane invalid values José Expósito
                   ` (35 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add a helper to get the plane type and test that the default type is set
when a new plane is created.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 19 +++++++++++++++++++
 lib/igt_vkms.h             |  1 +
 tests/vkms/vkms_configfs.c | 21 +++++++++++++++++++++
 3 files changed, 41 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index a7b395a71..5cfe5123c 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -23,6 +23,7 @@
 
 #define VKMS_ROOT_DIR_NAME		"vkms"
 #define VKMS_FILE_ENABLED		"enabled"
+#define VKMS_FILE_PLANE_TYPE		"type"
 
 enum vkms_pipeline_item {
 	VKMS_PIPELINE_ITEM_PLANE,
@@ -321,3 +322,21 @@ void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name)
 {
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
 }
+
+/**
+ * igt_vkms_plane_get_type:
+ * @dev: Device the plane belongs to
+ * @name: Plane name
+ *
+ * Return the plane type.
+ */
+int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name)
+{
+	char path[PATH_MAX];
+
+	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
+		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_PLANE), name,
+		 VKMS_FILE_PLANE_TYPE);
+
+	return read_int(path);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 9e16ae7eb..dd06d8f5b 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -30,5 +30,6 @@ bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
 void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
 
 void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
+int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
 
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index ec334641f..a3fa60762 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -202,6 +202,26 @@ static void test_plane_default_files(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: plane-default-values
+ * Description: Check that the default values for the plane are correct.
+ */
+
+static void test_plane_default_values(void)
+{
+	igt_vkms_t *dev;
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_plane(dev, "plane0");
+
+	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
+		      DRM_PLANE_TYPE_OVERLAY);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -212,6 +232,7 @@ igt_main
 		{ "device-default-values", test_device_default_values },
 		{ "device-wrong-values", test_device_wrong_values },
 		{ "plane-default-files", test_plane_default_files },
+		{ "plane-default-values", test_plane_default_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 09/39] lib/vkms: Test plane invalid values
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (7 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 08/39] lib/vkms: Test plane default values José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:14   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 10/39] lib/vkms: Test CRTC default files José Expósito
                   ` (34 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

For a VKMS plane, it is only possible to set invalid values in the plane
type.

Test that setting wrong values fails and that the plane is not
accidentally changed.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 25 +++++++++++++++++++
 lib/igt_vkms.h             |  1 +
 tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 5cfe5123c..ca6f37975 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -340,3 +340,28 @@ int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name)
 
 	return read_int(path);
 }
+
+/**
+ * igt_vkms_plane_set_type:
+ * @dev: Device the plane belongs to
+ * @name: Plane name
+ * @type: DRM_PLANE_TYPE_OVERLAY, DRM_PLANE_TYPE_PRIMARY or
+ * DRM_PLANE_TYPE_CURSOR
+ *
+ * Set a new type for the plane
+ */
+void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
+{
+	char path[PATH_MAX];
+
+	if (type != DRM_PLANE_TYPE_OVERLAY &&
+	    type != DRM_PLANE_TYPE_PRIMARY &&
+	    type != DRM_PLANE_TYPE_CURSOR)
+		igt_assert(!"Cannot be reached: Unknown plane type");
+
+	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
+		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_PLANE), name,
+		 VKMS_FILE_PLANE_TYPE);
+
+	write_int(path, type);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index dd06d8f5b..283be5699 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -31,5 +31,6 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
 
 void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
 int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
+void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
 
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index a3fa60762..d607b1a5a 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -222,6 +222,56 @@ static void test_plane_default_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: plane-wrong-values
+ * Description: Check that setting unexpected values doesn't work.
+ */
+
+static void test_plane_wrong_values(void)
+{
+	struct invalid_value invalid_type_values[] = {
+		{ "", 0 },
+		{ "\0", 1 },
+		{ "-1", 2 },
+		{ "4", 1 },
+		{ "primary", 8 },
+		{ "overlay", 8 },
+	};
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+	int fd;
+	int ret;
+
+	/* Create a device with a primary plane */
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_plane(dev, "plane0");
+	igt_vkms_plane_set_type(dev, "plane0", DRM_PLANE_TYPE_PRIMARY);
+	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
+		      DRM_PLANE_TYPE_PRIMARY);
+
+	snprintf(path, sizeof(path), "%s/planes/plane0/type", dev->path);
+
+	/* Test invalid values for "type" */
+	for (int i = 0; i < ARRAY_SIZE(invalid_type_values); i++) {
+		struct invalid_value v = invalid_type_values[i];
+
+		fd = open(path, O_WRONLY);
+		igt_assert_f(fd >= 0, "Error opening '%s'\n", path);
+
+		ret = write(fd, v.value, v.size);
+		igt_assert(ret <= 0);
+
+		close(fd);
+	}
+
+	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
+		      DRM_PLANE_TYPE_PRIMARY);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -233,6 +283,7 @@ igt_main
 		{ "device-wrong-values", test_device_wrong_values },
 		{ "plane-default-files", test_plane_default_files },
 		{ "plane-default-values", test_plane_default_values },
+		{ "plane-wrong-values", test_plane_wrong_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 10/39] lib/vkms: Test CRTC default files
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (8 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 09/39] lib/vkms: Test plane invalid values José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:15   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 11/39] lib/vkms: Test CRTC default values José Expósito
                   ` (33 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add a helper to create a CRTC and a test checking that the default
files and directories are created.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 12 ++++++++++++
 lib/igt_vkms.h             |  2 ++
 tests/vkms/vkms_configfs.c | 29 +++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index ca6f37975..a7dad43e2 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -365,3 +365,15 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
 
 	write_int(path, type);
 }
+
+/**
+ * igt_vkms_device_add_crtc:
+ * @dev: Device to add the CRTC to
+ * @name: CRTC name
+ *
+ * Add a new CRTC to the VKMS device.
+ */
+void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name)
+{
+	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CRTC, name);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 283be5699..7f70f92d3 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -33,4 +33,6 @@ void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
 int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
 void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
 
+void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
+
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index d607b1a5a..398232c03 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -272,6 +272,34 @@ static void test_plane_wrong_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: crtc-default-files
+ * Description: Test that creating a CRTC creates the default files and
+ *              directories.
+ */
+
+static void test_crtc_default_files(void)
+{
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+
+	const char *files[] = {
+		"writeback",
+	};
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_crtc(dev, "crtc0");
+
+	snprintf(path, sizeof(path), "%s/crtcs/crtc0", dev->path);
+	assert_default_files(path,
+			     files, ARRAY_SIZE(files),
+			     NULL, 0);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -284,6 +312,7 @@ igt_main
 		{ "plane-default-files", test_plane_default_files },
 		{ "plane-default-values", test_plane_default_values },
 		{ "plane-wrong-values", test_plane_wrong_values },
+		{ "crtc-default-files", test_crtc_default_files },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 11/39] lib/vkms: Test CRTC default values
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (9 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 10/39] lib/vkms: Test CRTC default files José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:12   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 12/39] lib/vkms: Test CRTC invalid values José Expósito
                   ` (32 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add a helper to get the CRTC writeback status and test that the default
value is set when a new CRTC is created.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 19 +++++++++++++++++++
 lib/igt_vkms.h             |  1 +
 tests/vkms/vkms_configfs.c | 20 ++++++++++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index a7dad43e2..4021f9aea 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -24,6 +24,7 @@
 #define VKMS_ROOT_DIR_NAME		"vkms"
 #define VKMS_FILE_ENABLED		"enabled"
 #define VKMS_FILE_PLANE_TYPE		"type"
+#define VKMS_FILE_CRTC_WRITEBACK	"writeback"
 
 enum vkms_pipeline_item {
 	VKMS_PIPELINE_ITEM_PLANE,
@@ -377,3 +378,21 @@ void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name)
 {
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CRTC, name);
 }
+
+/**
+ * igt_vkms_crtc_is_writeback_enabled:
+ * @dev: Device the CRTC belongs to
+ * @name: CRTC name
+ *
+ * Indicate whether a VKMS CRTC writeback connector is enabled or not.
+ */
+bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name)
+{
+	char path[PATH_MAX];
+
+	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
+		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_CRTC), name,
+		 VKMS_FILE_CRTC_WRITEBACK);
+
+	return read_bool(path);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 7f70f92d3..59f6a9775 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -34,5 +34,6 @@ int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
 void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
 
 void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
+bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
 
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 398232c03..95779d336 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -300,6 +300,25 @@ static void test_crtc_default_files(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: crtc-default-values
+ * Description: Check that the default values for the CRTC are correct.
+ */
+
+static void test_crtc_default_values(void)
+{
+	igt_vkms_t *dev;
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_crtc(dev, "crtc0");
+
+	igt_assert(!igt_vkms_crtc_is_writeback_enabled(dev, "crtc0"));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -313,6 +332,7 @@ igt_main
 		{ "plane-default-values", test_plane_default_values },
 		{ "plane-wrong-values", test_plane_wrong_values },
 		{ "crtc-default-files", test_crtc_default_files },
+		{ "crtc-default-values", test_crtc_default_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 12/39] lib/vkms: Test CRTC invalid values
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (10 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 11/39] lib/vkms: Test CRTC default values José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:12   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 13/39] lib/vkms: Test encoder default files José Expósito
                   ` (31 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

For a VKMS CRTC, it is only possible to set invalid values in the
writeback connector status.

Test that setting wrong values fails and that the CRTC status is not
accidentally changed.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 20 ++++++++++++++++++++
 lib/igt_vkms.h             |  2 ++
 tests/vkms/vkms_configfs.c | 27 +++++++++++++++++++++++++++
 3 files changed, 49 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 4021f9aea..d881a2417 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -396,3 +396,23 @@ bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name)
 
 	return read_bool(path);
 }
+
+/**
+ * igt_vkms_crtc_set_writeback_enabled:
+ * @dev: Device the CRTC belongs to
+ * @name: CRTC name
+ * @writeback: Enable or disable the writeback connector
+ *
+ * Set the VKMS CRTC writeback connector is status.
+ */
+void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
+					 bool writeback)
+{
+	char path[PATH_MAX];
+
+	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
+		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_CRTC), name,
+		 VKMS_FILE_CRTC_WRITEBACK);
+
+	write_bool(path, writeback);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 59f6a9775..cb0278544 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -35,5 +35,7 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
 
 void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
 bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
+void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
+					 bool writeback);
 
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 95779d336..af42e364d 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -319,6 +319,32 @@ static void test_crtc_default_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: crtc-wrong-values
+ * Description: Check that setting unexpected values doesn't work.
+ */
+
+static void test_crtc_wrong_values(void)
+{
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+
+	/* Test invalid values for "writeback" */
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_crtc(dev, "crtc0");
+	igt_vkms_crtc_set_writeback_enabled(dev, "crtc0", true);
+	igt_assert(igt_vkms_crtc_is_writeback_enabled(dev, "crtc0"));
+
+	snprintf(path, sizeof(path), "%s/crtcs/crtc0/writeback", dev->path);
+
+	assert_wrong_bool_values(path);
+	igt_assert(igt_vkms_crtc_is_writeback_enabled(dev, "crtc0"));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -333,6 +359,7 @@ igt_main
 		{ "plane-wrong-values", test_plane_wrong_values },
 		{ "crtc-default-files", test_crtc_default_files },
 		{ "crtc-default-values", test_crtc_default_values },
+		{ "crtc-wrong-values", test_crtc_wrong_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 13/39] lib/vkms: Test encoder default files
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (11 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 12/39] lib/vkms: Test CRTC invalid values José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:14   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 14/39] lib/vkms: Test connector " José Expósito
                   ` (30 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add a helper to create a encoder and a test checking that the default
files and directories are created.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 12 ++++++++++++
 lib/igt_vkms.h             |  2 ++
 tests/vkms/vkms_configfs.c | 29 +++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index d881a2417..299891377 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -416,3 +416,15 @@ void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
 
 	write_bool(path, writeback);
 }
+
+/**
+ * igt_vkms_device_add_encoder:
+ * @dev: Device to add the encoder to
+ * @name: Encoder name
+ *
+ * Add a new encoder to the VKMS device.
+ */
+void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name)
+{
+	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER, name);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index cb0278544..b4b048c6d 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -38,4 +38,6 @@ bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
 void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
 					 bool writeback);
 
+void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
+
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index af42e364d..753ea2d85 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -345,6 +345,34 @@ static void test_crtc_wrong_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: encoder-default-files
+ * Description: Test that creating a encoder creates the default files and
+ *              directories.
+ */
+
+static void test_encoder_default_files(void)
+{
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+
+	const char *dirs[] = {
+		"possible_crtcs",
+	};
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_encoder(dev, "encoder0");
+
+	snprintf(path, sizeof(path), "%s/encoders/encoder0", dev->path);
+	assert_default_files(path,
+			     NULL, 0,
+			     dirs, ARRAY_SIZE(dirs));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -360,6 +388,7 @@ igt_main
 		{ "crtc-default-files", test_crtc_default_files },
 		{ "crtc-default-values", test_crtc_default_values },
 		{ "crtc-wrong-values", test_crtc_wrong_values },
+		{ "encoder-default-files", test_encoder_default_files },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 14/39] lib/vkms: Test connector default files
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (12 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 13/39] lib/vkms: Test encoder default files José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 15/39] lib/vkms: Test connector default values José Expósito
                   ` (29 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add a helper to create a connector and a test checking that the default
files and directories are created.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 12 ++++++++++++
 lib/igt_vkms.h             |  2 ++
 tests/vkms/vkms_configfs.c | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 47 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 299891377..e9475bba7 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -428,3 +428,15 @@ void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name)
 {
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER, name);
 }
+
+/**
+ * igt_vkms_device_add_connector:
+ * @dev: Device to add the connector to
+ * @name: Connector name
+ *
+ * Add a new connector to the VKMS device.
+ */
+void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name)
+{
+	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CONNECTOR, name);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index b4b048c6d..d065a2acb 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -40,4 +40,6 @@ void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
 
 void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
 
+void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name);
+
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 753ea2d85..f6b32a9f7 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -373,6 +373,38 @@ static void test_encoder_default_files(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: connector-default-files
+ * Description: Test that creating a connector creates the default files and
+ *              directories.
+ */
+
+static void test_connector_default_files(void)
+{
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+
+	const char *files[] = {
+		"status",
+	};
+
+	const char *dirs[] = {
+		"possible_encoders",
+	};
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_connector(dev, "connector0");
+
+	snprintf(path, sizeof(path), "%s/connectors/connector0", dev->path);
+	assert_default_files(path,
+			     files, ARRAY_SIZE(files),
+			     dirs, ARRAY_SIZE(dirs));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -389,6 +421,7 @@ igt_main
 		{ "crtc-default-values", test_crtc_default_values },
 		{ "crtc-wrong-values", test_crtc_wrong_values },
 		{ "encoder-default-files", test_encoder_default_files },
+		{ "connector-default-files", test_connector_default_files },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 15/39] lib/vkms: Test connector default values
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (13 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 14/39] lib/vkms: Test connector " José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 16/39] lib/vkms: Test plane connector invalid values José Expósito
                   ` (28 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add a helper to get the connector status and test that the default
value is set when a new connector is created.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 19 +++++++++++++++++++
 lib/igt_vkms.h             |  1 +
 tests/vkms/vkms_configfs.c | 21 +++++++++++++++++++++
 3 files changed, 41 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index e9475bba7..6780d36da 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -25,6 +25,7 @@
 #define VKMS_FILE_ENABLED		"enabled"
 #define VKMS_FILE_PLANE_TYPE		"type"
 #define VKMS_FILE_CRTC_WRITEBACK	"writeback"
+#define VKMS_FILE_CONNECTOR_STATUS	"status"
 
 enum vkms_pipeline_item {
 	VKMS_PIPELINE_ITEM_PLANE,
@@ -440,3 +441,21 @@ void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name)
 {
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CONNECTOR, name);
 }
+
+/**
+ * igt_vkms_connector_get_status:
+ * @dev: Device the connector belongs to
+ * @name: Connector name
+ *
+ * Return the connector status.
+ */
+int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name)
+{
+	char path[PATH_MAX];
+
+	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
+		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_CONNECTOR), name,
+		 VKMS_FILE_CONNECTOR_STATUS);
+
+	return read_int(path);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index d065a2acb..d0a148242 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -41,5 +41,6 @@ void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
 void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
 
 void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name);
+int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name);
 
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index f6b32a9f7..b8c97e20d 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -405,6 +405,26 @@ static void test_connector_default_files(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: connector-default-values
+ * Description: Check that the default values for the connector are correct.
+ */
+
+static void test_connector_default_values(void)
+{
+	igt_vkms_t *dev;
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_connector(dev, "connector0");
+
+	igt_assert_eq(igt_vkms_connector_get_status(dev, "connector0"),
+		      DRM_MODE_CONNECTED);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -422,6 +442,7 @@ igt_main
 		{ "crtc-wrong-values", test_crtc_wrong_values },
 		{ "encoder-default-files", test_encoder_default_files },
 		{ "connector-default-files", test_connector_default_files },
+		{ "connector-default-values", test_connector_default_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 16/39] lib/vkms: Test plane connector invalid values
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (14 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 15/39] lib/vkms: Test connector default values José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:12   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs José Expósito
                   ` (27 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

For a VKMS connector, it is only possible to set invalid values in the
connector status.

Test that setting wrong values fails and that the connector is not
accidentally changed.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 26 +++++++++++++++++++
 lib/igt_vkms.h             |  2 ++
 tests/vkms/vkms_configfs.c | 52 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 6780d36da..f5e193a1c 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -459,3 +459,29 @@ int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name)
 
 	return read_int(path);
 }
+
+/**
+ * igt_vkms_connector_set_status:
+ * @dev: Device the connector belongs to
+ * @name: Connector name
+ * @type: DRM_MODE_CONNECTED, DRM_MODE_DISCONNECTED or
+ * DRM_MODE_UNKNOWNCONNECTION
+ *
+ * Set a new status for the connector
+ */
+void igt_vkms_connector_set_status(igt_vkms_t *dev, const char *name,
+				   int status)
+{
+	char path[PATH_MAX];
+
+	if (status != DRM_MODE_CONNECTED &&
+	    status != DRM_MODE_DISCONNECTED &&
+	    status != DRM_MODE_UNKNOWNCONNECTION)
+		igt_assert(!"Cannot be reached: Unknown connector status");
+
+	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
+		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_CONNECTOR), name,
+		 VKMS_FILE_CONNECTOR_STATUS);
+
+	write_int(path, status);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index d0a148242..50f42aa4b 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -42,5 +42,7 @@ void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
 
 void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name);
 int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name);
+void igt_vkms_connector_set_status(igt_vkms_t *dev, const char *name,
+				   int status);
 
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index b8c97e20d..ea84d9f82 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -425,6 +425,57 @@ static void test_connector_default_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: connector-wrong-values
+ * Description: Check that setting unexpected values doesn't work.
+ */
+
+static void test_connector_wrong_values(void)
+{
+	struct invalid_value invalid_status_values[] = {
+		{ "", 0 },
+		{ "\0", 1 },
+		{ "-1", 2 },
+		{ "0", 1 },
+		{ "4", 1 },
+		{ "connected", 10 },
+	};
+	igt_vkms_t *dev;
+	char path[PATH_MAX];
+	int fd;
+	int ret;
+
+	/* Create a device with a disconnected connector */
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	igt_vkms_device_add_connector(dev, "connector0");
+	igt_vkms_connector_set_status(dev, "connector0", DRM_MODE_DISCONNECTED);
+	igt_assert_eq(igt_vkms_connector_get_status(dev, "connector0"),
+		      DRM_MODE_DISCONNECTED);
+
+	snprintf(path, sizeof(path), "%s/connectors/connector0/status",
+		 dev->path);
+
+	/* Test invalid values for "status" */
+	for (int i = 0; i < ARRAY_SIZE(invalid_status_values); i++) {
+		struct invalid_value v = invalid_status_values[i];
+
+		fd = open(path, O_WRONLY);
+		igt_assert_f(fd >= 0, "Error opening '%s'\n", path);
+
+		ret = write(fd, v.value, v.size);
+		igt_assert(ret <= 0);
+
+		close(fd);
+	}
+
+	igt_assert_eq(igt_vkms_connector_get_status(dev, "connector0"),
+		      DRM_MODE_DISCONNECTED);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -443,6 +494,7 @@ igt_main
 		{ "encoder-default-files", test_encoder_default_files },
 		{ "connector-default-files", test_connector_default_files },
 		{ "connector-default-values", test_connector_default_values },
+		{ "connector-wrong-values", test_connector_wrong_values },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (15 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 16/39] lib/vkms: Test plane connector invalid values José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:15   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 18/39] lib/vkms: Test attaching encoders " José Expósito
                   ` (26 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add helpers to attach and detach planes and CRTCs and a test checking
the different valid and invalid cases.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 91 ++++++++++++++++++++++++++++++++++++++
 lib/igt_vkms.h             |  4 ++
 tests/vkms/vkms_configfs.c | 81 +++++++++++++++++++++++++++++++++
 3 files changed, 176 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index f5e193a1c..147234e5b 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -119,6 +119,22 @@ static const char *get_pipeline_item_dir_name(enum vkms_pipeline_item item)
 	igt_assert(!"Cannot be reached: Unknown VKMS pipeline item type");
 }
 
+static const char *get_attach_dir_name(enum vkms_pipeline_item item)
+{
+	switch (item) {
+	case VKMS_PIPELINE_ITEM_PLANE:
+		return "possible_crtcs";
+	case VKMS_PIPELINE_ITEM_ENCODER:
+		return "possible_crtcs";
+	case VKMS_PIPELINE_ITEM_CONNECTOR:
+		return "possible_encoders";
+	default:
+		break;
+	}
+
+	igt_assert(!"Cannot be reached: Unknown VKMS attach directory name");
+}
+
 static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
 			      const char *name)
 {
@@ -136,6 +152,51 @@ static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
 		     path, errno, strerror(errno));
 }
 
+static bool attach_pipeline_item(igt_vkms_t *dev,
+				 enum vkms_pipeline_item src_item,
+				 const char *src_item_name,
+				 enum vkms_pipeline_item dst_item,
+				 const char *dst_item_name)
+{
+	char src_path[PATH_MAX];
+	char dst_path[PATH_MAX];
+	const char *src_dir_name;
+	const char *attach_dir_name;
+	const char *dst_dir_name;
+	int ret;
+
+	src_dir_name = get_pipeline_item_dir_name(src_item);
+	attach_dir_name = get_attach_dir_name(src_item);
+	snprintf(src_path, sizeof(src_path), "%s/%s/%s/%s/%s", dev->path,
+		 src_dir_name, src_item_name, attach_dir_name, dst_item_name);
+
+	dst_dir_name = get_pipeline_item_dir_name(dst_item);
+	snprintf(dst_path, sizeof(dst_path), "%s/%s/%s", dev->path,
+		 dst_dir_name, dst_item_name);
+
+	ret = symlink(dst_path, src_path);
+	return ret == 0;
+}
+
+static bool detach_pipeline_item(igt_vkms_t *dev,
+				 enum vkms_pipeline_item src_item,
+				 const char *src_item_name,
+				 const char *dst_item_name)
+{
+	char link_path[PATH_MAX];
+	const char *src_dir_name;
+	const char *attach_dir_name;
+	int ret;
+
+	src_dir_name = get_pipeline_item_dir_name(src_item);
+	attach_dir_name = get_attach_dir_name(src_item);
+	snprintf(link_path, sizeof(link_path), "%s/%s/%s/%s/%s", dev->path,
+		 src_dir_name, src_item_name, attach_dir_name, dst_item_name);
+
+	ret = unlink(link_path);
+	return ret == 0;
+}
+
 /**
  * igt_require_vkms_configfs:
  *
@@ -368,6 +429,36 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
 	write_int(path, type);
 }
 
+/**
+ * igt_vkms_plane_attach_crtc:
+ * @dev: Target device
+ * @plane_name: Target plane name
+ * @crtc_name: Destination CRTC name
+ *
+ * Attach a plane to a CRTC. Return true on success and false on error.
+ */
+bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
+				const char *crtc_name)
+{
+	return attach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
+				    VKMS_PIPELINE_ITEM_CRTC, crtc_name);
+}
+
+/**
+ * igt_vkms_plane_detach_crtc:
+ * @dev: Target device
+ * @plane_name: Target plane name
+ * @crtc_name: Destination CRTC name
+ *
+ * Detach a plane from a CRTC. Return true on success and false on error.
+ */
+bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
+				const char *crtc_name)
+{
+	return detach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
+				    crtc_name);
+}
+
 /**
  * igt_vkms_device_add_crtc:
  * @dev: Device to add the CRTC to
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 50f42aa4b..fc8db268b 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -32,6 +32,10 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
 void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
 int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
 void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
+bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
+				const char *crtc_name);
+bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
+				const char *crtc_name);
 
 void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
 bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index ea84d9f82..e1572d65f 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -94,6 +94,20 @@ static void assert_wrong_bool_values(const char *path)
 	}
 }
 
+static bool attach(const char *src_path, const char *dst_path,
+		   const char *link_name)
+{
+	char link_path[PATH_MAX];
+	int ret;
+
+	ret = snprintf(link_path, sizeof(link_path), "%s/%s", src_path, link_name);
+	igt_assert(ret >= 0 && ret < sizeof(link_path));
+
+	ret = symlink(dst_path, link_path);
+
+	return ret == 0;
+}
+
 /**
  * SUBTEST: device-default-files
  * Description: Test that creating a VKMS device creates the default files and
@@ -476,6 +490,72 @@ static void test_connector_wrong_values(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: attach-plane-to-crtc
+ * Description: Check that errors are handled while attaching planes to CRTCs.
+ */
+
+static void test_attach_plane_to_crtc(void)
+{
+	igt_vkms_t *dev1;
+	igt_vkms_t *dev2;
+	char plane1[PATH_MAX];
+	char crtc1[PATH_MAX];
+	char connector1[PATH_MAX];
+	char crtc2[PATH_MAX];
+	char dev2_enabled_path[PATH_MAX];
+	bool ok;
+
+	dev1 = igt_vkms_device_create("test_attach_plane_to_crtc_1");
+	igt_assert(dev1);
+
+	dev2 = igt_vkms_device_create("test_attach_plane_to_crtc_2");
+	igt_assert(dev2);
+
+	igt_vkms_device_add_plane(dev1, "plane1");
+	igt_vkms_device_add_crtc(dev1, "crtc1");
+	igt_vkms_device_add_connector(dev1, "connector1");
+	igt_vkms_device_add_crtc(dev2, "crtc2");
+
+	snprintf(plane1, sizeof(plane1), "%s/planes/plane1/possible_crtcs",
+		 dev1->path);
+	snprintf(crtc1, sizeof(crtc1), "%s/crtcs/crtc1", dev1->path);
+	snprintf(connector1, sizeof(connector1), "%s/connectors/connector1",
+		 dev1->path);
+	snprintf(crtc2, sizeof(crtc2), "%s/crtcs/crtc2", dev2->path);
+	snprintf(dev2_enabled_path, sizeof(dev2_enabled_path), "%s/enabled",
+		 dev2->path);
+
+	/* Error: Attach a plane to a connector */
+	ok = attach(plane1, connector1, "connector");
+	igt_assert_f(!ok, "Attaching plane1 to connector1 should fail\n");
+
+	/* Error: Attach a plane to a random file */
+	ok = attach(plane1, dev2_enabled_path, "file");
+	igt_assert_f(!ok, "Attaching plane1 to a random file should fail\n");
+
+	/* Error: Attach a plane to a CRTC from other device */
+	ok = attach(plane1, crtc2, "crtc2");
+	igt_assert_f(!ok, "Attaching plane1 to crtc2 should fail\n");
+
+	/* OK: Attaching plane1 to crtc1 */
+	ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
+	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
+
+	/* Error: Attaching plane1 to crtc1 twice */
+	ok = attach(plane1, crtc1, "crtc1_duplicated");
+	igt_assert_f(!ok, "Error attaching plane1 to crtc1 twice should fail");
+
+	/* OK: Detaching and attaching again */
+	ok = igt_vkms_plane_detach_crtc(dev1, "plane1", "crtc1");
+	igt_assert_f(ok, "Error detaching plane1 from crtc1\n");
+	ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
+	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
+
+	igt_vkms_device_destroy(dev1);
+	igt_vkms_device_destroy(dev2);
+}
+
 igt_main
 {
 	struct {
@@ -495,6 +575,7 @@ igt_main
 		{ "connector-default-files", test_connector_default_files },
 		{ "connector-default-values", test_connector_default_values },
 		{ "connector-wrong-values", test_connector_wrong_values },
+		{ "attach-plane-to-crtc", test_attach_plane_to_crtc },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 18/39] lib/vkms: Test attaching encoders to CRTCs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (16 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 19/39] lib/vkms: Test attaching connectors to encoders José Expósito
                   ` (25 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add helpers to attach and detach encoders and CRTCs and a test checking
the different valid and invalid cases.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 31 ++++++++++++++++++
 lib/igt_vkms.h             |  4 +++
 tests/vkms/vkms_configfs.c | 66 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 101 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 147234e5b..dba766c28 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -521,6 +521,37 @@ void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name)
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER, name);
 }
 
+/**
+ * igt_vkms_encoder_attach_crtc:
+ * @dev: Target device
+ * @encoder_name: Target encoder name
+ * @crtc_name: Destination CRTC name
+ *
+ * Attach an encoder to a CRTC. Return true on success and false on error.
+ */
+bool igt_vkms_encoder_attach_crtc(igt_vkms_t *dev, const char *encoder_name,
+				  const char *crtc_name)
+{
+	return attach_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER,
+				    encoder_name, VKMS_PIPELINE_ITEM_CRTC,
+				    crtc_name);
+}
+
+/**
+ * igt_vkms_encoder_detach_crtc:
+ * @dev: Target device
+ * @encoder_name: Target encoder name
+ * @crtc_name: Destination CRTC name
+ *
+ * Detach an encoder from a CRTC. Return true on success and false on error.
+ */
+bool igt_vkms_encoder_detach_crtc(igt_vkms_t *dev, const char *encoder_name,
+				  const char *crtc_name)
+{
+	return detach_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER,
+				    encoder_name, crtc_name);
+}
+
 /**
  * igt_vkms_device_add_connector:
  * @dev: Device to add the connector to
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index fc8db268b..0cc09eb90 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -43,6 +43,10 @@ void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
 					 bool writeback);
 
 void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
+bool igt_vkms_encoder_attach_crtc(igt_vkms_t *dev, const char *encoder_name,
+				  const char *crtc_name);
+bool igt_vkms_encoder_detach_crtc(igt_vkms_t *dev, const char *encoder_name,
+				  const char *crtc_name);
 
 void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name);
 int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name);
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index e1572d65f..6ac475ff4 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -556,6 +556,71 @@ static void test_attach_plane_to_crtc(void)
 	igt_vkms_device_destroy(dev2);
 }
 
+/**
+ * SUBTEST: attach-encoder-to-crtc
+ * Description: Check that errors are handled while attaching encoders to CRTCs.
+ */
+
+static void test_attach_encoder_to_crtc(void)
+{
+	igt_vkms_t *dev1;
+	igt_vkms_t *dev2;
+	char plane1[PATH_MAX];
+	char crtc1[PATH_MAX];
+	char encoder1[PATH_MAX];
+	char plane1_type_path[PATH_MAX];
+	char crtc2[PATH_MAX];
+	bool ok;
+
+	dev1 = igt_vkms_device_create("test_attach_encoder_to_crtc_1");
+	igt_assert(dev1);
+
+	dev2 = igt_vkms_device_create("test_attach_encoder_to_crtc_2");
+	igt_assert(dev2);
+
+	igt_vkms_device_add_plane(dev1, "plane1");
+	igt_vkms_device_add_crtc(dev1, "crtc1");
+	igt_vkms_device_add_encoder(dev1, "encoder1");
+	igt_vkms_device_add_crtc(dev2, "crtc2");
+
+	snprintf(plane1, sizeof(plane1), "%s/planes/plane1", dev1->path);
+	snprintf(crtc1, sizeof(crtc1), "%s/crtcs/crtc1", dev1->path);
+	snprintf(encoder1, sizeof(encoder1),
+		 "%s/encoders/encoder1/possible_crtcs", dev1->path);
+	snprintf(crtc2, sizeof(crtc2), "%s/crtcs/crtc2", dev2->path);
+	snprintf(plane1_type_path, sizeof(plane1_type_path),
+		 "%s/planes/plane1/type", dev2->path);
+
+	/* Error: Attach a encoder to a plane */
+	ok = attach(encoder1, plane1, "plane");
+	igt_assert_f(!ok, "Attaching encoder1 to plane1 should fail\n");
+
+	/* Error: Attach a encoder to a random file */
+	ok = attach(encoder1, plane1_type_path, "file");
+	igt_assert_f(!ok, "Attaching encoder1 to a random file should fail\n");
+
+	/* Error: Attach a encoder to a CRTC from other device */
+	ok = attach(encoder1, crtc2, "crtc2");
+	igt_assert_f(!ok, "Attaching encoder1 to crtc2 should fail\n");
+
+	/* OK: Attaching encoder1 to crtc1 */
+	ok = igt_vkms_encoder_attach_crtc(dev1, "encoder1", "crtc1");
+	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
+
+	/* Error: Attaching encoder1 to crtc1 twice */
+	ok = attach(encoder1, crtc1, "crtc1_duplicated");
+	igt_assert_f(!ok, "Error attaching encoder1 to crtc1 twice should fail");
+
+	/* OK: Detaching and attaching again */
+	ok = igt_vkms_encoder_detach_crtc(dev1, "encoder1", "crtc1");
+	igt_assert_f(ok, "Error detaching encoder1 from crtc1\n");
+	ok = igt_vkms_encoder_attach_crtc(dev1, "encoder1", "crtc1");
+	igt_assert_f(ok, "Error attaching encoder1 to crtc1\n");
+
+	igt_vkms_device_destroy(dev1);
+	igt_vkms_device_destroy(dev2);
+}
+
 igt_main
 {
 	struct {
@@ -576,6 +641,7 @@ igt_main
 		{ "connector-default-values", test_connector_default_values },
 		{ "connector-wrong-values", test_connector_wrong_values },
 		{ "attach-plane-to-crtc", test_attach_plane_to_crtc },
+		{ "attach-encoder-to-crtc", test_attach_encoder_to_crtc },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 19/39] lib/vkms: Test attaching connectors to encoders
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (17 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 18/39] lib/vkms: Test attaching encoders " José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-18 16:49 ` [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items José Expósito
                   ` (24 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Add helpers to attach and detach connectors and encoders and a test
checking the different valid and invalid cases.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 34 +++++++++++++++++++
 lib/igt_vkms.h             |  6 ++++
 tests/vkms/vkms_configfs.c | 69 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 109 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index dba766c28..1fcb93c94 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -607,3 +607,37 @@ void igt_vkms_connector_set_status(igt_vkms_t *dev, const char *name,
 
 	write_int(path, status);
 }
+
+/**
+ * igt_vkms_connector_attach_encoder:
+ * @dev: Target device
+ * @connector_name: Target connector name
+ * @encoder_name: Destination encoder name
+ *
+ * Attach a connector to an encoder. Return true on success and false on error.
+ */
+bool igt_vkms_connector_attach_encoder(igt_vkms_t *dev,
+				       const char *connector_name,
+				       const char *encoder_name)
+{
+	return attach_pipeline_item(dev, VKMS_PIPELINE_ITEM_CONNECTOR,
+				    connector_name, VKMS_PIPELINE_ITEM_ENCODER,
+				    encoder_name);
+}
+
+/**
+ * igt_vkms_connector_detach_encoder:
+ * @dev: Target device
+ * @connector_name: Target connector name
+ * @encoder_name: Destination encoder name
+ *
+ * Detach a connector from an encoder. Return true on success and false on
+ * error.
+ */
+bool igt_vkms_connector_detach_encoder(igt_vkms_t *dev,
+				       const char *connector_name,
+				       const char *encoder_name)
+{
+	return detach_pipeline_item(dev, VKMS_PIPELINE_ITEM_CONNECTOR,
+				    connector_name, encoder_name);
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 0cc09eb90..1ef62125f 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -52,5 +52,11 @@ void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name);
 int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name);
 void igt_vkms_connector_set_status(igt_vkms_t *dev, const char *name,
 				   int status);
+bool igt_vkms_connector_attach_encoder(igt_vkms_t *dev,
+				       const char *connector_name,
+				       const char *encoder_name);
+bool igt_vkms_connector_detach_encoder(igt_vkms_t *dev,
+				       const char *connector_name,
+				       const char *encoder_name);
 
 #endif /* __IGT_VKMS_H__ */
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 6ac475ff4..dc3dbe80d 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -621,6 +621,74 @@ static void test_attach_encoder_to_crtc(void)
 	igt_vkms_device_destroy(dev2);
 }
 
+/**
+ * SUBTEST: attach-connector-to-encoder
+ * Description: Check that errors are handled while attaching connectors to
+ *              encoders.
+ */
+
+static void test_attach_connector_to_encoder(void)
+{
+	igt_vkms_t *dev1;
+	igt_vkms_t *dev2;
+	char crtc1[PATH_MAX];
+	char encoder1[PATH_MAX];
+	char connector1[PATH_MAX];
+	char encoder2[PATH_MAX];
+	char encoder2_enabled_path[PATH_MAX];
+	bool ok;
+
+	dev1 = igt_vkms_device_create("test_attach_encoder_to_crtc_1");
+	igt_assert(dev1);
+
+	dev2 = igt_vkms_device_create("test_attach_encoder_to_crtc_2");
+	igt_assert(dev2);
+
+	igt_vkms_device_add_crtc(dev1, "crtc1");
+	igt_vkms_device_add_encoder(dev1, "encoder1");
+	igt_vkms_device_add_connector(dev1, "connector1");
+	igt_vkms_device_add_encoder(dev2, "encoder2");
+
+	snprintf(crtc1, sizeof(crtc1), "%s/crtcs/crtc1", dev1->path);
+	snprintf(encoder1, sizeof(encoder1), "%s/encoders/encoder1",
+		 dev1->path);
+	snprintf(connector1, sizeof(connector1),
+		 "%s/connectors/connector1/possible_encoders", dev1->path);
+	snprintf(encoder2, sizeof(encoder2), "%s/encoders/encoder2",
+		 dev2->path);
+	snprintf(encoder2, sizeof(encoder2), "%s/encoders/encoder2/enabled",
+		 dev2->path);
+
+	/* Error: Attach a connector to a CRTC */
+	ok = attach(connector1, crtc1, "crtc");
+	igt_assert_f(!ok, "Attaching connector1 to crtc1 should fail\n");
+
+	/* Error: Attach a connector to a random file */
+	ok = attach(connector1, encoder2_enabled_path, "file");
+	igt_assert_f(!ok, "Attaching connector1 to a random file should fail\n");
+
+	/* Error: Attach a connector to an encoder from other device */
+	ok = attach(connector1, encoder2, "encoder2");
+	igt_assert_f(!ok, "Attaching connector1 to encoder2 should fail\n");
+
+	/* OK: Attaching connector1 to encoder1 */
+	ok = igt_vkms_connector_attach_encoder(dev1, "connector1", "encoder1");
+	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
+
+	/* Error: Attaching connector1 to encoder1 twice */
+	ok = attach(connector1, encoder1, "encoder1_duplicated");
+	igt_assert_f(!ok, "Error attaching connector1 to encoder1 twice should fail");
+
+	/* OK: Detaching and attaching again */
+	ok = igt_vkms_connector_detach_encoder(dev1, "connector1", "encoder1");
+	igt_assert_f(ok, "Error detaching connector1 from encoder1\n");
+	ok = igt_vkms_connector_attach_encoder(dev1, "connector1", "encoder1");
+	igt_assert_f(ok, "Error attaching connector1 to encoder1\n");
+
+	igt_vkms_device_destroy(dev1);
+	igt_vkms_device_destroy(dev2);
+}
+
 igt_main
 {
 	struct {
@@ -642,6 +710,7 @@ igt_main
 		{ "connector-wrong-values", test_connector_wrong_values },
 		{ "attach-plane-to-crtc", test_attach_plane_to_crtc },
 		{ "attach-encoder-to-crtc", test_attach_encoder_to_crtc },
+		{ "attach-connector-to-encoder", test_attach_connector_to_encoder },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (18 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 19/39] lib/vkms: Test attaching connectors to encoders José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 13:06   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 21/39] lib/vkms: Create VKMS device from static config José Expósito
                   ` (23 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

It shouldn't be possible to enable a device without creating and
attaching its pipeline items.

Test that the device is not enabled and also that no actual device was
created using libdrm.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 60 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index dc3dbe80d..87d660fff 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -108,6 +108,42 @@ static bool attach(const char *src_path, const char *dst_path,
 	return ret == 0;
 }
 
+static drmDevicePtr find_device(const char *name, drmDevicePtr *devices,
+				int n_devices)
+{
+	drmDevicePtr dev;
+	const char *dev_name;
+
+	for (int i = 0; i < n_devices; i++) {
+		dev = devices[i];
+
+		if (!(dev->available_nodes & BIT(DRM_NODE_PRIMARY)))
+			continue;
+
+		if (dev->bustype != DRM_BUS_PLATFORM)
+			continue;
+
+		dev_name = dev->businfo.platform->fullname;
+		if (strncmp(name, dev_name, strlen(name)) == 0)
+			return dev;
+	}
+
+	return NULL;
+}
+
+static bool device_exists(const char *name)
+{
+	drmDevicePtr devices[64];
+	int n_devices;
+	bool exists;
+
+	n_devices = drmGetDevices(devices, ARRAY_SIZE(devices));
+	exists = !!find_device(name, devices, n_devices);
+	drmFreeDevices(devices, n_devices);
+
+	return exists;
+}
+
 /**
  * SUBTEST: device-default-files
  * Description: Test that creating a VKMS device creates the default files and
@@ -689,6 +725,29 @@ static void test_attach_connector_to_encoder(void)
 	igt_vkms_device_destroy(dev2);
 }
 
+/**
+ * SUBTEST: enable-no-pipeline-items
+ * Description: Try to enable a VKMS device without adding any pipeline items
+ *              and test that it fails.
+ */
+
+static void test_enable_no_pipeline_items(void)
+{
+	igt_vkms_t *dev;
+
+	dev = igt_vkms_device_create(__func__);
+	igt_assert(dev);
+
+	/* Try to enable it and check that the device is not set as enabled */
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+
+	/* Check that no actual device was created*/
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -711,6 +770,7 @@ igt_main
 		{ "attach-plane-to-crtc", test_attach_plane_to_crtc },
 		{ "attach-encoder-to-crtc", test_attach_encoder_to_crtc },
 		{ "attach-connector-to-encoder", test_attach_connector_to_encoder },
+		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 21/39] lib/vkms: Create VKMS device from static config
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (19 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 14:30   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 22/39] tests/vkms_configfs: Test adding too many planes José Expósito
                   ` (22 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

In order to make the process of creating new VKMS devices as simple as
possible and in a declarative way, create a set of structures
representing a VKMS device configuration and a function that reads them
and applies the configuration.

In addition, add a test using this new function that checks that
creating a device without planes fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 88 ++++++++++++++++++++++++++++++++++++++
 lib/igt_vkms.h             | 43 +++++++++++++++++++
 tests/vkms/vkms_configfs.c | 40 +++++++++++++++++
 3 files changed, 171 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 1fcb93c94..4c44efec9 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -253,6 +253,94 @@ igt_vkms_t *igt_vkms_device_create(const char *name)
 	return dev;
 }
 
+/**
+ * igt_vkms_device_create_from_config:
+ * @cfg: Device configuration
+ *
+ * Create a VKMS device and set all the parameters specified by the
+ * configuration.
+ */
+igt_vkms_t *igt_vkms_device_create_from_config(igt_vkms_config_t *cfg)
+{
+	igt_vkms_t *dev;
+	igt_vkms_plane_config_t *plane;
+	igt_vkms_crtc_config_t *crtc;
+	igt_vkms_encoder_config_t *encoder;
+	igt_vkms_connector_config_t *connector;
+	const char *name;
+	int n, i;
+
+	igt_debug("Creating device from configuration:\n");
+	igt_debug("\t- Device name: %s\n", cfg->device_name);
+
+	dev = igt_vkms_device_create(cfg->device_name);
+	if (!dev)
+		return NULL;
+
+	for (n = 0; (crtc = &cfg->crtcs[n])->name; n++) {
+		igt_debug("\t- CRTC %d:\n", n);
+		igt_debug("\t\t- name: %s\n", crtc->name);
+		igt_debug("\t\t- writeback: %d\n", crtc->writeback);
+
+		igt_vkms_device_add_crtc(dev, crtc->name);
+		igt_vkms_crtc_set_writeback_enabled(dev, crtc->name,
+						    crtc->writeback);
+	}
+
+	for (n = 0; (plane = &cfg->planes[n])->name; n++) {
+		igt_debug("\t- Plane %d:\n", n);
+		igt_debug("\t\t- name: %s\n", plane->name);
+		igt_debug("\t\t- type: %d\n", plane->type);
+		igt_debug("\t\t- possible_crtcs:\n");
+
+		igt_vkms_device_add_plane(dev, plane->name);
+		igt_vkms_plane_set_type(dev, plane->name, plane->type);
+
+		for (i = 0; (name = plane->possible_crtcs[i]); i++) {
+			igt_debug("\t\t\t- %s\n", name);
+
+			igt_vkms_plane_attach_crtc(dev, plane->name, name);
+		}
+	}
+
+	for (n = 0; (encoder = &cfg->encoders[n])->name; n++) {
+		igt_debug("\t- Encoder %d:\n", n);
+		igt_debug("\t\t- name: %s\n", encoder->name);
+		igt_debug("\t\t- possible_crtcs:\n");
+
+		igt_vkms_device_add_encoder(dev, encoder->name);
+
+		for (i = 0; (name = encoder->possible_crtcs[i]); i++) {
+			igt_debug("\t\t\t- %s\n", name);
+
+			igt_vkms_encoder_attach_crtc(dev, encoder->name, name);
+		}
+	}
+
+	for (n = 0; (connector = &cfg->connectors[n])->name; n++) {
+		if (connector->status == 0)
+			connector->status = DRM_MODE_CONNECTED;
+
+		igt_debug("\t- Connector %d:\n", n);
+		igt_debug("\t\t- name: %s\n", connector->name);
+		igt_debug("\t\t- status: %d\n", connector->status);
+		igt_debug("\t\t- possible_encoders:\n");
+
+		igt_vkms_device_add_connector(dev, connector->name);
+		igt_vkms_connector_set_status(dev, connector->name,
+					      connector->status);
+
+		for (i = 0; (name = connector->possible_encoders[i]); i++) {
+			igt_debug("\t\t\t- %s\n", name);
+
+			igt_vkms_connector_attach_encoder(dev, connector->name,
+							  name);
+		}
+	}
+
+	return dev;
+}
+
 static int detach_pipeline_items(const char *path, const struct stat *info,
 				 const int typeflag, struct FTW *pathinfo)
 {
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 1ef62125f..79edabe81 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -10,6 +10,8 @@
 
 #include <stdbool.h>
 
+#define VKMS_MAX_PIPELINE_ITEMS	40
+
 /**
  * igt_vkms_t:
  * @path: VKMS root directory inside configfs mounted directory
@@ -20,9 +22,50 @@ typedef struct igt_vkms {
 	char *path;
 } igt_vkms_t;
 
+typedef struct igt_vkms_crtc_config {
+	const char *name;
+	bool writeback; /* Default: false */
+} igt_vkms_crtc_config_t;
+
+typedef struct igt_vkms_plane_config {
+	const char *name;
+	int type; /* Default: DRM_PLANE_TYPE_OVERLAY */
+	const char *possible_crtcs[VKMS_MAX_PIPELINE_ITEMS];
+} igt_vkms_plane_config_t;
+
+typedef struct igt_vkms_encoder_config {
+	const char *name;
+	const char *possible_crtcs[VKMS_MAX_PIPELINE_ITEMS];
+} igt_vkms_encoder_config_t;
+
+typedef struct igt_vkms_connector_config {
+	const char *name;
+	int status; /* Default: DRM_MODE_CONNECTED */
+	const char *possible_encoders[VKMS_MAX_PIPELINE_ITEMS];
+} igt_vkms_connector_config_t;
+
+/**
+ * igt_vkms_config_t:
+ * @device_name: Device name
+ * @planes: NULL terminated list of plane configurations
+ * @crtcs: NULL terminated list of CRTC configurations
+ * @encoders: NULL terminated list of encoders configurations
+ * @connectors: NULL terminated list of connector configurations
+ *
+ * Structure used to create a VKMS device from a static configuration.
+ */
+typedef struct igt_vkms_config {
+	const char *device_name;
+	igt_vkms_plane_config_t planes[VKMS_MAX_PIPELINE_ITEMS];
+	igt_vkms_crtc_config_t crtcs[VKMS_MAX_PIPELINE_ITEMS];
+	igt_vkms_encoder_config_t encoders[VKMS_MAX_PIPELINE_ITEMS];
+	igt_vkms_connector_config_t connectors[VKMS_MAX_PIPELINE_ITEMS];
+} igt_vkms_config_t;
+
 void igt_require_vkms_configfs(void);
 
 igt_vkms_t *igt_vkms_device_create(const char *name);
+igt_vkms_t *igt_vkms_device_create_from_config(igt_vkms_config_t *cfg);
 void igt_vkms_device_destroy(igt_vkms_t *dev);
 void igt_vkms_destroy_all_devices(void);
 
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 87d660fff..47cfa475f 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -748,6 +748,45 @@ static void test_enable_no_pipeline_items(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-no-planes
+ * Description: Try to enable a VKMS device without adding planes and test that
+ *              it fails.
+ */
+
+static void test_enable_no_planes(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = { {} },
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -771,6 +810,7 @@ igt_main
 		{ "attach-encoder-to-crtc", test_attach_encoder_to_crtc },
 		{ "attach-connector-to-encoder", test_attach_connector_to_encoder },
 		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
+		{ "enable-no-planes", test_enable_no_planes },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 22/39] tests/vkms_configfs: Test adding too many planes
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (20 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 21/39] lib/vkms: Create VKMS device from static config José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 14:53   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 23/39] tests/vkms_configfs: Test not adding a primary plane José Expósito
                   ` (21 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

The kernel references pipeline items with 32 bit bitmaks, therefore,
adding more than 31 items causes an overflow.

Make sure that this limit is handled correctly.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 53 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 47cfa475f..7df9bda01 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -787,6 +787,58 @@ static void test_enable_no_planes(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-too-many-planes
+ * Description: Try to enable a VKMS device with too many planes and test that
+ *              it fails.
+ */
+
+static void test_enable_too_many_planes(void)
+{
+	igt_vkms_t *dev;
+	char plane_names[VKMS_MAX_PIPELINE_ITEMS][8];
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0" },
+			},
+		},
+	};
+
+	for (int n = 1; n < 32; n++) {
+		snprintf(plane_names[n], sizeof(plane_names[n]), "plane%d", n);
+		cfg.planes[n] = (igt_vkms_plane_config_t){
+			.name = plane_names[n],
+			.possible_crtcs = { "crtc0" },
+		};
+	}
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -811,6 +863,7 @@ igt_main
 		{ "attach-connector-to-encoder", test_attach_connector_to_encoder },
 		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
 		{ "enable-no-planes", test_enable_no_planes },
+		{ "enable-too-many-planes", test_enable_too_many_planes },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 23/39] tests/vkms_configfs: Test not adding a primary plane
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (21 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 22/39] tests/vkms_configfs: Test adding too many planes José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 14:54   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 24/39] tests/vkms_configfs: Test adding multiple primary planes José Expósito
                   ` (20 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device without a primary plane for one of its
CRTCs and test that it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 7df9bda01..fa20a364f 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -839,6 +839,56 @@ static void test_enable_too_many_planes(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-no-primary-plane
+ * Description: Try to enable a VKMS device without a primary plane for one of
+ *              its CRTCs and test that it fails.
+ */
+
+static void test_enable_no_primary_plane(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_CURSOR,
+				.possible_crtcs = { "crtc1" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -864,6 +914,7 @@ igt_main
 		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
 		{ "enable-no-planes", test_enable_no_planes },
 		{ "enable-too-many-planes", test_enable_too_many_planes },
+		{ "enable-no-primary-plane", test_enable_no_primary_plane },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 24/39] tests/vkms_configfs: Test adding multiple primary planes
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (22 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 23/39] tests/vkms_configfs: Test not adding a primary plane José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 15:00   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 25/39] tests/vkms_configfs: Test adding multiple cursor planes José Expósito
                   ` (19 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with multiple primary planes for one of its
CRTCs and test that it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 56 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index fa20a364f..c93ebadb3 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -889,6 +889,61 @@ static void test_enable_no_primary_plane(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-multiple-primary-planes
+ * Description: Try to enable a VKMS device with multiple primary planes for one
+ *              of its CRTCs and test that it fails.
+ */
+
+static void test_enable_multiple_primary_planes(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1" },
+			},
+			{
+				.name = "plane2",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -915,6 +970,7 @@ igt_main
 		{ "enable-no-planes", test_enable_no_planes },
 		{ "enable-too-many-planes", test_enable_too_many_planes },
 		{ "enable-no-primary-plane", test_enable_no_primary_plane },
+		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 25/39] tests/vkms_configfs: Test adding multiple cursor planes
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (23 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 24/39] tests/vkms_configfs: Test adding multiple primary planes José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 15:00   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 26/39] tests/vkms_configfs: Test adding a plane without possible CRTCs José Expósito
                   ` (18 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with multiple cursor planes for one of its
CRTCs and test that it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 61 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index c93ebadb3..dcd0bb5ec 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -944,6 +944,66 @@ static void test_enable_multiple_primary_planes(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-multiple-cursor-planes
+ * Description: Try to enable a VKMS device with multiple cursor planes for one
+ *              of its CRTCs and test that it fails.
+ */
+
+static void test_enable_multiple_cursor_planes(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1" },
+			},
+			{
+				.name = "plane2",
+				.type = DRM_PLANE_TYPE_CURSOR,
+				.possible_crtcs = { "crtc1" },
+			},
+			{
+				.name = "plane3",
+				.type = DRM_PLANE_TYPE_CURSOR,
+				.possible_crtcs = { "crtc1" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -971,6 +1031,7 @@ igt_main
 		{ "enable-too-many-planes", test_enable_too_many_planes },
 		{ "enable-no-primary-plane", test_enable_no_primary_plane },
 		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
+		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 26/39] tests/vkms_configfs: Test adding a plane without possible CRTCs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (24 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 25/39] tests/vkms_configfs: Test adding multiple cursor planes José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 15:01   ` Louis Chauvet
  2025-02-18 16:49 ` [PATCH i-g-t 27/39] tests/vkms_configfs: Test enabling a device without CRTCs José Expósito
                   ` (17 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with a plane without possible CRTCs and test
that it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index dcd0bb5ec..7d6437c87 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1004,6 +1004,56 @@ static void test_enable_multiple_cursor_planes(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-plane-no-crtcs
+ * Description: Try to enable a VKMS device with a plane without possible CRTCs
+ *              and test that it fails.
+ */
+
+static void test_enable_plane_no_crtcs(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = {},
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1032,6 +1082,7 @@ igt_main
 		{ "enable-no-primary-plane", test_enable_no_primary_plane },
 		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
 		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
+		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 27/39] tests/vkms_configfs: Test enabling a device without CRTCs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (25 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 26/39] tests/vkms_configfs: Test adding a plane without possible CRTCs José Expósito
@ 2025-02-18 16:49 ` José Expósito
  2025-02-27 15:15   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 28/39] tests/vkms_configfs: Test enabling a device with too many CRTCs José Expósito
                   ` (16 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:49 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device without adding CRTCs and test that it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 42 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 7d6437c87..59365c91b 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1054,6 +1054,47 @@ static void test_enable_plane_no_crtcs(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-no-crtcs
+ * Description: Try to enable a VKMS device without adding CRTCs and test that
+ *              it fails.
+ */
+
+static void test_enable_no_crtcs(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = {},
+			},
+		},
+		.crtcs = { {} },
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1083,6 +1124,7 @@ igt_main
 		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
 		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
 		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
+		{ "enable-no-crtcs", test_enable_no_crtcs },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 28/39] tests/vkms_configfs: Test enabling a device with too many CRTCs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (26 preceding siblings ...)
  2025-02-18 16:49 ` [PATCH i-g-t 27/39] tests/vkms_configfs: Test enabling a device without CRTCs José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-27 15:05   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 29/39] tests/vkms_configfs: Test enabling a device without encoders José Expósito
                   ` (15 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with too many CRTCs and test that it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 50 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 59365c91b..eb6ebfba1 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1095,6 +1095,55 @@ static void test_enable_no_crtcs(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-too-many-crtcs
+ * Description: Try to enable a VKMS device with too many CRTCs and test that it
+ *              fails.
+ */
+
+static void test_enable_too_many_crtcs(void)
+{
+	igt_vkms_t *dev;
+	char crtc_names[VKMS_MAX_PIPELINE_ITEMS][7];
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+		},
+		.crtcs = {},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0" },
+			},
+		},
+	};
+
+	for (int n = 0; n < 32; n++) {
+		snprintf(crtc_names[n], sizeof(crtc_names[n]), "crtc%d", n);
+		cfg.crtcs[n] = (igt_vkms_crtc_config_t){
+			.name = crtc_names[n],
+		};
+	}
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1125,6 +1174,7 @@ igt_main
 		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
 		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
 		{ "enable-no-crtcs", test_enable_no_crtcs },
+		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 29/39] tests/vkms_configfs: Test enabling a device without encoders
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (27 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 28/39] tests/vkms_configfs: Test enabling a device with too many CRTCs José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-27 15:05   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 30/39] tests/vkms_configfs: Test enabling a device with too many encoders José Expósito
                   ` (14 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device without adding encoders and test that it
fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 42 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index eb6ebfba1..ffbc3b133 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1144,6 +1144,47 @@ static void test_enable_too_many_crtcs(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-no-encoders
+ * Description: Try to enable a VKMS device without adding encoders and test
+ *              that it fails.
+ */
+
+static void test_enable_no_encoders(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+		},
+		.encoders = { {} },
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = {},
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1175,6 +1216,7 @@ igt_main
 		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
 		{ "enable-no-crtcs", test_enable_no_crtcs },
 		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
+		{ "enable-no-encoders", test_enable_no_encoders },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 30/39] tests/vkms_configfs: Test enabling a device with too many encoders
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (28 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 29/39] tests/vkms_configfs: Test enabling a device without encoders José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-27 15:05   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 31/39] tests/vkms_configfs: Test adding an encoder without possible CRTCs José Expósito
                   ` (13 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with too many encoders and test that it
fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index ffbc3b133..8f1f46f90 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1185,6 +1185,56 @@ static void test_enable_no_encoders(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-too-many-encoders
+ * Description: Try to enable a VKMS device with too many encoders and test that
+ *              it fails.
+ */
+
+static void test_enable_too_many_encoders(void)
+{
+	igt_vkms_t *dev;
+	char encoder_names[VKMS_MAX_PIPELINE_ITEMS][10];
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+		},
+		.encoders = {},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0" },
+			},
+		},
+	};
+
+	for (int n = 0; n < 32; n++) {
+		snprintf(encoder_names[n], sizeof(encoder_names[n]), "encoder%d", n);
+		cfg.encoders[n] = (igt_vkms_encoder_config_t){
+			.name = encoder_names[n],
+			.possible_crtcs = { "crtc0" }
+		};
+	}
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1217,6 +1267,7 @@ igt_main
 		{ "enable-no-crtcs", test_enable_no_crtcs },
 		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
 		{ "enable-no-encoders", test_enable_no_encoders },
+		{ "enable-too-many-encoders", test_enable_too_many_encoders },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 31/39] tests/vkms_configfs: Test adding an encoder without possible CRTCs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (29 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 30/39] tests/vkms_configfs: Test enabling a device with too many encoders José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-27 15:15   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 32/39] tests/vkms_configfs: Test adding a CRTC without encoders José Expósito
                   ` (12 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with an encoder without possible CRTCs and
test that it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 44 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 8f1f46f90..11ed6dbcb 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1235,6 +1235,49 @@ static void test_enable_too_many_encoders(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-encoder-no-crtcs
+ * Description: Try to enable a VKMS device with an encoder without possible
+ *              CRTCs and test that it fails.
+ */
+
+static void test_enable_encoder_no_crtcs(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = {} },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1268,6 +1311,7 @@ igt_main
 		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
 		{ "enable-no-encoders", test_enable_no_encoders },
 		{ "enable-too-many-encoders", test_enable_too_many_encoders },
+		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 32/39] tests/vkms_configfs: Test adding a CRTC without encoders
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (30 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 31/39] tests/vkms_configfs: Test adding an encoder without possible CRTCs José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-27 15:15   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 33/39] tests/vkms_configfs: Test enabling a device without connectors José Expósito
                   ` (11 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with a CRTC without encoders and test that
it fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 11ed6dbcb..e003e0ca0 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1278,6 +1278,56 @@ static void test_enable_encoder_no_crtcs(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-crtc-no-encoder
+ * Description: Try to enable a VKMS device with a CRTC without encoders and
+ *              test that it fails.
+ */
+
+static void test_enable_crtc_no_encoder(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc0" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1312,6 +1362,7 @@ igt_main
 		{ "enable-no-encoders", test_enable_no_encoders },
 		{ "enable-too-many-encoders", test_enable_too_many_encoders },
 		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
+		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 33/39] tests/vkms_configfs: Test enabling a device without connectors
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (31 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 32/39] tests/vkms_configfs: Test adding a CRTC without encoders José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-27 15:15   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 34/39] tests/vkms_configfs: Test enabling a device with too many connectors José Expósito
                   ` (10 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Enable a VKMS device without adding connectors and test that it is
created with the specified configuration.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 39 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index e003e0ca0..3ad3df584 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1328,6 +1328,44 @@ static void test_enable_crtc_no_encoder(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-no-connectors
+ * Description: Try to enable a VKMS device without adding connectors and test
+ *              that it fails.
+ */
+
+static void test_enable_no_connectors(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0"},
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+		},
+		.connectors = { },
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1363,6 +1401,7 @@ igt_main
 		{ "enable-too-many-encoders", test_enable_too_many_encoders },
 		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
 		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
+		{ "enable-no-connectors", test_enable_no_connectors },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 34/39] tests/vkms_configfs: Test enabling a device with too many connectors
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (32 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 33/39] tests/vkms_configfs: Test enabling a device without connectors José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-27 15:15   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes José Expósito
                   ` (9 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Try to enable a VKMS device with too many connectors and test that it
fails.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 49 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 3ad3df584..5a5f85ef3 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1366,6 +1366,54 @@ static void test_enable_no_connectors(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enable-too-many-connectors
+ * Description: Try to enable a VKMS device with too many connectors and test
+ *              that it fails.
+ */
+
+static void test_enable_too_many_connectors(void)
+{
+	igt_vkms_t *dev;
+	char connector_names[VKMS_MAX_PIPELINE_ITEMS][12];
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0" },
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+		},
+		.connectors = {},
+	};
+
+	for (int n = 0; n < 32; n++) {
+		snprintf(connector_names[n], sizeof(connector_names[n]),
+			 "connector%d", n);
+		cfg.connectors[n] = (igt_vkms_connector_config_t){
+			.name = connector_names[n],
+			.possible_encoders = { "encoder0" }
+		};
+	}
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(!igt_vkms_device_is_enabled(dev));
+	igt_assert(!device_exists(__func__));
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1402,6 +1450,7 @@ igt_main
 		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
 		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
 		{ "enable-no-connectors", test_enable_no_connectors },
+		{ "enable-too-many-connectors", test_enable_too_many_connectors },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (33 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 34/39] tests/vkms_configfs: Test enabling a device with too many connectors José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-28  8:51   ` Louis Chauvet
  2025-02-18 16:50 ` [PATCH i-g-t 36/39] lib/vkms: Test changing enabled device CRTCs José Expósito
                   ` (8 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Test that, once a VKMS device is enabled, the plane values can't change
and that deleting it or the attached CRTCs doesn't change the VKMS
device.

Add a function that performs a basic validation checking that the
device created matches the expected one.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             |  27 +++++++
 lib/igt_vkms.h             |   1 +
 tests/vkms/vkms_configfs.c | 147 +++++++++++++++++++++++++++++++++++++
 3 files changed, 175 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 4c44efec9..3dab7a823 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -152,6 +152,21 @@ static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
 		     path, errno, strerror(errno));
 }
 
+static bool remove_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
+				 const char *name)
+{
+	const char *item_dir_name;
+	char path[PATH_MAX];
+	int ret;
+
+	item_dir_name = get_pipeline_item_dir_name(item);
+	snprintf(path, sizeof(path), "%s/%s/%s", dev->path, item_dir_name,
+		 name);
+
+	ret = rmdir(path);
+	return ret == 0;
+}
+
 static bool attach_pipeline_item(igt_vkms_t *dev,
 				 enum vkms_pipeline_item src_item,
 				 const char *src_item_name,
@@ -474,6 +489,18 @@ void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name)
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
 }
 
+/**
+ * igt_vkms_device_remove_plane:
+ * @dev: Device to remove the plane from
+ * @name: Plane name
+ *
+ * Remove an existing plane from the VKMS device.
+ */
+bool igt_vkms_device_remove_plane(igt_vkms_t *dev, const char *name)
+{
+	return remove_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
+}
+
 /**
  * igt_vkms_plane_get_type:
  * @dev: Device the plane belongs to
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 79edabe81..03f9cb339 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -73,6 +73,7 @@ bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
 void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
 
 void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
+bool igt_vkms_device_remove_plane(igt_vkms_t *dev, const char *name);
 int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
 void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
 bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 5a5f85ef3..066911715 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -144,6 +144,89 @@ static bool device_exists(const char *name)
 	return exists;
 }
 
+static void assert_device_config(igt_vkms_config_t *cfg)
+{
+	drmDevicePtr devices[64];
+	drmDevicePtr dev;
+	drmModeResPtr res;
+	drmModePlaneResPtr plane_res;
+	drmModeConnectorPtr connector_res;
+	igt_vkms_crtc_config_t *crtc;
+	igt_vkms_connector_config_t *connector;
+	int n_devices;
+	int n_planes = 0;
+	int n_crtcs = 0;
+	int n_encoders = 0;
+	int n_connectors = 0;
+	int n_connector_status_cfg[4] = {0};
+	int n_connector_status_drm[4] = {0};
+	int fd;
+
+	n_devices = drmGetDevices(devices, ARRAY_SIZE(devices));
+
+	dev = find_device(cfg->device_name, devices, n_devices);
+	igt_assert_f(dev, "Device '%s' not found\n", cfg->device_name);
+
+	fd = open(dev->nodes[DRM_NODE_PRIMARY], O_RDONLY);
+	igt_assert_f(fd >= 0, "Error opening device '%s' at path '%s'\n",
+		     cfg->device_name, dev->nodes[DRM_NODE_PRIMARY]);
+	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1),
+		     "Error setting DRM_CLIENT_CAP_UNIVERSAL_PLANES\n");
+	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1),
+		     "Error setting DRM_CLIENT_CAP_ATOMIC\n");
+	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1),
+		     "Error setting DRM_CLIENT_CAP_WRITEBACK_CONNECTORS\n");
+
+	res = drmModeGetResources(fd);
+	igt_assert_f(res, "Error getting resources\n");
+	plane_res = drmModeGetPlaneResources(fd);
+	igt_assert_f(plane_res, "Error getting plane resources\n");
+
+	for (int n = 0; (&cfg->planes[n])->name; n++)
+		n_planes++;
+
+	for (int n = 0; (crtc = &cfg->crtcs[n])->name; n++) {
+		n_crtcs++;
+
+		if (crtc->writeback) {
+			n_encoders++;
+			n_connectors++;
+			n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION]++;
+		}
+	}
+
+	for (int n = 0; (&cfg->encoders[n])->name; n++)
+		n_encoders++;
+
+	for (int n = 0; (connector = &cfg->connectors[n])->name; n++) {
+		n_connectors++;
+		n_connector_status_cfg[connector->status]++;
+	}
+
+	for (int n = 0; n < res->count_connectors; n++) {
+		connector_res = drmModeGetConnectorCurrent(fd,
+							   res->connectors[n]);
+		n_connector_status_drm[connector_res->connection]++;
+		drmModeFreeConnector(connector_res);
+	}
+
+	igt_assert_eq(n_planes, plane_res->count_planes);
+	igt_assert_eq(n_crtcs, res->count_crtcs);
+	igt_assert_eq(n_encoders, res->count_encoders);
+	igt_assert_eq(n_connectors, res->count_connectors);
+	igt_assert_eq(n_connector_status_cfg[DRM_MODE_CONNECTED],
+		      n_connector_status_drm[DRM_MODE_CONNECTED]);
+	igt_assert_eq(n_connector_status_cfg[DRM_MODE_DISCONNECTED],
+		      n_connector_status_drm[DRM_MODE_DISCONNECTED]);
+	igt_assert_eq(n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION],
+		      n_connector_status_drm[DRM_MODE_UNKNOWNCONNECTION]);
+
+	drmModeFreePlaneResources(plane_res);
+	drmModeFreeResources(res);
+	close(fd);
+	drmFreeDevices(devices, n_devices);
+}
+
 /**
  * SUBTEST: device-default-files
  * Description: Test that creating a VKMS device creates the default files and
@@ -1414,6 +1497,69 @@ static void test_enable_too_many_connectors(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enabled-plane-cannot-change
+ * Description: Test that, once a VKMS device is enabled, the plane values can't
+ *              change and that deleting it or the attached CRTCs doesn't change
+ *              the VKMS device.
+ */
+
+static void test_enabled_plane_cannot_change(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0"},
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1"},
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(igt_vkms_device_is_enabled(dev));
+	assert_device_config(&cfg);
+
+	/* Try to change values */
+	igt_vkms_plane_set_type(dev, "plane0", DRM_PLANE_TYPE_OVERLAY);
+	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
+		      DRM_PLANE_TYPE_PRIMARY);
+
+	igt_assert(!igt_vkms_plane_attach_crtc(dev, "plane0", "crtc1"));
+
+	/* Deleting pipeline items doesn't affect the device */
+	igt_assert(igt_vkms_plane_detach_crtc(dev, "plane0", "crtc0"));
+	igt_assert(igt_vkms_device_remove_plane(dev, "plane0"));
+	assert_device_config(&cfg);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1451,6 +1597,7 @@ igt_main
 		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
 		{ "enable-no-connectors", test_enable_no_connectors },
 		{ "enable-too-many-connectors", test_enable_too_many_connectors },
+		{ "enabled-plane-cannot-change", test_enabled_plane_cannot_change },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 36/39] lib/vkms: Test changing enabled device CRTCs
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (34 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-18 16:50 ` [PATCH i-g-t 37/39] lib/vkms: Test changing enabled device encoders José Expósito
                   ` (7 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Test that, once a VKMS device is enabled, the CRTC values can't change
and that deleting it or the attached planes/encoders doesn't change the
VKMS device.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 12 +++++++++
 lib/igt_vkms.h             |  1 +
 tests/vkms/vkms_configfs.c | 55 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 68 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 3dab7a823..58c71ca08 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -586,6 +586,18 @@ void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name)
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CRTC, name);
 }
 
+/**
+ * igt_vkms_device_remove_crtc:
+ * @dev: Device to remove the CRTC from
+ * @name: CRTC name
+ *
+ * Remove an existing CRTC from the VKMS device.
+ */
+bool igt_vkms_device_remove_crtc(igt_vkms_t *dev, const char *name)
+{
+	return remove_pipeline_item(dev, VKMS_PIPELINE_ITEM_CRTC, name);
+}
+
 /**
  * igt_vkms_crtc_is_writeback_enabled:
  * @dev: Device the CRTC belongs to
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index 03f9cb339..e1f63d809 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -82,6 +82,7 @@ bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
 				const char *crtc_name);
 
 void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
+bool igt_vkms_device_remove_crtc(igt_vkms_t *dev, const char *name);
 bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
 void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
 					 bool writeback);
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 066911715..d8ae1f073 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1560,6 +1560,60 @@ static void test_enabled_plane_cannot_change(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enabled-crtc-cannot-change
+ * Description: Test that, once a VKMS device is enabled, the CRTC values can't
+ *              change and that deleting it or the attached planes/encoders
+ *              doesn't change the VKMS device.
+ */
+
+static void test_enabled_crtc_cannot_change(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0"},
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0", .writeback = true },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(igt_vkms_device_is_enabled(dev));
+	assert_device_config(&cfg);
+
+	/* Try to change values */
+	igt_vkms_crtc_set_writeback_enabled(dev, "crtc0", false);
+	igt_assert(igt_vkms_crtc_is_writeback_enabled(dev, "crtc0"));
+
+	/* Deleting pipeline items doesn't affect the device */
+	igt_assert(igt_vkms_plane_detach_crtc(dev, "plane0", "crtc0"));
+	igt_assert(igt_vkms_encoder_detach_crtc(dev, "encoder0", "crtc0"));
+	igt_assert(igt_vkms_device_remove_crtc(dev, "crtc0"));
+	assert_device_config(&cfg);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1598,6 +1652,7 @@ igt_main
 		{ "enable-no-connectors", test_enable_no_connectors },
 		{ "enable-too-many-connectors", test_enable_too_many_connectors },
 		{ "enabled-plane-cannot-change", test_enabled_plane_cannot_change },
+		{ "enabled-crtc-cannot-change", test_enabled_crtc_cannot_change },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 37/39] lib/vkms: Test changing enabled device encoders
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (35 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 36/39] lib/vkms: Test changing enabled device CRTCs José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-18 16:50 ` [PATCH i-g-t 38/39] lib/vkms: Test changing enabled device connectors José Expósito
                   ` (6 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Test that, once a VKMS device is enabled, the encoder values can't
change and that deleting it or the attached CRTCs doesn't change the
VKMS device.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 12 ++++++++
 lib/igt_vkms.h             |  1 +
 tests/vkms/vkms_configfs.c | 62 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 75 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 58c71ca08..95fbf5773 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -648,6 +648,18 @@ void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name)
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER, name);
 }
 
+/**
+ * igt_vkms_device_remove_encoder:
+ * @dev: Device to remove the encoder from
+ * @name: Encoder name
+ *
+ * Remove an existing encoder from the VKMS device.
+ */
+bool igt_vkms_device_remove_encoder(igt_vkms_t *dev, const char *name)
+{
+	return remove_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER, name);
+}
+
 /**
  * igt_vkms_encoder_attach_crtc:
  * @dev: Target device
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index e1f63d809..b82282a11 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -88,6 +88,7 @@ void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
 					 bool writeback);
 
 void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
+bool igt_vkms_device_remove_encoder(igt_vkms_t *dev, const char *name);
 bool igt_vkms_encoder_attach_crtc(igt_vkms_t *dev, const char *encoder_name,
 				  const char *crtc_name);
 bool igt_vkms_encoder_detach_crtc(igt_vkms_t *dev, const char *encoder_name,
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index d8ae1f073..be311e77e 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1614,6 +1614,67 @@ static void test_enabled_crtc_cannot_change(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enabled-encoder-cannot-change
+ * Description: Test that, once a VKMS device is enabled, the encoder values
+ *              can't change and that deleting it or the attached CRTCs doesn't
+ *              change the VKMS device.
+ */
+
+static void test_enabled_encoder_cannot_change(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0"},
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1"},
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.possible_encoders = { "encoder0", "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(igt_vkms_device_is_enabled(dev));
+	assert_device_config(&cfg);
+
+	/* Try to change values */
+	igt_assert(!igt_vkms_encoder_attach_crtc(dev, "encoder0", "crtc1"));
+
+	/* Deleting pipeline items doesn't affect the device */
+	igt_assert(igt_vkms_encoder_detach_crtc(dev, "encoder0", "crtc0"));
+	igt_assert(igt_vkms_connector_detach_encoder(dev, "connector0",
+						     "encoder0"));
+	igt_assert(igt_vkms_device_remove_encoder(dev, "encoder0"));
+	assert_device_config(&cfg);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1653,6 +1714,7 @@ igt_main
 		{ "enable-too-many-connectors", test_enable_too_many_connectors },
 		{ "enabled-plane-cannot-change", test_enabled_plane_cannot_change },
 		{ "enabled-crtc-cannot-change", test_enabled_crtc_cannot_change },
+		{ "enabled-encoder-cannot-change", test_enabled_encoder_cannot_change },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 38/39] lib/vkms: Test changing enabled device connectors
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (36 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 37/39] lib/vkms: Test changing enabled device encoders José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-18 16:50 ` [PATCH i-g-t 39/39] tests/vkms_configfs: Test connector hot-plug José Expósito
                   ` (5 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Test that, once a VKMS device is enabled, the connector values, with
the exception of status, can't change and that deleting it or the
attached encoders doesn't change the VKMS device.

Connector hot-plug/unplug is not covered by this test.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 lib/igt_vkms.c             | 12 +++++++
 lib/igt_vkms.h             |  1 +
 tests/vkms/vkms_configfs.c | 64 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
index 95fbf5773..af9197b23 100644
--- a/lib/igt_vkms.c
+++ b/lib/igt_vkms.c
@@ -703,6 +703,18 @@ void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name)
 	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CONNECTOR, name);
 }
 
+/**
+ * igt_vkms_device_remove_connector:
+ * @dev: Device to remove the connector from
+ * @name: Connector name
+ *
+ * Remove an existing connector from the VKMS device.
+ */
+bool igt_vkms_device_remove_connector(igt_vkms_t *dev, const char *name)
+{
+	return remove_pipeline_item(dev, VKMS_PIPELINE_ITEM_CONNECTOR, name);
+}
+
 /**
  * igt_vkms_connector_get_status:
  * @dev: Device the connector belongs to
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
index b82282a11..f2233b91a 100644
--- a/lib/igt_vkms.h
+++ b/lib/igt_vkms.h
@@ -95,6 +95,7 @@ bool igt_vkms_encoder_detach_crtc(igt_vkms_t *dev, const char *encoder_name,
 				  const char *crtc_name);
 
 void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name);
+bool igt_vkms_device_remove_connector(igt_vkms_t *dev, const char *name);
 int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name);
 void igt_vkms_connector_set_status(igt_vkms_t *dev, const char *name,
 				   int status);
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index be311e77e..47a6a81ff 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1675,6 +1675,69 @@ static void test_enabled_encoder_cannot_change(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enabled-connector-cannot-change
+ * Description: Test that, once a VKMS device is enabled, the connector values,
+ *              with the exception of status, can't change and that deleting it
+ *              or the attached encoders doesn't change the VKMS device.
+ *              Connector hot-plug/unplug is not covered by this test.
+ */
+
+static void test_enabled_connector_cannot_change(void)
+{
+	igt_vkms_t *dev;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0"},
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1"},
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0" },
+			{ .name = "crtc1" },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.status = DRM_MODE_CONNECTED,
+				.possible_encoders = { "encoder0" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(igt_vkms_device_is_enabled(dev));
+	assert_device_config(&cfg);
+
+	/* Try to change values */
+	igt_assert(!igt_vkms_connector_attach_encoder(dev, "connector0",
+						      "encoder1"));
+
+	/* Deleting pipeline items doesn't affect the device */
+	igt_assert(igt_vkms_connector_detach_encoder(dev, "connector0",
+						     "encoder0"));
+	igt_assert(igt_vkms_device_remove_connector(dev, "connector0"));
+	assert_device_config(&cfg);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1715,6 +1778,7 @@ igt_main
 		{ "enabled-plane-cannot-change", test_enabled_plane_cannot_change },
 		{ "enabled-crtc-cannot-change", test_enabled_crtc_cannot_change },
 		{ "enabled-encoder-cannot-change", test_enabled_encoder_cannot_change },
+		{ "enabled-connector-cannot-change", test_enabled_connector_cannot_change },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* [PATCH i-g-t 39/39] tests/vkms_configfs: Test connector hot-plug
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (37 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 38/39] lib/vkms: Test changing enabled device connectors José Expósito
@ 2025-02-18 16:50 ` José Expósito
  2025-02-28  8:51   ` Louis Chauvet
  2025-02-27 13:11 ` [PATCH i-g-t 00/39] VKMS configfs tests Louis Chauvet
                   ` (4 subsequent siblings)
  43 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-18 16:50 UTC (permalink / raw)
  To: igt-dev; +Cc: louis.chauvet, José Expósito

Test that, once a VKMS device is enabled, the connectors can be
hot-plugged and hot-unplugged.

Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 tests/vkms/vkms_configfs.c | 84 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)

diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
index 47a6a81ff..16922b62b 100644
--- a/tests/vkms/vkms_configfs.c
+++ b/tests/vkms/vkms_configfs.c
@@ -1738,6 +1738,89 @@ static void test_enabled_connector_cannot_change(void)
 	igt_vkms_device_destroy(dev);
 }
 
+/**
+ * SUBTEST: enabled-connector-hot-plug
+ * Description: Test that, once a VKMS device is enabled, the connectors can be
+ *              hot-plugged and unplugged.
+ */
+
+static void test_enabled_connector_hot_plug(void)
+{
+	igt_vkms_t *dev;
+	drmModeConnection status;
+
+	igt_vkms_config_t cfg = {
+		.device_name = __func__,
+		.planes = {
+			{
+				.name = "plane0",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc0"},
+			},
+			{
+				.name = "plane1",
+				.type = DRM_PLANE_TYPE_PRIMARY,
+				.possible_crtcs = { "crtc1"},
+			},
+		},
+		.crtcs = {
+			{ .name = "crtc0", .writeback = true },
+			{ .name = "crtc1", .writeback = true },
+		},
+		.encoders = {
+			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
+			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
+		},
+		.connectors = {
+			{
+				.name = "connector0",
+				.status = DRM_MODE_DISCONNECTED,
+				.possible_encoders = { "encoder0" },
+			},
+			{
+				.name = "connector1",
+				.status = DRM_MODE_DISCONNECTED,
+				.possible_encoders = { "encoder1" },
+			},
+		},
+	};
+
+	dev = igt_vkms_device_create_from_config(&cfg);
+	igt_assert(dev);
+
+	igt_vkms_device_set_enabled(dev, true);
+	igt_assert(igt_vkms_device_is_enabled(dev));
+	assert_device_config(&cfg);
+
+	/* Connect both connectors */
+	cfg.connectors[0].status = DRM_MODE_CONNECTED;
+	igt_vkms_connector_set_status(dev, "connector0", DRM_MODE_CONNECTED);
+	status = igt_vkms_connector_get_status(dev, "connector0");
+	igt_assert_eq(status, DRM_MODE_CONNECTED);
+	assert_device_config(&cfg);
+
+	cfg.connectors[1].status = DRM_MODE_CONNECTED;
+	igt_vkms_connector_set_status(dev, "connector1", DRM_MODE_CONNECTED);
+	status = igt_vkms_connector_get_status(dev, "connector1");
+	igt_assert_eq(status, DRM_MODE_CONNECTED);
+	assert_device_config(&cfg);
+
+	/* Set one to unknown connection and disconnect the other one */
+	cfg.connectors[0].status = DRM_MODE_UNKNOWNCONNECTION;
+	igt_vkms_connector_set_status(dev, "connector0", DRM_MODE_UNKNOWNCONNECTION);
+	status = igt_vkms_connector_get_status(dev, "connector0");
+	igt_assert_eq(status, DRM_MODE_UNKNOWNCONNECTION);
+	assert_device_config(&cfg);
+
+	cfg.connectors[1].status = DRM_MODE_DISCONNECTED;
+	igt_vkms_connector_set_status(dev, "connector1", DRM_MODE_DISCONNECTED);
+	status = igt_vkms_connector_get_status(dev, "connector1");
+	igt_assert_eq(status, DRM_MODE_DISCONNECTED);
+	assert_device_config(&cfg);
+
+	igt_vkms_device_destroy(dev);
+}
+
 igt_main
 {
 	struct {
@@ -1779,6 +1862,7 @@ igt_main
 		{ "enabled-crtc-cannot-change", test_enabled_crtc_cannot_change },
 		{ "enabled-encoder-cannot-change", test_enabled_encoder_cannot_change },
 		{ "enabled-connector-cannot-change", test_enabled_connector_cannot_change },
+		{ "enabled-connector-hot-plug", test_enabled_connector_hot_plug },
 	};
 
 	igt_fixture {
-- 
2.48.1


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

* Re: [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items
  2025-02-18 16:49 ` [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items José Expósito
@ 2025-02-27 13:06   ` Louis Chauvet
  2025-02-28  1:47     ` Greg Kroah-Hartman
  0 siblings, 1 reply; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:06 UTC (permalink / raw)
  To: José Expósito, igt-dev, Thomas Zimmermann,
	Greg Kroah-Hartman



Le 18/02/2025 à 17:49, José Expósito a écrit :
> It shouldn't be possible to enable a device without creating and
> attaching its pipeline items.
> 
> Test that the device is not enabled and also that no actual device was
> created using libdrm.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   tests/vkms/vkms_configfs.c | 60 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 60 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index dc3dbe80d..87d660fff 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -108,6 +108,42 @@ static bool attach(const char *src_path, const char *dst_path,
>   	return ret == 0;
>   }
>   
> +static drmDevicePtr find_device(const char *name, drmDevicePtr *devices,
> +				int n_devices)
> +{
> +	drmDevicePtr dev;
> +	const char *dev_name;
> +
> +	for (int i = 0; i < n_devices; i++) {
> +		dev = devices[i];
> +
> +		if (!(dev->available_nodes & BIT(DRM_NODE_PRIMARY)))
> +			continue;
> +
> +		if (dev->bustype != DRM_BUS_PLATFORM)
> +			continue;

Hummm, I think this may have issues with the change proposed by Greg in 
[1], I don't know how the drmDevicePtr should look like with the new 
faux_device struct.

The declaration in xf86drm.h is:

typedef struct _drmDevice {
     char **nodes; /* DRM_NODE_MAX sized array */
     int available_nodes; /* DRM_NODE_* bitmask */
     int bustype;
     union {
         drmPciBusInfoPtr pci;
         drmUsbBusInfoPtr usb;
         drmPlatformBusInfoPtr platform;
         drmHost1xBusInfoPtr host1x;
     } businfo;
     union {
         drmPciDeviceInfoPtr pci;
         drmUsbDeviceInfoPtr usb;
         drmPlatformDeviceInfoPtr platform;
         drmHost1xDeviceInfoPtr host1x;
     } deviceinfo;
} drmDevice, *drmDevicePtr;

But if vkms/vgem switch to faux_device, all users will break,

But with faux_device integration, everything using it with VKMS will break.

Isn't this a breakage of the UAPI? The vkms devices are currently in 
"platform_bus", but if we change it to faux_device, it will be on a 
"faux_bus".

[1]: https://lore.kernel.org/all/2025021029-snout-swivel-9a45@gregkh/

(not for the patch itself, but the comment just above, that may apply 
for vgem_drv too, I will reply to [1] to have the comment at the right 
place)
+CC: Thomas Zimmerman
+CC: Greg Kroah-Hartman

> +
> +		dev_name = dev->businfo.platform->fullname;
> +		if (strncmp(name, dev_name, strlen(name)) == 0)
> +			return dev;
> +	}
> +
> +	return NULL;
> +}
> +
> +static bool device_exists(const char *name)
> +{
> +	drmDevicePtr devices[64];
> +	int n_devices;
> +	bool exists;
> +
> +	n_devices = drmGetDevices(devices, ARRAY_SIZE(devices));
> +	exists = !!find_device(name, devices, n_devices);
> +	drmFreeDevices(devices, n_devices);
> +
> +	return exists;
> +}
> +
>   /**
>    * SUBTEST: device-default-files
>    * Description: Test that creating a VKMS device creates the default files and
> @@ -689,6 +725,29 @@ static void test_attach_connector_to_encoder(void)
>   	igt_vkms_device_destroy(dev2);
>   }
>   
> +/**
> + * SUBTEST: enable-no-pipeline-items
> + * Description: Try to enable a VKMS device without adding any pipeline items
> + *              and test that it fails.
> + */
> +
> +static void test_enable_no_pipeline_items(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	/* Try to enable it and check that the device is not set as enabled */
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +
> +	/* Check that no actual device was created*/
> +	igt_assert(!device_exists(__func__));

I think to properly validate that no new device were created, we need to 
have another test "working configuration" where we can confirm that the 
configfs name is the same as the device name.

> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -711,6 +770,7 @@ igt_main
>   		{ "attach-plane-to-crtc", test_attach_plane_to_crtc },
>   		{ "attach-encoder-to-crtc", test_attach_encoder_to_crtc },
>   		{ "attach-connector-to-encoder", test_attach_connector_to_encoder },
> +		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 00/39] VKMS configfs tests
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (38 preceding siblings ...)
  2025-02-18 16:50 ` [PATCH i-g-t 39/39] tests/vkms_configfs: Test connector hot-plug José Expósito
@ 2025-02-27 13:11 ` Louis Chauvet
  2025-02-28 21:22 ` ✓ Xe.CI.BAT: success for VKMS configfs tests (rev3) Patchwork
                   ` (3 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:11 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Hi everyone,
> 
> This series add tests for the VKMS + configfs work Louis Chauvet and I are doing
> in the kernel.
> 
> This new functionality allows to configure one or more VKMS instances without
> having to reload the driver using configfs.
> 
> For more details, have a look to the kernel patchset and the documentation in
> "vkms.rst" (not merged yet).
> 
> There was a previous attempt to implement this tests [1] and I kept copyright
> were required.
> 
> Best wishes,
> José Expósito
> 

Hi José,

Thanks a lot for this series, it will be very useful to ensure that the 
UAPI of vkms does not change.

I really like that you tested both "stuff that should work" (create a 
device, planes...) and "stuff that should not work" (can't change the 
status of planes...)

Unfortunatly, the last tests, maybe it is an issue on my side. Can you 
share a git repo that contains a kernel that pass the tests on your machine?

Thanks,
Louis Chauvet


> [1] https://lists.freedesktop.org/archives/igt-dev/2023-September/060717.html
> 
> José Expósito (39):
>    lib/drmtest: Add VKMS as a known driver type
>    lib/igt_debugfs: Move is_mountpoint() to igt_aux
>    lib/igt_configfs: Add helper to mount configfs
>    lib/vkms: Add minimal VKMS library and test device default files
>    lib/vkms: Allow to enable/disable VKMS devices
>    tests/vkms_configfs: Test device invalid values
>    lib/vkms: Test plane default files
>    lib/vkms: Test plane default values
>    lib/vkms: Test plane invalid values
>    lib/vkms: Test CRTC default files
>    lib/vkms: Test CRTC default values
>    lib/vkms: Test CRTC invalid values
>    lib/vkms: Test encoder default files
>    lib/vkms: Test connector default files
>    lib/vkms: Test connector default values
>    lib/vkms: Test plane connector invalid values
>    lib/vkms: Test attaching planes to CRTCs
>    lib/vkms: Test attaching encoders to CRTCs
>    lib/vkms: Test attaching connectors to encoders
>    tests/vkms_configfs: Test enablement without pipeline items
>    lib/vkms: Create VKMS device from static config
>    tests/vkms_configfs: Test adding too many planes
>    tests/vkms_configfs: Test not adding a primary plane
>    tests/vkms_configfs: Test adding multiple primary planes
>    tests/vkms_configfs: Test adding multiple cursor planes
>    tests/vkms_configfs: Test adding a plane without possible CRTCs
>    tests/vkms_configfs: Test enabling a device without CRTCs
>    tests/vkms_configfs: Test enabling a device with too many CRTCs
>    tests/vkms_configfs: Test enabling a device without encoders
>    tests/vkms_configfs: Test enabling a device with too many encoders
>    tests/vkms_configfs: Test adding an encoder without possible CRTCs
>    tests/vkms_configfs: Test adding a CRTC without encoders
>    tests/vkms_configfs: Test enabling a device without connectors
>    tests/vkms_configfs: Test enabling a device with too many connectors
>    lib/vkms: Test changing enabled device planes
>    lib/vkms: Test changing enabled device CRTCs
>    lib/vkms: Test changing enabled device encoders
>    lib/vkms: Test changing enabled device connectors
>    tests/vkms_configfs: Test connector hot-plug
> 
>   docs/testplan/meson.build        |    7 +-
>   lib/drmtest.c                    |   18 +
>   lib/drmtest.h                    |    8 +-
>   lib/igt.h                        |    1 +
>   lib/igt_aux.c                    |   25 +
>   lib/igt_aux.h                    |    2 +
>   lib/igt_configfs.c               |   57 +
>   lib/igt_configfs.h               |   13 +
>   lib/igt_debugfs.c                |   29 +-
>   lib/igt_vkms.c                   |  794 +++++++++++++
>   lib/igt_vkms.h                   |  109 ++
>   lib/meson.build                  |    2 +
>   meson.build                      |    8 +
>   tests/meson.build                |    2 +
>   tests/vkms/meson.build           |   13 +
>   tests/vkms/vkms_configfs.c       | 1884 ++++++++++++++++++++++++++++++
>   tests/vkms/vkms_test_config.json |   72 ++
>   17 files changed, 3013 insertions(+), 31 deletions(-)
>   create mode 100644 lib/igt_configfs.c
>   create mode 100644 lib/igt_configfs.h
>   create mode 100644 lib/igt_vkms.c
>   create mode 100644 lib/igt_vkms.h
>   create mode 100644 tests/vkms/meson.build
>   create mode 100644 tests/vkms/vkms_configfs.c
>   create mode 100644 tests/vkms/vkms_test_config.json
> 

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type
  2025-02-18 16:49 ` [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type José Expósito
@ 2025-02-27 13:12   ` Louis Chauvet
  2025-03-13 17:22     ` José Expósito
  0 siblings, 1 reply; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:12 UTC (permalink / raw)
  To: José Expósito, igt-dev; +Cc: Jim Shargo, Marius Vlad



Le 18/02/2025 à 17:49, José Expósito a écrit :
> As we are going to add VKMS specific tests, allow to check if it is
> available.
> 
> Co-developed-by: Jim Shargo <jshargo@chromium.org>
> Signed-off-by: Jim Shargo <jshargo@chromium.org>
> Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/drmtest.c | 18 ++++++++++++++++++
>   lib/drmtest.h |  8 ++++++--
>   2 files changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 436b6de78..2cc6e0c29 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -971,3 +971,21 @@ void igt_require_xe(int fd)
>   {
>   	igt_require(is_xe_device(fd));
>   }
> +
> +void igt_require_vkms(void)
> +{
> +	/*
> +	 * Since VKMS can create and destroy virtual drivers at will, instead
> +	 * look to make sure the driver is installed.
> +	 */
> +	struct stat s = {};
> +	int ret;
> +	const char *vkms_module_dir = "/sys/module/vkms";
> +
> +	ret = stat(vkms_module_dir, &s);
> +
> +	igt_require_f(ret == 0, "VKMS stat of %s returned %d (%s)\n",
> +		      vkms_module_dir, ret, strerror(ret));
> +	igt_require_f(S_ISDIR(s.st_mode),
> +		      "VKMS stat of %s was not a directory\n", vkms_module_dir);
> +}
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 27e5a18e2..1b57e49ec 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -54,15 +54,18 @@ int __get_drm_device_name(int fd, char *name, int name_size);
>   #define DRIVER_PANFROST	(1 << 5)
>   #define DRIVER_MSM	(1 << 6)
>   #define DRIVER_XE	(1 << 7)
> -#define DRIVER_VMWGFX   (1 << 8)
> +#define DRIVER_VKMS	(1 << 8)
> +#define DRIVER_VMWGFX	(1 << 9)

Is it normal to change the DRIVER_VMWGFX value?

I also found the `module` list in drmtest.c that use this value, I think 
this list is used to do the proper `modprobe` during a open_driver().

Maybe you can use it, so you will be able to do:

	drm_load_module(DRIVER_VKMS); // (If I understand correctly, this fails 
silently)
	igt_require_vkms();

And future tests requiring a vkms device will be able to do:

	open_driver(DRIVER_VKMS);

>   
>   /*
>    * Exclude DRVER_VGEM from DRIVER_ANY since if you run on a system
>    * with vgem as well as a supported driver, you can end up with a
>    * near-100% skip rate if you don't explicitly specify the device,
>    * depending on device-load ordering.
> + *
> + * Exclude VKMS to prefer hardware drivers.
>    */
> -#define DRIVER_ANY 	~(DRIVER_VGEM)
> +#define DRIVER_ANY	~(DRIVER_VGEM | DRIVER_VKMS)
>   
>   /*
>    * Compile friendly enum for i915/xe.
> @@ -135,6 +138,7 @@ void igt_require_i915(int fd);
>   void igt_require_nouveau(int fd);
>   void igt_require_vc4(int fd);
>   void igt_require_xe(int fd);
> +void igt_require_vkms(void);
>   
>   bool is_amdgpu_device(int fd);
>   bool is_i915_device(int fd);

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 02/39] lib/igt_debugfs: Move is_mountpoint() to igt_aux
  2025-02-18 16:49 ` [PATCH i-g-t 02/39] lib/igt_debugfs: Move is_mountpoint() to igt_aux José Expósito
@ 2025-02-27 13:12   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:12 UTC (permalink / raw)
  To: José Expósito, igt-dev; +Cc: Jim Shargo, Marius Vlad



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Rename is_mountpoint() to igt_is_mountpoint() and make it available in
> igt_aux.h/c.
> 
> Refactor, no functional change.
> 
> Co-developed-by: Jim Shargo <jshargo@chromium.org>
> Signed-off-by: Jim Shargo <jshargo@chromium.org>
> Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_aux.c     | 25 +++++++++++++++++++++++++
>   lib/igt_aux.h     |  2 ++
>   lib/igt_debugfs.c | 29 ++---------------------------
>   3 files changed, 29 insertions(+), 27 deletions(-)
> 
> diff --git a/lib/igt_aux.c b/lib/igt_aux.c
> index f5bf48da6..d8f1f6982 100644
> --- a/lib/igt_aux.c
> +++ b/lib/igt_aux.c
> @@ -1374,6 +1374,31 @@ static bool get_process_ids(struct igt_process *prcs)
>   	return prcs->tid != 0;
>   }
>   

As this become a public function, maybe you can add some doc:

/**
   * igt_is_mountpoint() - Check if a path is a mounted filesystem
   * @path: Root directory to test
   *
   * Returns: true if @path is the root of a mounted filesystem
   */

With this kind of doc:
Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> +bool igt_is_mountpoint(const char *path)
> +{
> +	char buf[strlen(path) + 4];
> +	struct stat st;
> +	dev_t dev;
> +
> +	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/.", path), sizeof(buf));
> +	if (stat(buf, &st))
> +		return false;
> +
> +	if (!S_ISDIR(st.st_mode))
> +		return false;
> +
> +	dev = st.st_dev;
> +
> +	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/..", path), sizeof(buf));
> +	if (stat(buf, &st))
> +		return false;
> +
> +	if (!S_ISDIR(st.st_mode))
> +		return false;
> +
> +	return dev != st.st_dev;
> +}
> +
>   /**
>    * igt_is_process_running:
>    * @comm: Name of process in the form found in /proc/pid/comm (limited to 15
> diff --git a/lib/igt_aux.h b/lib/igt_aux.h
> index bfd83adca..e8a1788b2 100644
> --- a/lib/igt_aux.h
> +++ b/lib/igt_aux.h
> @@ -314,6 +314,8 @@ double igt_stop_siglatency(struct igt_mean *result);
>   
>   bool igt_allow_unlimited_files(void);
>   
> +bool igt_is_mountpoint(const char *path);
> +
>   int igt_is_process_running(const char *comm);
>   int igt_terminate_process(int sig, const char *comm);
>   void igt_lsof(const char *dpath);
> diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
> index 8ac215a76..210a9cea0 100644
> --- a/lib/igt_debugfs.c
> +++ b/lib/igt_debugfs.c
> @@ -67,37 +67,12 @@
>    * General debugfs helpers
>    */
>   
> -static bool is_mountpoint(const char *path)
> -{
> -	char buf[strlen(path) + 4];
> -	struct stat st;
> -	dev_t dev;
> -
> -	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/.", path), sizeof(buf));
> -	if (stat(buf, &st))
> -		return false;
> -
> -	if (!S_ISDIR(st.st_mode))
> -		return false;
> -
> -	dev = st.st_dev;
> -
> -	igt_assert_lt(snprintf(buf, sizeof(buf), "%s/..", path), sizeof(buf));
> -	if (stat(buf, &st))
> -		return false;
> -
> -	if (!S_ISDIR(st.st_mode))
> -		return false;
> -
> -	return dev != st.st_dev;
> -}
> -
>   static const char *__igt_debugfs_mount(void)
>   {
> -	if (is_mountpoint("/sys/kernel/debug"))
> +	if (igt_is_mountpoint("/sys/kernel/debug"))
>   		return "/sys/kernel/debug";
>   
> -	if (is_mountpoint("/debug"))
> +	if (igt_is_mountpoint("/debug"))
>   		return "/debug";
>   
>   	if (mount("debug", "/sys/kernel/debug", "debugfs", 0, 0))

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 04/39] lib/vkms: Add minimal VKMS library and test device default files
  2025-02-18 16:49 ` [PATCH i-g-t 04/39] lib/vkms: Add minimal VKMS library and test device default files José Expósito
@ 2025-02-27 13:12   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:12 UTC (permalink / raw)
  To: José Expósito, igt-dev; +Cc: Jim Shargo, Marius Vlad



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Create a library containing helpers for creating VKMS devices and
> configuring them dynamically using configfs.
> For the moment, add the minimal number of helpers to be able to start
> testing VKMS's configfs support: Create device, destroy device and
> destroy all devices.
> 
> Also, include the simplest possible test using those helpers (checking
> the device's default files) and the scaffolding required to generate
> the documentation.
> 
> Co-developed-by: Jim Shargo <jshargo@chromium.org>
> Signed-off-by: Jim Shargo <jshargo@chromium.org>
> Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   docs/testplan/meson.build        |   7 +-
>   lib/igt_vkms.c                   | 191 +++++++++++++++++++++++++++++++
>   lib/igt_vkms.h                   |  27 +++++
>   lib/meson.build                  |   1 +
>   meson.build                      |   8 ++
>   tests/meson.build                |   2 +
>   tests/vkms/meson.build           |  13 +++
>   tests/vkms/vkms_configfs.c       | 122 ++++++++++++++++++++
>   tests/vkms/vkms_test_config.json |  72 ++++++++++++
>   9 files changed, 441 insertions(+), 2 deletions(-)
>   create mode 100644 lib/igt_vkms.c
>   create mode 100644 lib/igt_vkms.h
>   create mode 100644 tests/vkms/meson.build
>   create mode 100644 tests/vkms/vkms_configfs.c
>   create mode 100644 tests/vkms/vkms_test_config.json
> 
> diff --git a/docs/testplan/meson.build b/docs/testplan/meson.build
> index 5560347f1..9e22f4c7d 100644
> --- a/docs/testplan/meson.build
> +++ b/docs/testplan/meson.build
> @@ -11,6 +11,7 @@ stylesheet = join_paths(meson.current_source_dir(), 'testplan.css')
>   xe_test_config = join_paths(source_root, 'tests', 'intel', 'xe_test_config.json')
>   kms_test_config = join_paths(source_root, 'tests', 'intel', 'kms_test_config.json')
>   i915_test_config = join_paths(source_root, 'tests', 'intel', 'i915_test_config.json')
> +vkms_test_config = join_paths(source_root, 'tests', 'vkms', 'vkms_test_config.json')
>   
>   check_testlist = []
>   kms_check_testlist = []
> @@ -37,12 +38,14 @@ if build_xe
>   	test_dict = {
>   		'i915_tests': { 'input': i915_test_config, 'extra_args': check_testlist },
>   		'kms_tests': { 'input': kms_test_config, 'extra_args': kms_check_testlist },
> -		'xe_tests': { 'input': xe_test_config, 'extra_args': check_testlist }
> +		'xe_tests': { 'input': xe_test_config, 'extra_args': check_testlist },
> +		'vkms_tests': { 'input': vkms_test_config, 'extra_args': check_testlist }
>   	    }
>   else
>   	test_dict = {
>   	      'i915_tests': { 'input': i915_test_config, 'extra_args': check_testlist },
> -	      'kms_tests': { 'input': kms_test_config, 'extra_args': kms_check_testlist }
> +	      'kms_tests': { 'input': kms_test_config, 'extra_args': kms_check_testlist },
> +	      'vkms_tests': { 'input': vkms_test_config, 'extra_args': check_testlist }
>   	    }
>   endif
>   
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> new file mode 100644
> index 000000000..8cea94901
> --- /dev/null
> +++ b/lib/igt_vkms.c
> @@ -0,0 +1,191 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2023 Google LLC.
> + * Copyright © 2023 Collabora, Ltd.
> + * Copyright © 2024 Red Hat, Inc.
> + */
> +
> +#include <dirent.h>
> +#include <errno.h>
> +#include <string.h>
> +
> +#include <ftw.h>
> +#include <linux/limits.h>
> +#include <sys/stat.h>
> +
> +#include "igt.h"
> +#include "igt_vkms.h"
> +
> +#define VKMS_ROOT_DIR_NAME		"vkms"
> +
> +/**
> + * SECTION:igt_vkms
> + * @short_description: Helpers to create and configure VKMS devices
> + * @title: VKMS
> + * @include: igt_vkms.h
> + *
> + * Helpers for creating VKMS devices and configuring them dynamically.
> + *
> + * First, create a VKMS device, next, add pipeline items (planes, CRTCs,
> + * encoders, CRTCs and connectors) compose the pipeline by attaching each item
> + * using the _attach_ functions and finally, enable the VKMS device.
> + */
> +
> +static const char *mount_vkms_configfs(void)
> +{
> +	static char vkms_root_path[PATH_MAX];
> +	const char *configfs_path;
> +
> +	configfs_path = igt_configfs_mount();
> +	igt_assert_f(configfs_path, "Error mounting configfs");
> +
> +	snprintf(vkms_root_path, sizeof(vkms_root_path), "%s/%s", configfs_path,
> +		 VKMS_ROOT_DIR_NAME);

As in PATCH 02/39, maybe you can add a check:

	igt_assert_lt(snprintf(...), sizeof(vkms_root_path));

> +
> +	return vkms_root_path;
> +}
> +
> +/**
> + * igt_require_vkms_configfs:
> + *
> + * Require that VKMS supports configfs configuration.
> + */
> +void igt_require_vkms_configfs(void)
> +{
> +	const char *vkms_root_path;
> +	DIR *dir;
> +
> +	vkms_root_path = mount_vkms_configfs();
> +
> +	dir = opendir(vkms_root_path);
> +	igt_require(dir);
> +	if (dir)
> +		closedir(dir);
> +}
> +
> +/**
> + * igt_vkms_device_create:
> + * @name: VKMS device name
> + *
> + * Create a directory in the ConfigFS VKMS root directory, where the entire
> + * pipeline will be configured.
> + */
> +igt_vkms_t *igt_vkms_device_create(const char *name)
> +{
> +	igt_vkms_t *dev;
> +	const char *vkms_root_path;
> +	size_t path_len;
> +	DIR *dir;
> +	int ret;
> +
> +	dev = calloc(1, sizeof(*dev));
> +
> +	vkms_root_path = mount_vkms_configfs();
> +
> +	path_len = strlen(vkms_root_path) + strlen(name) + 2;
> +	dev->path = malloc(path_len);
> +	snprintf(dev->path, path_len, "%s/%s", vkms_root_path, name);
> +
> +	dir = opendir(dev->path);
> +	if (dir) {

Can we add some debug logging here? I think it is important to quickly 
know if a device is reused or not.

> +		closedir(dir);
> +	} else {
> +		ret = mkdir(dev->path, 0777);
> +		if (ret != 0) {
> +			free(dev->path);
> +			free(dev);
> +			dev = NULL;
> +		}
> +	}
> +
> +	return dev;
> +}
> +
> +static int detach_pipeline_items(const char *path, const struct stat *info,
> +				 const int typeflag, struct FTW *pathinfo)
> +{
> +	/* Level 4 are the links in the possible_* directories */

Can you add an example path to clarify this comment? Same for other 
usage of pathinfo->level

	/*
	 * Level 4 are the links in the possible_* directories
	 * i.e: vkms/<DEV>/<OBJECT>/<POSSIBLE_*>/*
	 */

Can we also log the unlinked files?

> +	if (pathinfo->level == 4 && typeflag == FTW_SL)
> +		return unlink(path);
> +
> +	/* Ignore the other files, they are removed by remove_pipeline_items */
> +	return 0;
> +}
> +
> +static int remove_pipeline_items(const char *path, const struct stat *info,
> +				 const int typeflag, struct FTW *pathinfo)
> +{
> +	/* Level 0 is the device root directory */
> +	if (pathinfo->level == 0)
> +		return rmdir(path);
> +
> +	/* Level 2 directories are the pipeline items */
> +	if (pathinfo->level == 2 && typeflag == FTW_DP)
> +		return rmdir(path);

Can we log the deleted files? I think it can be useful because 
igt_vkms_device_destroy only prints the root directory, not which file 
we fail to remove.

> +
> +	/* Ignore the other files, they are removed by VKMS */
> +	return 0;
> +}
> +
> +static int remove_device_dir(igt_vkms_t *dev)
> +{
> +	int ret;
> +
> +	ret = nftw(dev->path, detach_pipeline_items, 64, FTW_DEPTH | FTW_PHYS);
> +	if (ret)
> +		return ret;
> +
> +	ret = nftw(dev->path, remove_pipeline_items, 64, FTW_DEPTH | FTW_PHYS);
> +	return ret;
> +}
> +
> +/**
> + * igt_vkms_device_destroy:
> + * @dev: Device to destroy
> + *
> + * Remove and free the VKMS device.
> + */
> +void igt_vkms_device_destroy(igt_vkms_t *dev)
> +{
> +	int ret;
> +
> +	igt_assert(dev);
> +
> +	ret = remove_device_dir(dev);
> +	igt_assert_f(ret == 0,
> +		     "Unable to rmdir device directory '%s'. Got errno=%d (%s)\n",
> +		     dev->path, errno, strerror(errno));
> +
> +	free(dev->path);
> +	free(dev);
> +}
> +
> +/**
> + * igt_vkms_destroy_all_devices:
> + *
> + * Remove all VKMS devices created via configfs.
> + */
> +void igt_vkms_destroy_all_devices(void)
> +{
> +	igt_vkms_t *dev;
> +	const char *vkms_root_path;
> +	DIR *dir;
> +	struct dirent *ent;
> +
> +	vkms_root_path = mount_vkms_configfs();
> +	dir = opendir(vkms_root_path);
> +	igt_assert_f(dir, "VKMS configfs directory not available at '%s'. "
> +		     "Got errno=%d (%s)\n", vkms_root_path, errno,
> +		     strerror(errno));
> +
> +	while ((ent = readdir(dir)) != NULL) {
> +		if (strcmp(ent->d_name, ".") == 0 ||
> +		    strcmp(ent->d_name, "..") == 0)
> +			continue;
> +
> +		dev = igt_vkms_device_create(ent->d_name);
> +		igt_vkms_device_destroy(dev);
> +	}
> +
> +	closedir(dir);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> new file mode 100644
> index 000000000..48c48f296
> --- /dev/null
> +++ b/lib/igt_vkms.h
> @@ -0,0 +1,27 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2023 Google LLC.
> + * Copyright © 2023 Collabora, Ltd.
> + * Copyright © 2024 Red Hat, Inc.
> + */
> +
> +#ifndef __IGT_VKMS_H__
> +#define __IGT_VKMS_H__
> +
> +/**
> + * igt_vkms_t:
> + * @path: VKMS root directory inside configfs mounted directory
> + *
> + * A struct representing a VKMS device.
> + */
> +typedef struct igt_vkms {
> +	char *path;
> +} igt_vkms_t;
> +
> +void igt_require_vkms_configfs(void);
> +
> +igt_vkms_t *igt_vkms_device_create(const char *name);
> +void igt_vkms_device_destroy(igt_vkms_t *dev);
> +void igt_vkms_destroy_all_devices(void);
> +
> +#endif /* __IGT_VKMS_H__ */
> diff --git a/lib/meson.build b/lib/meson.build
> index 201b1fbb4..8e0b4b7e3 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -50,6 +50,7 @@ lib_sources = [
>   	'igt_types.c',
>   	'igt_vec.c',
>   	'igt_vgem.c',
> +	'igt_vkms.c',
>   	'igt_x86.c',
>   	'instdone.c',
>   	'intel_allocator.c',
> diff --git a/meson.build b/meson.build
> index 2f663dc03..aec49152b 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -287,6 +287,7 @@ msmdir = join_paths(libexecdir, 'msm')
>   panfrostdir = join_paths(libexecdir, 'panfrost')
>   v3ddir = join_paths(libexecdir, 'v3d')
>   vc4dir = join_paths(libexecdir, 'vc4')
> +vkmsdir = join_paths(libexecdir, 'vkms')
>   vmwgfxdir = join_paths(libexecdir, 'vmwgfx')
>   mandir = get_option('mandir')
>   pkgconfigdir = join_paths(libdir, 'pkgconfig')
> @@ -348,6 +349,12 @@ if get_option('use_rpath')
>   	endforeach
>   	vc4_rpathdir = join_paths(vc4_rpathdir, libdir)
>   
> +	vkms_rpathdir = '$ORIGIN'
> +	foreach p : vkmsdir.split('/')
> +		vkms_rpathdir = join_paths(vkms_rpathdir, '..')
> +	endforeach
> +	vkms_rpathdir = join_paths(vkms_rpathdir, libdir)
> +
>   	vmwgfx_rpathdir = '$ORIGIN'
>   	foreach p : vmwgfxdir.split('/')
>   		vmwgfx_rpathdir = join_paths(vmwgfx_rpathdir, '..')
> @@ -361,6 +368,7 @@ else
>   	panfrost_rpathdir = ''
>   	v3d_rpathdir = ''
>   	vc4_rpathdir = ''
> +	vkms_rpathdir = ''
>   	vmwgfx_rpathdir = ''
>   endif
>   
> diff --git a/tests/meson.build b/tests/meson.build
> index f8a0ab836..b2ec1361d 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -474,6 +474,8 @@ subdir('v3d')
>   
>   subdir('vc4')
>   
> +subdir('vkms')
> +
>   subdir('vmwgfx')
>   
>   gen_testlist = find_program('generate_testlist.sh')
> diff --git a/tests/vkms/meson.build b/tests/vkms/meson.build
> new file mode 100644
> index 000000000..e55ba32ba
> --- /dev/null
> +++ b/tests/vkms/meson.build
> @@ -0,0 +1,13 @@
> +vkms_progs = [
> +	'vkms_configfs',
> +]
> +vkms_deps = test_deps
> +
> +foreach prog : vkms_progs
> +	test_executables += executable(prog, prog + '.c',
> +				       dependencies : vkms_deps,
> +				       install_dir : vkmsdir,
> +				       install_rpath : vkms_rpathdir,
> +				       install : true)
> +	test_list += join_paths('vkms', prog)
> +endforeach
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> new file mode 100644
> index 000000000..441c39a47
> --- /dev/null
> +++ b/tests/vkms/vkms_configfs.c
> @@ -0,0 +1,122 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2023 Google LLC.
> + * Copyright © 2023 Collabora, Ltd.
> + * Copyright © 2024 Red Hat, Inc.
> + */
> +
> +/**
> + * TEST: Tests for VKMS configfs support.
> + * Category: Display
> + * Mega feature: General Display Features
> + * Sub-category: uapi
> + * Functionality: vkms,configfs
> + * Test category: functionality test
> + */
> +
> +#include <dirent.h>
> +#include <string.h>
> +
> +#include <linux/limits.h>
> +#include <sys/stat.h>
> +
> +#include "drmtest.h"
> +#include "igt.h"
> +#include "igt_vkms.h"
> +
> +static void assert_default_files(const char *path,
> +				 const char **files, size_t n_files,
> +				 const char **dirs, size_t n_dirs)
> +{
> +	DIR *dir;
> +	struct dirent *ent;
> +	int total = 0;
> +
> +	/* Check that the number of files/directories matches the expected.
> +	 * Plus 2 because of "." and "..".
> +	 */
> +	dir = opendir(path);
> +	igt_assert(dir);
> +	while ((ent = readdir(dir)) != NULL)
> +		total++;

Can we simply skip "." and ".." as you did in 
igt_vkms_destroy_all_devices? This way we don't have this "magic" +2

> +	igt_assert_eq(total, n_dirs + n_files + 2);
> +	closedir(dir);
> +
> +	/* Check that the files/directories are present */
> +	for (int i = 0; i < n_files; i++) {
> +		char file_path[PATH_MAX];
> +		struct stat buf;
> +
> +		snprintf(file_path, sizeof(file_path), "%s/%s", path, files[i]);
> +
> +		igt_assert_eq(stat(file_path, &buf), 0);

Can you transform this igt_assert_eq into:

	igt_assert_f(stat(...) == 0, "File %s does not exists\n", file_path)

So it is easier to know exactly the fail reason

> +	}
> +
> +	for (int i = 0; i < n_dirs; i++) {
> +		char dir_path[PATH_MAX];
> +
> +		snprintf(dir_path, sizeof(dir_path), "%s/%s", path, dirs[i]);

Ditto

Thanks,
Louis Chauvet

> +		dir = opendir(dir_path);
> +		igt_assert(dir);
> +		closedir(dir);
> +	}
> +}
> +
> +/**
> + * SUBTEST: device-default-files
> + * Description: Test that creating a VKMS device creates the default files and
> + *              directories.
> + */
> +
> +static void test_device_default_files(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	const char *files[] = {
> +		"enabled",
> +	};
> +
> +	const char *dirs[] = {
> +		"planes",
> +		"crtcs",
> +		"encoders",
> +		"connectors",
> +	};
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	assert_default_files(dev->path,
> +			     files, ARRAY_SIZE(files),
> +			     dirs, ARRAY_SIZE(dirs));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
> +igt_main
> +{
> +	struct {
> +		const char *name;
> +		void (*fn)(void);
> +	} tests[] = {
> +		{ "device-default-files", test_device_default_files },
> +	};
> +
> +	igt_fixture {
> +		igt_require_vkms();
> +		igt_require_vkms_configfs();
> +		igt_vkms_destroy_all_devices();
> +	}
> +
> +	for (int i = 0; i < ARRAY_SIZE(tests); i++) {
> +		igt_subtest(tests[i].name)
> +			tests[i].fn();
> +	}
> +
> +	igt_fixture {
> +		igt_require_vkms();
> +		igt_require_vkms_configfs();
> +		igt_vkms_destroy_all_devices();
> +	}
> +}
> diff --git a/tests/vkms/vkms_test_config.json b/tests/vkms/vkms_test_config.json
> new file mode 100644
> index 000000000..4e84e184a
> --- /dev/null
> +++ b/tests/vkms/vkms_test_config.json
> @@ -0,0 +1,72 @@
> +{
> +    "description": "JSON file to be used to parse VKMS documentation",
> +    "name": "Tests for VKMS Driver",
> +    "drivers": [ "vkms" ],
> +    "files": [ "*.c" ],
> +    "fields": {
> +        "Run type": {
> +            "_properties_": {
> +                "mandatory": true
> +            },
> +            "Category": {
> +                "_properties_": {
> +                    "description": "Contains the major group for the tested functionality 'Display'"
> +                },
> +                "Mega feature": {
> +                    "_properties_": {
> +                        "mandatory": true,
> +                        "description": "Contains the mega feature for end to end use case"
> +                    },
> +                    "Sub-category": {
> +                        "_properties_": {
> +                            "mandatory": true,
> +                            "description": "Contains the technical feature/functionality"
> +                        },
> +                        "Functionality": {
> +                            "_properties_": {
> +                                "mandatory": true,
> +                                "description": "Groups page table tests on buckets containing more detailed functionality"
> +                            },
> +                            "Feature": {
> +                                "_properties_": {
> +                                    "description": "Describes the lowest level feature bucket"
> +                                }
> +                            }
> +                        }
> +                    }
> +                }
> +            }
> +        },
> +        "Test category": {
> +            "_properties_": {
> +                "description": "Defines the test category. Usually used at subtest level."
> +            }
> +        },
> +        "Test requirement": {
> +            "_properties_": {
> +                "description": "Defines Kernel parameters required for the test to run"
> +            }
> +        },
> +        "Issue": {
> +            "_properties_": {
> +                "description": "If the test is used to solve an issue, point to the URL containing the issue."
> +            }
> +        },
> +        "Depends on": {
> +            "_properties_": {
> +                "description": "List other subtests that are required to not be skipped before calling this one."
> +            }
> +        },
> +        "TODO": {
> +            "_properties_": {
> +                "description": "Point to known missing features at the test or subtest."
> +            }
> +        },
> +        "Description": {
> +            "_properties_": {
> +                "mandatory": true,
> +                "description": "Provides a description for the test/subtest."
> +            }
> +        }
> +    }
> +}


-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 12/39] lib/vkms: Test CRTC invalid values
  2025-02-18 16:49 ` [PATCH i-g-t 12/39] lib/vkms: Test CRTC invalid values José Expósito
@ 2025-02-27 13:12   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:12 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> For a VKMS CRTC, it is only possible to set invalid values in the
> writeback connector status.
> 
> Test that setting wrong values fails and that the CRTC status is not
> accidentally changed.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   lib/igt_vkms.c             | 20 ++++++++++++++++++++
>   lib/igt_vkms.h             |  2 ++
>   tests/vkms/vkms_configfs.c | 27 +++++++++++++++++++++++++++
>   3 files changed, 49 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index 4021f9aea..d881a2417 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -396,3 +396,23 @@ bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name)
>   
>   	return read_bool(path);
>   }
> +
> +/**
> + * igt_vkms_crtc_set_writeback_enabled:
> + * @dev: Device the CRTC belongs to
> + * @name: CRTC name
> + * @writeback: Enable or disable the writeback connector
> + *
> + * Set the VKMS CRTC writeback connector is status.
> + */
> +void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
> +					 bool writeback)
> +{
> +	char path[PATH_MAX];
> +
> +	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
> +		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_CRTC), name,
> +		 VKMS_FILE_CRTC_WRITEBACK);
> +
> +	write_bool(path, writeback);

Can fail silently because of the implementation of write_int.

> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 59f6a9775..cb0278544 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -35,5 +35,7 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
>   
>   void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
>   bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
> +void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
> +					 bool writeback);
>   
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 95779d336..af42e364d 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -319,6 +319,32 @@ static void test_crtc_default_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: crtc-wrong-values
> + * Description: Check that setting unexpected values doesn't work.
> + */
> +
> +static void test_crtc_wrong_values(void)
> +{
> +	igt_vkms_t *dev;
> +	char path[PATH_MAX];
> +
> +	/* Test invalid values for "writeback" */
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_crtc(dev, "crtc0");
> +	igt_vkms_crtc_set_writeback_enabled(dev, "crtc0", true);
> +	igt_assert(igt_vkms_crtc_is_writeback_enabled(dev, "crtc0"));
> +
> +	snprintf(path, sizeof(path), "%s/crtcs/crtc0/writeback", dev->path);
> +
> +	assert_wrong_bool_values(path);
> +	igt_assert(igt_vkms_crtc_is_writeback_enabled(dev, "crtc0"));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -333,6 +359,7 @@ igt_main
>   		{ "plane-wrong-values", test_plane_wrong_values },
>   		{ "crtc-default-files", test_crtc_default_files },
>   		{ "crtc-default-values", test_crtc_default_values },
> +		{ "crtc-wrong-values", test_crtc_wrong_values },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 16/39] lib/vkms: Test plane connector invalid values
  2025-02-18 16:49 ` [PATCH i-g-t 16/39] lib/vkms: Test plane connector invalid values José Expósito
@ 2025-02-27 13:12   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:12 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> For a VKMS connector, it is only possible to set invalid values in the
> connector status.
> 
> Test that setting wrong values fails and that the connector is not
> accidentally changed.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_vkms.c             | 26 +++++++++++++++++++
>   lib/igt_vkms.h             |  2 ++
>   tests/vkms/vkms_configfs.c | 52 ++++++++++++++++++++++++++++++++++++++
>   3 files changed, 80 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index 6780d36da..f5e193a1c 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -459,3 +459,29 @@ int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name)
>   
>   	return read_int(path);
>   }
> +
> +/**
> + * igt_vkms_connector_set_status:
> + * @dev: Device the connector belongs to
> + * @name: Connector name
> + * @type: DRM_MODE_CONNECTED, DRM_MODE_DISCONNECTED or
> + * DRM_MODE_UNKNOWNCONNECTION
> + *
> + * Set a new status for the connector
> + */
> +void igt_vkms_connector_set_status(igt_vkms_t *dev, const char *name,
> +				   int status)
> +{
> +	char path[PATH_MAX];
> +
> +	if (status != DRM_MODE_CONNECTED &&
> +	    status != DRM_MODE_DISCONNECTED &&
> +	    status != DRM_MODE_UNKNOWNCONNECTION)
> +		igt_assert(!"Cannot be reached: Unknown connector status");
> +
> +	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
> +		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_CONNECTOR), name,
> +		 VKMS_FILE_CONNECTOR_STATUS);
> +
> +	write_int(path, status);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index d0a148242..50f42aa4b 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -42,5 +42,7 @@ void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
>   
>   void igt_vkms_device_add_connector(igt_vkms_t *dev, const char *name);
>   int igt_vkms_connector_get_status(igt_vkms_t *dev, const char *name);
> +void igt_vkms_connector_set_status(igt_vkms_t *dev, const char *name,
> +				   int status);
>   
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index b8c97e20d..ea84d9f82 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -425,6 +425,57 @@ static void test_connector_default_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: connector-wrong-values
> + * Description: Check that setting unexpected values doesn't work.
> + */
> +
> +static void test_connector_wrong_values(void)
> +{
> +	struct invalid_value invalid_status_values[] = {
> +		{ "", 0 },
> +		{ "\0", 1 },
> +		{ "-1", 2 },
> +		{ "0", 1 },
> +		{ "4", 1 },
> +		{ "connected", 10 },
> +	};
> +	igt_vkms_t *dev;
> +	char path[PATH_MAX];
> +	int fd;
> +	int ret;
> +
> +	/* Create a device with a disconnected connector */
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_connector(dev, "connector0");
> +	igt_vkms_connector_set_status(dev, "connector0", DRM_MODE_DISCONNECTED);
> +	igt_assert_eq(igt_vkms_connector_get_status(dev, "connector0"),
> +		      DRM_MODE_DISCONNECTED);

Can you also test the allowed values? Maybe in another test. Same for 
plane type.

> +
> +	snprintf(path, sizeof(path), "%s/connectors/connector0/status",
> +		 dev->path);
> +
> +	/* Test invalid values for "status" */
> +	for (int i = 0; i < ARRAY_SIZE(invalid_status_values); i++) {
> +		struct invalid_value v = invalid_status_values[i];
> +
> +		fd = open(path, O_WRONLY);
> +		igt_assert_f(fd >= 0, "Error opening '%s'\n", path);
> +
> +		ret = write(fd, v.value, v.size);
> +		igt_assert(ret <= 0);
> +
> +		close(fd);
> +	}
> +
> +	igt_assert_eq(igt_vkms_connector_get_status(dev, "connector0"),
> +		      DRM_MODE_DISCONNECTED);
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -443,6 +494,7 @@ igt_main
>   		{ "encoder-default-files", test_encoder_default_files },
>   		{ "connector-default-files", test_connector_default_files },
>   		{ "connector-default-values", test_connector_default_values },
> +		{ "connector-wrong-values", test_connector_wrong_values },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 11/39] lib/vkms: Test CRTC default values
  2025-02-18 16:49 ` [PATCH i-g-t 11/39] lib/vkms: Test CRTC default values José Expósito
@ 2025-02-27 13:12   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:12 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add a helper to get the CRTC writeback status and test that the default
> value is set when a new CRTC is created.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   lib/igt_vkms.c             | 19 +++++++++++++++++++
>   lib/igt_vkms.h             |  1 +
>   tests/vkms/vkms_configfs.c | 20 ++++++++++++++++++++
>   3 files changed, 40 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index a7dad43e2..4021f9aea 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -24,6 +24,7 @@
>   #define VKMS_ROOT_DIR_NAME		"vkms"
>   #define VKMS_FILE_ENABLED		"enabled"
>   #define VKMS_FILE_PLANE_TYPE		"type"
> +#define VKMS_FILE_CRTC_WRITEBACK	"writeback"
>   
>   enum vkms_pipeline_item {
>   	VKMS_PIPELINE_ITEM_PLANE,
> @@ -377,3 +378,21 @@ void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name)
>   {
>   	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CRTC, name);
>   }
> +
> +/**
> + * igt_vkms_crtc_is_writeback_enabled:
> + * @dev: Device the CRTC belongs to
> + * @name: CRTC name
> + *
> + * Indicate whether a VKMS CRTC writeback connector is enabled or not.
> + */
> +bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name)
> +{
> +	char path[PATH_MAX];
> +
> +	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
> +		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_CRTC), name,
> +		 VKMS_FILE_CRTC_WRITEBACK);
> +
> +	return read_bool(path);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 7f70f92d3..59f6a9775 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -34,5 +34,6 @@ int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
>   void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
>   
>   void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
> +bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
>   
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 398232c03..95779d336 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -300,6 +300,25 @@ static void test_crtc_default_files(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: crtc-default-values
> + * Description: Check that the default values for the CRTC are correct.
> + */
> +
> +static void test_crtc_default_values(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_crtc(dev, "crtc0");
> +
> +	igt_assert(!igt_vkms_crtc_is_writeback_enabled(dev, "crtc0"));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -313,6 +332,7 @@ igt_main
>   		{ "plane-default-values", test_plane_default_values },
>   		{ "plane-wrong-values", test_plane_wrong_values },
>   		{ "crtc-default-files", test_crtc_default_files },
> +		{ "crtc-default-values", test_crtc_default_values },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 03/39] lib/igt_configfs: Add helper to mount configfs
  2025-02-18 16:49 ` [PATCH i-g-t 03/39] lib/igt_configfs: Add helper to mount configfs José Expósito
@ 2025-02-27 13:14   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:14 UTC (permalink / raw)
  To: José Expósito, igt-dev; +Cc: Jim Shargo, Marius Vlad



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add a new helper function to mount configfs. Required to test VKMS
> configuration.
> 
> Co-developed-by: Jim Shargo <jshargo@chromium.org>
> Signed-off-by: Jim Shargo <jshargo@chromium.org>
> Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   lib/igt.h          |  1 +
>   lib/igt_configfs.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++
>   lib/igt_configfs.h | 13 +++++++++++
>   lib/meson.build    |  1 +
>   4 files changed, 72 insertions(+)
>   create mode 100644 lib/igt_configfs.c
>   create mode 100644 lib/igt_configfs.h
> 
> diff --git a/lib/igt.h b/lib/igt.h
> index 58c39e098..173ca70bf 100644
> --- a/lib/igt.h
> +++ b/lib/igt.h
> @@ -27,6 +27,7 @@
>   #include "drmtest.h"
>   #include "i915_3d.h"
>   #include "igt_aux.h"
> +#include "igt_configfs.h"
>   #include "igt_core.h"
>   #include "igt_debugfs.h"
>   #include "igt_draw.h"
> diff --git a/lib/igt_configfs.c b/lib/igt_configfs.c
> new file mode 100644
> index 000000000..cd8674cb5
> --- /dev/null
> +++ b/lib/igt_configfs.c
> @@ -0,0 +1,57 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2023 Google LLC.
> + * Copyright © 2023 Collabora, Ltd.
> + * Copyright © 2024 Red Hat, Inc.
> + */
> +
> +#include <sys/mount.h>
> +
> +#include "igt_aux.h"
> +#include "igt_configfs.h"
> +
> +/**
> + * SECTION:igt_configfs
> + * @short_description: Support code for configfs features
> + * @title: configfs
> + * @include: igt_configfs.h
> + *
> + * This library provides helpers to access configfs features.
> + */
> +
> +/*
> + * General configfs helpers
> + */
> +
> +static const char *__igt_configfs_mount(void)
> +{
> +	if (igt_is_mountpoint("/sys/kernel/config"))
> +		return "/sys/kernel/config";
> +
> +	if (igt_is_mountpoint("/config"))
> +		return "/config";
> +
> +	if (mount("config", "/sys/kernel/config", "configfs", 0, 0))
> +		return NULL;
> +
> +	return "/sys/kernel/config";
> +}
> +
> +/**
> + * igt_configfs_mount:
> + *
> + * This attempts to locate where configfs is mounted on the filesystem,
> + * and if not found, will then try to mount configfs at /sys/kernel/config.
> + *
> + * Returns:
> + * The path to the configfs mount point (e.g. /sys/kernel/config)
> + */
> +const char *igt_configfs_mount(void)
> +{
> +	static const char *path;
> +
> +	if (!path)
> +		path = __igt_configfs_mount();
> +
> +	return path;
> +}
> diff --git a/lib/igt_configfs.h b/lib/igt_configfs.h
> new file mode 100644
> index 000000000..4cbe9001e
> --- /dev/null
> +++ b/lib/igt_configfs.h
> @@ -0,0 +1,13 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2023 Google LLC.
> + * Copyright © 2023 Collabora, Ltd.
> + * Copyright © 2024 Red Hat, Inc.
> + */
> +
> +#ifndef __IGT_CONFIGFS_H__
> +#define __IGT_CONFIGFS_H__
> +
> +const char *igt_configfs_mount(void);
> +
> +#endif /* __IGT_CONFIGFS_H__ */
> diff --git a/lib/meson.build b/lib/meson.build
> index 9fffdd3c6..201b1fbb4 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -18,6 +18,7 @@ lib_sources = [
>   	'i915/i915_crc.c',
>   	'igt_collection.c',
>   	'igt_color_encoding.c',
> +	'igt_configfs.c',
>   	'igt_facts.c',
>   	'igt_crc.c',
>   	'igt_debugfs.c',

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 06/39] tests/vkms_configfs: Test device invalid values
  2025-02-18 16:49 ` [PATCH i-g-t 06/39] tests/vkms_configfs: Test device invalid values José Expósito
@ 2025-02-27 13:14   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:14 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> For a VKMS device, it is only possible to set invalid values in two
> places:
> 
> - The device name: The "vkms" name is reserved for the default device
>    created by the driver.
> - The device enabled status: It should only accept boolean values.
> 
> Test that setting wrong values fails and that the device is not
> accidentally enabled.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   tests/vkms/vkms_configfs.c | 60 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 60 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 6c7d0310c..79023359a 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -24,6 +24,11 @@
>   #include "igt.h"
>   #include "igt_vkms.h"
>   
> +struct invalid_value {
> +	const char *value;
> +	int size;
> +};
> +
>   static void assert_default_files(const char *path,
>   				 const char **files, size_t n_files,
>   				 const char **dirs, size_t n_dirs)
> @@ -63,6 +68,32 @@ static void assert_default_files(const char *path,
>   	}
>   }
>   
> +static void assert_wrong_bool_values(const char *path)
> +{
> +	struct invalid_value invalid_bool_values[] = {
> +		{ "", 0 },
> +		{ "\0", 1 },
> +		{ "-1", 2 },
> +		{ "2", 1 },
> +		{ "o", 1 },
> +		{ "invalid", 8 },
> +	};
> +	int fd;
> +	int ret;
> +
> +	for (int i = 0; i < ARRAY_SIZE(invalid_bool_values); i++) {
> +		struct invalid_value v = invalid_bool_values[i];
> +
> +		fd = open(path, O_WRONLY);
> +		igt_assert_f(fd >= 0, "Error opening '%s'\n", path);
> +
> +		ret = write(fd, v.value, v.size);
> +		igt_assert(ret <= 0);

Can you add some information about the attempted value:

	"Invalid success write of %s in the file %s", v.value, path

> +
> +		close(fd);
> +	}
> +}
> +
>   /**
>    * SUBTEST: device-default-files
>    * Description: Test that creating a VKMS device creates the default files and
> @@ -111,6 +142,34 @@ static void test_device_default_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: device-wrong-values
> + * Description: Check that setting unexpected values doesn't work.
> + */
> +
> +static void test_device_wrong_values(void)
> +{
> +	igt_vkms_t *dev;
> +	char path[PATH_MAX];
> +
> +	/* It is not possible to create devices named "vkms" to avoid clashes
> +	 * with the default device created by VKMS
> +	 */
> +	dev = igt_vkms_device_create("vkms");
> +	igt_assert(!dev);
> +
> +	/* Test invalid values for "enabled" */
> +	dev = igt_vkms_device_create(__func__);

Good idea to name the device from the function!

> +	igt_assert(dev);
> +
> +	snprintf(path, sizeof(path), "%s/enabled", dev->path);
> +
> +	assert_wrong_bool_values(path);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -119,6 +178,7 @@ igt_main
>   	} tests[] = {
>   		{ "device-default-files", test_device_default_files },
>   		{ "device-default-values", test_device_default_values },
> +		{ "device-wrong-values", test_device_wrong_values },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 13/39] lib/vkms: Test encoder default files
  2025-02-18 16:49 ` [PATCH i-g-t 13/39] lib/vkms: Test encoder default files José Expósito
@ 2025-02-27 13:14   ` Louis Chauvet
  2025-03-13 17:25     ` José Expósito
  0 siblings, 1 reply; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:14 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add a helper to create a encoder and a test checking that the default
> files and directories are created.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_vkms.c             | 12 ++++++++++++
>   lib/igt_vkms.h             |  2 ++
>   tests/vkms/vkms_configfs.c | 29 +++++++++++++++++++++++++++++
>   3 files changed, 43 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index d881a2417..299891377 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -416,3 +416,15 @@ void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
>   
>   	write_bool(path, writeback);
>   }
> +
> +/**
> + * igt_vkms_device_add_encoder:
> + * @dev: Device to add the encoder to
> + * @name: Encoder name
> + *
> + * Add a new encoder to the VKMS device.
> + */
> +void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name)
> +{
> +	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER, name);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index cb0278544..b4b048c6d 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -38,4 +38,6 @@ bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
>   void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
>   					 bool writeback);
>   
> +void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
> +
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index af42e364d..753ea2d85 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -345,6 +345,34 @@ static void test_crtc_wrong_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: encoder-default-files
> + * Description: Test that creating a encoder creates the default files and
> + *              directories.
> + */
> +
> +static void test_encoder_default_files(void)
> +{
> +	igt_vkms_t *dev;
> +	char path[PATH_MAX];
> +
> +	const char *dirs[] = {
> +		"possible_crtcs",
> +	};
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_encoder(dev, "encoder0");

I maybe found a solution for the duplication of path generation, can the 
igt_vkms_device_add_* return the path of the object?

To avoid malloc/free, you can simply add an optional pointer "path":

void igt_vkms_device_add_encoder(dev, name, path, max_len) {
	if (path)
		igt_assert_le(snprintf(path, max_len, "....", ...),
				max_len);
	[...]
}

> +	snprintf(path, sizeof(path), "%s/encoders/encoder0", dev->path);
> +	assert_default_files(path,
> +			     NULL, 0,
> +			     dirs, ARRAY_SIZE(dirs));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -360,6 +388,7 @@ igt_main
>   		{ "crtc-default-files", test_crtc_default_files },
>   		{ "crtc-default-values", test_crtc_default_values },
>   		{ "crtc-wrong-values", test_crtc_wrong_values },
> +		{ "encoder-default-files", test_encoder_default_files },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 09/39] lib/vkms: Test plane invalid values
  2025-02-18 16:49 ` [PATCH i-g-t 09/39] lib/vkms: Test plane invalid values José Expósito
@ 2025-02-27 13:14   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:14 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> For a VKMS plane, it is only possible to set invalid values in the plane
> type.
> 
> Test that setting wrong values fails and that the plane is not
> accidentally changed.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_vkms.c             | 25 +++++++++++++++++++
>   lib/igt_vkms.h             |  1 +
>   tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
>   3 files changed, 77 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index 5cfe5123c..ca6f37975 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -340,3 +340,28 @@ int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name)
>   
>   	return read_int(path);
>   }
> +
> +/**
> + * igt_vkms_plane_set_type:
> + * @dev: Device the plane belongs to
> + * @name: Plane name
> + * @type: DRM_PLANE_TYPE_OVERLAY, DRM_PLANE_TYPE_PRIMARY or
> + * DRM_PLANE_TYPE_CURSOR
> + *
> + * Set a new type for the plane
> + */
> +void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
> +{
> +	char path[PATH_MAX];
> +
> +	if (type != DRM_PLANE_TYPE_OVERLAY &&
> +	    type != DRM_PLANE_TYPE_PRIMARY &&
> +	    type != DRM_PLANE_TYPE_CURSOR)
> +		igt_assert(!"Cannot be reached: Unknown plane type");
> +
> +	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
> +		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_PLANE), name,
> +		 VKMS_FILE_PLANE_TYPE);
> +
> +	write_int(path, type);

It can fail silently, see my comment on 05/39.

> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index dd06d8f5b..283be5699 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -31,5 +31,6 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
>   
>   void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
>   int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
> +void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
>   
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index a3fa60762..d607b1a5a 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -222,6 +222,56 @@ static void test_plane_default_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: plane-wrong-values
> + * Description: Check that setting unexpected values doesn't work.
> + */
> +
> +static void test_plane_wrong_values(void)
> +{
> +	struct invalid_value invalid_type_values[] = {
> +		{ "", 0 },
> +		{ "\0", 1 },
> +		{ "-1", 2 },
> +		{ "4", 1 },
> +		{ "primary", 8 },
> +		{ "overlay", 8 },
> +	};
> +	igt_vkms_t *dev;
> +	char path[PATH_MAX];
> +	int fd;
> +	int ret;
> +
> +	/* Create a device with a primary plane */
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_plane(dev, "plane0");
> +	igt_vkms_plane_set_type(dev, "plane0", DRM_PLANE_TYPE_PRIMARY);
> +	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
> +		      DRM_PLANE_TYPE_PRIMARY);
> +
> +	snprintf(path, sizeof(path), "%s/planes/plane0/type", dev->path);

I am not a big fan of duplicating the path generation here and in 
igt_vkms_plane_set_type. But OTOH, I don't see how to do better, so:

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> +
> +	/* Test invalid values for "type" */
> +	for (int i = 0; i < ARRAY_SIZE(invalid_type_values); i++) {
> +		struct invalid_value v = invalid_type_values[i];
> +
> +		fd = open(path, O_WRONLY);
> +		igt_assert_f(fd >= 0, "Error opening '%s'\n", path);
> +
> +		ret = write(fd, v.value, v.size);
> +		igt_assert(ret <= 0);

As in a previous patch, can you add some information about the fail 
(value and path).

> +
> +		close(fd);
> +	}
> +
> +	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
> +		      DRM_PLANE_TYPE_PRIMARY);
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -233,6 +283,7 @@ igt_main
>   		{ "device-wrong-values", test_device_wrong_values },
>   		{ "plane-default-files", test_plane_default_files },
>   		{ "plane-default-values", test_plane_default_values },
> +		{ "plane-wrong-values", test_plane_wrong_values },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs
  2025-02-18 16:49 ` [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs José Expósito
@ 2025-02-27 13:15   ` Louis Chauvet
  2025-03-13 17:23     ` José Expósito
  0 siblings, 1 reply; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add helpers to attach and detach planes and CRTCs and a test checking
> the different valid and invalid cases.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_vkms.c             | 91 ++++++++++++++++++++++++++++++++++++++
>   lib/igt_vkms.h             |  4 ++
>   tests/vkms/vkms_configfs.c | 81 +++++++++++++++++++++++++++++++++
>   3 files changed, 176 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index f5e193a1c..147234e5b 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -119,6 +119,22 @@ static const char *get_pipeline_item_dir_name(enum vkms_pipeline_item item)
>   	igt_assert(!"Cannot be reached: Unknown VKMS pipeline item type");
>   }
>   
> +static const char *get_attach_dir_name(enum vkms_pipeline_item item)
> +{
> +	switch (item) {
> +	case VKMS_PIPELINE_ITEM_PLANE:
> +		return "possible_crtcs";
> +	case VKMS_PIPELINE_ITEM_ENCODER:
> +		return "possible_crtcs";
> +	case VKMS_PIPELINE_ITEM_CONNECTOR:
> +		return "possible_encoders";
> +	default:
> +		break;
> +	}
> +
> +	igt_assert(!"Cannot be reached: Unknown VKMS attach directory name");
> +}
> +
>   static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
>   			      const char *name)
>   {
> @@ -136,6 +152,51 @@ static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
>   		     path, errno, strerror(errno));
>   }
>   
> +static bool attach_pipeline_item(igt_vkms_t *dev,
> +				 enum vkms_pipeline_item src_item,
> +				 const char *src_item_name,
> +				 enum vkms_pipeline_item dst_item,
> +				 const char *dst_item_name)
> +{
> +	char src_path[PATH_MAX];
> +	char dst_path[PATH_MAX];
> +	const char *src_dir_name;
> +	const char *attach_dir_name;
> +	const char *dst_dir_name;
> +	int ret;
> +
> +	src_dir_name = get_pipeline_item_dir_name(src_item);
> +	attach_dir_name = get_attach_dir_name(src_item);
> +	snprintf(src_path, sizeof(src_path), "%s/%s/%s/%s/%s", dev->path,
> +		 src_dir_name, src_item_name, attach_dir_name, dst_item_name);

The more I read those functions, the more I think my proposition of 
having full path for pipeline item is better than having only its name.

Or maybe, to avoid the duplication a macro could help:

	#define ITEM_FMT "%s/%s/%s"
	#define ITEM_ARGS(dev, src_item, src_item_name) (dev), 
get_pipeline_item_dir_name((src_item)), (src_item_name)

I don't see major drawbacks for both of my proposition, so take what you 
think is better.

> +
> +	dst_dir_name = get_pipeline_item_dir_name(dst_item);
> +	snprintf(dst_path, sizeof(dst_path), "%s/%s/%s", dev->path,
> +		 dst_dir_name, dst_item_name);
> +
> +	ret = symlink(dst_path, src_path);
> +	return ret == 0;

Why this function has a return value? For all the other 
igt_vkms_device_* functions, they return void, and do assertions to stop 
the test if it fails.

> +}
> +
> +static bool detach_pipeline_item(igt_vkms_t *dev,
> +				 enum vkms_pipeline_item src_item,
> +				 const char *src_item_name,
> +				 const char *dst_item_name)
> +{
> +	char link_path[PATH_MAX];
> +	const char *src_dir_name;
> +	const char *attach_dir_name;
> +	int ret;
> +
> +	src_dir_name = get_pipeline_item_dir_name(src_item);
> +	attach_dir_name = get_attach_dir_name(src_item);
> +	snprintf(link_path, sizeof(link_path), "%s/%s/%s/%s/%s", dev->path,
> +		 src_dir_name, src_item_name, attach_dir_name, dst_item_name);
> +
> +	ret = unlink(link_path);
> +	return ret == 0;
> +}
> +
>   /**
>    * igt_require_vkms_configfs:
>    *
> @@ -368,6 +429,36 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
>   	write_int(path, type);
>   }
>   
> +/**
> + * igt_vkms_plane_attach_crtc:
> + * @dev: Target device
> + * @plane_name: Target plane name
> + * @crtc_name: Destination CRTC name
> + *
> + * Attach a plane to a CRTC. Return true on success and false on error.
> + */
> +bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
> +				const char *crtc_name)
> +{
> +	return attach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
> +				    VKMS_PIPELINE_ITEM_CRTC, crtc_name);
> +}
> +
> +/**
> + * igt_vkms_plane_detach_crtc:
> + * @dev: Target device
> + * @plane_name: Target plane name
> + * @crtc_name: Destination CRTC name
> + *
> + * Detach a plane from a CRTC. Return true on success and false on error.
> + */
> +bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
> +				const char *crtc_name)
> +{
> +	return detach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
> +				    crtc_name);
> +}
> +
>   /**
>    * igt_vkms_device_add_crtc:
>    * @dev: Device to add the CRTC to
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 50f42aa4b..fc8db268b 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -32,6 +32,10 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
>   void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
>   int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
>   void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
> +bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
> +				const char *crtc_name);
> +bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
> +				const char *crtc_name);
>   
>   void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
>   bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index ea84d9f82..e1572d65f 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -94,6 +94,20 @@ static void assert_wrong_bool_values(const char *path)
>   	}
>   }
>   
> +static bool attach(const char *src_path, const char *dst_path,
> +		   const char *link_name)
> +{
> +	char link_path[PATH_MAX];
> +	int ret;
> +
> +	ret = snprintf(link_path, sizeof(link_path), "%s/%s", src_path, link_name);
> +	igt_assert(ret >= 0 && ret < sizeof(link_path));
> +
> +	ret = symlink(dst_path, link_path);
> +
> +	return ret == 0;
> +}
> +
>   /**
>    * SUBTEST: device-default-files
>    * Description: Test that creating a VKMS device creates the default files and
> @@ -476,6 +490,72 @@ static void test_connector_wrong_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: attach-plane-to-crtc
> + * Description: Check that errors are handled while attaching planes to CRTCs.
> + */
> +
> +static void test_attach_plane_to_crtc(void)
> +{
> +	igt_vkms_t *dev1;
> +	igt_vkms_t *dev2;
> +	char plane1[PATH_MAX];
> +	char crtc1[PATH_MAX];
> +	char connector1[PATH_MAX];
> +	char crtc2[PATH_MAX];
> +	char dev2_enabled_path[PATH_MAX];
> +	bool ok;
> +
> +	dev1 = igt_vkms_device_create("test_attach_plane_to_crtc_1");
> +	igt_assert(dev1);
> +
> +	dev2 = igt_vkms_device_create("test_attach_plane_to_crtc_2");
> +	igt_assert(dev2);
> +
> +	igt_vkms_device_add_plane(dev1, "plane1");
> +	igt_vkms_device_add_crtc(dev1, "crtc1");
> +	igt_vkms_device_add_connector(dev1, "connector1");
> +	igt_vkms_device_add_crtc(dev2, "crtc2");
> +
> +	snprintf(plane1, sizeof(plane1), "%s/planes/plane1/possible_crtcs",
> +		 dev1->path);
> +	snprintf(crtc1, sizeof(crtc1), "%s/crtcs/crtc1", dev1->path);
> +	snprintf(connector1, sizeof(connector1), "%s/connectors/connector1",
> +		 dev1->path);
> +	snprintf(crtc2, sizeof(crtc2), "%s/crtcs/crtc2", dev2->path);
> +	snprintf(dev2_enabled_path, sizeof(dev2_enabled_path), "%s/enabled",
> +		 dev2->path);
> +
> +	/* Error: Attach a plane to a connector */
> +	ok = attach(plane1, connector1, "connector");
> +	igt_assert_f(!ok, "Attaching plane1 to connector1 should fail\n");
> +
> +	/* Error: Attach a plane to a random file */
> +	ok = attach(plane1, dev2_enabled_path, "file");
> +	igt_assert_f(!ok, "Attaching plane1 to a random file should fail\n");
> +
> +	/* Error: Attach a plane to a CRTC from other device */
> +	ok = attach(plane1, crtc2, "crtc2");
> +	igt_assert_f(!ok, "Attaching plane1 to crtc2 should fail\n");
> +
> +	/* OK: Attaching plane1 to crtc1 */
> +	ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
> +	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
> +
> +	/* Error: Attaching plane1 to crtc1 twice */
> +	ok = attach(plane1, crtc1, "crtc1_duplicated");
> +	igt_assert_f(!ok, "Error attaching plane1 to crtc1 twice should fail");
> +
> +	/* OK: Detaching and attaching again */
> +	ok = igt_vkms_plane_detach_crtc(dev1, "plane1", "crtc1");
> +	igt_assert_f(ok, "Error detaching plane1 from crtc1\n");
> +	ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
> +	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
> +
> +	igt_vkms_device_destroy(dev1);
> +	igt_vkms_device_destroy(dev2);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -495,6 +575,7 @@ igt_main
>   		{ "connector-default-files", test_connector_default_files },
>   		{ "connector-default-values", test_connector_default_values },
>   		{ "connector-wrong-values", test_connector_wrong_values },
> +		{ "attach-plane-to-crtc", test_attach_plane_to_crtc },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 08/39] lib/vkms: Test plane default values
  2025-02-18 16:49 ` [PATCH i-g-t 08/39] lib/vkms: Test plane default values José Expósito
@ 2025-02-27 13:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add a helper to get the plane type and test that the default type is set
> when a new plane is created.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   lib/igt_vkms.c             | 19 +++++++++++++++++++
>   lib/igt_vkms.h             |  1 +
>   tests/vkms/vkms_configfs.c | 21 +++++++++++++++++++++
>   3 files changed, 41 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index a7b395a71..5cfe5123c 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -23,6 +23,7 @@
>   
>   #define VKMS_ROOT_DIR_NAME		"vkms"
>   #define VKMS_FILE_ENABLED		"enabled"
> +#define VKMS_FILE_PLANE_TYPE		"type"
>   
>   enum vkms_pipeline_item {
>   	VKMS_PIPELINE_ITEM_PLANE,
> @@ -321,3 +322,21 @@ void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name)
>   {
>   	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
>   }
> +
> +/**
> + * igt_vkms_plane_get_type:
> + * @dev: Device the plane belongs to
> + * @name: Plane name
> + *
> + * Return the plane type.
> + */
> +int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name)
> +{
> +	char path[PATH_MAX];
> +
> +	snprintf(path, sizeof(path), "%s/%s/%s/%s", dev->path,
> +		 get_pipeline_item_dir_name(VKMS_PIPELINE_ITEM_PLANE), name,
> +		 VKMS_FILE_PLANE_TYPE);
> +
> +	return read_int(path);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 9e16ae7eb..dd06d8f5b 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -30,5 +30,6 @@ bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
>   void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
>   
>   void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
> +int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
>   
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index ec334641f..a3fa60762 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -202,6 +202,26 @@ static void test_plane_default_files(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: plane-default-values
> + * Description: Check that the default values for the plane are correct.
> + */
> +
> +static void test_plane_default_values(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_plane(dev, "plane0");
> +
> +	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
> +		      DRM_PLANE_TYPE_OVERLAY);
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -212,6 +232,7 @@ igt_main
>   		{ "device-default-values", test_device_default_values },
>   		{ "device-wrong-values", test_device_wrong_values },
>   		{ "plane-default-files", test_plane_default_files },
> +		{ "plane-default-values", test_plane_default_values },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 07/39] lib/vkms: Test plane default files
  2025-02-18 16:49 ` [PATCH i-g-t 07/39] lib/vkms: Test plane default files José Expósito
@ 2025-02-27 13:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add a helper to create a plane and a test checking that the default
> files and directories are created.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_vkms.c             | 52 ++++++++++++++++++++++++++++++++++++++
>   lib/igt_vkms.h             |  2 ++
>   tests/vkms/vkms_configfs.c | 33 ++++++++++++++++++++++++
>   3 files changed, 87 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index 1fdfb09f7..a7b395a71 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -24,6 +24,13 @@
>   #define VKMS_ROOT_DIR_NAME		"vkms"
>   #define VKMS_FILE_ENABLED		"enabled"
>   
> +enum vkms_pipeline_item {
> +	VKMS_PIPELINE_ITEM_PLANE,
> +	VKMS_PIPELINE_ITEM_CRTC,
> +	VKMS_PIPELINE_ITEM_ENCODER,
> +	VKMS_PIPELINE_ITEM_CONNECTOR,
> +};
> +
>   /**
>    * SECTION:igt_vkms
>    * @short_description: Helpers to create and configure VKMS devices
> @@ -93,6 +100,39 @@ static void write_bool(const char *path, bool value)
>   	write_int(path, value ? 1 : 0);
>   }
>   
> +static const char *get_pipeline_item_dir_name(enum vkms_pipeline_item item)
> +{
> +	switch (item) {
> +	case VKMS_PIPELINE_ITEM_PLANE:
> +		return "planes";
> +	case VKMS_PIPELINE_ITEM_CRTC:
> +		return "crtcs";
> +	case VKMS_PIPELINE_ITEM_ENCODER:
> +		return "encoders";
> +	case VKMS_PIPELINE_ITEM_CONNECTOR:
> +		return "connectors";
> +	}
> +
> +	igt_assert(!"Cannot be reached: Unknown VKMS pipeline item type");
> +}
> +
> +static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
> +			      const char *name)
> +{
> +	const char *item_dir_name;
> +	char path[PATH_MAX];
> +	int ret;
> +
> +	item_dir_name = get_pipeline_item_dir_name(item);
> +	snprintf(path, sizeof(path), "%s/%s/%s", dev->path, item_dir_name,
> +		 name);

Again, it costs nothing to add a check igt_assert_le(snprintf, 
PATH_MAX). Same for all the snprintf in other patches.

For the rest of the patches (8..39), my R-by are valid with or without 
this change.

> +
> +	ret = mkdir(path, 0777);
> +	igt_assert_f(ret == 0,
> +		     "Unable to mkdir directory '%s'. Got errno=%d (%s)\n",
> +		     path, errno, strerror(errno));
> +}
> +
>   /**
>    * igt_require_vkms_configfs:
>    *
> @@ -269,3 +309,15 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled)
>   
>   	write_bool(path, enabled);
>   }
> +
> +/**
> + * igt_vkms_device_add_plane:
> + * @dev: Device to add the plane to
> + * @name: Plane name
> + *
> + * Add a new plane to the VKMS device.
> + */
> +void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name)
> +{
> +	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index dab51852a..9e16ae7eb 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -29,4 +29,6 @@ void igt_vkms_destroy_all_devices(void);
>   bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
>   void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
>   
> +void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
> +
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 79023359a..ec334641f 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -170,6 +170,38 @@ static void test_device_wrong_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: plane-default-files
> + * Description: Test that creating a plane creates the default files and
> + *              directories.
> + */
> +
> +static void test_plane_default_files(void)
> +{
> +	igt_vkms_t *dev;
> +	char path[PATH_MAX];
> +
> +	const char *files[] = {
> +		"type",
> +	};
> +
> +	const char *dirs[] = {
> +		"possible_crtcs",
> +	};
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_plane(dev, "plane0");
> +
> +	snprintf(path, sizeof(path), "%s/planes/plane0", dev->path);
> +	assert_default_files(path,
> +			     files, ARRAY_SIZE(files),
> +			     dirs, ARRAY_SIZE(dirs));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -179,6 +211,7 @@ igt_main
>   		{ "device-default-files", test_device_default_files },
>   		{ "device-default-values", test_device_default_values },
>   		{ "device-wrong-values", test_device_wrong_values },
> +		{ "plane-default-files", test_plane_default_files },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com




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

* Re: [PATCH i-g-t 05/39] lib/vkms: Allow to enable/disable VKMS devices
  2025-02-18 16:49 ` [PATCH i-g-t 05/39] lib/vkms: Allow to enable/disable VKMS devices José Expósito
@ 2025-02-27 13:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add helper to enable, disable and check the enabled status of a VKMS
> device and add a test to ensure that the default value is correctly set.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_vkms.c             | 80 ++++++++++++++++++++++++++++++++++++++
>   lib/igt_vkms.h             |  5 +++
>   tests/vkms/vkms_configfs.c | 18 +++++++++
>   3 files changed, 103 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index 8cea94901..1fdfb09f7 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -7,7 +7,12 @@
>   
>   #include <dirent.h>
>   #include <errno.h>
> +#include <fcntl.h>
> +#include <stddef.h>
> +#include <stdio.h>
> +#include <stdlib.h>
>   #include <string.h>
> +#include <unistd.h>
>   
>   #include <ftw.h>
>   #include <linux/limits.h>
> @@ -17,6 +22,7 @@
>   #include "igt_vkms.h"
>   
>   #define VKMS_ROOT_DIR_NAME		"vkms"
> +#define VKMS_FILE_ENABLED		"enabled"
>   
>   /**
>    * SECTION:igt_vkms
> @@ -45,6 +51,48 @@ static const char *mount_vkms_configfs(void)
>   	return vkms_root_path;
>   }
>   
> +static int read_int(const char *path)
> +{
> +	FILE *file;
> +	int value;
> +	int ret;
> +
> +	file = fopen(path, "r");
> +	igt_assert_f(file, "Error opening '%s'\n", path);
> +
> +	ret = fscanf(file, "%d", &value);
> +	fclose(file);
> +	igt_assert_f(ret == 1, "Error reading integer from '%s'\n", path);
> +
> +	return value;
> +}
> +
> +static bool read_bool(const char *path)
> +{
> +	int ret;
> +
> +	ret = read_int(path);
> +
> +	return !!ret;
> +}
> +
> +static void write_int(const char *path, int value)
> +{
> +	FILE *file;
> +
> +	file = fopen(path, "w");
> +	igt_assert_f(file, "Error opening '%s'\n", path);
> +
> +	fprintf(file, "%d", value);

No check about the result of fprintf? This may hide some strange issues.

And in 09/39, the function igt_vkms_plane_set_type is broken because of 
this, it can fails silently.

> +
> +	fclose(file);
> +}
> +
> +static void write_bool(const char *path, bool value)
> +{
> +	write_int(path, value ? 1 : 0);
> +}
> +
>   /**
>    * igt_require_vkms_configfs:
>    *
> @@ -151,6 +199,8 @@ void igt_vkms_device_destroy(igt_vkms_t *dev)
>   
>   	igt_assert(dev);
>   
> +	igt_vkms_device_set_enabled(dev, false);
> +
>   	ret = remove_device_dir(dev);
>   	igt_assert_f(ret == 0,
>   		     "Unable to rmdir device directory '%s'. Got errno=%d (%s)\n",
> @@ -189,3 +239,33 @@ void igt_vkms_destroy_all_devices(void)
>   
>   	closedir(dir);
>   }
> +
> +/**
> + * igt_vkms_device_is_enabled:
> + * @dev: The device to check
> + *
> + * Indicate whether a VKMS device is enabled or not.
> + */
> +bool igt_vkms_device_is_enabled(igt_vkms_t *dev)
> +{
> +	char path[PATH_MAX];
> +
> +	snprintf(path, sizeof(path), "%s/%s", dev->path, VKMS_FILE_ENABLED);

As nothing garantee that dev->path is shorter than PATH_MAX, can you add 
a simple check:

igt_assert_le(snprintf(...), PATH_MAX);

> +	return read_bool(path);
> +}
> +
> +/**
> + * igt_vkms_device_set_enabled:
> + * @dev: Device to enable or disable
> + *
> + * Enable or disable a VKMS device.
> + */
> +void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled)
> +{
> +	char path[PATH_MAX];
> +
> +	snprintf(path, sizeof(path), "%s/%s", dev->path, VKMS_FILE_ENABLED);

Ditto

> +	write_bool(path, enabled);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 48c48f296..dab51852a 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -8,6 +8,8 @@
>   #ifndef __IGT_VKMS_H__
>   #define __IGT_VKMS_H__
>   
> +#include <stdbool.h>
> +
>   /**
>    * igt_vkms_t:
>    * @path: VKMS root directory inside configfs mounted directory
> @@ -24,4 +26,7 @@ igt_vkms_t *igt_vkms_device_create(const char *name);
>   void igt_vkms_device_destroy(igt_vkms_t *dev);
>   void igt_vkms_destroy_all_devices(void);
>   
> +bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
> +void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
> +
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 441c39a47..6c7d0310c 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -94,6 +94,23 @@ static void test_device_default_files(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: device-default-values
> + * Description: Check that the default values for the device are correct.
> + */
> +
> +static void test_device_default_values(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -101,6 +118,7 @@ igt_main
>   		void (*fn)(void);
>   	} tests[] = {
>   		{ "device-default-files", test_device_default_files },
> +		{ "device-default-values", test_device_default_values },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com




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

* Re: [PATCH i-g-t 10/39] lib/vkms: Test CRTC default files
  2025-02-18 16:49 ` [PATCH i-g-t 10/39] lib/vkms: Test CRTC default files José Expósito
@ 2025-02-27 13:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 13:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Add a helper to create a CRTC and a test checking that the default
> files and directories are created.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   lib/igt_vkms.c             | 12 ++++++++++++
>   lib/igt_vkms.h             |  2 ++
>   tests/vkms/vkms_configfs.c | 29 +++++++++++++++++++++++++++++
>   3 files changed, 43 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index ca6f37975..a7dad43e2 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -365,3 +365,15 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
>   
>   	write_int(path, type);
>   }
> +
> +/**
> + * igt_vkms_device_add_crtc:
> + * @dev: Device to add the CRTC to
> + * @name: CRTC name
> + *
> + * Add a new CRTC to the VKMS device.
> + */
> +void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name)
> +{
> +	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_CRTC, name);
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 283be5699..7f70f92d3 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -33,4 +33,6 @@ void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
>   int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
>   void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
>   
> +void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
> +
>   #endif /* __IGT_VKMS_H__ */
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index d607b1a5a..398232c03 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -272,6 +272,34 @@ static void test_plane_wrong_values(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: crtc-default-files
> + * Description: Test that creating a CRTC creates the default files and
> + *              directories.
> + */
> +
> +static void test_crtc_default_files(void)
> +{
> +	igt_vkms_t *dev;
> +	char path[PATH_MAX];
> +
> +	const char *files[] = {
> +		"writeback",
> +	};
> +
> +	dev = igt_vkms_device_create(__func__);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_add_crtc(dev, "crtc0");
> +
> +	snprintf(path, sizeof(path), "%s/crtcs/crtc0", dev->path);
> +	assert_default_files(path,
> +			     files, ARRAY_SIZE(files),
> +			     NULL, 0);
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -284,6 +312,7 @@ igt_main
>   		{ "plane-default-files", test_plane_default_files },
>   		{ "plane-default-values", test_plane_default_values },
>   		{ "plane-wrong-values", test_plane_wrong_values },
> +		{ "crtc-default-files", test_crtc_default_files },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 21/39] lib/vkms: Create VKMS device from static config
  2025-02-18 16:49 ` [PATCH i-g-t 21/39] lib/vkms: Create VKMS device from static config José Expósito
@ 2025-02-27 14:30   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 14:30 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> In order to make the process of creating new VKMS devices as simple as
> possible and in a declarative way, create a set of structures
> representing a VKMS device configuration and a function that reads them
> and applies the configuration.
> 
> In addition, add a test using this new function that checks that
> creating a device without planes fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   lib/igt_vkms.c             | 88 ++++++++++++++++++++++++++++++++++++++
>   lib/igt_vkms.h             | 43 +++++++++++++++++++
>   tests/vkms/vkms_configfs.c | 40 +++++++++++++++++
>   3 files changed, 171 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index 1fcb93c94..4c44efec9 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -253,6 +253,94 @@ igt_vkms_t *igt_vkms_device_create(const char *name)
>   	return dev;
>   }
>   
> +/**
> + * igt_vkms_device_create_from_config:
> + * @cfg: Device configuration
> + *
> + * Create a VKMS device and set all the parameters specified by the
> + * configuration.
> + */
> +igt_vkms_t *igt_vkms_device_create_from_config(igt_vkms_config_t *cfg)
> +{
> +	igt_vkms_t *dev;
> +	igt_vkms_plane_config_t *plane;
> +	igt_vkms_crtc_config_t *crtc;
> +	igt_vkms_encoder_config_t *encoder;
> +	igt_vkms_connector_config_t *connector;
> +	const char *name;
> +	int n, i;
> +
> +	igt_debug("Creating device from configuration:\n");
> +	igt_debug("\t- Device name: %s\n", cfg->device_name);
> +
> +	dev = igt_vkms_device_create(cfg->device_name);
> +	if (!dev)
> +		return NULL;
> +
> +	for (n = 0; (crtc = &cfg->crtcs[n])->name; n++) {
> +		igt_debug("\t- CRTC %d:\n", n);
> +		igt_debug("\t\t- name: %s\n", crtc->name);
> +		igt_debug("\t\t- writeback: %d\n", crtc->writeback);
> +
> +		igt_vkms_device_add_crtc(dev, crtc->name);
> +		igt_vkms_crtc_set_writeback_enabled(dev, crtc->name,
> +						    crtc->writeback);
> +	}
> +
> +	for (n = 0; (plane = &cfg->planes[n])->name; n++) {
> +		igt_debug("\t- Plane %d:\n", n);
> +		igt_debug("\t\t- name: %s\n", plane->name);
> +		igt_debug("\t\t- type: %d\n", plane->type);
> +		igt_debug("\t\t- possible_crtcs:\n");
> +
> +		igt_vkms_device_add_plane(dev, plane->name);
> +		igt_vkms_plane_set_type(dev, plane->name, plane->type);
> +
> +		for (i = 0; (name = plane->possible_crtcs[i]); i++) {
> +			igt_debug("\t\t\t- %s\n", name);
> +
> +			igt_vkms_plane_attach_crtc(dev, plane->name, name);
> +		}
> +	}
> +
> +	for (n = 0; (encoder = &cfg->encoders[n])->name; n++) {
> +		igt_debug("\t- Encoder %d:\n", n);
> +		igt_debug("\t\t- name: %s\n", encoder->name);
> +		igt_debug("\t\t- possible_crtcs:\n");
> +
> +		igt_vkms_device_add_encoder(dev, encoder->name);
> +
> +		for (i = 0; (name = encoder->possible_crtcs[i]); i++) {
> +			igt_debug("\t\t\t- %s\n", name);
> +
> +			igt_vkms_encoder_attach_crtc(dev, encoder->name, name);
> +		}
> +	}
> +
> +	for (n = 0; (connector = &cfg->connectors[n])->name; n++) {
> +		if (connector->status == 0)
> +			connector->status = DRM_MODE_CONNECTED;
> +
> +		igt_debug("\t- Connector %d:\n", n);
> +		igt_debug("\t\t- name: %s\n", connector->name);
> +		igt_debug("\t\t- status: %d\n", connector->status);
> +		igt_debug("\t\t- possible_encoders:\n");
> +
> +		igt_vkms_device_add_connector(dev, connector->name);
> +		igt_vkms_connector_set_status(dev, connector->name,
> +					      connector->status);
> +
> +		for (i = 0; (name = connector->possible_encoders[i]); i++) {
> +			igt_debug("\t\t\t- %s\n", name);
> +
> +			igt_vkms_connector_attach_encoder(dev, connector->name,
> +							  name);
> +		}
> +	}
> +
> +	return dev;
> +}
> +
>   static int detach_pipeline_items(const char *path, const struct stat *info,
>   				 const int typeflag, struct FTW *pathinfo)
>   {
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 1ef62125f..79edabe81 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -10,6 +10,8 @@
>   
>   #include <stdbool.h>
>   
> +#define VKMS_MAX_PIPELINE_ITEMS	40
> +
>   /**
>    * igt_vkms_t:
>    * @path: VKMS root directory inside configfs mounted directory
> @@ -20,9 +22,50 @@ typedef struct igt_vkms {
>   	char *path;
>   } igt_vkms_t;
>   
> +typedef struct igt_vkms_crtc_config {
> +	const char *name;
> +	bool writeback; /* Default: false */
> +} igt_vkms_crtc_config_t;
> +
> +typedef struct igt_vkms_plane_config {
> +	const char *name;
> +	int type; /* Default: DRM_PLANE_TYPE_OVERLAY */
> +	const char *possible_crtcs[VKMS_MAX_PIPELINE_ITEMS];
> +} igt_vkms_plane_config_t;
> +
> +typedef struct igt_vkms_encoder_config {
> +	const char *name;
> +	const char *possible_crtcs[VKMS_MAX_PIPELINE_ITEMS];
> +} igt_vkms_encoder_config_t;
> +
> +typedef struct igt_vkms_connector_config {
> +	const char *name;
> +	int status; /* Default: DRM_MODE_CONNECTED */
> +	const char *possible_encoders[VKMS_MAX_PIPELINE_ITEMS];
> +} igt_vkms_connector_config_t;
> +
> +/**
> + * igt_vkms_config_t:
> + * @device_name: Device name
> + * @planes: NULL terminated list of plane configurations
> + * @crtcs: NULL terminated list of CRTC configurations
> + * @encoders: NULL terminated list of encoders configurations
> + * @connectors: NULL terminated list of connector configurations
> + *
> + * Structure used to create a VKMS device from a static configuration.
> + */
> +typedef struct igt_vkms_config {
> +	const char *device_name;
> +	igt_vkms_plane_config_t planes[VKMS_MAX_PIPELINE_ITEMS];
> +	igt_vkms_crtc_config_t crtcs[VKMS_MAX_PIPELINE_ITEMS];
> +	igt_vkms_encoder_config_t encoders[VKMS_MAX_PIPELINE_ITEMS];
> +	igt_vkms_connector_config_t connectors[VKMS_MAX_PIPELINE_ITEMS];
> +} igt_vkms_config_t;
> +
>   void igt_require_vkms_configfs(void);
>   
>   igt_vkms_t *igt_vkms_device_create(const char *name);
> +igt_vkms_t *igt_vkms_device_create_from_config(igt_vkms_config_t *cfg);
>   void igt_vkms_device_destroy(igt_vkms_t *dev);
>   void igt_vkms_destroy_all_devices(void);
>   
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 87d660fff..47cfa475f 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -748,6 +748,45 @@ static void test_enable_no_pipeline_items(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-no-planes
> + * Description: Try to enable a VKMS device without adding planes and test that
> + *              it fails.
> + */
> +
> +static void test_enable_no_planes(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = { {} },
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +			{ .name = "crtc1" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0", "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);

I just though about it, maybe it could be nice to have a 
/my-vkms/config-valid, that returns the status of the current configuration.
No need to add it to your current vkms-configfs series, I can do it later.

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -771,6 +810,7 @@ igt_main
>   		{ "attach-encoder-to-crtc", test_attach_encoder_to_crtc },
>   		{ "attach-connector-to-encoder", test_attach_connector_to_encoder },
>   		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
> +		{ "enable-no-planes", test_enable_no_planes },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 22/39] tests/vkms_configfs: Test adding too many planes
  2025-02-18 16:49 ` [PATCH i-g-t 22/39] tests/vkms_configfs: Test adding too many planes José Expósito
@ 2025-02-27 14:53   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 14:53 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> The kernel references pipeline items with 32 bit bitmaks, therefore,
> adding more than 31 items causes an overflow.
> 
> Make sure that this limit is handled correctly.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   tests/vkms/vkms_configfs.c | 53 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 53 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 47cfa475f..7df9bda01 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -787,6 +787,58 @@ static void test_enable_no_planes(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-too-many-planes
> + * Description: Try to enable a VKMS device with too many planes and test that
> + *              it fails.
> + */
> +
> +static void test_enable_too_many_planes(void)
> +{
> +	igt_vkms_t *dev;
> +	char plane_names[VKMS_MAX_PIPELINE_ITEMS][8];
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0" },
> +			},
> +		},
> +	};
> +
> +	for (int n = 1; n < 32; n++) {
> +		snprintf(plane_names[n], sizeof(plane_names[n]), "plane%d", n);
> +		cfg.planes[n] = (igt_vkms_plane_config_t){
> +			.name = plane_names[n],
> +			.possible_crtcs = { "crtc0" },
> +		};
> +	}
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -811,6 +863,7 @@ igt_main
>   		{ "attach-connector-to-encoder", test_attach_connector_to_encoder },
>   		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
>   		{ "enable-no-planes", test_enable_no_planes },
> +		{ "enable-too-many-planes", test_enable_too_many_planes },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 23/39] tests/vkms_configfs: Test not adding a primary plane
  2025-02-18 16:49 ` [PATCH i-g-t 23/39] tests/vkms_configfs: Test not adding a primary plane José Expósito
@ 2025-02-27 14:54   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 14:54 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Try to enable a VKMS device without a primary plane for one of its
> CRTCs and test that it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 51 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 7df9bda01..fa20a364f 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -839,6 +839,56 @@ static void test_enable_too_many_planes(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-no-primary-plane
> + * Description: Try to enable a VKMS device without a primary plane for one of
> + *              its CRTCs and test that it fails.
> + */
> +
> +static void test_enable_no_primary_plane(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +			{
> +				.name = "plane1",
> +				.type = DRM_PLANE_TYPE_CURSOR,
> +				.possible_crtcs = { "crtc1" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +			{ .name = "crtc1" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0", "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -864,6 +914,7 @@ igt_main
>   		{ "enable-no-pipeline-items", test_enable_no_pipeline_items },
>   		{ "enable-no-planes", test_enable_no_planes },
>   		{ "enable-too-many-planes", test_enable_too_many_planes },
> +		{ "enable-no-primary-plane", test_enable_no_primary_plane },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 24/39] tests/vkms_configfs: Test adding multiple primary planes
  2025-02-18 16:49 ` [PATCH i-g-t 24/39] tests/vkms_configfs: Test adding multiple primary planes José Expósito
@ 2025-02-27 15:00   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:00 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Try to enable a VKMS device with multiple primary planes for one of its
> CRTCs and test that it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   tests/vkms/vkms_configfs.c | 56 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 56 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index fa20a364f..c93ebadb3 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -889,6 +889,61 @@ static void test_enable_no_primary_plane(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-multiple-primary-planes
> + * Description: Try to enable a VKMS device with multiple primary planes for one
> + *              of its CRTCs and test that it fails.
> + */
> +
> +static void test_enable_multiple_primary_planes(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +			{
> +				.name = "plane1",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc1" },
> +			},
> +			{
> +				.name = "plane2",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc1" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +			{ .name = "crtc1" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0", "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -915,6 +970,7 @@ igt_main
>   		{ "enable-no-planes", test_enable_no_planes },
>   		{ "enable-too-many-planes", test_enable_too_many_planes },
>   		{ "enable-no-primary-plane", test_enable_no_primary_plane },
> +		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 25/39] tests/vkms_configfs: Test adding multiple cursor planes
  2025-02-18 16:49 ` [PATCH i-g-t 25/39] tests/vkms_configfs: Test adding multiple cursor planes José Expósito
@ 2025-02-27 15:00   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:00 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Try to enable a VKMS device with multiple cursor planes for one of its
> CRTCs and test that it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   tests/vkms/vkms_configfs.c | 61 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 61 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index c93ebadb3..dcd0bb5ec 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -944,6 +944,66 @@ static void test_enable_multiple_primary_planes(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-multiple-cursor-planes
> + * Description: Try to enable a VKMS device with multiple cursor planes for one
> + *              of its CRTCs and test that it fails.
> + */
> +
> +static void test_enable_multiple_cursor_planes(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +			{
> +				.name = "plane1",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc1" },
> +			},
> +			{
> +				.name = "plane2",
> +				.type = DRM_PLANE_TYPE_CURSOR,
> +				.possible_crtcs = { "crtc1" },
> +			},
> +			{
> +				.name = "plane3",
> +				.type = DRM_PLANE_TYPE_CURSOR,
> +				.possible_crtcs = { "crtc1" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +			{ .name = "crtc1" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0", "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -971,6 +1031,7 @@ igt_main
>   		{ "enable-too-many-planes", test_enable_too_many_planes },
>   		{ "enable-no-primary-plane", test_enable_no_primary_plane },
>   		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
> +		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 26/39] tests/vkms_configfs: Test adding a plane without possible CRTCs
  2025-02-18 16:49 ` [PATCH i-g-t 26/39] tests/vkms_configfs: Test adding a plane without possible CRTCs José Expósito
@ 2025-02-27 15:01   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:01 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Try to enable a VKMS device with a plane without possible CRTCs and test
> that it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@boolin.com>

> ---
>   tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 51 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index dcd0bb5ec..7d6437c87 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1004,6 +1004,56 @@ static void test_enable_multiple_cursor_planes(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-plane-no-crtcs
> + * Description: Try to enable a VKMS device with a plane without possible CRTCs
> + *              and test that it fails.
> + */
> +
> +static void test_enable_plane_no_crtcs(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +			{
> +				.name = "plane1",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = {},
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +			{ .name = "crtc1" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0", "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1032,6 +1082,7 @@ igt_main
>   		{ "enable-no-primary-plane", test_enable_no_primary_plane },
>   		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
>   		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
> +		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 30/39] tests/vkms_configfs: Test enabling a device with too many encoders
  2025-02-18 16:50 ` [PATCH i-g-t 30/39] tests/vkms_configfs: Test enabling a device with too many encoders José Expósito
@ 2025-02-27 15:05   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:05 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Try to enable a VKMS device with too many encoders and test that it
> fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@boolin.com>

> ---
>   tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 51 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index ffbc3b133..8f1f46f90 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1185,6 +1185,56 @@ static void test_enable_no_encoders(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-too-many-encoders
> + * Description: Try to enable a VKMS device with too many encoders and test that
> + *              it fails.
> + */
> +
> +static void test_enable_too_many_encoders(void)
> +{
> +	igt_vkms_t *dev;
> +	char encoder_names[VKMS_MAX_PIPELINE_ITEMS][10];
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +		},
> +		.encoders = {},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0" },
> +			},
> +		},
> +	};
> +
> +	for (int n = 0; n < 32; n++) {
> +		snprintf(encoder_names[n], sizeof(encoder_names[n]), "encoder%d", n);
> +		cfg.encoders[n] = (igt_vkms_encoder_config_t){
> +			.name = encoder_names[n],
> +			.possible_crtcs = { "crtc0" }
> +		};
> +	}
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1217,6 +1267,7 @@ igt_main
>   		{ "enable-no-crtcs", test_enable_no_crtcs },
>   		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
>   		{ "enable-no-encoders", test_enable_no_encoders },
> +		{ "enable-too-many-encoders", test_enable_too_many_encoders },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 29/39] tests/vkms_configfs: Test enabling a device without encoders
  2025-02-18 16:50 ` [PATCH i-g-t 29/39] tests/vkms_configfs: Test enabling a device without encoders José Expósito
@ 2025-02-27 15:05   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:05 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Try to enable a VKMS device without adding encoders and test that it
> fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   tests/vkms/vkms_configfs.c | 42 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 42 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index eb6ebfba1..ffbc3b133 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1144,6 +1144,47 @@ static void test_enable_too_many_crtcs(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-no-encoders
> + * Description: Try to enable a VKMS device without adding encoders and test
> + *              that it fails.
> + */
> +
> +static void test_enable_no_encoders(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +		},
> +		.encoders = { {} },

Is this empty item normal?

> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = {},
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1175,6 +1216,7 @@ igt_main
>   		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
>   		{ "enable-no-crtcs", test_enable_no_crtcs },
>   		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
> +		{ "enable-no-encoders", test_enable_no_encoders },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 28/39] tests/vkms_configfs: Test enabling a device with too many CRTCs
  2025-02-18 16:50 ` [PATCH i-g-t 28/39] tests/vkms_configfs: Test enabling a device with too many CRTCs José Expósito
@ 2025-02-27 15:05   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:05 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Try to enable a VKMS device with too many CRTCs and test that it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@boolin.com>

> ---
>   tests/vkms/vkms_configfs.c | 50 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 50 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 59365c91b..eb6ebfba1 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1095,6 +1095,55 @@ static void test_enable_no_crtcs(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-too-many-crtcs
> + * Description: Try to enable a VKMS device with too many CRTCs and test that it
> + *              fails.
> + */
> +
> +static void test_enable_too_many_crtcs(void)
> +{
> +	igt_vkms_t *dev;
> +	char crtc_names[VKMS_MAX_PIPELINE_ITEMS][7];
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +		},
> +		.crtcs = {},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0" },
> +			},
> +		},
> +	};
> +
> +	for (int n = 0; n < 32; n++) {
> +		snprintf(crtc_names[n], sizeof(crtc_names[n]), "crtc%d", n);
> +		cfg.crtcs[n] = (igt_vkms_crtc_config_t){
> +			.name = crtc_names[n],
> +		};
> +	}
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1125,6 +1174,7 @@ igt_main
>   		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
>   		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
>   		{ "enable-no-crtcs", test_enable_no_crtcs },
> +		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 31/39] tests/vkms_configfs: Test adding an encoder without possible CRTCs
  2025-02-18 16:50 ` [PATCH i-g-t 31/39] tests/vkms_configfs: Test adding an encoder without possible CRTCs José Expósito
@ 2025-02-27 15:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Try to enable a VKMS device with an encoder without possible CRTCs and
> test that it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com>

> ---
>   tests/vkms/vkms_configfs.c | 44 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 44 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 8f1f46f90..11ed6dbcb 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1235,6 +1235,49 @@ static void test_enable_too_many_encoders(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-encoder-no-crtcs
> + * Description: Try to enable a VKMS device with an encoder without possible
> + *              CRTCs and test that it fails.
> + */
> +
> +static void test_enable_encoder_no_crtcs(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = {} },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1268,6 +1311,7 @@ igt_main
>   		{ "enable-too-many-crtcs", test_enable_too_many_crtcs },
>   		{ "enable-no-encoders", test_enable_no_encoders },
>   		{ "enable-too-many-encoders", test_enable_too_many_encoders },
> +		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 32/39] tests/vkms_configfs: Test adding a CRTC without encoders
  2025-02-18 16:50 ` [PATCH i-g-t 32/39] tests/vkms_configfs: Test adding a CRTC without encoders José Expósito
@ 2025-02-27 15:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Try to enable a VKMS device with a CRTC without encoders and test that
> it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@boolin.com>

> ---
>   tests/vkms/vkms_configfs.c | 51 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 51 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 11ed6dbcb..e003e0ca0 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1278,6 +1278,56 @@ static void test_enable_encoder_no_crtcs(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-crtc-no-encoder
> + * Description: Try to enable a VKMS device with a CRTC without encoders and
> + *              test that it fails.
> + */
> +
> +static void test_enable_crtc_no_encoder(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +			{
> +				.name = "plane1",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc1" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +			{ .name = "crtc1" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc0" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0", "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1312,6 +1362,7 @@ igt_main
>   		{ "enable-no-encoders", test_enable_no_encoders },
>   		{ "enable-too-many-encoders", test_enable_too_many_encoders },
>   		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
> +		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 33/39] tests/vkms_configfs: Test enabling a device without connectors
  2025-02-18 16:50 ` [PATCH i-g-t 33/39] tests/vkms_configfs: Test enabling a device without connectors José Expósito
@ 2025-02-27 15:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Enable a VKMS device without adding connectors and test that it is
> created with the specified configuration.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@boolin.com>

> ---
>   tests/vkms/vkms_configfs.c | 39 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 39 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index e003e0ca0..3ad3df584 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1328,6 +1328,44 @@ static void test_enable_crtc_no_encoder(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-no-connectors
> + * Description: Try to enable a VKMS device without adding connectors and test
> + *              that it fails.
> + */
> +
> +static void test_enable_no_connectors(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0"},
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +		},
> +		.connectors = { },
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1363,6 +1401,7 @@ igt_main
>   		{ "enable-too-many-encoders", test_enable_too_many_encoders },
>   		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
>   		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
> +		{ "enable-no-connectors", test_enable_no_connectors },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 34/39] tests/vkms_configfs: Test enabling a device with too many connectors
  2025-02-18 16:50 ` [PATCH i-g-t 34/39] tests/vkms_configfs: Test enabling a device with too many connectors José Expósito
@ 2025-02-27 15:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Try to enable a VKMS device with too many connectors and test that it
> fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

Reviewed-by: Louis Chauvet <louis.chauvet@boolin.com>

> ---
>   tests/vkms/vkms_configfs.c | 49 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 49 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 3ad3df584..5a5f85ef3 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1366,6 +1366,54 @@ static void test_enable_no_connectors(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-too-many-connectors
> + * Description: Try to enable a VKMS device with too many connectors and test
> + *              that it fails.
> + */
> +
> +static void test_enable_too_many_connectors(void)
> +{
> +	igt_vkms_t *dev;
> +	char connector_names[VKMS_MAX_PIPELINE_ITEMS][12];
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0" },
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +		},
> +		.connectors = {},
> +	};
> +
> +	for (int n = 0; n < 32; n++) {
> +		snprintf(connector_names[n], sizeof(connector_names[n]),
> +			 "connector%d", n);
> +		cfg.connectors[n] = (igt_vkms_connector_config_t){
> +			.name = connector_names[n],
> +			.possible_encoders = { "encoder0" }
> +		};
> +	}
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1402,6 +1450,7 @@ igt_main
>   		{ "enable-encoder-no-crtcs", test_enable_encoder_no_crtcs },
>   		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
>   		{ "enable-no-connectors", test_enable_no_connectors },
> +		{ "enable-too-many-connectors", test_enable_too_many_connectors },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 27/39] tests/vkms_configfs: Test enabling a device without CRTCs
  2025-02-18 16:49 ` [PATCH i-g-t 27/39] tests/vkms_configfs: Test enabling a device without CRTCs José Expósito
@ 2025-02-27 15:15   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-27 15:15 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:49, José Expósito a écrit :
> Try to enable a VKMS device without adding CRTCs and test that it fails.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   tests/vkms/vkms_configfs.c | 42 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 42 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 7d6437c87..59365c91b 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1054,6 +1054,47 @@ static void test_enable_plane_no_crtcs(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enable-no-crtcs
> + * Description: Try to enable a VKMS device without adding CRTCs and test that
> + *              it fails.
> + */
> +
> +static void test_enable_no_crtcs(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = {},
> +			},
> +		},
> +		.crtcs = { {} },

Again, a strange empty item in crtcs, is it normal?

> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(!igt_vkms_device_is_enabled(dev));
> +	igt_assert(!device_exists(__func__));
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1083,6 +1124,7 @@ igt_main
>   		{ "enable-multiple-primary-planes", test_enable_multiple_primary_planes },
>   		{ "enable-multiple-cursor-planes", test_enable_multiple_cursor_planes },
>   		{ "enable-plane-no-crtcs", test_enable_plane_no_crtcs },
> +		{ "enable-no-crtcs", test_enable_no_crtcs },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items
  2025-02-27 13:06   ` Louis Chauvet
@ 2025-02-28  1:47     ` Greg Kroah-Hartman
  2025-02-28 11:58       ` José Expósito
  0 siblings, 1 reply; 84+ messages in thread
From: Greg Kroah-Hartman @ 2025-02-28  1:47 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: José Expósito, igt-dev, Thomas Zimmermann

On Thu, Feb 27, 2025 at 02:06:23PM +0100, Louis Chauvet wrote:
> 
> 
> Le 18/02/2025 à 17:49, José Expósito a écrit :
> > It shouldn't be possible to enable a device without creating and
> > attaching its pipeline items.
> > 
> > Test that the device is not enabled and also that no actual device was
> > created using libdrm.
> > 
> > Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> > ---
> >   tests/vkms/vkms_configfs.c | 60 ++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 60 insertions(+)
> > 
> > diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> > index dc3dbe80d..87d660fff 100644
> > --- a/tests/vkms/vkms_configfs.c
> > +++ b/tests/vkms/vkms_configfs.c
> > @@ -108,6 +108,42 @@ static bool attach(const char *src_path, const char *dst_path,
> >   	return ret == 0;
> >   }
> > +static drmDevicePtr find_device(const char *name, drmDevicePtr *devices,
> > +				int n_devices)
> > +{
> > +	drmDevicePtr dev;
> > +	const char *dev_name;
> > +
> > +	for (int i = 0; i < n_devices; i++) {
> > +		dev = devices[i];
> > +
> > +		if (!(dev->available_nodes & BIT(DRM_NODE_PRIMARY)))
> > +			continue;
> > +
> > +		if (dev->bustype != DRM_BUS_PLATFORM)
> > +			continue;
> 
> Hummm, I think this may have issues with the change proposed by Greg in [1],
> I don't know how the drmDevicePtr should look like with the new faux_device
> struct.
> 
> The declaration in xf86drm.h is:
> 
> typedef struct _drmDevice {
>     char **nodes; /* DRM_NODE_MAX sized array */
>     int available_nodes; /* DRM_NODE_* bitmask */
>     int bustype;
>     union {
>         drmPciBusInfoPtr pci;
>         drmUsbBusInfoPtr usb;
>         drmPlatformBusInfoPtr platform;
>         drmHost1xBusInfoPtr host1x;
>     } businfo;
>     union {
>         drmPciDeviceInfoPtr pci;
>         drmUsbDeviceInfoPtr usb;
>         drmPlatformDeviceInfoPtr platform;
>         drmHost1xDeviceInfoPtr host1x;
>     } deviceinfo;
> } drmDevice, *drmDevicePtr;

Why does a drm device care about what type of "bus" it lives on?  That's
not the user/kernel api to the drm device, the drm api is the way the
device is handled.

Why not just treat it like any other "new bus" that gets written?  What
happens if a bus type shows up in the kernel that no one has seen yet in
this userspace code, and exposes a drm device node?  Why would that not
"just work"?

thanks,

greg k-h

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

* Re: [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes
  2025-02-18 16:50 ` [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes José Expósito
@ 2025-02-28  8:51   ` Louis Chauvet
  2025-02-28 11:52     ` José Expósito
  0 siblings, 1 reply; 84+ messages in thread
From: Louis Chauvet @ 2025-02-28  8:51 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Test that, once a VKMS device is enabled, the plane values can't change
> and that deleting it or the attached CRTCs doesn't change the VKMS
> device.
> 
> Add a function that performs a basic validation checking that the
> device created matches the expected one.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>

The next tests don't pass on my VM, can you share details on your setup? 
(kernel branch, architecture)

> ---
>   lib/igt_vkms.c             |  27 +++++++
>   lib/igt_vkms.h             |   1 +
>   tests/vkms/vkms_configfs.c | 147 +++++++++++++++++++++++++++++++++++++
>   3 files changed, 175 insertions(+)
> 
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> index 4c44efec9..3dab7a823 100644
> --- a/lib/igt_vkms.c
> +++ b/lib/igt_vkms.c
> @@ -152,6 +152,21 @@ static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
>   		     path, errno, strerror(errno));
>   }
>   
> +static bool remove_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
> +				 const char *name)
> +{
> +	const char *item_dir_name;
> +	char path[PATH_MAX];
> +	int ret;
> +
> +	item_dir_name = get_pipeline_item_dir_name(item);
> +	snprintf(path, sizeof(path), "%s/%s/%s", dev->path, item_dir_name,
> +		 name);
> +
> +	ret = rmdir(path);
> +	return ret == 0;
> +}
> +
>   static bool attach_pipeline_item(igt_vkms_t *dev,
>   				 enum vkms_pipeline_item src_item,
>   				 const char *src_item_name,
> @@ -474,6 +489,18 @@ void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name)
>   	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
>   }
>   
> +/**
> + * igt_vkms_device_remove_plane:
> + * @dev: Device to remove the plane from
> + * @name: Plane name
> + *
> + * Remove an existing plane from the VKMS device.
> + */
> +bool igt_vkms_device_remove_plane(igt_vkms_t *dev, const char *name)
> +{
> +	return remove_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, name);
> +}
> +
>   /**
>    * igt_vkms_plane_get_type:
>    * @dev: Device the plane belongs to
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> index 79edabe81..03f9cb339 100644
> --- a/lib/igt_vkms.h
> +++ b/lib/igt_vkms.h
> @@ -73,6 +73,7 @@ bool igt_vkms_device_is_enabled(igt_vkms_t *dev);
>   void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
>   
>   void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
> +bool igt_vkms_device_remove_plane(igt_vkms_t *dev, const char *name);
>   int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
>   void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
>   bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 5a5f85ef3..066911715 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -144,6 +144,89 @@ static bool device_exists(const char *name)
>   	return exists;
>   }
>   
> +static void assert_device_config(igt_vkms_config_t *cfg)
> +{
> +	drmDevicePtr devices[64];
> +	drmDevicePtr dev;
> +	drmModeResPtr res;
> +	drmModePlaneResPtr plane_res;
> +	drmModeConnectorPtr connector_res;
> +	igt_vkms_crtc_config_t *crtc;
> +	igt_vkms_connector_config_t *connector;
> +	int n_devices;
> +	int n_planes = 0;
> +	int n_crtcs = 0;
> +	int n_encoders = 0;
> +	int n_connectors = 0;
> +	int n_connector_status_cfg[4] = {0};
> +	int n_connector_status_drm[4] = {0};
> +	int fd;
> +
> +	n_devices = drmGetDevices(devices, ARRAY_SIZE(devices));
> +
> +	dev = find_device(cfg->device_name, devices, n_devices);
> +	igt_assert_f(dev, "Device '%s' not found\n", cfg->device_name);
> +
> +	fd = open(dev->nodes[DRM_NODE_PRIMARY], O_RDONLY);
> +	igt_assert_f(fd >= 0, "Error opening device '%s' at path '%s'\n",
> +		     cfg->device_name, dev->nodes[DRM_NODE_PRIMARY]);
> +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1),
> +		     "Error setting DRM_CLIENT_CAP_UNIVERSAL_PLANES\n");
> +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1),
> +		     "Error setting DRM_CLIENT_CAP_ATOMIC\n");
> +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1),
> +		     "Error setting DRM_CLIENT_CAP_WRITEBACK_CONNECTORS\n");
> +
> +	res = drmModeGetResources(fd);
> +	igt_assert_f(res, "Error getting resources\n");
> +	plane_res = drmModeGetPlaneResources(fd);
> +	igt_assert_f(plane_res, "Error getting plane resources\n");
> +
> +	for (int n = 0; (&cfg->planes[n])->name; n++)
> +		n_planes++;
> +
> +	for (int n = 0; (crtc = &cfg->crtcs[n])->name; n++) {
> +		n_crtcs++;
> +
> +		if (crtc->writeback) {
> +			n_encoders++;
> +			n_connectors++;
> +			n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION]++;
> +		}
> +	}
> +
> +	for (int n = 0; (&cfg->encoders[n])->name; n++)
> +		n_encoders++;
> +
> +	for (int n = 0; (connector = &cfg->connectors[n])->name; n++) {
> +		n_connectors++;
> +		n_connector_status_cfg[connector->status]++;
> +	}
> +
> +	for (int n = 0; n < res->count_connectors; n++) {
> +		connector_res = drmModeGetConnectorCurrent(fd,
> +							   res->connectors[n]);
> +		n_connector_status_drm[connector_res->connection]++;
> +		drmModeFreeConnector(connector_res);
> +	}

I think the main issue here is something I already observed: you need to 
force probe the connector status (and in this test you really want to do 
it), so you should use `drmModeGetConnector`.

I just tested, it seems to work, except for the last test about 
connector hotplug (see my review).

> +
> +	igt_assert_eq(n_planes, plane_res->count_planes);
> +	igt_assert_eq(n_crtcs, res->count_crtcs);
> +	igt_assert_eq(n_encoders, res->count_encoders);
> +	igt_assert_eq(n_connectors, res->count_connectors);
> +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_CONNECTED],
> +		      n_connector_status_drm[DRM_MODE_CONNECTED]);
> +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_DISCONNECTED],
> +		      n_connector_status_drm[DRM_MODE_DISCONNECTED]);
> +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION],
> +		      n_connector_status_drm[DRM_MODE_UNKNOWNCONNECTION]);

^ Fails on those asserts

> +
> +	drmModeFreePlaneResources(plane_res);
> +	drmModeFreeResources(res);
> +	close(fd);
> +	drmFreeDevices(devices, n_devices);
> +}
> +
>   /**
>    * SUBTEST: device-default-files
>    * Description: Test that creating a VKMS device creates the default files and
> @@ -1414,6 +1497,69 @@ static void test_enable_too_many_connectors(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enabled-plane-cannot-change
> + * Description: Test that, once a VKMS device is enabled, the plane values can't
> + *              change and that deleting it or the attached CRTCs doesn't change
> + *              the VKMS device.
> + */
> +
> +static void test_enabled_plane_cannot_change(void)
> +{
> +	igt_vkms_t *dev;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0"},
> +			},
> +			{
> +				.name = "plane1",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc1"},
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0" },
> +			{ .name = "crtc1" },
> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.possible_encoders = { "encoder0", "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(igt_vkms_device_is_enabled(dev));
> +	assert_device_config(&cfg);
> +
> +	/* Try to change values */
> +	igt_vkms_plane_set_type(dev, "plane0", DRM_PLANE_TYPE_OVERLAY);
> +	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
> +		      DRM_PLANE_TYPE_PRIMARY);
> +
> +	igt_assert(!igt_vkms_plane_attach_crtc(dev, "plane0", "crtc1"));
> +
> +	/* Deleting pipeline items doesn't affect the device */
> +	igt_assert(igt_vkms_plane_detach_crtc(dev, "plane0", "crtc0"));
> +	igt_assert(igt_vkms_device_remove_plane(dev, "plane0"));
> +	assert_device_config(&cfg);
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1451,6 +1597,7 @@ igt_main
>   		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
>   		{ "enable-no-connectors", test_enable_no_connectors },
>   		{ "enable-too-many-connectors", test_enable_too_many_connectors },
> +		{ "enabled-plane-cannot-change", test_enabled_plane_cannot_change },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



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

* Re: [PATCH i-g-t 39/39] tests/vkms_configfs: Test connector hot-plug
  2025-02-18 16:50 ` [PATCH i-g-t 39/39] tests/vkms_configfs: Test connector hot-plug José Expósito
@ 2025-02-28  8:51   ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-28  8:51 UTC (permalink / raw)
  To: José Expósito, igt-dev



Le 18/02/2025 à 17:50, José Expósito a écrit :
> Test that, once a VKMS device is enabled, the connectors can be
> hot-plugged and hot-unplugged.
> 
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>   tests/vkms/vkms_configfs.c | 84 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 84 insertions(+)
> 
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> index 47a6a81ff..16922b62b 100644
> --- a/tests/vkms/vkms_configfs.c
> +++ b/tests/vkms/vkms_configfs.c
> @@ -1738,6 +1738,89 @@ static void test_enabled_connector_cannot_change(void)
>   	igt_vkms_device_destroy(dev);
>   }
>   
> +/**
> + * SUBTEST: enabled-connector-hot-plug
> + * Description: Test that, once a VKMS device is enabled, the connectors can be
> + *              hot-plugged and unplugged.
> + */
> +
> +static void test_enabled_connector_hot_plug(void)
> +{
> +	igt_vkms_t *dev;
> +	drmModeConnection status;
> +
> +	igt_vkms_config_t cfg = {
> +		.device_name = __func__,
> +		.planes = {
> +			{
> +				.name = "plane0",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc0"},
> +			},
> +			{
> +				.name = "plane1",
> +				.type = DRM_PLANE_TYPE_PRIMARY,
> +				.possible_crtcs = { "crtc1"},
> +			},
> +		},
> +		.crtcs = {
> +			{ .name = "crtc0", .writeback = true },
> +			{ .name = "crtc1", .writeback = true },

This test fails because of:
- the reason I presented in 35/39
- writeback=true creates two more connectors, which break your function 
assert_device_config.

Dirty fix (that work): remove writeback=true
Correct fix: correct the assert_device_config function to count how much 
writeback connectors are expected

Thanks a lot for all of those tests, straightforward to understand!

Louis Chauvet

> +		},
> +		.encoders = {
> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> +		},
> +		.connectors = {
> +			{
> +				.name = "connector0",
> +				.status = DRM_MODE_DISCONNECTED,
> +				.possible_encoders = { "encoder0" },
> +			},
> +			{
> +				.name = "connector1",
> +				.status = DRM_MODE_DISCONNECTED,
> +				.possible_encoders = { "encoder1" },
> +			},
> +		},
> +	};
> +
> +	dev = igt_vkms_device_create_from_config(&cfg);
> +	igt_assert(dev);
> +
> +	igt_vkms_device_set_enabled(dev, true);
> +	igt_assert(igt_vkms_device_is_enabled(dev));
> +	assert_device_config(&cfg);
> +
> +	/* Connect both connectors */
> +	cfg.connectors[0].status = DRM_MODE_CONNECTED;
> +	igt_vkms_connector_set_status(dev, "connector0", DRM_MODE_CONNECTED);
> +	status = igt_vkms_connector_get_status(dev, "connector0");
> +	igt_assert_eq(status, DRM_MODE_CONNECTED);
> +	assert_device_config(&cfg);
> +
> +	cfg.connectors[1].status = DRM_MODE_CONNECTED;
> +	igt_vkms_connector_set_status(dev, "connector1", DRM_MODE_CONNECTED);
> +	status = igt_vkms_connector_get_status(dev, "connector1");
> +	igt_assert_eq(status, DRM_MODE_CONNECTED);
> +	assert_device_config(&cfg);
> +
> +	/* Set one to unknown connection and disconnect the other one */
> +	cfg.connectors[0].status = DRM_MODE_UNKNOWNCONNECTION;
> +	igt_vkms_connector_set_status(dev, "connector0", DRM_MODE_UNKNOWNCONNECTION);
> +	status = igt_vkms_connector_get_status(dev, "connector0");
> +	igt_assert_eq(status, DRM_MODE_UNKNOWNCONNECTION);
> +	assert_device_config(&cfg);
> +
> +	cfg.connectors[1].status = DRM_MODE_DISCONNECTED;
> +	igt_vkms_connector_set_status(dev, "connector1", DRM_MODE_DISCONNECTED);
> +	status = igt_vkms_connector_get_status(dev, "connector1");
> +	igt_assert_eq(status, DRM_MODE_DISCONNECTED);
> +	assert_device_config(&cfg);
> +
> +	igt_vkms_device_destroy(dev);
> +}
> +
>   igt_main
>   {
>   	struct {
> @@ -1779,6 +1862,7 @@ igt_main
>   		{ "enabled-crtc-cannot-change", test_enabled_crtc_cannot_change },
>   		{ "enabled-encoder-cannot-change", test_enabled_encoder_cannot_change },
>   		{ "enabled-connector-cannot-change", test_enabled_connector_cannot_change },
> +		{ "enabled-connector-hot-plug", test_enabled_connector_hot_plug },
>   	};
>   
>   	igt_fixture {

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* Re: [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes
  2025-02-28  8:51   ` Louis Chauvet
@ 2025-02-28 11:52     ` José Expósito
  2025-02-28 22:15       ` Louis Chauvet
  0 siblings, 1 reply; 84+ messages in thread
From: José Expósito @ 2025-02-28 11:52 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev

Hi Louis,

Thanks a lot for reviewing this series, there were a ton of
patches. I hope they were easy enough to understand :)

I won't have time to look into all of your reviews this week,
but I'll try to at least anwser to this one as I see you are
finding some test failures.

On Fri, Feb 28, 2025 at 09:51:47AM +0100, Louis Chauvet wrote:
> 
> 
> Le 18/02/2025 à 17:50, José Expósito a écrit :
> > Test that, once a VKMS device is enabled, the plane values can't change
> > and that deleting it or the attached CRTCs doesn't change the VKMS
> > device.
> > 
> > Add a function that performs a basic validation checking that the
> > device created matches the expected one.
> > 
> > Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> 
> The next tests don't pass on my VM, can you share details on your setup?
> (kernel branch, architecture)

I'm testing on a QEMU VM (x86_64), using this kernel branch [1], which
is basically [2] + [3].

This is the script I'm using to run the IGT tests:

  $ meson setup build ; ninja -C build && \
     ssh -p 2222 jose@127.0.0.1 -t \
            'cd shared/igt-gpu-tools && \
            sudo modprobe vkms && \
            sudo systemctl isolate multi-user.target && \
            sudo IGT_DEVICE="sys:/sys/devices/platform/vkms" \
                ./build/tests/vkms/vkms_configfs ; \            
            sudo systemctl isolate graphical.target'

Basically, I build in the host and run on the VM by sharing the code
and builds in "shared/igt-gpu-tools" inside the VM.

[1] https://github.com/JoseExposito/linux/tree/patch-vkms-configfs
[2] https://lore.kernel.org/all/20250218101214.5790-1-jose.exposito89@gmail.com/
[3] https://lore.kernel.org/dri-devel/20250225175936.7223-1-jose.exposito89@gmail.com/T/

> > ---
> >   lib/igt_vkms.c             |  27 +++++++
> >   lib/igt_vkms.h             |   1 +
> >   tests/vkms/vkms_configfs.c | 147 +++++++++++++++++++++++++++++++++++++
> >   3 files changed, 175 insertions(+)
> > 
> > diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> > index 4c44efec9..3dab7a823 100644
> > --- a/lib/igt_vkms.c
> > +++ b/lib/igt_vkms.c
> > [...]
> > +static void assert_device_config(igt_vkms_config_t *cfg)
> > +{
> > +	drmDevicePtr devices[64];
> > +	drmDevicePtr dev;
> > +	drmModeResPtr res;
> > +	drmModePlaneResPtr plane_res;
> > +	drmModeConnectorPtr connector_res;
> > +	igt_vkms_crtc_config_t *crtc;
> > +	igt_vkms_connector_config_t *connector;
> > +	int n_devices;
> > +	int n_planes = 0;
> > +	int n_crtcs = 0;
> > +	int n_encoders = 0;
> > +	int n_connectors = 0;
> > +	int n_connector_status_cfg[4] = {0};
> > +	int n_connector_status_drm[4] = {0};
> > +	int fd;
> > +
> > +	n_devices = drmGetDevices(devices, ARRAY_SIZE(devices));
> > +
> > +	dev = find_device(cfg->device_name, devices, n_devices);
> > +	igt_assert_f(dev, "Device '%s' not found\n", cfg->device_name);
> > +
> > +	fd = open(dev->nodes[DRM_NODE_PRIMARY], O_RDONLY);
> > +	igt_assert_f(fd >= 0, "Error opening device '%s' at path '%s'\n",
> > +		     cfg->device_name, dev->nodes[DRM_NODE_PRIMARY]);
> > +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1),
> > +		     "Error setting DRM_CLIENT_CAP_UNIVERSAL_PLANES\n");
> > +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1),
> > +		     "Error setting DRM_CLIENT_CAP_ATOMIC\n");
> > +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1),
> > +		     "Error setting DRM_CLIENT_CAP_WRITEBACK_CONNECTORS\n");
> > +
> > +	res = drmModeGetResources(fd);
> > +	igt_assert_f(res, "Error getting resources\n");
> > +	plane_res = drmModeGetPlaneResources(fd);
> > +	igt_assert_f(plane_res, "Error getting plane resources\n");
> > +
> > +	for (int n = 0; (&cfg->planes[n])->name; n++)
> > +		n_planes++;
> > +
> > +	for (int n = 0; (crtc = &cfg->crtcs[n])->name; n++) {
> > +		n_crtcs++;
> > +
> > +		if (crtc->writeback) {
> > +			n_encoders++;
> > +			n_connectors++;
> > +			n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION]++;

I wonder why this is not working for you.

I see in your comment in 39/39 that you are not getting the right numner
of connectors when "crtc->writeback == true", but I'm adding them here.

Could add a log and check if this is actually the problem, please?

Best wishes,
Jose

> > +		}
> > +	}
> > +
> > +	for (int n = 0; (&cfg->encoders[n])->name; n++)
> > +		n_encoders++;
> > +
> > +	for (int n = 0; (connector = &cfg->connectors[n])->name; n++) {
> > +		n_connectors++;
> > +		n_connector_status_cfg[connector->status]++;
> > +	}
> > +
> > +	for (int n = 0; n < res->count_connectors; n++) {
> > +		connector_res = drmModeGetConnectorCurrent(fd,
> > +							   res->connectors[n]);
> > +		n_connector_status_drm[connector_res->connection]++;
> > +		drmModeFreeConnector(connector_res);
> > +	}
> 
> I think the main issue here is something I already observed: you need to
> force probe the connector status (and in this test you really want to do
> it), so you should use `drmModeGetConnector`.
> 
> I just tested, it seems to work, except for the last test about connector
> hotplug (see my review).
> 
> > +
> > +	igt_assert_eq(n_planes, plane_res->count_planes);
> > +	igt_assert_eq(n_crtcs, res->count_crtcs);
> > +	igt_assert_eq(n_encoders, res->count_encoders);
> > +	igt_assert_eq(n_connectors, res->count_connectors);
> > +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_CONNECTED],
> > +		      n_connector_status_drm[DRM_MODE_CONNECTED]);
> > +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_DISCONNECTED],
> > +		      n_connector_status_drm[DRM_MODE_DISCONNECTED]);
> > +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION],
> > +		      n_connector_status_drm[DRM_MODE_UNKNOWNCONNECTION]);
> 
> ^ Fails on those asserts
> 
> > +
> > +	drmModeFreePlaneResources(plane_res);
> > +	drmModeFreeResources(res);
> > +	close(fd);
> > +	drmFreeDevices(devices, n_devices);
> > +}
> > +
> >   /**
> >    * SUBTEST: device-default-files
> >    * Description: Test that creating a VKMS device creates the default files and
> > @@ -1414,6 +1497,69 @@ static void test_enable_too_many_connectors(void)
> >   	igt_vkms_device_destroy(dev);
> >   }
> > +/**
> > + * SUBTEST: enabled-plane-cannot-change
> > + * Description: Test that, once a VKMS device is enabled, the plane values can't
> > + *              change and that deleting it or the attached CRTCs doesn't change
> > + *              the VKMS device.
> > + */
> > +
> > +static void test_enabled_plane_cannot_change(void)
> > +{
> > +	igt_vkms_t *dev;
> > +
> > +	igt_vkms_config_t cfg = {
> > +		.device_name = __func__,
> > +		.planes = {
> > +			{
> > +				.name = "plane0",
> > +				.type = DRM_PLANE_TYPE_PRIMARY,
> > +				.possible_crtcs = { "crtc0"},
> > +			},
> > +			{
> > +				.name = "plane1",
> > +				.type = DRM_PLANE_TYPE_PRIMARY,
> > +				.possible_crtcs = { "crtc1"},
> > +			},
> > +		},
> > +		.crtcs = {
> > +			{ .name = "crtc0" },
> > +			{ .name = "crtc1" },
> > +		},
> > +		.encoders = {
> > +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
> > +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
> > +		},
> > +		.connectors = {
> > +			{
> > +				.name = "connector0",
> > +				.possible_encoders = { "encoder0", "encoder1" },
> > +			},
> > +		},
> > +	};
> > +
> > +	dev = igt_vkms_device_create_from_config(&cfg);
> > +	igt_assert(dev);
> > +
> > +	igt_vkms_device_set_enabled(dev, true);
> > +	igt_assert(igt_vkms_device_is_enabled(dev));
> > +	assert_device_config(&cfg);
> > +
> > +	/* Try to change values */
> > +	igt_vkms_plane_set_type(dev, "plane0", DRM_PLANE_TYPE_OVERLAY);
> > +	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
> > +		      DRM_PLANE_TYPE_PRIMARY);
> > +
> > +	igt_assert(!igt_vkms_plane_attach_crtc(dev, "plane0", "crtc1"));
> > +
> > +	/* Deleting pipeline items doesn't affect the device */
> > +	igt_assert(igt_vkms_plane_detach_crtc(dev, "plane0", "crtc0"));
> > +	igt_assert(igt_vkms_device_remove_plane(dev, "plane0"));
> > +	assert_device_config(&cfg);
> > +
> > +	igt_vkms_device_destroy(dev);
> > +}
> > +
> >   igt_main
> >   {
> >   	struct {
> > @@ -1451,6 +1597,7 @@ igt_main
> >   		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
> >   		{ "enable-no-connectors", test_enable_no_connectors },
> >   		{ "enable-too-many-connectors", test_enable_too_many_connectors },
> > +		{ "enabled-plane-cannot-change", test_enabled_plane_cannot_change },
> >   	};
> >   	igt_fixture {
> 
> -- 
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
> 
> 

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

* Re: [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items
  2025-02-28  1:47     ` Greg Kroah-Hartman
@ 2025-02-28 11:58       ` José Expósito
  0 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-02-28 11:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Louis Chauvet, igt-dev, Thomas Zimmermann

Hi everyone,

On Thu, Feb 27, 2025 at 05:47:59PM -0800, Greg Kroah-Hartman wrote:
> On Thu, Feb 27, 2025 at 02:06:23PM +0100, Louis Chauvet wrote:
> > 
> > 
> > Le 18/02/2025 à 17:49, José Expósito a écrit :
> > > It shouldn't be possible to enable a device without creating and
> > > attaching its pipeline items.
> > > 
> > > Test that the device is not enabled and also that no actual device was
> > > created using libdrm.
> > > 
> > > Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> > > ---
> > >   tests/vkms/vkms_configfs.c | 60 ++++++++++++++++++++++++++++++++++++++
> > >   1 file changed, 60 insertions(+)
> > > 
> > > diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> > > index dc3dbe80d..87d660fff 100644
> > > --- a/tests/vkms/vkms_configfs.c
> > > +++ b/tests/vkms/vkms_configfs.c
> > > @@ -108,6 +108,42 @@ static bool attach(const char *src_path, const char *dst_path,
> > >   	return ret == 0;
> > >   }
> > > +static drmDevicePtr find_device(const char *name, drmDevicePtr *devices,
> > > +				int n_devices)
> > > +{
> > > +	drmDevicePtr dev;
> > > +	const char *dev_name;
> > > +
> > > +	for (int i = 0; i < n_devices; i++) {
> > > +		dev = devices[i];
> > > +
> > > +		if (!(dev->available_nodes & BIT(DRM_NODE_PRIMARY)))
> > > +			continue;
> > > +
> > > +		if (dev->bustype != DRM_BUS_PLATFORM)
> > > +			continue;
> > 
> > Hummm, I think this may have issues with the change proposed by Greg in [1],
> > I don't know how the drmDevicePtr should look like with the new faux_device
> > struct.
> > 
> > The declaration in xf86drm.h is:
> > 
> > typedef struct _drmDevice {
> >     char **nodes; /* DRM_NODE_MAX sized array */
> >     int available_nodes; /* DRM_NODE_* bitmask */
> >     int bustype;
> >     union {
> >         drmPciBusInfoPtr pci;
> >         drmUsbBusInfoPtr usb;
> >         drmPlatformBusInfoPtr platform;
> >         drmHost1xBusInfoPtr host1x;
> >     } businfo;
> >     union {
> >         drmPciDeviceInfoPtr pci;
> >         drmUsbDeviceInfoPtr usb;
> >         drmPlatformDeviceInfoPtr platform;
> >         drmHost1xDeviceInfoPtr host1x;
> >     } deviceinfo;
> > } drmDevice, *drmDevicePtr;
> 
> Why does a drm device care about what type of "bus" it lives on?  That's
> not the user/kernel api to the drm device, the drm api is the way the
> device is handled.
> 
> Why not just treat it like any other "new bus" that gets written?  What
> happens if a bus type shows up in the kernel that no one has seen yet in
> this userspace code, and exposes a drm device node?  Why would that not
> "just work"?
> 
> thanks,
> 
> greg k-h

I already commented in the kernel ML [1], but I'm dropping a comment
here as well in case someone is following this thread.

drmGetDevices() doesn't return the devices in the faux bus, and libdrm
would need to be updated to handle the new bus.

To avoid blocking this series, I'll try to get the VKMS device using
udev in v2, following the approach taken by Mutter.

Let me know if you known a better API to solve this issue, please.

Thanks,
Jose

[1] https://lore.kernel.org/all/Z8Gduj1cDdCYzaBY@fedora/T/#m3fa9b60d5f637ebb0352366c605b94822fc45788

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

* ✓ Xe.CI.BAT: success for VKMS configfs tests (rev3)
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (39 preceding siblings ...)
  2025-02-27 13:11 ` [PATCH i-g-t 00/39] VKMS configfs tests Louis Chauvet
@ 2025-02-28 21:22 ` Patchwork
  2025-02-28 21:25 ` ✓ i915.CI.BAT: " Patchwork
                   ` (2 subsequent siblings)
  43 siblings, 0 replies; 84+ messages in thread
From: Patchwork @ 2025-02-28 21:22 UTC (permalink / raw)
  To: José Expósito; +Cc: igt-dev

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

== Series Details ==

Series: VKMS configfs tests (rev3)
URL   : https://patchwork.freedesktop.org/series/145065/
State : success

== Summary ==

CI Bug Log - changes from XEIGT_8255_BAT -> XEIGTPW_12683_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (8 -> 8)
------------------------------

  No changes in participating hosts

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

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

### IGT changes ###

#### Issues hit ####

  * igt@xe_live_ktest@xe_migrate:
    - bat-adlp-vf:        [PASS][1] -> [DMESG-FAIL][2] ([Intel XE#3890] / [Intel XE#3970]) +1 other test dmesg-fail
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/bat-adlp-vf/igt@xe_live_ktest@xe_migrate.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/bat-adlp-vf/igt@xe_live_ktest@xe_migrate.html

  
  [Intel XE#3890]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3890
  [Intel XE#3970]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3970


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

  * IGT: IGT_8255 -> IGTPW_12683

  IGTPW_12683: eca0cbd842bf582a693a3f966b2a1b131705195e @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8255: 4ef742fae97d2f4af680f9e29f7ea45920f939b7 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-2736-ca9d01b66c70413a62a1a28fbf8709d2e8440c1c: ca9d01b66c70413a62a1a28fbf8709d2e8440c1c

== Logs ==

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

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

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

* ✓ i915.CI.BAT: success for VKMS configfs tests (rev3)
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (40 preceding siblings ...)
  2025-02-28 21:22 ` ✓ Xe.CI.BAT: success for VKMS configfs tests (rev3) Patchwork
@ 2025-02-28 21:25 ` Patchwork
  2025-03-01  5:04 ` ✗ Xe.CI.Full: failure " Patchwork
  2025-03-01  9:43 ` ✗ i915.CI.Full: " Patchwork
  43 siblings, 0 replies; 84+ messages in thread
From: Patchwork @ 2025-02-28 21:25 UTC (permalink / raw)
  To: José Expósito; +Cc: igt-dev

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

== Series Details ==

Series: VKMS configfs tests (rev3)
URL   : https://patchwork.freedesktop.org/series/145065/
State : success

== Summary ==

CI Bug Log - changes from IGT_8255 -> IGTPW_12683
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

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

  Additional (1): bat-arlh-2 

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

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

### IGT changes ###

#### Issues hit ####

  * igt@debugfs_test@basic-hwmon:
    - bat-arlh-2:         NOTRUN -> [SKIP][1] ([i915#11346] / [i915#9318])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@debugfs_test@basic-hwmon.html

  * igt@fbdev@eof:
    - bat-arlh-2:         NOTRUN -> [SKIP][2] ([i915#11345] / [i915#11346]) +3 other tests skip
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@fbdev@eof.html

  * igt@fbdev@info:
    - bat-arlh-2:         NOTRUN -> [SKIP][3] ([i915#11346] / [i915#1849])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@fbdev@info.html

  * igt@gem_lmem_swapping@basic:
    - bat-arlh-2:         NOTRUN -> [SKIP][4] ([i915#10213] / [i915#11346] / [i915#11671]) +3 other tests skip
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@gem_lmem_swapping@basic.html

  * igt@gem_mmap@basic:
    - bat-arlh-2:         NOTRUN -> [SKIP][5] ([i915#11343] / [i915#11346])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@gem_mmap@basic.html

  * igt@gem_render_tiled_blits@basic:
    - bat-arlh-2:         NOTRUN -> [SKIP][6] ([i915#10197] / [i915#10211] / [i915#11346] / [i915#11725])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@gem_render_tiled_blits@basic.html

  * igt@gem_tiled_blits@basic:
    - bat-arlh-2:         NOTRUN -> [SKIP][7] ([i915#11346] / [i915#12637]) +4 other tests skip
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@gem_tiled_blits@basic.html

  * igt@gem_tiled_pread_basic:
    - bat-arlh-2:         NOTRUN -> [SKIP][8] ([i915#10206] / [i915#11346] / [i915#11724])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@gem_tiled_pread_basic.html

  * igt@i915_pm_rps@basic-api:
    - bat-arlh-2:         NOTRUN -> [SKIP][9] ([i915#10209] / [i915#11346] / [i915#11681])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@i915_pm_rps@basic-api.html

  * igt@i915_selftest@live:
    - bat-twl-2:          [PASS][10] -> [INCOMPLETE][11] ([i915#12445] / [i915#13761] / [i915#13776])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/bat-twl-2/igt@i915_selftest@live.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-twl-2/igt@i915_selftest@live.html

  * igt@i915_selftest@live@reset:
    - bat-twl-2:          [PASS][12] -> [INCOMPLETE][13] ([i915#12445])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/bat-twl-2/igt@i915_selftest@live@reset.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-twl-2/igt@i915_selftest@live@reset.html

  * igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
    - bat-arlh-2:         NOTRUN -> [SKIP][14] ([i915#10200] / [i915#11346] / [i915#11666] / [i915#12203])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html

  * igt@kms_addfb_basic@basic-x-tiled-legacy:
    - bat-arlh-2:         NOTRUN -> [SKIP][15] ([i915#10200] / [i915#11346] / [i915#11666]) +8 other tests skip
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@kms_addfb_basic@basic-x-tiled-legacy.html

  * igt@kms_psr@psr-primary-page-flip:
    - bat-arlh-2:         NOTRUN -> [SKIP][16] ([i915#11346]) +32 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@kms_psr@psr-primary-page-flip.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - bat-arlh-2:         NOTRUN -> [SKIP][17] ([i915#10208] / [i915#11346] / [i915#8809])
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@kms_setmode@basic-clone-single-crtc.html

  * igt@prime_vgem@basic-fence-read:
    - bat-arlh-2:         NOTRUN -> [SKIP][18] ([i915#10212] / [i915#11346] / [i915#11726])
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@prime_vgem@basic-fence-read.html

  * igt@prime_vgem@basic-read:
    - bat-arlh-2:         NOTRUN -> [SKIP][19] ([i915#10214] / [i915#11346] / [i915#11726])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@prime_vgem@basic-read.html

  * igt@prime_vgem@basic-write:
    - bat-arlh-2:         NOTRUN -> [SKIP][20] ([i915#10216] / [i915#11346] / [i915#11723])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-arlh-2/igt@prime_vgem@basic-write.html

  
#### Possible fixes ####

  * igt@i915_selftest@live@workarounds:
    - bat-mtlp-9:         [DMESG-FAIL][21] ([i915#12061]) -> [PASS][22] +1 other test pass
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/bat-mtlp-9/igt@i915_selftest@live@workarounds.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-mtlp-9/igt@i915_selftest@live@workarounds.html

  * igt@kms_chamelium_edid@hdmi-edid-read:
    - bat-dg2-13:         [DMESG-WARN][23] -> [PASS][24]
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/bat-dg2-13/igt@kms_chamelium_edid@hdmi-edid-read.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/bat-dg2-13/igt@kms_chamelium_edid@hdmi-edid-read.html

  
  [i915#10197]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10197
  [i915#10200]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10200
  [i915#10206]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10206
  [i915#10208]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10208
  [i915#10209]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10209
  [i915#10211]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10211
  [i915#10212]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10212
  [i915#10213]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10213
  [i915#10214]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10214
  [i915#10216]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10216
  [i915#11343]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11343
  [i915#11345]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11345
  [i915#11346]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11346
  [i915#11666]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11666
  [i915#11671]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11671
  [i915#11681]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11681
  [i915#11723]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11723
  [i915#11724]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11724
  [i915#11725]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11725
  [i915#11726]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11726
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#12203]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12203
  [i915#12445]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12445
  [i915#12637]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12637
  [i915#13761]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13761
  [i915#13776]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13776
  [i915#1849]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1849
  [i915#8809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8809
  [i915#9318]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9318


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

  * CI: CI-20190529 -> None
  * IGT: IGT_8255 -> IGTPW_12683

  CI-20190529: 20190529
  CI_DRM_16205: ca9d01b66c70413a62a1a28fbf8709d2e8440c1c @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_12683: eca0cbd842bf582a693a3f966b2a1b131705195e @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8255: 4ef742fae97d2f4af680f9e29f7ea45920f939b7 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git

== Logs ==

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

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

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

* Re: [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes
  2025-02-28 11:52     ` José Expósito
@ 2025-02-28 22:15       ` Louis Chauvet
  0 siblings, 0 replies; 84+ messages in thread
From: Louis Chauvet @ 2025-02-28 22:15 UTC (permalink / raw)
  To: José Expósito; +Cc: igt-dev



Le 28/02/2025 à 12:52, José Expósito a écrit :
> Hi Louis,
> 
> Thanks a lot for reviewing this series, there were a ton of
> patches. I hope they were easy enough to understand :)

Apart from the meson part, the rest is straightforward to understand, 
your tests are very clear! It was just long to review because there are 
39 patches, not because they were complex.

> I won't have time to look into all of your reviews this week,
> but I'll try to at least anwser to this one as I see you are
> finding some test failures.

Don't panic, almost all of my reviews are R-bys!

> On Fri, Feb 28, 2025 at 09:51:47AM +0100, Louis Chauvet wrote:
>>
>>
>> Le 18/02/2025 à 17:50, José Expósito a écrit :
>>> Test that, once a VKMS device is enabled, the plane values can't change
>>> and that deleting it or the attached CRTCs doesn't change the VKMS
>>> device.
>>>
>>> Add a function that performs a basic validation checking that the
>>> device created matches the expected one.
>>>
>>> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
>>
>> The next tests don't pass on my VM, can you share details on your setup?
>> (kernel branch, architecture)
> 
> I'm testing on a QEMU VM (x86_64), using this kernel branch [1], which
> is basically [2] + [3].

Perfect, I work on almost the same branch, but I will test with your

> This is the script I'm using to run the IGT tests:
> 
>    $ meson setup build ; ninja -C build && \
>       ssh -p 2222 jose@127.0.0.1 -t \
>              'cd shared/igt-gpu-tools && \
>              sudo modprobe vkms && \
>              sudo systemctl isolate multi-user.target && \
>              sudo IGT_DEVICE="sys:/sys/devices/platform/vkms" \
>                  ./build/tests/vkms/vkms_configfs ; \
>              sudo systemctl isolate graphical.target'
> 
> Basically, I build in the host and run on the VM by sharing the code
> and builds in "shared/igt-gpu-tools" inside the VM.

I have a very similar setup (except I use virtme-ng to configure the 
VM), so I don't think this is an issue. Thanks for sharing those details!

> [1] https://github.com/JoseExposito/linux/tree/patch-vkms-configfs
> [2] https://lore.kernel.org/all/20250218101214.5790-1-jose.exposito89@gmail.com/
> [3] https://lore.kernel.org/dri-devel/20250225175936.7223-1-jose.exposito89@gmail.com/T/
> 
>>> ---
>>>    lib/igt_vkms.c             |  27 +++++++
>>>    lib/igt_vkms.h             |   1 +
>>>    tests/vkms/vkms_configfs.c | 147 +++++++++++++++++++++++++++++++++++++
>>>    3 files changed, 175 insertions(+)
>>>
>>> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
>>> index 4c44efec9..3dab7a823 100644
>>> --- a/lib/igt_vkms.c
>>> +++ b/lib/igt_vkms.c
>>> [...]
>>> +static void assert_device_config(igt_vkms_config_t *cfg)
>>> +{
>>> +	drmDevicePtr devices[64];
>>> +	drmDevicePtr dev;
>>> +	drmModeResPtr res;
>>> +	drmModePlaneResPtr plane_res;
>>> +	drmModeConnectorPtr connector_res;
>>> +	igt_vkms_crtc_config_t *crtc;
>>> +	igt_vkms_connector_config_t *connector;
>>> +	int n_devices;
>>> +	int n_planes = 0;
>>> +	int n_crtcs = 0;
>>> +	int n_encoders = 0;
>>> +	int n_connectors = 0;
>>> +	int n_connector_status_cfg[4] = {0};
>>> +	int n_connector_status_drm[4] = {0};
>>> +	int fd;
>>> +
>>> +	n_devices = drmGetDevices(devices, ARRAY_SIZE(devices));
>>> +
>>> +	dev = find_device(cfg->device_name, devices, n_devices);
>>> +	igt_assert_f(dev, "Device '%s' not found\n", cfg->device_name);
>>> +
>>> +	fd = open(dev->nodes[DRM_NODE_PRIMARY], O_RDONLY);
>>> +	igt_assert_f(fd >= 0, "Error opening device '%s' at path '%s'\n",
>>> +		     cfg->device_name, dev->nodes[DRM_NODE_PRIMARY]);
>>> +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1),
>>> +		     "Error setting DRM_CLIENT_CAP_UNIVERSAL_PLANES\n");
>>> +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1),
>>> +		     "Error setting DRM_CLIENT_CAP_ATOMIC\n");
>>> +	igt_assert_f(!drmSetClientCap(fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1),
>>> +		     "Error setting DRM_CLIENT_CAP_WRITEBACK_CONNECTORS\n");
>>> +
>>> +	res = drmModeGetResources(fd);
>>> +	igt_assert_f(res, "Error getting resources\n");
>>> +	plane_res = drmModeGetPlaneResources(fd);
>>> +	igt_assert_f(plane_res, "Error getting plane resources\n");
>>> +
>>> +	for (int n = 0; (&cfg->planes[n])->name; n++)
>>> +		n_planes++;
>>> +
>>> +	for (int n = 0; (crtc = &cfg->crtcs[n])->name; n++) {
>>> +		n_crtcs++;
>>> +
>>> +		if (crtc->writeback) {
>>> +			n_encoders++;
>>> +			n_connectors++;
>>> +			n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION]++;
> 
> I wonder why this is not working for you.
> 
> I see in your comment in 39/39 that you are not getting the right numner
> of connectors when "crtc->writeback == true", but I'm adding them here.

True! I missed this part (I read too fast, sorry). So this is probably 
not the problem.

> Could add a log and check if this is actually the problem, please?

I will re-run the tests on Monday to print exactly what are the 
values/expected values, and search why they fails.

Thanks!
Louis Chauvet

> Best wishes,
> Jose
> 
>>> +		}
>>> +	}
>>> +
>>> +	for (int n = 0; (&cfg->encoders[n])->name; n++)
>>> +		n_encoders++;
>>> +
>>> +	for (int n = 0; (connector = &cfg->connectors[n])->name; n++) {
>>> +		n_connectors++;
>>> +		n_connector_status_cfg[connector->status]++;
>>> +	}
>>> +
>>> +	for (int n = 0; n < res->count_connectors; n++) {
>>> +		connector_res = drmModeGetConnectorCurrent(fd,
>>> +							   res->connectors[n]);
>>> +		n_connector_status_drm[connector_res->connection]++;
>>> +		drmModeFreeConnector(connector_res);
>>> +	}
>>
>> I think the main issue here is something I already observed: you need to
>> force probe the connector status (and in this test you really want to do
>> it), so you should use `drmModeGetConnector`.
>>
>> I just tested, it seems to work, except for the last test about connector
>> hotplug (see my review).
>>
>>> +
>>> +	igt_assert_eq(n_planes, plane_res->count_planes);
>>> +	igt_assert_eq(n_crtcs, res->count_crtcs);
>>> +	igt_assert_eq(n_encoders, res->count_encoders);
>>> +	igt_assert_eq(n_connectors, res->count_connectors);
>>> +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_CONNECTED],
>>> +		      n_connector_status_drm[DRM_MODE_CONNECTED]);
>>> +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_DISCONNECTED],
>>> +		      n_connector_status_drm[DRM_MODE_DISCONNECTED]);
>>> +	igt_assert_eq(n_connector_status_cfg[DRM_MODE_UNKNOWNCONNECTION],
>>> +		      n_connector_status_drm[DRM_MODE_UNKNOWNCONNECTION]);
>>
>> ^ Fails on those asserts
>>
>>> +
>>> +	drmModeFreePlaneResources(plane_res);
>>> +	drmModeFreeResources(res);
>>> +	close(fd);
>>> +	drmFreeDevices(devices, n_devices);
>>> +}
>>> +
>>>    /**
>>>     * SUBTEST: device-default-files
>>>     * Description: Test that creating a VKMS device creates the default files and
>>> @@ -1414,6 +1497,69 @@ static void test_enable_too_many_connectors(void)
>>>    	igt_vkms_device_destroy(dev);
>>>    }
>>> +/**
>>> + * SUBTEST: enabled-plane-cannot-change
>>> + * Description: Test that, once a VKMS device is enabled, the plane values can't
>>> + *              change and that deleting it or the attached CRTCs doesn't change
>>> + *              the VKMS device.
>>> + */
>>> +
>>> +static void test_enabled_plane_cannot_change(void)
>>> +{
>>> +	igt_vkms_t *dev;
>>> +
>>> +	igt_vkms_config_t cfg = {
>>> +		.device_name = __func__,
>>> +		.planes = {
>>> +			{
>>> +				.name = "plane0",
>>> +				.type = DRM_PLANE_TYPE_PRIMARY,
>>> +				.possible_crtcs = { "crtc0"},
>>> +			},
>>> +			{
>>> +				.name = "plane1",
>>> +				.type = DRM_PLANE_TYPE_PRIMARY,
>>> +				.possible_crtcs = { "crtc1"},
>>> +			},
>>> +		},
>>> +		.crtcs = {
>>> +			{ .name = "crtc0" },
>>> +			{ .name = "crtc1" },
>>> +		},
>>> +		.encoders = {
>>> +			{ .name = "encoder0", .possible_crtcs = { "crtc0" } },
>>> +			{ .name = "encoder1", .possible_crtcs = { "crtc1" } },
>>> +		},
>>> +		.connectors = {
>>> +			{
>>> +				.name = "connector0",
>>> +				.possible_encoders = { "encoder0", "encoder1" },
>>> +			},
>>> +		},
>>> +	};
>>> +
>>> +	dev = igt_vkms_device_create_from_config(&cfg);
>>> +	igt_assert(dev);
>>> +
>>> +	igt_vkms_device_set_enabled(dev, true);
>>> +	igt_assert(igt_vkms_device_is_enabled(dev));
>>> +	assert_device_config(&cfg);
>>> +
>>> +	/* Try to change values */
>>> +	igt_vkms_plane_set_type(dev, "plane0", DRM_PLANE_TYPE_OVERLAY);
>>> +	igt_assert_eq(igt_vkms_plane_get_type(dev, "plane0"),
>>> +		      DRM_PLANE_TYPE_PRIMARY);
>>> +
>>> +	igt_assert(!igt_vkms_plane_attach_crtc(dev, "plane0", "crtc1"));
>>> +
>>> +	/* Deleting pipeline items doesn't affect the device */
>>> +	igt_assert(igt_vkms_plane_detach_crtc(dev, "plane0", "crtc0"));
>>> +	igt_assert(igt_vkms_device_remove_plane(dev, "plane0"));
>>> +	assert_device_config(&cfg);
>>> +
>>> +	igt_vkms_device_destroy(dev);
>>> +}
>>> +
>>>    igt_main
>>>    {
>>>    	struct {
>>> @@ -1451,6 +1597,7 @@ igt_main
>>>    		{ "enable-crtc-no-encoder", test_enable_crtc_no_encoder },
>>>    		{ "enable-no-connectors", test_enable_no_connectors },
>>>    		{ "enable-too-many-connectors", test_enable_too_many_connectors },
>>> +		{ "enabled-plane-cannot-change", test_enabled_plane_cannot_change },
>>>    	};
>>>    	igt_fixture {
>>
>> -- 
>> Louis Chauvet, Bootlin
>> Embedded Linux and Kernel engineering
>> https://bootlin.com
>>
>>

-- 
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


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

* ✗ Xe.CI.Full: failure for VKMS configfs tests (rev3)
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (41 preceding siblings ...)
  2025-02-28 21:25 ` ✓ i915.CI.BAT: " Patchwork
@ 2025-03-01  5:04 ` Patchwork
  2025-03-01  9:43 ` ✗ i915.CI.Full: " Patchwork
  43 siblings, 0 replies; 84+ messages in thread
From: Patchwork @ 2025-03-01  5:04 UTC (permalink / raw)
  To: José Expósito; +Cc: igt-dev

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

== Series Details ==

Series: VKMS configfs tests (rev3)
URL   : https://patchwork.freedesktop.org/series/145065/
State : failure

== Summary ==

CI Bug Log - changes from XEIGT_8255_full -> XEIGTPW_12683_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with XEIGTPW_12683_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in XEIGTPW_12683_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 -> 4)
------------------------------

  No changes in participating hosts

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@kms_cursor_legacy@cursora-vs-flipb-legacy:
    - shard-dg2-set2:     [PASS][1] -> [DMESG-WARN][2] +1 other test dmesg-warn
   [1]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html
   [2]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_cursor_legacy@cursora-vs-flipb-legacy.html

  * igt@kms_plane_multiple@tiling-x:
    - shard-bmg:          [PASS][3] -> [DMESG-WARN][4]
   [3]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-7/igt@kms_plane_multiple@tiling-x.html
   [4]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_plane_multiple@tiling-x.html
    - shard-dg2-set2:     NOTRUN -> [DMESG-WARN][5] +1 other test dmesg-warn
   [5]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_plane_multiple@tiling-x.html

  * {igt@vkms/vkms_configfs@enable-no-pipeline-items} (NEW):
    - shard-dg2-set2:     NOTRUN -> [SKIP][6] +28 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@vkms/vkms_configfs@enable-no-pipeline-items.html
    - shard-lnl:          NOTRUN -> [SKIP][7] +26 other tests skip
   [7]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@vkms/vkms_configfs@enable-no-pipeline-items.html

  * {igt@vkms/vkms_configfs@enable-too-many-planes} (NEW):
    - shard-bmg:          NOTRUN -> [SKIP][8] +23 other tests skip
   [8]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@vkms/vkms_configfs@enable-too-many-planes.html

  
New tests
---------

  New tests have been introduced between XEIGT_8255_full and XEIGTPW_12683_full:

### New IGT tests (36) ###

  * igt@vkms/vkms_configfs@attach-connector-to-encoder:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@attach-encoder-to-crtc:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@attach-plane-to-crtc:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@connector-default-files:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@connector-default-values:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@connector-wrong-values:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@crtc-default-files:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@crtc-default-values:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@crtc-wrong-values:
    - Statuses :
    - Exec time: [None] s

  * igt@vkms/vkms_configfs@device-default-files:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@device-default-values:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@device-wrong-values:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-crtc-no-encoder:
    - Statuses :
    - Exec time: [None] s

  * igt@vkms/vkms_configfs@enable-encoder-no-crtcs:
    - Statuses :
    - Exec time: [None] s

  * igt@vkms/vkms_configfs@enable-multiple-cursor-planes:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-multiple-primary-planes:
    - Statuses :
    - Exec time: [None] s

  * igt@vkms/vkms_configfs@enable-no-connectors:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-crtcs:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-encoders:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-pipeline-items:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-planes:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-primary-plane:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-plane-no-crtcs:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-connectors:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-crtcs:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-encoders:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-planes:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-connector-cannot-change:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-connector-hot-plug:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-crtc-cannot-change:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-encoder-cannot-change:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-plane-cannot-change:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@encoder-default-files:
    - Statuses :
    - Exec time: [None] s

  * igt@vkms/vkms_configfs@plane-default-files:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@plane-default-values:
    - Statuses : 3 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@plane-wrong-values:
    - Statuses : 2 skip(s)
    - Exec time: [0.0] s

  

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

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

### IGT changes ###

#### Issues hit ####

  * igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
    - shard-bmg:          NOTRUN -> [SKIP][9] ([Intel XE#2233])
   [9]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html

  * igt@kms_addfb_basic@invalid-smem-bo-on-discrete:
    - shard-lnl:          NOTRUN -> [SKIP][10] ([Intel XE#3157])
   [10]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@kms_addfb_basic@invalid-smem-bo-on-discrete.html

  * igt@kms_async_flips@alternate-sync-async-flip:
    - shard-bmg:          [PASS][11] -> [FAIL][12] ([Intel XE#827]) +1 other test fail
   [11]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-4/igt@kms_async_flips@alternate-sync-async-flip.html
   [12]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_async_flips@alternate-sync-async-flip.html

  * igt@kms_async_flips@async-flip-with-page-flip-events:
    - shard-bmg:          NOTRUN -> [DMESG-WARN][13] ([Intel XE#4330]) +18 other tests dmesg-warn
   [13]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_async_flips@async-flip-with-page-flip-events.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-b-hdmi-a-6-4-mc-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][14] ([Intel XE#3767]) +15 other tests skip
   [14]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-b-hdmi-a-6-4-mc-ccs.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear:
    - shard-lnl:          NOTRUN -> [FAIL][15] ([Intel XE#911]) +3 other tests fail
   [15]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-edp-1-linear.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][16] ([Intel XE#2550] / [Intel XE#3767]) +15 other tests skip
   [16]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs.html

  * igt@kms_async_flips@invalid-async-flip:
    - shard-bmg:          NOTRUN -> [SKIP][17] ([Intel XE#873])
   [17]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_async_flips@invalid-async-flip.html

  * igt@kms_async_flips@invalid-async-flip-atomic:
    - shard-bmg:          NOTRUN -> [SKIP][18] ([Intel XE#3768])
   [18]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_async_flips@invalid-async-flip-atomic.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
    - shard-bmg:          NOTRUN -> [SKIP][19] ([Intel XE#2370])
   [19]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip:
    - shard-lnl:          NOTRUN -> [SKIP][20] ([Intel XE#1407]) +4 other tests skip
   [20]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html

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

  * igt@kms_big_fb@linear-32bpp-rotate-270:
    - shard-bmg:          NOTRUN -> [SKIP][22] ([Intel XE#2327]) +4 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_big_fb@linear-32bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-16bpp-rotate-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][23] ([Intel XE#316]) +4 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_big_fb@x-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-addfb:
    - shard-bmg:          NOTRUN -> [SKIP][24] ([Intel XE#2328])
   [24]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_big_fb@y-tiled-addfb.html

  * igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
    - shard-dg2-set2:     NOTRUN -> [SKIP][25] ([Intel XE#607])
   [25]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html

  * igt@kms_big_fb@yf-tiled-32bpp-rotate-0:
    - shard-bmg:          NOTRUN -> [SKIP][26] ([Intel XE#1124]) +17 other tests skip
   [26]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_big_fb@yf-tiled-32bpp-rotate-0.html

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

  * igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p:
    - shard-bmg:          [PASS][29] -> [SKIP][30] ([Intel XE#2314] / [Intel XE#2894])
   [29]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-7/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html
   [30]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-2560x1440p.html

  * igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p:
    - shard-dg2-set2:     [PASS][31] -> [SKIP][32] ([Intel XE#2191]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html
   [32]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html

  * igt@kms_bw@connected-linear-tiling-3-displays-2160x1440p:
    - shard-lnl:          NOTRUN -> [SKIP][33] ([Intel XE#2191])
   [33]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_bw@connected-linear-tiling-3-displays-2160x1440p.html

  * igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][34] ([Intel XE#2191]) +2 other tests skip
   [34]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_bw@connected-linear-tiling-4-displays-2560x1440p.html

  * igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p:
    - shard-bmg:          NOTRUN -> [SKIP][35] ([Intel XE#2314] / [Intel XE#2894]) +2 other tests skip
   [35]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p.html

  * igt@kms_bw@linear-tiling-1-displays-2560x1440p:
    - shard-bmg:          NOTRUN -> [SKIP][36] ([Intel XE#367]) +3 other tests skip
   [36]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_bw@linear-tiling-1-displays-2560x1440p.html

  * igt@kms_bw@linear-tiling-2-displays-2160x1440p:
    - shard-lnl:          NOTRUN -> [SKIP][37] ([Intel XE#367]) +1 other test skip
   [37]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-2/igt@kms_bw@linear-tiling-2-displays-2160x1440p.html

  * igt@kms_bw@linear-tiling-4-displays-2560x1440p:
    - shard-dg2-set2:     NOTRUN -> [SKIP][38] ([Intel XE#367]) +4 other tests skip
   [38]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_bw@linear-tiling-4-displays-2560x1440p.html
    - shard-lnl:          NOTRUN -> [SKIP][39] ([Intel XE#1512]) +1 other test skip
   [39]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_bw@linear-tiling-4-displays-2560x1440p.html

  * igt@kms_ccs@bad-pixel-format-4-tiled-mtl-rc-ccs-cc@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [SKIP][40] ([Intel XE#787]) +214 other tests skip
   [40]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_ccs@bad-pixel-format-4-tiled-mtl-rc-ccs-cc@pipe-a-hdmi-a-6.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc:
    - shard-lnl:          NOTRUN -> [SKIP][41] ([Intel XE#2887]) +18 other tests skip
   [41]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc.html

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

  * igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][43] ([Intel XE#3442]) +1 other test skip
   [43]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][44] ([Intel XE#2669] / [Intel XE#3433]) +3 other tests skip
   [44]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs@pipe-a-edp-1.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs:
    - shard-lnl:          NOTRUN -> [SKIP][45] ([Intel XE#3432])
   [45]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc:
    - shard-bmg:          NOTRUN -> [SKIP][46] ([Intel XE#3432]) +2 other tests skip
   [46]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs-cc.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-d-dp-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][47] ([Intel XE#455] / [Intel XE#787]) +55 other tests skip
   [47]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-rc-ccs@pipe-d-dp-2.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6:
    - shard-dg2-set2:     [PASS][48] -> [INCOMPLETE][49] ([Intel XE#3113])
   [48]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6.html
   [49]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-hdmi-a-6:
    - shard-dg2-set2:     NOTRUN -> [INCOMPLETE][50] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124]) +1 other test incomplete
   [50]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-b-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][51] ([Intel XE#2907]) +1 other test skip
   [51]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs@pipe-c-dp-2:
    - shard-bmg:          NOTRUN -> [SKIP][52] ([Intel XE#2652] / [Intel XE#787]) +16 other tests skip
   [52]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs@pipe-c-dp-2.html

  * igt@kms_cdclk@mode-transition@pipe-a-dp-2:
    - shard-dg2-set2:     NOTRUN -> [SKIP][53] ([Intel XE#4417]) +3 other tests skip
   [53]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_cdclk@mode-transition@pipe-a-dp-2.html

  * igt@kms_chamelium_color@ctm-red-to-blue:
    - shard-bmg:          NOTRUN -> [SKIP][54] ([Intel XE#2325]) +1 other test skip
   [54]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_chamelium_color@ctm-red-to-blue.html

  * igt@kms_chamelium_edid@dp-edid-change-during-hibernate:
    - shard-bmg:          NOTRUN -> [SKIP][55] ([Intel XE#2252]) +18 other tests skip
   [55]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_chamelium_edid@dp-edid-change-during-hibernate.html

  * igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe:
    - shard-dg2-set2:     NOTRUN -> [SKIP][56] ([Intel XE#373]) +12 other tests skip
   [56]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe.html
    - shard-lnl:          NOTRUN -> [SKIP][57] ([Intel XE#373]) +12 other tests skip
   [57]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@kms_chamelium_hpd@hdmi-hpd-for-each-pipe.html

  * igt@kms_content_protection@atomic:
    - shard-dg2-set2:     NOTRUN -> [FAIL][58] ([Intel XE#1178]) +1 other test fail
   [58]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_content_protection@atomic.html
    - shard-lnl:          NOTRUN -> [SKIP][59] ([Intel XE#3278])
   [59]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-2/igt@kms_content_protection@atomic.html

  * igt@kms_content_protection@atomic-dpms@pipe-a-dp-4:
    - shard-dg2-set2:     NOTRUN -> [DMESG-FAIL][60] ([Intel XE#4330]) +2 other tests dmesg-fail
   [60]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_content_protection@atomic-dpms@pipe-a-dp-4.html

  * igt@kms_content_protection@content-type-change:
    - shard-bmg:          NOTRUN -> [SKIP][61] ([Intel XE#2341]) +1 other test skip
   [61]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_content_protection@content-type-change.html

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

  * igt@kms_content_protection@dp-mst-type-0:
    - shard-lnl:          NOTRUN -> [SKIP][64] ([Intel XE#307]) +1 other test skip
   [64]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_content_protection@dp-mst-type-0.html

  * igt@kms_cursor_crc@cursor-offscreen-32x32:
    - shard-bmg:          NOTRUN -> [SKIP][65] ([Intel XE#2320]) +9 other tests skip
   [65]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_cursor_crc@cursor-offscreen-32x32.html

  * igt@kms_cursor_crc@cursor-offscreen-64x64@pipe-d-hdmi-a-2:
    - shard-dg2-set2:     NOTRUN -> [DMESG-WARN][66] ([Intel XE#4330]) +20 other tests dmesg-warn
   [66]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_cursor_crc@cursor-offscreen-64x64@pipe-d-hdmi-a-2.html

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

  * igt@kms_cursor_crc@cursor-random-512x170:
    - shard-bmg:          NOTRUN -> [SKIP][69] ([Intel XE#2321]) +1 other test skip
   [69]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_cursor_crc@cursor-random-512x170.html

  * igt@kms_cursor_crc@cursor-sliding-max-size:
    - shard-lnl:          NOTRUN -> [SKIP][70] ([Intel XE#1424]) +6 other tests skip
   [70]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_cursor_crc@cursor-sliding-max-size.html

  * igt@kms_cursor_legacy@2x-cursor-vs-flip-legacy:
    - shard-lnl:          NOTRUN -> [SKIP][71] ([Intel XE#309]) +8 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_cursor_legacy@2x-cursor-vs-flip-legacy.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size:
    - shard-bmg:          NOTRUN -> [SKIP][72] ([Intel XE#2286]) +1 other test skip
   [72]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-varying-size.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size:
    - shard-dg2-set2:     [PASS][73] -> [SKIP][74] ([Intel XE#309]) +2 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-433/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
   [74]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
    - shard-bmg:          NOTRUN -> [SKIP][75] ([Intel XE#2291]) +6 other tests skip
   [75]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size:
    - shard-bmg:          [PASS][76] -> [SKIP][77] ([Intel XE#2291])
   [76]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-2/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html
   [77]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size:
    - shard-dg2-set2:     NOTRUN -> [SKIP][78] ([Intel XE#309])
   [78]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions:
    - shard-dg2-set2:     NOTRUN -> [SKIP][79] ([Intel XE#323]) +1 other test skip
   [79]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html
    - shard-lnl:          NOTRUN -> [SKIP][80] ([Intel XE#323]) +1 other test skip
   [80]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions.html

  * igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
    - shard-lnl:          NOTRUN -> [SKIP][81] ([Intel XE#1508])
   [81]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html

  * igt@kms_dirtyfb@fbc-dirtyfb-ioctl:
    - shard-bmg:          NOTRUN -> [SKIP][82] ([Intel XE#4210])
   [82]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_dirtyfb@fbc-dirtyfb-ioctl.html

  * igt@kms_display_modes@extended-mode-basic:
    - shard-dg2-set2:     [PASS][83] -> [SKIP][84] ([Intel XE#4302])
   [83]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-463/igt@kms_display_modes@extended-mode-basic.html
   [84]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_display_modes@extended-mode-basic.html

  * igt@kms_dp_link_training@uhbr-mst:
    - shard-lnl:          NOTRUN -> [SKIP][85] ([Intel XE#4354])
   [85]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@kms_dp_link_training@uhbr-mst.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][86] ([Intel XE#4356])
   [86]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_dp_link_training@uhbr-mst.html

  * igt@kms_dp_link_training@uhbr-sst:
    - shard-bmg:          NOTRUN -> [SKIP][87] ([Intel XE#4354]) +2 other tests skip
   [87]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_dp_link_training@uhbr-sst.html

  * igt@kms_dp_linktrain_fallback@dp-fallback:
    - shard-lnl:          NOTRUN -> [SKIP][88] ([Intel XE#4294])
   [88]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@kms_dp_linktrain_fallback@dp-fallback.html

  * igt@kms_dp_linktrain_fallback@dsc-fallback:
    - shard-bmg:          NOTRUN -> [SKIP][89] ([Intel XE#4331])
   [89]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_dp_linktrain_fallback@dsc-fallback.html

  * igt@kms_dsc@dsc-fractional-bpp:
    - shard-bmg:          NOTRUN -> [SKIP][90] ([Intel XE#2244])
   [90]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_dsc@dsc-fractional-bpp.html
    - shard-lnl:          NOTRUN -> [SKIP][91] ([Intel XE#2244]) +1 other test skip
   [91]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_dsc@dsc-fractional-bpp.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats:
    - shard-bmg:          NOTRUN -> [SKIP][92] ([Intel XE#4422])
   [92]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-different-formats.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-bmg:          NOTRUN -> [SKIP][93] ([Intel XE#4156]) +1 other test skip
   [93]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_fbcon_fbt@psr:
    - shard-bmg:          NOTRUN -> [SKIP][94] ([Intel XE#776])
   [94]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_fbcon_fbt@psr.html

  * igt@kms_feature_discovery@psr1:
    - shard-bmg:          NOTRUN -> [SKIP][95] ([Intel XE#2374]) +1 other test skip
   [95]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_feature_discovery@psr1.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][96] ([Intel XE#1135]) +1 other test skip
   [96]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_feature_discovery@psr1.html

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

  * igt@kms_flip@2x-dpms-vs-vblank-race-interruptible:
    - shard-dg2-set2:     [PASS][98] -> [SKIP][99] ([Intel XE#310]) +3 other tests skip
   [98]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-432/igt@kms_flip@2x-dpms-vs-vblank-race-interruptible.html
   [99]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_flip@2x-dpms-vs-vblank-race-interruptible.html

  * igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ab-dp2-hdmi-a3:
    - shard-bmg:          NOTRUN -> [FAIL][100] ([Intel XE#2882]) +1 other test fail
   [100]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_flip@2x-flip-vs-absolute-wf_vblank@ab-dp2-hdmi-a3.html

  * igt@kms_flip@2x-flip-vs-expired-vblank@bc-dp2-hdmi-a3:
    - shard-bmg:          NOTRUN -> [FAIL][101] ([Intel XE#3321]) +1 other test fail
   [101]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_flip@2x-flip-vs-expired-vblank@bc-dp2-hdmi-a3.html

  * igt@kms_flip@2x-flip-vs-rmfb:
    - shard-lnl:          NOTRUN -> [SKIP][102] ([Intel XE#1421]) +3 other tests skip
   [102]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@kms_flip@2x-flip-vs-rmfb.html

  * igt@kms_flip@2x-nonexisting-fb:
    - shard-bmg:          [PASS][103] -> [SKIP][104] ([Intel XE#2316]) +4 other tests skip
   [103]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-2/igt@kms_flip@2x-nonexisting-fb.html
   [104]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_flip@2x-nonexisting-fb.html

  * igt@kms_flip@2x-nonexisting-fb-interruptible:
    - shard-dg2-set2:     NOTRUN -> [SKIP][105] ([Intel XE#310]) +2 other tests skip
   [105]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_flip@2x-nonexisting-fb-interruptible.html

  * igt@kms_flip@dpms-vs-vblank-race-interruptible:
    - shard-bmg:          [PASS][106] -> [DMESG-WARN][107] ([Intel XE#2955])
   [106]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-2/igt@kms_flip@dpms-vs-vblank-race-interruptible.html
   [107]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_flip@dpms-vs-vblank-race-interruptible.html
    - shard-dg2-set2:     [PASS][108] -> [DMESG-WARN][109] ([Intel XE#2955])
   [108]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@dpms-vs-vblank-race-interruptible.html
   [109]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_flip@dpms-vs-vblank-race-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-hdmi-a6:
    - shard-dg2-set2:     [PASS][110] -> [FAIL][111] ([Intel XE#301]) +1 other test fail
   [110]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-hdmi-a6.html
   [111]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-hdmi-a6.html

  * igt@kms_flip@flip-vs-expired-vblank@a-edp1:
    - shard-lnl:          NOTRUN -> [FAIL][112] ([Intel XE#301]) +1 other test fail
   [112]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank@a-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a6:
    - shard-dg2-set2:     NOTRUN -> [FAIL][113] ([Intel XE#301]) +3 other tests fail
   [113]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a6.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-lnl:          NOTRUN -> [FAIL][114] ([Intel XE#301] / [Intel XE#3149]) +1 other test fail
   [114]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_flip@plain-flip-fb-recreate@a-edp1:
    - shard-lnl:          [PASS][115] -> [FAIL][116] ([Intel XE#886]) +1 other test fail
   [115]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-3/igt@kms_flip@plain-flip-fb-recreate@a-edp1.html
   [116]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-2/igt@kms_flip@plain-flip-fb-recreate@a-edp1.html

  * igt@kms_flip@wf_vblank-ts-check@d-dp4:
    - shard-dg2-set2:     [PASS][117] -> [DMESG-WARN][118] ([Intel XE#4330]) +35 other tests dmesg-warn
   [117]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-433/igt@kms_flip@wf_vblank-ts-check@d-dp4.html
   [118]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_flip@wf_vblank-ts-check@d-dp4.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling:
    - shard-lnl:          NOTRUN -> [SKIP][119] ([Intel XE#1397] / [Intel XE#1745]) +1 other test skip
   [119]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][120] ([Intel XE#1397]) +1 other test skip
   [120]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-default-mode:
    - shard-lnl:          NOTRUN -> [SKIP][121] ([Intel XE#1401]) +2 other tests skip
   [121]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling:
    - shard-bmg:          NOTRUN -> [SKIP][122] ([Intel XE#2293] / [Intel XE#2380]) +6 other tests skip
   [122]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling:
    - shard-lnl:          NOTRUN -> [SKIP][123] ([Intel XE#1401] / [Intel XE#1745]) +2 other tests skip
   [123]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling@pipe-a-valid-mode:
    - shard-bmg:          NOTRUN -> [SKIP][124] ([Intel XE#2293]) +6 other tests skip
   [124]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-16bpp-ytile-downscaling@pipe-a-valid-mode.html

  * igt@kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-fullscreen:
    - shard-bmg:          NOTRUN -> [SKIP][125] ([Intel XE#2311]) +33 other tests skip
   [125]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-fullscreen.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][126] ([Intel XE#4141]) +17 other tests skip
   [126]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-wc:
    - shard-lnl:          NOTRUN -> [SKIP][127] ([Intel XE#656]) +52 other tests skip
   [127]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-blt:
    - shard-dg2-set2:     [PASS][128] -> [SKIP][129] ([Intel XE#656]) +4 other tests skip
   [128]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-blt.html
   [129]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-plflip-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][130] ([Intel XE#656]) +10 other tests skip
   [130]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][131] ([Intel XE#651]) +32 other tests skip
   [131]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-render.html
    - shard-lnl:          NOTRUN -> [SKIP][132] ([Intel XE#651]) +11 other tests skip
   [132]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-tiling-y:
    - shard-dg2-set2:     NOTRUN -> [SKIP][133] ([Intel XE#658])
   [133]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_frontbuffer_tracking@fbcdrrs-tiling-y.html
    - shard-bmg:          NOTRUN -> [SKIP][134] ([Intel XE#2352])
   [134]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcdrrs-tiling-y.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt:
    - shard-dg2-set2:     NOTRUN -> [SKIP][135] ([Intel XE#653]) +34 other tests skip
   [135]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt:
    - shard-bmg:          NOTRUN -> [SKIP][136] ([Intel XE#2313]) +34 other tests skip
   [136]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-tiling-y:
    - shard-lnl:          NOTRUN -> [SKIP][137] ([Intel XE#1469])
   [137]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_frontbuffer_tracking@fbcpsr-tiling-y.html

  * igt@kms_frontbuffer_tracking@plane-fbc-rte:
    - shard-dg2-set2:     NOTRUN -> [SKIP][138] ([Intel XE#4439])
   [138]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_frontbuffer_tracking@plane-fbc-rte.html
    - shard-bmg:          NOTRUN -> [SKIP][139] ([Intel XE#4439])
   [139]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_frontbuffer_tracking@plane-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt:
    - shard-bmg:          NOTRUN -> [SKIP][140] ([Intel XE#2312]) +26 other tests skip
   [140]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-indfb-plflip-blt.html

  * igt@kms_getfb@getfb-reject-ccs:
    - shard-dg2-set2:     NOTRUN -> [SKIP][141] ([Intel XE#605])
   [141]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_getfb@getfb-reject-ccs.html
    - shard-lnl:          NOTRUN -> [SKIP][142] ([Intel XE#605])
   [142]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_getfb@getfb-reject-ccs.html

  * igt@kms_hdmi_inject@inject-4k:
    - shard-lnl:          NOTRUN -> [SKIP][143] ([Intel XE#1470])
   [143]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@kms_hdmi_inject@inject-4k.html

  * igt@kms_invalid_mode@clock-too-high:
    - shard-lnl:          NOTRUN -> [SKIP][144] ([Intel XE#1450] / [Intel XE#2568])
   [144]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@kms_invalid_mode@clock-too-high.html

  * igt@kms_invalid_mode@clock-too-high@pipe-a-edp-1:
    - shard-lnl:          NOTRUN -> [SKIP][145] ([Intel XE#1450]) +2 other tests skip
   [145]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@kms_invalid_mode@clock-too-high@pipe-a-edp-1.html

  * igt@kms_joiner@basic-big-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][146] ([Intel XE#346])
   [146]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_joiner@basic-big-joiner.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][147] ([Intel XE#346])
   [147]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_joiner@basic-big-joiner.html
    - shard-lnl:          NOTRUN -> [SKIP][148] ([Intel XE#346]) +1 other test skip
   [148]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_joiner@basic-big-joiner.html

  * igt@kms_joiner@basic-force-big-joiner:
    - shard-dg2-set2:     NOTRUN -> [SKIP][149] ([Intel XE#4328])
   [149]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_joiner@basic-force-big-joiner.html

  * igt@kms_joiner@basic-force-ultra-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][150] ([Intel XE#2934]) +1 other test skip
   [150]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_joiner@basic-force-ultra-joiner.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][151] ([Intel XE#2925]) +1 other test skip
   [151]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_joiner@basic-force-ultra-joiner.html
    - shard-lnl:          NOTRUN -> [SKIP][152] ([Intel XE#2934]) +1 other test skip
   [152]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_joiner@basic-force-ultra-joiner.html

  * igt@kms_joiner@basic-max-non-joiner:
    - shard-bmg:          NOTRUN -> [SKIP][153] ([Intel XE#4298])
   [153]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_joiner@basic-max-non-joiner.html

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

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-lnl:          NOTRUN -> [SKIP][155] ([Intel XE#356])
   [155]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  * igt@kms_pipe_stress@stress-xrgb8888-ytiled:
    - shard-bmg:          NOTRUN -> [SKIP][156] ([Intel XE#4329])
   [156]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_pipe_stress@stress-xrgb8888-ytiled.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][157] ([Intel XE#4359])
   [157]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_pipe_stress@stress-xrgb8888-ytiled.html

  * igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256:
    - shard-dg2-set2:     NOTRUN -> [FAIL][158] ([Intel XE#616]) +2 other tests fail
   [158]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256.html

  * igt@kms_plane_lowres@tiling-4:
    - shard-lnl:          NOTRUN -> [SKIP][159] ([Intel XE#599]) +3 other tests skip
   [159]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@kms_plane_lowres@tiling-4.html

  * igt@kms_plane_lowres@tiling-yf:
    - shard-bmg:          NOTRUN -> [SKIP][160] ([Intel XE#2393])
   [160]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_plane_lowres@tiling-yf.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-d:
    - shard-dg2-set2:     NOTRUN -> [SKIP][161] ([Intel XE#2763] / [Intel XE#455]) +3 other tests skip
   [161]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-d.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-5-with-pixel-format:
    - shard-bmg:          NOTRUN -> [DMESG-WARN][162] ([Intel XE#2566] / [Intel XE#4330]) +1 other test dmesg-warn
   [162]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-pixel-format.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-5-with-pixel-format@pipe-c:
    - shard-lnl:          NOTRUN -> [SKIP][163] ([Intel XE#2763]) +27 other tests skip
   [163]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_plane_scaling@plane-downscale-factor-0-5-with-pixel-format@pipe-c.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5@pipe-b:
    - shard-bmg:          NOTRUN -> [SKIP][164] ([Intel XE#2763]) +14 other tests skip
   [164]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-5@pipe-b.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-25@pipe-b:
    - shard-dg2-set2:     NOTRUN -> [SKIP][165] ([Intel XE#2763]) +5 other tests skip
   [165]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-25@pipe-b.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-5@pipe-d:
    - shard-dg2-set2:     [PASS][166] -> [DMESG-WARN][167] ([Intel XE#2566] / [Intel XE#4330]) +1 other test dmesg-warn
   [166]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-5@pipe-d.html
   [167]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-5@pipe-d.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-bmg:          NOTRUN -> [SKIP][168] ([Intel XE#2392]) +1 other test skip
   [168]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_dc@dc5-retention-flops:
    - shard-bmg:          NOTRUN -> [SKIP][169] ([Intel XE#3309])
   [169]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_pm_dc@dc5-retention-flops.html

  * igt@kms_pm_dc@dc6-dpms:
    - shard-dg2-set2:     NOTRUN -> [SKIP][170] ([Intel XE#908])
   [170]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_pm_dc@dc6-dpms.html

  * igt@kms_pm_dc@dc6-psr:
    - shard-lnl:          NOTRUN -> [FAIL][171] ([Intel XE#1430])
   [171]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@kms_pm_dc@dc6-psr.html

  * igt@kms_pm_dc@deep-pkgc:
    - shard-bmg:          NOTRUN -> [SKIP][172] ([Intel XE#2505])
   [172]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_pm_dc@deep-pkgc.html

  * igt@kms_pm_rpm@dpms-lpsp:
    - shard-bmg:          NOTRUN -> [SKIP][173] ([Intel XE#1439] / [Intel XE#3141] / [Intel XE#836])
   [173]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_pm_rpm@dpms-lpsp.html

  * igt@kms_pm_rpm@dpms-non-lpsp:
    - shard-dg2-set2:     NOTRUN -> [SKIP][174] ([Intel XE#836])
   [174]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_pm_rpm@dpms-non-lpsp.html
    - shard-lnl:          NOTRUN -> [SKIP][175] ([Intel XE#1439] / [Intel XE#3141])
   [175]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_pm_rpm@dpms-non-lpsp.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf:
    - shard-dg2-set2:     NOTRUN -> [SKIP][176] ([Intel XE#1489]) +10 other tests skip
   [176]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-sf:
    - shard-lnl:          NOTRUN -> [SKIP][177] ([Intel XE#2893]) +6 other tests skip
   [177]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-sf.html

  * igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area-big-fb:
    - shard-bmg:          NOTRUN -> [SKIP][178] ([Intel XE#1489]) +14 other tests skip
   [178]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_psr2_sf@psr2-primary-plane-update-sf-dmg-area-big-fb.html

  * igt@kms_psr2_su@page_flip-nv12:
    - shard-dg2-set2:     NOTRUN -> [SKIP][179] ([Intel XE#1122]) +1 other test skip
   [179]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_psr2_su@page_flip-nv12.html

  * igt@kms_psr2_su@page_flip-p010:
    - shard-bmg:          NOTRUN -> [SKIP][180] ([Intel XE#2387])
   [180]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@kms_psr2_su@page_flip-p010.html
    - shard-lnl:          NOTRUN -> [SKIP][181] ([Intel XE#1128])
   [181]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_psr2_su@page_flip-p010.html

  * igt@kms_psr@fbc-psr2-cursor-plane-move:
    - shard-bmg:          NOTRUN -> [SKIP][182] ([Intel XE#2234] / [Intel XE#2850]) +26 other tests skip
   [182]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_psr@fbc-psr2-cursor-plane-move.html

  * igt@kms_psr@fbc-psr2-primary-render:
    - shard-dg2-set2:     NOTRUN -> [SKIP][183] ([Intel XE#2850] / [Intel XE#929]) +21 other tests skip
   [183]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_psr@fbc-psr2-primary-render.html

  * igt@kms_psr@pr-primary-blt:
    - shard-lnl:          NOTRUN -> [SKIP][184] ([Intel XE#1406]) +7 other tests skip
   [184]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@kms_psr@pr-primary-blt.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - shard-bmg:          NOTRUN -> [SKIP][185] ([Intel XE#2414])
   [185]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][186] ([Intel XE#2939])
   [186]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
    - shard-bmg:          NOTRUN -> [SKIP][187] ([Intel XE#3414] / [Intel XE#3904]) +3 other tests skip
   [187]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@sprite-rotation-270:
    - shard-dg2-set2:     NOTRUN -> [SKIP][188] ([Intel XE#3414]) +2 other tests skip
   [188]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_rotation_crc@sprite-rotation-270.html
    - shard-lnl:          NOTRUN -> [SKIP][189] ([Intel XE#3414] / [Intel XE#3904]) +3 other tests skip
   [189]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@kms_rotation_crc@sprite-rotation-270.html

  * igt@kms_scaling_modes@scaling-mode-center:
    - shard-bmg:          NOTRUN -> [SKIP][190] ([Intel XE#2413]) +2 other tests skip
   [190]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_scaling_modes@scaling-mode-center.html

  * igt@kms_setmode@clone-exclusive-crtc:
    - shard-bmg:          [PASS][191] -> [SKIP][192] ([Intel XE#1435])
   [191]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-8/igt@kms_setmode@clone-exclusive-crtc.html
   [192]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_setmode@clone-exclusive-crtc.html

  * igt@kms_setmode@invalid-clone-exclusive-crtc:
    - shard-bmg:          NOTRUN -> [SKIP][193] ([Intel XE#1435])
   [193]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_setmode@invalid-clone-exclusive-crtc.html

  * igt@kms_setmode@invalid-clone-single-crtc:
    - shard-lnl:          NOTRUN -> [SKIP][194] ([Intel XE#1435]) +2 other tests skip
   [194]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@kms_setmode@invalid-clone-single-crtc.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-bmg:          NOTRUN -> [SKIP][195] ([Intel XE#2426])
   [195]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_tiled_display@basic-test-pattern.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][196] ([Intel XE#362])
   [196]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_tiled_display@basic-test-pattern-with-chamelium:
    - shard-dg2-set2:     NOTRUN -> [SKIP][197] ([Intel XE#1500])
   [197]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html

  * igt@kms_tv_load_detect@load-detect:
    - shard-dg2-set2:     NOTRUN -> [SKIP][198] ([Intel XE#330])
   [198]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_tv_load_detect@load-detect.html
    - shard-lnl:          NOTRUN -> [SKIP][199] ([Intel XE#330])
   [199]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@kms_tv_load_detect@load-detect.html
    - shard-bmg:          NOTRUN -> [SKIP][200] ([Intel XE#2450])
   [200]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_tv_load_detect@load-detect.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-c-edp-1:
    - shard-lnl:          [PASS][201] -> [FAIL][202] ([Intel XE#899])
   [201]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-7/igt@kms_universal_plane@cursor-fb-leak@pipe-c-edp-1.html
   [202]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_universal_plane@cursor-fb-leak@pipe-c-edp-1.html

  * igt@kms_vblank@ts-continuation-suspend:
    - shard-bmg:          [PASS][203] -> [DMESG-WARN][204] ([Intel XE#4330]) +18 other tests dmesg-warn
   [203]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_vblank@ts-continuation-suspend.html
   [204]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_vblank@ts-continuation-suspend.html

  * igt@kms_vrr@flipline:
    - shard-dg2-set2:     NOTRUN -> [SKIP][205] ([Intel XE#455]) +20 other tests skip
   [205]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_vrr@flipline.html

  * igt@kms_vrr@max-min:
    - shard-bmg:          NOTRUN -> [SKIP][206] ([Intel XE#1499]) +3 other tests skip
   [206]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_vrr@max-min.html

  * igt@kms_writeback@writeback-fb-id:
    - shard-dg2-set2:     NOTRUN -> [SKIP][207] ([Intel XE#756]) +1 other test skip
   [207]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_writeback@writeback-fb-id.html
    - shard-lnl:          NOTRUN -> [SKIP][208] ([Intel XE#756])
   [208]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@kms_writeback@writeback-fb-id.html
    - shard-bmg:          NOTRUN -> [SKIP][209] ([Intel XE#756])
   [209]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_writeback@writeback-fb-id.html

  * igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all:
    - shard-bmg:          NOTRUN -> [SKIP][210] ([Intel XE#1091] / [Intel XE#2849])
   [210]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html

  * igt@xe_compute@ccs-mode-compute-kernel:
    - shard-lnl:          NOTRUN -> [SKIP][211] ([Intel XE#1447])
   [211]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@xe_compute@ccs-mode-compute-kernel.html

  * igt@xe_compute_preempt@compute-preempt-many:
    - shard-dg2-set2:     NOTRUN -> [SKIP][212] ([Intel XE#1280] / [Intel XE#455]) +1 other test skip
   [212]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@xe_compute_preempt@compute-preempt-many.html

  * igt@xe_copy_basic@mem-set-linear-0xfffe:
    - shard-dg2-set2:     NOTRUN -> [SKIP][213] ([Intel XE#1126])
   [213]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@xe_copy_basic@mem-set-linear-0xfffe.html

  * igt@xe_eudebug@basic-vm-access-parameters:
    - shard-dg2-set2:     NOTRUN -> [SKIP][214] ([Intel XE#2905]) +12 other tests skip
   [214]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@xe_eudebug@basic-vm-access-parameters.html
    - shard-lnl:          NOTRUN -> [SKIP][215] ([Intel XE#2905]) +11 other tests skip
   [215]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-2/igt@xe_eudebug@basic-vm-access-parameters.html

  * igt@xe_eudebug@basic-vm-access-parameters-userptr:
    - shard-bmg:          NOTRUN -> [SKIP][216] ([Intel XE#3889]) +2 other tests skip
   [216]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@xe_eudebug@basic-vm-access-parameters-userptr.html

  * igt@xe_eudebug@basic-vm-bind-metadata-discovery:
    - shard-bmg:          NOTRUN -> [SKIP][217] ([Intel XE#2905]) +14 other tests skip
   [217]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@xe_eudebug@basic-vm-bind-metadata-discovery.html

  * igt@xe_eudebug@basic-vm-bind-ufence-delay-ack:
    - shard-dg2-set2:     NOTRUN -> [SKIP][218] ([Intel XE#3889])
   [218]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@xe_eudebug@basic-vm-bind-ufence-delay-ack.html
    - shard-lnl:          NOTRUN -> [SKIP][219] ([Intel XE#3889])
   [219]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@xe_eudebug@basic-vm-bind-ufence-delay-ack.html

  * igt@xe_eudebug@discovery-race-sigint:
    - shard-bmg:          NOTRUN -> [SKIP][220] ([Intel XE#4259])
   [220]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@xe_eudebug@discovery-race-sigint.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][221] ([Intel XE#4259])
   [221]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@xe_eudebug@discovery-race-sigint.html
    - shard-lnl:          NOTRUN -> [SKIP][222] ([Intel XE#4259])
   [222]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@xe_eudebug@discovery-race-sigint.html

  * igt@xe_evict@evict-large:
    - shard-lnl:          NOTRUN -> [SKIP][223] ([Intel XE#688]) +4 other tests skip
   [223]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@xe_evict@evict-large.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate-race:
    - shard-dg2-set2:     NOTRUN -> [SKIP][224] ([Intel XE#1392]) +1 other test skip
   [224]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-invalidate-race.html

  * igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind:
    - shard-lnl:          NOTRUN -> [SKIP][225] ([Intel XE#1392]) +8 other tests skip
   [225]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind.html

  * igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate-race:
    - shard-dg2-set2:     [PASS][226] -> [SKIP][227] ([Intel XE#1392]) +4 other tests skip
   [226]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate-race.html
   [227]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-userptr-invalidate-race.html

  * igt@xe_exec_basic@multigpu-once-null-rebind:
    - shard-bmg:          NOTRUN -> [SKIP][228] ([Intel XE#2322]) +10 other tests skip
   [228]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@xe_exec_basic@multigpu-once-null-rebind.html

  * igt@xe_exec_fault_mode@twice-userptr-prefetch:
    - shard-dg2-set2:     NOTRUN -> [SKIP][229] ([Intel XE#288]) +34 other tests skip
   [229]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@xe_exec_fault_mode@twice-userptr-prefetch.html

  * igt@xe_exec_mix_modes@exec-simple-batch-store-dma-fence:
    - shard-dg2-set2:     NOTRUN -> [SKIP][230] ([Intel XE#2360]) +1 other test skip
   [230]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@xe_exec_mix_modes@exec-simple-batch-store-dma-fence.html

  * igt@xe_exec_threads@threads-hang-userptr-rebind:
    - shard-dg2-set2:     NOTRUN -> [DMESG-WARN][231] ([Intel XE#3876])
   [231]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@xe_exec_threads@threads-hang-userptr-rebind.html

  * igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit:
    - shard-bmg:          NOTRUN -> [SKIP][232] ([Intel XE#2229])
   [232]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html

  * igt@xe_live_ktest@xe_eudebug:
    - shard-lnl:          NOTRUN -> [SKIP][233] ([Intel XE#2833])
   [233]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@xe_live_ktest@xe_eudebug.html

  * igt@xe_mmap@pci-membarrier-bad-object:
    - shard-lnl:          NOTRUN -> [SKIP][234] ([Intel XE#4045])
   [234]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@xe_mmap@pci-membarrier-bad-object.html

  * igt@xe_module_load@load:
    - shard-lnl:          ([PASS][235], [PASS][236], [PASS][237], [PASS][238], [PASS][239], [PASS][240], [PASS][241], [PASS][242], [PASS][243], [PASS][244], [PASS][245], [PASS][246], [PASS][247], [PASS][248], [PASS][249], [PASS][250], [PASS][251], [PASS][252], [PASS][253], [PASS][254], [PASS][255], [PASS][256], [PASS][257], [PASS][258], [PASS][259]) -> ([PASS][260], [PASS][261], [PASS][262], [PASS][263], [PASS][264], [PASS][265], [PASS][266], [PASS][267], [PASS][268], [PASS][269], [PASS][270], [PASS][271], [PASS][272], [PASS][273], [PASS][274], [PASS][275], [PASS][276], [PASS][277], [PASS][278], [PASS][279], [PASS][280], [PASS][281], [PASS][282], [PASS][283], [PASS][284], [SKIP][285]) ([Intel XE#378])
   [235]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-5/igt@xe_module_load@load.html
   [236]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-2/igt@xe_module_load@load.html
   [237]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-2/igt@xe_module_load@load.html
   [238]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-7/igt@xe_module_load@load.html
   [239]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-7/igt@xe_module_load@load.html
   [240]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-8/igt@xe_module_load@load.html
   [241]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-8/igt@xe_module_load@load.html
   [242]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-8/igt@xe_module_load@load.html
   [243]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-5/igt@xe_module_load@load.html
   [244]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-6/igt@xe_module_load@load.html
   [245]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-6/igt@xe_module_load@load.html
   [246]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-3/igt@xe_module_load@load.html
   [247]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-3/igt@xe_module_load@load.html
   [248]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-8/igt@xe_module_load@load.html
   [249]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-1/igt@xe_module_load@load.html
   [250]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-6/igt@xe_module_load@load.html
   [251]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-5/igt@xe_module_load@load.html
   [252]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-1/igt@xe_module_load@load.html
   [253]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-4/igt@xe_module_load@load.html
   [254]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-4/igt@xe_module_load@load.html
   [255]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-4/igt@xe_module_load@load.html
   [256]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-7/igt@xe_module_load@load.html
   [257]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-7/igt@xe_module_load@load.html
   [258]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-1/igt@xe_module_load@load.html
   [259]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-3/igt@xe_module_load@load.html
   [260]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@xe_module_load@load.html
   [261]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-2/igt@xe_module_load@load.html
   [262]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-2/igt@xe_module_load@load.html
   [263]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@xe_module_load@load.html
   [264]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@xe_module_load@load.html
   [265]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@xe_module_load@load.html
   [266]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@xe_module_load@load.html
   [267]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@xe_module_load@load.html
   [268]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@xe_module_load@load.html
   [269]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@xe_module_load@load.html
   [270]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@xe_module_load@load.html
   [271]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@xe_module_load@load.html
   [272]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@xe_module_load@load.html
   [273]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@xe_module_load@load.html
   [274]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@xe_module_load@load.html
   [275]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@xe_module_load@load.html
   [276]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@xe_module_load@load.html
   [277]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-8/igt@xe_module_load@load.html
   [278]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@xe_module_load@load.html
   [279]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@xe_module_load@load.html
   [280]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@xe_module_load@load.html
   [281]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@xe_module_load@load.html
   [282]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@xe_module_load@load.html
   [283]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@xe_module_load@load.html
   [284]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@xe_module_load@load.html
   [285]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@xe_module_load@load.html

  * igt@xe_oa@invalid-create-userspace-config:
    - shard-dg2-set2:     NOTRUN -> [SKIP][286] ([Intel XE#2541] / [Intel XE#3573]) +9 other tests skip
   [286]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@xe_oa@invalid-create-userspace-config.html

  * igt@xe_oa@unprivileged-single-ctx-counters:
    - shard-lnl:          NOTRUN -> [SKIP][287] ([Intel XE#2248])
   [287]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@xe_oa@unprivileged-single-ctx-counters.html

  * igt@xe_pat@pat-index-xelp:
    - shard-lnl:          NOTRUN -> [SKIP][288] ([Intel XE#977])
   [288]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@xe_pat@pat-index-xelp.html
    - shard-bmg:          NOTRUN -> [SKIP][289] ([Intel XE#2245])
   [289]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@xe_pat@pat-index-xelp.html

  * igt@xe_peer2peer@write:
    - shard-lnl:          NOTRUN -> [SKIP][290] ([Intel XE#1061])
   [290]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-7/igt@xe_peer2peer@write.html

  * igt@xe_peer2peer@write@write-gpua-vram01-gpub-system-p2p:
    - shard-dg2-set2:     NOTRUN -> [FAIL][291] ([Intel XE#1173]) +1 other test fail
   [291]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@xe_peer2peer@write@write-gpua-vram01-gpub-system-p2p.html

  * igt@xe_pm@s2idle-d3cold-basic-exec:
    - shard-bmg:          NOTRUN -> [SKIP][292] ([Intel XE#2284]) +3 other tests skip
   [292]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@xe_pm@s2idle-d3cold-basic-exec.html
    - shard-dg2-set2:     NOTRUN -> [SKIP][293] ([Intel XE#2284] / [Intel XE#366]) +2 other tests skip
   [293]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@xe_pm@s2idle-d3cold-basic-exec.html
    - shard-lnl:          NOTRUN -> [SKIP][294] ([Intel XE#2284] / [Intel XE#366]) +1 other test skip
   [294]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@xe_pm@s2idle-d3cold-basic-exec.html

  * igt@xe_pm@s4-vm-bind-unbind-all:
    - shard-bmg:          NOTRUN -> [ABORT][295] ([Intel XE#4268])
   [295]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@xe_pm@s4-vm-bind-unbind-all.html
    - shard-dg2-set2:     NOTRUN -> [ABORT][296] ([Intel XE#4268])
   [296]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@xe_pm@s4-vm-bind-unbind-all.html
    - shard-lnl:          NOTRUN -> [ABORT][297] ([Intel XE#4268])
   [297]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-4/igt@xe_pm@s4-vm-bind-unbind-all.html

  * igt@xe_query@multigpu-query-gt-list:
    - shard-bmg:          NOTRUN -> [SKIP][298] ([Intel XE#944]) +1 other test skip
   [298]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@xe_query@multigpu-query-gt-list.html

  * igt@xe_query@multigpu-query-hwconfig:
    - shard-dg2-set2:     NOTRUN -> [SKIP][299] ([Intel XE#944])
   [299]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@xe_query@multigpu-query-hwconfig.html
    - shard-lnl:          NOTRUN -> [SKIP][300] ([Intel XE#944])
   [300]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@xe_query@multigpu-query-hwconfig.html

  * igt@xe_sriov_auto_provisioning@fair-allocation:
    - shard-lnl:          NOTRUN -> [SKIP][301] ([Intel XE#4130])
   [301]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-5/igt@xe_sriov_auto_provisioning@fair-allocation.html

  * igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling:
    - shard-bmg:          NOTRUN -> [SKIP][302] ([Intel XE#4130]) +2 other tests skip
   [302]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@xe_sriov_auto_provisioning@resources-released-on-vfs-disabling.html

  * igt@xe_sriov_flr@flr-twice:
    - shard-bmg:          NOTRUN -> [SKIP][303] ([Intel XE#4273])
   [303]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@xe_sriov_flr@flr-twice.html

  * igt@xe_sriov_flr@flr-vf1-clear:
    - shard-dg2-set2:     NOTRUN -> [SKIP][304] ([Intel XE#3342])
   [304]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@xe_sriov_flr@flr-vf1-clear.html
    - shard-bmg:          NOTRUN -> [SKIP][305] ([Intel XE#3342])
   [305]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@xe_sriov_flr@flr-vf1-clear.html

  * igt@xe_sriov_flr@flr-vfs-parallel:
    - shard-dg2-set2:     NOTRUN -> [SKIP][306] ([Intel XE#4273])
   [306]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@xe_sriov_flr@flr-vfs-parallel.html

  * igt@xe_sriov_scheduling@equal-throughput:
    - shard-dg2-set2:     NOTRUN -> [SKIP][307] ([Intel XE#4351])
   [307]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@xe_sriov_scheduling@equal-throughput.html
    - shard-lnl:          NOTRUN -> [SKIP][308] ([Intel XE#4351])
   [308]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-3/igt@xe_sriov_scheduling@equal-throughput.html
    - shard-bmg:          NOTRUN -> [SKIP][309] ([Intel XE#4351])
   [309]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-7/igt@xe_sriov_scheduling@equal-throughput.html

  
#### Possible fixes ####

  * igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p:
    - shard-bmg:          [SKIP][310] ([Intel XE#2314] / [Intel XE#2894]) -> [PASS][311]
   [310]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html
   [311]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_bw@connected-linear-tiling-2-displays-3840x2160p.html

  * igt@kms_cursor_edge_walk@128x128-right-edge:
    - shard-dg2-set2:     [DMESG-WARN][312] ([Intel XE#4330]) -> [PASS][313] +70 other tests pass
   [312]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-432/igt@kms_cursor_edge_walk@128x128-right-edge.html
   [313]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_cursor_edge_walk@128x128-right-edge.html

  * igt@kms_cursor_edge_walk@128x128-right-edge@pipe-d-dp-2:
    - shard-bmg:          [DMESG-WARN][314] ([Intel XE#4330]) -> [PASS][315] +24 other tests pass
   [314]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-4/igt@kms_cursor_edge_walk@128x128-right-edge@pipe-d-dp-2.html
   [315]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_cursor_edge_walk@128x128-right-edge@pipe-d-dp-2.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size:
    - shard-bmg:          [SKIP][316] ([Intel XE#2291]) -> [PASS][317] +4 other tests pass
   [316]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html
   [317]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-2/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size:
    - shard-dg2-set2:     [SKIP][318] ([Intel XE#309]) -> [PASS][319] +2 other tests pass
   [318]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html
   [319]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html

  * igt@kms_feature_discovery@display-2x:
    - shard-dg2-set2:     [SKIP][320] ([Intel XE#702]) -> [PASS][321]
   [320]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_feature_discovery@display-2x.html
   [321]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_feature_discovery@display-2x.html

  * igt@kms_flip@2x-dpms-vs-vblank-race-interruptible@ab-dp2-hdmi-a3:
    - shard-bmg:          [FAIL][322] ([Intel XE#3098]) -> [PASS][323] +1 other test pass
   [322]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-8/igt@kms_flip@2x-dpms-vs-vblank-race-interruptible@ab-dp2-hdmi-a3.html
   [323]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_flip@2x-dpms-vs-vblank-race-interruptible@ab-dp2-hdmi-a3.html

  * igt@kms_flip@2x-flip-vs-suspend:
    - shard-bmg:          [DMESG-WARN][324] ([Intel XE#2955]) -> [PASS][325]
   [324]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-1/igt@kms_flip@2x-flip-vs-suspend.html
   [325]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_flip@2x-flip-vs-suspend.html

  * igt@kms_flip@2x-nonexisting-fb:
    - shard-dg2-set2:     [SKIP][326] ([Intel XE#310]) -> [PASS][327] +2 other tests pass
   [326]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@2x-nonexisting-fb.html
   [327]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_flip@2x-nonexisting-fb.html

  * igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset:
    - shard-bmg:          [SKIP][328] ([Intel XE#2316]) -> [PASS][329] +1 other test pass
   [328]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-4/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
   [329]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
    - shard-dg2-set2:     [DMESG-WARN][330] ([Intel XE#2955] / [Intel XE#4330]) -> [PASS][331]
   [330]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-432/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html
   [331]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_flip@2x-single-buffer-flip-vs-dpms-off-vs-modeset.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a6:
    - shard-dg2-set2:     [FAIL][332] ([Intel XE#301]) -> [PASS][333]
   [332]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a6.html
   [333]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_flip@flip-vs-expired-vblank-interruptible@d-hdmi-a6.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-dg2-set2:     [DMESG-WARN][334] ([Intel XE#2955]) -> [PASS][335] +1 other test pass
   [334]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-432/igt@kms_flip@flip-vs-suspend.html
   [335]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_flip@plain-flip-ts-check-interruptible:
    - shard-dg2-set2:     [FAIL][336] ([Intel XE#2882] / [Intel XE#3149]) -> [PASS][337]
   [336]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@plain-flip-ts-check-interruptible.html
   [337]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_flip@plain-flip-ts-check-interruptible.html

  * igt@kms_flip@plain-flip-ts-check-interruptible@c-hdmi-a6:
    - shard-dg2-set2:     [FAIL][338] ([Intel XE#886]) -> [PASS][339]
   [338]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@plain-flip-ts-check-interruptible@c-hdmi-a6.html
   [339]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_flip@plain-flip-ts-check-interruptible@c-hdmi-a6.html

  * igt@kms_flip@plain-flip-ts-check-interruptible@d-hdmi-a6:
    - shard-dg2-set2:     [FAIL][340] -> [PASS][341]
   [340]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@plain-flip-ts-check-interruptible@d-hdmi-a6.html
   [341]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_flip@plain-flip-ts-check-interruptible@d-hdmi-a6.html

  * igt@kms_flip@wf_vblank-ts-check@a-edp1:
    - shard-lnl:          [FAIL][342] ([Intel XE#886]) -> [PASS][343] +1 other test pass
   [342]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-8/igt@kms_flip@wf_vblank-ts-check@a-edp1.html
   [343]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-6/igt@kms_flip@wf_vblank-ts-check@a-edp1.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc:
    - shard-dg2-set2:     [SKIP][344] ([Intel XE#656]) -> [PASS][345] +5 other tests pass
   [344]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html
   [345]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-bmg:          [SKIP][346] ([Intel XE#3012]) -> [PASS][347]
   [346]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_joiner@invalid-modeset-force-big-joiner.html
   [347]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_plane_lowres@tiling-x:
    - shard-dg2-set2:     [DMESG-WARN][348] ([Intel XE#4091]) -> [PASS][349]
   [348]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-436/igt@kms_plane_lowres@tiling-x.html
   [349]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-436/igt@kms_plane_lowres@tiling-x.html

  * igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats:
    - shard-dg2-set2:     [DMESG-WARN][350] ([Intel XE#2566] / [Intel XE#4330]) -> [PASS][351] +1 other test pass
   [350]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-433/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats.html
   [351]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_plane_scaling@plane-scaler-with-clipping-clamping-pixel-formats.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-lnl:          [FAIL][352] ([Intel XE#718]) -> [PASS][353]
   [352]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-lnl-4/igt@kms_pm_dc@dc5-psr.html
   [353]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-lnl-1/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
    - shard-dg2-set2:     [SKIP][354] ([Intel XE#836]) -> [PASS][355]
   [354]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html
   [355]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html

  * igt@kms_setmode@invalid-clone-single-crtc-stealing:
    - shard-dg2-set2:     [DMESG-WARN][356] ([Intel XE#4212]) -> [PASS][357]
   [356]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-463/igt@kms_setmode@invalid-clone-single-crtc-stealing.html
   [357]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_setmode@invalid-clone-single-crtc-stealing.html

  * igt@xe_exec_basic@multigpu-once-basic-defer-mmap:
    - shard-dg2-set2:     [SKIP][358] ([Intel XE#1392]) -> [PASS][359] +3 other tests pass
   [358]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-432/igt@xe_exec_basic@multigpu-once-basic-defer-mmap.html
   [359]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@xe_exec_basic@multigpu-once-basic-defer-mmap.html

  * igt@xe_pm@s3-vm-bind-unbind-all:
    - shard-dg2-set2:     [DMESG-WARN][360] ([Intel XE#4330] / [Intel XE#569]) -> [PASS][361] +2 other tests pass
   [360]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-433/igt@xe_pm@s3-vm-bind-unbind-all.html
   [361]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-463/igt@xe_pm@s3-vm-bind-unbind-all.html
    - shard-bmg:          [DMESG-WARN][362] ([Intel XE#4330] / [Intel XE#569]) -> [PASS][363]
   [362]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-1/igt@xe_pm@s3-vm-bind-unbind-all.html
   [363]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-8/igt@xe_pm@s3-vm-bind-unbind-all.html

  
#### Warnings ####

  * igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][364] ([Intel XE#455] / [Intel XE#787]) -> [SKIP][365] ([Intel XE#787]) +12 other tests skip
   [364]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-6.html
   [365]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-mc-ccs@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@bad-pixel-format-y-tiled-ccs@pipe-d-hdmi-a-6:
    - shard-dg2-set2:     [SKIP][366] ([Intel XE#787]) -> [SKIP][367] ([Intel XE#455] / [Intel XE#787]) +8 other tests skip
   [366]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-463/igt@kms_ccs@bad-pixel-format-y-tiled-ccs@pipe-d-hdmi-a-6.html
   [367]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_ccs@bad-pixel-format-y-tiled-ccs@pipe-d-hdmi-a-6.html

  * igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc:
    - shard-dg2-set2:     [INCOMPLETE][368] ([Intel XE#1727] / [Intel XE#3113] / [Intel XE#3124]) -> [INCOMPLETE][369] ([Intel XE#1727] / [Intel XE#3113])
   [368]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html
   [369]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs-cc.html

  * igt@kms_content_protection@atomic-dpms@pipe-a-dp-2:
    - shard-bmg:          [FAIL][370] ([Intel XE#1178]) -> [DMESG-FAIL][371] ([Intel XE#4330]) +1 other test dmesg-fail
   [370]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-1/igt@kms_content_protection@atomic-dpms@pipe-a-dp-2.html
   [371]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_content_protection@atomic-dpms@pipe-a-dp-2.html

  * igt@kms_content_protection@lic-type-0:
    - shard-dg2-set2:     [SKIP][372] ([Intel XE#455]) -> [DMESG-FAIL][373] ([Intel XE#4330]) +1 other test dmesg-fail
   [372]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_content_protection@lic-type-0.html
   [373]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_content_protection@lic-type-0.html

  * igt@kms_content_protection@lic-type-0@pipe-a-dp-2:
    - shard-bmg:          [TIMEOUT][374] -> [DMESG-FAIL][375] ([Intel XE#4330]) +1 other test dmesg-fail
   [374]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-2/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html
   [375]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_content_protection@lic-type-0@pipe-a-dp-2.html

  * igt@kms_content_protection@srm:
    - shard-dg2-set2:     [DMESG-FAIL][376] ([Intel XE#4330]) -> [SKIP][377] ([Intel XE#455])
   [376]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_content_protection@srm.html
   [377]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_content_protection@srm.html

  * igt@kms_content_protection@uevent:
    - shard-dg2-set2:     [FAIL][378] ([Intel XE#1188]) -> [SKIP][379] ([Intel XE#455])
   [378]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-434/igt@kms_content_protection@uevent.html
   [379]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic:
    - shard-bmg:          [SKIP][380] ([Intel XE#2291]) -> [DMESG-WARN][381] ([Intel XE#4330])
   [380]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-4/igt@kms_cursor_legacy@cursora-vs-flipb-atomic.html
   [381]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_cursor_legacy@cursora-vs-flipb-atomic.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions:
    - shard-dg2-set2:     [DMESG-WARN][382] ([Intel XE#4330]) -> [SKIP][383] ([Intel XE#309])
   [382]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-433/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions.html
   [383]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_cursor_legacy@cursora-vs-flipb-atomic-transitions.html

  * igt@kms_flip@2x-dpms-vs-vblank-race:
    - shard-dg2-set2:     [DMESG-WARN][384] ([Intel XE#2955]) -> [SKIP][385] ([Intel XE#310]) +1 other test skip
   [384]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-432/igt@kms_flip@2x-dpms-vs-vblank-race.html
   [385]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_flip@2x-dpms-vs-vblank-race.html

  * igt@kms_flip@2x-flip-vs-expired-vblank:
    - shard-bmg:          [SKIP][386] ([Intel XE#2316]) -> [DMESG-FAIL][387] ([Intel XE#4330])
   [386]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-4/igt@kms_flip@2x-flip-vs-expired-vblank.html
   [387]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_flip@2x-flip-vs-expired-vblank.html

  * igt@kms_flip@2x-flip-vs-suspend-interruptible:
    - shard-bmg:          [SKIP][388] ([Intel XE#2316]) -> [DMESG-WARN][389] ([Intel XE#2955])
   [388]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-4/igt@kms_flip@2x-flip-vs-suspend-interruptible.html
   [389]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_flip@2x-flip-vs-suspend-interruptible.html

  * igt@kms_flip@2x-plain-flip-interruptible:
    - shard-bmg:          [DMESG-WARN][390] ([Intel XE#4330]) -> [SKIP][391] ([Intel XE#2316])
   [390]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-1/igt@kms_flip@2x-plain-flip-interruptible.html
   [391]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_flip@2x-plain-flip-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-dg2-set2:     [FAIL][392] ([Intel XE#301]) -> [DMESG-FAIL][393] ([Intel XE#4330])
   [392]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [393]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-434/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@wf_vblank-ts-check:
    - shard-bmg:          [FAIL][394] ([Intel XE#2882]) -> [DMESG-WARN][395] ([Intel XE#4330])
   [394]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_flip@wf_vblank-ts-check.html
   [395]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_flip@wf_vblank-ts-check.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff:
    - shard-dg2-set2:     [SKIP][396] ([Intel XE#656]) -> [SKIP][397] ([Intel XE#651]) +17 other tests skip
   [396]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff.html
   [397]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-433/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt:
    - shard-bmg:          [SKIP][398] ([Intel XE#2311]) -> [SKIP][399] ([Intel XE#2312]) +7 other tests skip
   [398]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-8/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
   [399]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-4/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render:
    - shard-dg2-set2:     [DMESG-WARN][400] ([Intel XE#4330]) -> [SKIP][401] ([Intel XE#656])
   [400]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-463/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render.html
   [401]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][402] ([Intel XE#4141]) -> [SKIP][403] ([Intel XE#2312]) +3 other tests skip
   [402]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html
   [403]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][404] ([Intel XE#2312]) -> [SKIP][405] ([Intel XE#4141]) +4 other tests skip
   [404]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html
   [405]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render:
    - shard-bmg:          [SKIP][406] ([Intel XE#2312]) -> [SKIP][407] ([Intel XE#2311]) +6 other tests skip
   [406]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render.html
   [407]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcdrrs-2p-primscrn-spr-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-indfb-plflip-blt:
    - shard-dg2-set2:     [SKIP][408] ([Intel XE#651]) -> [SKIP][409] ([Intel XE#656]) +10 other tests skip
   [408]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-436/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-indfb-plflip-blt.html
   [409]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-indfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-onoff:
    - shard-dg2-set2:     [SKIP][410] ([Intel XE#656]) -> [SKIP][411] ([Intel XE#653]) +10 other tests skip
   [410]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-464/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-onoff.html
   [411]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-432/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-cur-indfb-onoff.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt:
    - shard-bmg:          [SKIP][412] ([Intel XE#2312]) -> [SKIP][413] ([Intel XE#2313]) +10 other tests skip
   [412]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html
   [413]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt:
    - shard-dg2-set2:     [SKIP][414] ([Intel XE#653]) -> [SKIP][415] ([Intel XE#656]) +10 other tests skip
   [414]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-dg2-463/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt.html
   [415]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-dg2-464/igt@kms_frontbuffer_tracking@psr-2p-primscrn-shrfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc:
    - shard-bmg:          [SKIP][416] ([Intel XE#2313]) -> [SKIP][417] ([Intel XE#2312]) +9 other tests skip
   [416]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-1/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc.html
   [417]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-mmap-wc.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-bmg:          [SKIP][418] ([Intel XE#3374] / [Intel XE#3544]) -> [SKIP][419] ([Intel XE#3544])
   [418]: https://intel-gfx-ci.01.org/tree/intel-xe/IGT_8255/shard-bmg-2/igt@kms_hdr@brightness-with-hdr.html
   [419]: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_12683/shard-bmg-1/igt@kms_hdr@brightness-with-hdr.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
  [Intel XE#1091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1091
  [Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
  [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#1128]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1128
  [Intel XE#1135]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1135
  [Intel XE#1173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1173
  [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#1280]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1280
  [Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
  [Intel XE#1397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1397
  [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#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
  [Intel XE#1430]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1430
  [Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
  [Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
  [Intel XE#1447]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1447
  [Intel XE#1450]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1450
  [Intel XE#1469]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1469
  [Intel XE#1470]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1470
  [Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
  [Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
  [Intel XE#1500]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1500
  [Intel XE#1508]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1508
  [Intel XE#1512]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1512
  [Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
  [Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
  [Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
  [Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
  [Intel XE#2233]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2233
  [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#2245]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2245
  [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#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
  [Intel XE#2286]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2286
  [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#2328]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2328
  [Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
  [Intel XE#2352]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2352
  [Intel XE#2360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2360
  [Intel XE#2370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2370
  [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#2387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2387
  [Intel XE#2390]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2390
  [Intel XE#2392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2392
  [Intel XE#2393]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2393
  [Intel XE#2413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2413
  [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#2450]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2450
  [Intel XE#2505]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2505
  [Intel XE#2541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2541
  [Intel XE#2550]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2550
  [Intel XE#2566]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2566
  [Intel XE#2568]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2568
  [Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
  [Intel XE#2669]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2669
  [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#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#2882]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2882
  [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#2905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2905
  [Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
  [Intel XE#2925]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2925
  [Intel XE#2927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2927
  [Intel XE#2934]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2934
  [Intel XE#2939]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2939
  [Intel XE#2955]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2955
  [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#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
  [Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
  [Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
  [Intel XE#3098]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3098
  [Intel XE#310]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/310
  [Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
  [Intel XE#3124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3124
  [Intel XE#3141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3141
  [Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
  [Intel XE#3157]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3157
  [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#3278]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3278
  [Intel XE#330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/330
  [Intel XE#3309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3309
  [Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
  [Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
  [Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
  [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#3433]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3433
  [Intel XE#3442]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3442
  [Intel XE#346]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/346
  [Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
  [Intel XE#356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/356
  [Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
  [Intel XE#362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/362
  [Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
  [Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
  [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#3767]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3767
  [Intel XE#3768]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3768
  [Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
  [Intel XE#3876]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3876
  [Intel XE#3889]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3889
  [Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
  [Intel XE#4045]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4045
  [Intel XE#4091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4091
  [Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
  [Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
  [Intel XE#4156]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4156
  [Intel XE#4210]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4210
  [Intel XE#4212]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4212
  [Intel XE#4259]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4259
  [Intel XE#4268]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4268
  [Intel XE#4273]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4273
  [Intel XE#4294]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4294
  [Intel XE#4298]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4298
  [Intel XE#4302]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4302
  [Intel XE#4328]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4328
  [Intel XE#4329]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4329
  [Intel XE#4330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4330
  [Intel XE#4331]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4331
  [Intel XE#4351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4351
  [Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
  [Intel XE#4356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4356
  [Intel XE#4359]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4359
  [Intel XE#4417]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4417
  [Intel XE#4422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4422
  [Intel XE#4439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4439
  [Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
  [Intel XE#569]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/569
  [Intel XE#599]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/599
  [Intel XE#605]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/605
  [Intel XE#607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/607
  [Intel XE#616]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/616
  [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#658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/658
  [Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
  [Intel XE#702]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/702
  [Intel XE#718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/718
  [Intel XE#756]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/756
  [Intel XE#776]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/776
  [Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
  [Intel XE#827]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/827
  [Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
  [Intel XE#873]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/873
  [Intel XE#886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/886
  [Intel XE#899]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/899
  [Intel XE#908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/908
  [Intel XE#911]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/911
  [Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
  [Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
  [Intel XE#977]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/977


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

  * IGT: IGT_8255 -> IGTPW_12683

  IGTPW_12683: eca0cbd842bf582a693a3f966b2a1b131705195e @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8255: 4ef742fae97d2f4af680f9e29f7ea45920f939b7 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  xe-2736-ca9d01b66c70413a62a1a28fbf8709d2e8440c1c: ca9d01b66c70413a62a1a28fbf8709d2e8440c1c

== Logs ==

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

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

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

* ✗ i915.CI.Full: failure for VKMS configfs tests (rev3)
  2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
                   ` (42 preceding siblings ...)
  2025-03-01  5:04 ` ✗ Xe.CI.Full: failure " Patchwork
@ 2025-03-01  9:43 ` Patchwork
  43 siblings, 0 replies; 84+ messages in thread
From: Patchwork @ 2025-03-01  9:43 UTC (permalink / raw)
  To: José Expósito; +Cc: igt-dev

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

== Series Details ==

Series: VKMS configfs tests (rev3)
URL   : https://patchwork.freedesktop.org/series/145065/
State : failure

== Summary ==

CI Bug Log - changes from IGT_8255_full -> IGTPW_12683_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with IGTPW_12683_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in IGTPW_12683_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.

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

Participating hosts (12 -> 10)
------------------------------

  Missing    (2): shard-snb-0 shard-dg2-set2 

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@gem_madvise@dontneed-before-exec:
    - shard-glk:          NOTRUN -> [DMESG-WARN][1]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk1/igt@gem_madvise@dontneed-before-exec.html

  * igt@gem_mmap_offset@open-flood:
    - shard-rkl:          [PASS][2] -> [DMESG-WARN][3]
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-5/igt@gem_mmap_offset@open-flood.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@gem_mmap_offset@open-flood.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible:
    - shard-mtlp:         [PASS][4] -> [FAIL][5]
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-mtlp-7/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible.html

  * {igt@vkms/vkms_configfs@enable-encoder-no-crtcs} (NEW):
    - shard-mtlp:         NOTRUN -> [SKIP][6] +32 other tests skip
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@vkms/vkms_configfs@enable-encoder-no-crtcs.html

  * {igt@vkms/vkms_configfs@enable-multiple-cursor-planes} (NEW):
    - shard-tglu:         NOTRUN -> [SKIP][7] +29 other tests skip
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@vkms/vkms_configfs@enable-multiple-cursor-planes.html

  * {igt@vkms/vkms_configfs@enable-no-connectors} (NEW):
    - shard-dg2-9:        NOTRUN -> [SKIP][8] +1 other test skip
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@vkms/vkms_configfs@enable-no-connectors.html

  * {igt@vkms/vkms_configfs@enable-no-crtcs} (NEW):
    - shard-dg2:          NOTRUN -> [SKIP][9] +32 other tests skip
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@vkms/vkms_configfs@enable-no-crtcs.html

  * {igt@vkms/vkms_configfs@enable-no-primary-plane} (NEW):
    - shard-tglu-1:       NOTRUN -> [SKIP][10] +3 other tests skip
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@vkms/vkms_configfs@enable-no-primary-plane.html

  * {igt@vkms/vkms_configfs@enabled-plane-cannot-change} (NEW):
    - shard-rkl:          NOTRUN -> [SKIP][11] +34 other tests skip
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@vkms/vkms_configfs@enabled-plane-cannot-change.html
    - shard-dg1:          NOTRUN -> [SKIP][12] +34 other tests skip
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@vkms/vkms_configfs@enabled-plane-cannot-change.html

  
New tests
---------

  New tests have been introduced between IGT_8255_full and IGTPW_12683_full:

### New IGT tests (36) ###

  * igt@vkms/vkms_configfs@attach-connector-to-encoder:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@attach-encoder-to-crtc:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@attach-plane-to-crtc:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@connector-default-files:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@connector-default-values:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@connector-wrong-values:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@crtc-default-files:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@crtc-default-values:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@crtc-wrong-values:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@device-default-files:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@device-default-values:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@device-wrong-values:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-crtc-no-encoder:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-encoder-no-crtcs:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-multiple-cursor-planes:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-multiple-primary-planes:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-connectors:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-crtcs:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-encoders:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-pipeline-items:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-planes:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-no-primary-plane:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-plane-no-crtcs:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-connectors:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-crtcs:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-encoders:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enable-too-many-planes:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-connector-cannot-change:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-connector-hot-plug:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-crtc-cannot-change:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-encoder-cannot-change:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@enabled-plane-cannot-change:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@encoder-default-files:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@plane-default-files:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@plane-default-values:
    - Statuses : 7 skip(s)
    - Exec time: [0.0] s

  * igt@vkms/vkms_configfs@plane-wrong-values:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  

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

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

### IGT changes ###

#### Issues hit ####

  * igt@api_intel_bb@crc32:
    - shard-rkl:          NOTRUN -> [SKIP][13] ([i915#6230])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@api_intel_bb@crc32.html
    - shard-dg1:          NOTRUN -> [SKIP][14] ([i915#6230])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@api_intel_bb@crc32.html
    - shard-tglu:         NOTRUN -> [SKIP][15] ([i915#6230])
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-2/igt@api_intel_bb@crc32.html

  * igt@api_intel_bb@object-reloc-keep-cache:
    - shard-dg2:          NOTRUN -> [SKIP][16] ([i915#8411]) +1 other test skip
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@api_intel_bb@object-reloc-keep-cache.html
    - shard-rkl:          NOTRUN -> [SKIP][17] ([i915#8411]) +2 other tests skip
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@api_intel_bb@object-reloc-keep-cache.html
    - shard-dg1:          NOTRUN -> [SKIP][18] ([i915#8411])
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@api_intel_bb@object-reloc-keep-cache.html

  * igt@api_intel_bb@object-reloc-purge-cache:
    - shard-mtlp:         NOTRUN -> [SKIP][19] ([i915#8411])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-1/igt@api_intel_bb@object-reloc-purge-cache.html

  * igt@device_reset@unbind-cold-reset-rebind:
    - shard-tglu:         NOTRUN -> [SKIP][20] ([i915#11078])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-5/igt@device_reset@unbind-cold-reset-rebind.html

  * igt@drm_fdinfo@busy-idle-check-all@ccs0:
    - shard-dg2-9:        NOTRUN -> [SKIP][21] ([i915#11527] / [i915#8414]) +6 other tests skip
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@drm_fdinfo@busy-idle-check-all@ccs0.html

  * igt@drm_fdinfo@isolation@vcs1:
    - shard-dg2-9:        NOTRUN -> [SKIP][22] ([i915#8414]) +8 other tests skip
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@drm_fdinfo@isolation@vcs1.html

  * igt@drm_fdinfo@most-busy-idle-check-all@ccs0:
    - shard-mtlp:         NOTRUN -> [SKIP][23] ([i915#8414]) +6 other tests skip
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-5/igt@drm_fdinfo@most-busy-idle-check-all@ccs0.html

  * igt@drm_fdinfo@most-busy-idle-check-all@vecs1:
    - shard-dg2:          NOTRUN -> [SKIP][24] ([i915#8414]) +16 other tests skip
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@drm_fdinfo@most-busy-idle-check-all@vecs1.html

  * igt@gem_basic@multigpu-create-close:
    - shard-tglu-1:       NOTRUN -> [SKIP][25] ([i915#7697])
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@gem_basic@multigpu-create-close.html

  * igt@gem_caching@reads:
    - shard-mtlp:         NOTRUN -> [SKIP][26] ([i915#4873])
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@gem_caching@reads.html

  * igt@gem_ccs@ctrl-surf-copy-new-ctx:
    - shard-tglu:         NOTRUN -> [SKIP][27] ([i915#9323])
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@gem_ccs@ctrl-surf-copy-new-ctx.html

  * igt@gem_ccs@suspend-resume:
    - shard-rkl:          NOTRUN -> [SKIP][28] ([i915#9323]) +1 other test skip
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@gem_ccs@suspend-resume.html
    - shard-dg1:          NOTRUN -> [SKIP][29] ([i915#9323])
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-19/igt@gem_ccs@suspend-resume.html
    - shard-mtlp:         NOTRUN -> [SKIP][30] ([i915#9323])
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-5/igt@gem_ccs@suspend-resume.html

  * igt@gem_close_race@multigpu-basic-threads:
    - shard-dg2:          NOTRUN -> [SKIP][31] ([i915#7697]) +1 other test skip
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_close_race@multigpu-basic-threads.html
    - shard-rkl:          NOTRUN -> [SKIP][32] ([i915#7697])
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@gem_close_race@multigpu-basic-threads.html
    - shard-dg1:          NOTRUN -> [SKIP][33] ([i915#7697])
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@gem_close_race@multigpu-basic-threads.html
    - shard-tglu:         NOTRUN -> [SKIP][34] ([i915#7697])
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@gem_close_race@multigpu-basic-threads.html

  * igt@gem_ctx_isolation@preservation-s3:
    - shard-rkl:          [PASS][35] -> [DMESG-FAIL][36] ([i915#12964]) +1 other test dmesg-fail
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-4/igt@gem_ctx_isolation@preservation-s3.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@gem_ctx_isolation@preservation-s3.html

  * igt@gem_ctx_isolation@preservation-s3@bcs0:
    - shard-glk:          NOTRUN -> [INCOMPLETE][37] ([i915#12353]) +1 other test incomplete
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk4/igt@gem_ctx_isolation@preservation-s3@bcs0.html

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

  * igt@gem_ctx_persistence@heartbeat-hang:
    - shard-dg2:          NOTRUN -> [SKIP][39] ([i915#8555]) +1 other test skip
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@gem_ctx_persistence@heartbeat-hang.html

  * igt@gem_ctx_persistence@heartbeat-hostile:
    - shard-dg2-9:        NOTRUN -> [SKIP][40] ([i915#8555]) +1 other test skip
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_ctx_persistence@heartbeat-hostile.html

  * igt@gem_ctx_persistence@heartbeat-many:
    - shard-mtlp:         NOTRUN -> [SKIP][41] ([i915#8555])
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@gem_ctx_persistence@heartbeat-many.html

  * igt@gem_ctx_persistence@saturated-hostile-nopreempt:
    - shard-dg2:          NOTRUN -> [SKIP][42] ([i915#5882]) +7 other tests skip
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_ctx_persistence@saturated-hostile-nopreempt.html

  * igt@gem_ctx_sseu@invalid-sseu:
    - shard-dg2:          NOTRUN -> [SKIP][43] ([i915#280]) +2 other tests skip
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@gem_ctx_sseu@invalid-sseu.html

  * igt@gem_eio@reset-stress:
    - shard-dg1:          [PASS][44] -> [FAIL][45] ([i915#12543] / [i915#5784])
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-16/igt@gem_eio@reset-stress.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@gem_eio@reset-stress.html

  * igt@gem_eio@unwedge-stress:
    - shard-dg1:          [PASS][46] -> [FAIL][47] ([i915#12714] / [i915#5784])
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-13/igt@gem_eio@unwedge-stress.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-15/igt@gem_eio@unwedge-stress.html

  * igt@gem_eio@wait-wedge-1us:
    - shard-mtlp:         [PASS][48] -> [ABORT][49] ([i915#13193]) +1 other test abort
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-mtlp-5/igt@gem_eio@wait-wedge-1us.html
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-7/igt@gem_eio@wait-wedge-1us.html

  * igt@gem_exec_balancer@bonded-pair:
    - shard-dg2-9:        NOTRUN -> [SKIP][50] ([i915#4771])
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_exec_balancer@bonded-pair.html

  * igt@gem_exec_balancer@hog:
    - shard-dg1:          NOTRUN -> [SKIP][51] ([i915#4812])
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-13/igt@gem_exec_balancer@hog.html

  * igt@gem_exec_balancer@invalid-bonds:
    - shard-dg2-9:        NOTRUN -> [SKIP][52] ([i915#4036])
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_exec_balancer@invalid-bonds.html

  * igt@gem_exec_balancer@parallel-balancer:
    - shard-tglu:         NOTRUN -> [SKIP][53] ([i915#4525]) +1 other test skip
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-9/igt@gem_exec_balancer@parallel-balancer.html

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

  * igt@gem_exec_balancer@parallel-ordering:
    - shard-tglu-1:       NOTRUN -> [SKIP][55] ([i915#4525])
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@gem_exec_balancer@parallel-ordering.html

  * igt@gem_exec_fence@submit:
    - shard-dg2:          NOTRUN -> [SKIP][56] ([i915#4812]) +1 other test skip
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@gem_exec_fence@submit.html

  * igt@gem_exec_fence@submit67:
    - shard-mtlp:         NOTRUN -> [SKIP][57] ([i915#4812]) +1 other test skip
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@gem_exec_fence@submit67.html

  * igt@gem_exec_flush@basic-uc-set-default:
    - shard-dg2:          NOTRUN -> [SKIP][58] ([i915#3539])
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_exec_flush@basic-uc-set-default.html

  * igt@gem_exec_flush@basic-wb-pro-default:
    - shard-dg2:          NOTRUN -> [SKIP][59] ([i915#3539] / [i915#4852]) +3 other tests skip
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@gem_exec_flush@basic-wb-pro-default.html

  * igt@gem_exec_flush@basic-wb-rw-before-default:
    - shard-dg1:          NOTRUN -> [SKIP][60] ([i915#3539] / [i915#4852])
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-13/igt@gem_exec_flush@basic-wb-rw-before-default.html

  * igt@gem_exec_reloc@basic-cpu-read-noreloc:
    - shard-mtlp:         NOTRUN -> [SKIP][61] ([i915#3281]) +8 other tests skip
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-5/igt@gem_exec_reloc@basic-cpu-read-noreloc.html

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

  * igt@gem_exec_reloc@basic-gtt-wc:
    - shard-dg2-9:        NOTRUN -> [SKIP][63] ([i915#3281]) +2 other tests skip
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_exec_reloc@basic-gtt-wc.html

  * igt@gem_exec_reloc@basic-write-read-active:
    - shard-dg2:          NOTRUN -> [SKIP][64] ([i915#3281]) +15 other tests skip
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@gem_exec_reloc@basic-write-read-active.html

  * igt@gem_exec_reloc@basic-write-wc-active:
    - shard-dg1:          NOTRUN -> [SKIP][65] ([i915#3281]) +4 other tests skip
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-18/igt@gem_exec_reloc@basic-write-wc-active.html

  * igt@gem_exec_schedule@semaphore-power:
    - shard-dg2:          NOTRUN -> [SKIP][66] ([i915#4537] / [i915#4812])
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_exec_schedule@semaphore-power.html

  * igt@gem_exec_schedule@wide:
    - shard-tglu:         [PASS][67] -> [INCOMPLETE][68] ([i915#13391]) +1 other test incomplete
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-tglu-9/igt@gem_exec_schedule@wide.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@gem_exec_schedule@wide.html

  * igt@gem_fenced_exec_thrash@2-spare-fences:
    - shard-dg2:          NOTRUN -> [SKIP][69] ([i915#4860]) +3 other tests skip
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@gem_fenced_exec_thrash@2-spare-fences.html

  * igt@gem_fenced_exec_thrash@no-spare-fences-interruptible:
    - shard-dg2-9:        NOTRUN -> [SKIP][70] ([i915#4860]) +1 other test skip
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_fenced_exec_thrash@no-spare-fences-interruptible.html

  * igt@gem_fenced_exec_thrash@too-many-fences:
    - shard-mtlp:         NOTRUN -> [SKIP][71] ([i915#4860]) +2 other tests skip
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@gem_fenced_exec_thrash@too-many-fences.html

  * igt@gem_lmem_swapping@heavy-random:
    - shard-glk:          NOTRUN -> [SKIP][72] ([i915#4613]) +9 other tests skip
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk2/igt@gem_lmem_swapping@heavy-random.html
    - shard-tglu:         NOTRUN -> [SKIP][73] ([i915#4613]) +3 other tests skip
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-9/igt@gem_lmem_swapping@heavy-random.html

  * igt@gem_lmem_swapping@heavy-verify-multi:
    - shard-mtlp:         NOTRUN -> [SKIP][74] ([i915#4613]) +2 other tests skip
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-7/igt@gem_lmem_swapping@heavy-verify-multi.html

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

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

  * igt@gem_media_fill@media-fill:
    - shard-mtlp:         NOTRUN -> [SKIP][77] ([i915#8289])
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@gem_media_fill@media-fill.html
    - shard-dg2:          NOTRUN -> [SKIP][78] ([i915#8289])
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@gem_media_fill@media-fill.html

  * igt@gem_media_vme:
    - shard-dg2:          NOTRUN -> [SKIP][79] ([i915#284])
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@gem_media_vme.html
    - shard-rkl:          NOTRUN -> [SKIP][80] ([i915#284])
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@gem_media_vme.html

  * igt@gem_mmap_gtt@basic-copy:
    - shard-dg2-9:        NOTRUN -> [SKIP][81] ([i915#4077]) +4 other tests skip
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_mmap_gtt@basic-copy.html

  * igt@gem_mmap_gtt@basic-small-copy-xy:
    - shard-dg1:          NOTRUN -> [SKIP][82] ([i915#4077]) +5 other tests skip
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@gem_mmap_gtt@basic-small-copy-xy.html

  * igt@gem_mmap_gtt@cpuset-big-copy-odd:
    - shard-dg2:          NOTRUN -> [SKIP][83] ([i915#4077]) +14 other tests skip
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-6/igt@gem_mmap_gtt@cpuset-big-copy-odd.html

  * igt@gem_mmap_gtt@hang-busy:
    - shard-mtlp:         NOTRUN -> [SKIP][84] ([i915#4077]) +10 other tests skip
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@gem_mmap_gtt@hang-busy.html

  * igt@gem_mmap_wc@write-cpu-read-wc:
    - shard-dg2-9:        NOTRUN -> [SKIP][85] ([i915#4083]) +3 other tests skip
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_mmap_wc@write-cpu-read-wc.html

  * igt@gem_mmap_wc@write-cpu-read-wc-unflushed:
    - shard-dg2:          NOTRUN -> [SKIP][86] ([i915#4083]) +5 other tests skip
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@gem_mmap_wc@write-cpu-read-wc-unflushed.html
    - shard-mtlp:         NOTRUN -> [SKIP][87] ([i915#4083]) +1 other test skip
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@gem_mmap_wc@write-cpu-read-wc-unflushed.html

  * igt@gem_partial_pwrite_pread@writes-after-reads-snoop:
    - shard-mtlp:         NOTRUN -> [SKIP][88] ([i915#3282]) +1 other test skip
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@gem_partial_pwrite_pread@writes-after-reads-snoop.html

  * igt@gem_pread@snoop:
    - shard-rkl:          NOTRUN -> [SKIP][89] ([i915#3282]) +12 other tests skip
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-4/igt@gem_pread@snoop.html
    - shard-dg2-9:        NOTRUN -> [SKIP][90] ([i915#3282]) +2 other tests skip
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_pread@snoop.html

  * igt@gem_pwrite_snooped:
    - shard-dg1:          NOTRUN -> [SKIP][91] ([i915#3282])
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-14/igt@gem_pwrite_snooped.html

  * igt@gem_pxp@display-protected-crc:
    - shard-dg2:          NOTRUN -> [SKIP][92] ([i915#4270]) +4 other tests skip
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_pxp@display-protected-crc.html

  * igt@gem_pxp@fail-invalid-protected-context:
    - shard-rkl:          NOTRUN -> [TIMEOUT][93] ([i915#12964])
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-3/igt@gem_pxp@fail-invalid-protected-context.html

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

  * igt@gem_pxp@hw-rejects-pxp-context:
    - shard-rkl:          NOTRUN -> [TIMEOUT][95] ([i915#12917] / [i915#12964]) +3 other tests timeout
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@gem_pxp@hw-rejects-pxp-context.html

  * igt@gem_pxp@protected-encrypted-src-copy-not-readible:
    - shard-rkl:          [PASS][96] -> [TIMEOUT][97] ([i915#12917] / [i915#12964]) +1 other test timeout
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-8/igt@gem_pxp@protected-encrypted-src-copy-not-readible.html
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-4/igt@gem_pxp@protected-encrypted-src-copy-not-readible.html
    - shard-dg2-9:        NOTRUN -> [SKIP][98] ([i915#4270])
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_pxp@protected-encrypted-src-copy-not-readible.html

  * igt@gem_pxp@reject-modify-context-protection-on:
    - shard-dg1:          NOTRUN -> [SKIP][99] ([i915#4270]) +1 other test skip
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-15/igt@gem_pxp@reject-modify-context-protection-on.html

  * igt@gem_readwrite@beyond-eob:
    - shard-dg2:          NOTRUN -> [SKIP][100] ([i915#3282]) +5 other tests skip
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@gem_readwrite@beyond-eob.html

  * igt@gem_render_copy@linear-to-vebox-y-tiled:
    - shard-mtlp:         NOTRUN -> [SKIP][101] ([i915#8428]) +2 other tests skip
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-3/igt@gem_render_copy@linear-to-vebox-y-tiled.html

  * igt@gem_render_copy@y-tiled-ccs-to-yf-tiled-mc-ccs:
    - shard-dg2-9:        NOTRUN -> [SKIP][102] ([i915#5190] / [i915#8428]) +1 other test skip
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_render_copy@y-tiled-ccs-to-yf-tiled-mc-ccs.html

  * igt@gem_render_copy@yf-tiled-ccs-to-y-tiled:
    - shard-dg2:          NOTRUN -> [SKIP][103] ([i915#5190] / [i915#8428]) +7 other tests skip
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@gem_render_copy@yf-tiled-ccs-to-y-tiled.html

  * igt@gem_set_tiling_vs_blt@untiled-to-tiled:
    - shard-dg2:          NOTRUN -> [SKIP][104] ([i915#4079]) +1 other test skip
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_set_tiling_vs_blt@untiled-to-tiled.html

  * igt@gem_set_tiling_vs_pwrite:
    - shard-dg2-9:        NOTRUN -> [SKIP][105] ([i915#4079])
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_set_tiling_vs_pwrite.html

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

  * igt@gem_tiled_swapping@non-threaded:
    - shard-glk:          NOTRUN -> [FAIL][107] ([i915#13805])
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk1/igt@gem_tiled_swapping@non-threaded.html

  * igt@gem_userptr_blits@coherency-sync:
    - shard-dg2:          NOTRUN -> [SKIP][108] ([i915#3297]) +3 other tests skip
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_userptr_blits@coherency-sync.html

  * igt@gem_userptr_blits@dmabuf-sync:
    - shard-glk:          NOTRUN -> [SKIP][109] ([i915#3323])
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk6/igt@gem_userptr_blits@dmabuf-sync.html

  * igt@gem_userptr_blits@forbidden-operations:
    - shard-dg2:          NOTRUN -> [SKIP][110] ([i915#3282] / [i915#3297])
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-1/igt@gem_userptr_blits@forbidden-operations.html

  * igt@gem_userptr_blits@map-fixed-invalidate:
    - shard-dg2-9:        NOTRUN -> [SKIP][111] ([i915#3297] / [i915#4880]) +2 other tests skip
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gem_userptr_blits@map-fixed-invalidate.html

  * igt@gem_userptr_blits@unsync-unmap-after-close:
    - shard-rkl:          NOTRUN -> [SKIP][112] ([i915#3297]) +1 other test skip
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@gem_userptr_blits@unsync-unmap-after-close.html
    - shard-dg1:          NOTRUN -> [SKIP][113] ([i915#3297])
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@gem_userptr_blits@unsync-unmap-after-close.html
    - shard-tglu:         NOTRUN -> [SKIP][114] ([i915#3297])
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-5/igt@gem_userptr_blits@unsync-unmap-after-close.html
    - shard-mtlp:         NOTRUN -> [SKIP][115] ([i915#3297])
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@gem_userptr_blits@unsync-unmap-after-close.html

  * igt@gen7_exec_parse@basic-rejected:
    - shard-dg2:          NOTRUN -> [SKIP][116] +16 other tests skip
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@gen7_exec_parse@basic-rejected.html

  * igt@gen9_exec_parse@basic-rejected-ctx-param:
    - shard-dg2-9:        NOTRUN -> [SKIP][117] ([i915#2856]) +1 other test skip
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@gen9_exec_parse@basic-rejected-ctx-param.html

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

  * igt@gen9_exec_parse@bb-start-far:
    - shard-dg2:          NOTRUN -> [SKIP][119] ([i915#2856]) +6 other tests skip
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@gen9_exec_parse@bb-start-far.html
    - shard-dg1:          NOTRUN -> [SKIP][120] ([i915#2527]) +2 other tests skip
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@gen9_exec_parse@bb-start-far.html

  * igt@gen9_exec_parse@bb-start-param:
    - shard-rkl:          NOTRUN -> [SKIP][121] ([i915#2527]) +6 other tests skip
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@gen9_exec_parse@bb-start-param.html

  * igt@gen9_exec_parse@secure-batches:
    - shard-mtlp:         NOTRUN -> [SKIP][122] ([i915#2856]) +4 other tests skip
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@gen9_exec_parse@secure-batches.html

  * igt@gen9_exec_parse@valid-registers:
    - shard-tglu:         NOTRUN -> [SKIP][123] ([i915#2527] / [i915#2856]) +4 other tests skip
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-10/igt@gen9_exec_parse@valid-registers.html

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

  * igt@i915_pm_freq_api@freq-basic-api:
    - shard-rkl:          NOTRUN -> [SKIP][125] ([i915#8399])
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@i915_pm_freq_api@freq-basic-api.html
    - shard-tglu:         NOTRUN -> [SKIP][126] ([i915#8399])
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-9/igt@i915_pm_freq_api@freq-basic-api.html

  * igt@i915_pm_rpm@system-suspend:
    - shard-glk:          [PASS][127] -> [INCOMPLETE][128] ([i915#12797])
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-glk3/igt@i915_pm_rpm@system-suspend.html
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk8/igt@i915_pm_rpm@system-suspend.html

  * igt@i915_pm_sseu@full-enable:
    - shard-tglu-1:       NOTRUN -> [SKIP][129] ([i915#4387])
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@i915_pm_sseu@full-enable.html

  * igt@i915_power@sanity:
    - shard-rkl:          NOTRUN -> [SKIP][130] ([i915#7984])
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@i915_power@sanity.html

  * igt@i915_query@hwconfig_table:
    - shard-tglu:         NOTRUN -> [SKIP][131] ([i915#6245])
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@i915_query@hwconfig_table.html

  * igt@i915_query@query-topology-coherent-slice-mask:
    - shard-mtlp:         NOTRUN -> [SKIP][132] ([i915#6188])
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@i915_query@query-topology-coherent-slice-mask.html

  * igt@i915_selftest@mock@memory_region:
    - shard-glk:          NOTRUN -> [DMESG-WARN][133] ([i915#9311]) +1 other test dmesg-warn
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk1/igt@i915_selftest@mock@memory_region.html

  * igt@i915_suspend@debugfs-reader:
    - shard-glk:          [PASS][134] -> [INCOMPLETE][135] ([i915#4817])
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-glk2/igt@i915_suspend@debugfs-reader.html
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk5/igt@i915_suspend@debugfs-reader.html

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

  * igt@kms_addfb_basic@bo-too-small-due-to-tiling:
    - shard-mtlp:         NOTRUN -> [SKIP][137] ([i915#4212]) +1 other test skip
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@kms_addfb_basic@bo-too-small-due-to-tiling.html

  * igt@kms_addfb_basic@framebuffer-vs-set-tiling:
    - shard-dg2:          NOTRUN -> [SKIP][138] ([i915#4212]) +1 other test skip
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_addfb_basic@framebuffer-vs-set-tiling.html

  * igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-c-hdmi-a-1-y-rc-ccs-cc:
    - shard-tglu:         NOTRUN -> [SKIP][139] ([i915#8709]) +3 other tests skip
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@kms_async_flips@async-flip-with-page-flip-events-atomic@pipe-c-hdmi-a-1-y-rc-ccs-cc.html

  * igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-dp-3-4-mc-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][140] ([i915#8709]) +15 other tests skip
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-a-dp-3-4-mc-ccs.html

  * igt@kms_async_flips@invalid-async-flip:
    - shard-dg2:          NOTRUN -> [SKIP][141] ([i915#12967] / [i915#6228])
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_async_flips@invalid-async-flip.html

  * igt@kms_atomic@plane-primary-overlay-mutable-zpos:
    - shard-dg2:          NOTRUN -> [SKIP][142] ([i915#9531])
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@kms_atomic@plane-primary-overlay-mutable-zpos.html
    - shard-rkl:          NOTRUN -> [SKIP][143] ([i915#9531])
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@kms_atomic@plane-primary-overlay-mutable-zpos.html

  * igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels:
    - shard-tglu-1:       NOTRUN -> [SKIP][144] ([i915#1769] / [i915#3555])
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_atomic_transition@plane-all-modeset-transition-internal-panels.html

  * igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [FAIL][145] ([i915#5956])
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-6/igt@kms_atomic_transition@plane-toggle-modeset-transition@pipe-a-hdmi-a-3.html

  * igt@kms_big_fb@4-tiled-16bpp-rotate-0:
    - shard-tglu:         NOTRUN -> [SKIP][146] ([i915#5286]) +3 other tests skip
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@kms_big_fb@4-tiled-16bpp-rotate-0.html

  * igt@kms_big_fb@4-tiled-16bpp-rotate-270:
    - shard-mtlp:         NOTRUN -> [SKIP][147] +14 other tests skip
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@kms_big_fb@4-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@4-tiled-addfb:
    - shard-rkl:          NOTRUN -> [SKIP][148] ([i915#5286]) +8 other tests skip
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_big_fb@4-tiled-addfb.html
    - shard-dg1:          NOTRUN -> [SKIP][149] ([i915#5286]) +1 other test skip
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@kms_big_fb@4-tiled-addfb.html

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

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
    - shard-dg1:          NOTRUN -> [SKIP][151] ([i915#4538] / [i915#5286]) +1 other test skip
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-13/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html

  * igt@kms_big_fb@linear-32bpp-rotate-90:
    - shard-rkl:          NOTRUN -> [SKIP][152] ([i915#3638]) +9 other tests skip
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@kms_big_fb@linear-32bpp-rotate-90.html

  * igt@kms_big_fb@linear-8bpp-rotate-90:
    - shard-dg2-9:        NOTRUN -> [SKIP][153] +6 other tests skip
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_big_fb@linear-8bpp-rotate-90.html

  * igt@kms_big_fb@y-tiled-8bpp-rotate-270:
    - shard-dg2:          NOTRUN -> [SKIP][154] ([i915#4538] / [i915#5190]) +12 other tests skip
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-6/igt@kms_big_fb@y-tiled-8bpp-rotate-270.html
    - shard-dg1:          NOTRUN -> [SKIP][155] ([i915#3638]) +3 other tests skip
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@kms_big_fb@y-tiled-8bpp-rotate-270.html

  * igt@kms_big_fb@y-tiled-addfb-size-overflow:
    - shard-mtlp:         NOTRUN -> [SKIP][156] ([i915#6187]) +1 other test skip
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@kms_big_fb@y-tiled-addfb-size-overflow.html

  * igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0:
    - shard-dg1:          NOTRUN -> [DMESG-WARN][157] ([i915#4423])
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-19/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0.html

  * igt@kms_big_fb@yf-tiled-addfb-size-overflow:
    - shard-dg2:          NOTRUN -> [SKIP][158] ([i915#5190]) +1 other test skip
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_big_fb@yf-tiled-addfb-size-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-dg2-9:        NOTRUN -> [SKIP][159] ([i915#4538] / [i915#5190]) +3 other tests skip
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html
    - shard-dg1:          NOTRUN -> [SKIP][160] ([i915#4538])
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-18/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_ccs@bad-aux-stride-y-tiled-gen12-rc-ccs@pipe-d-hdmi-a-1:
    - shard-dg2:          NOTRUN -> [SKIP][161] ([i915#10307] / [i915#10434] / [i915#6095]) +3 other tests skip
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_ccs@bad-aux-stride-y-tiled-gen12-rc-ccs@pipe-d-hdmi-a-1.html

  * igt@kms_ccs@bad-aux-stride-yf-tiled-ccs@pipe-a-hdmi-a-2:
    - shard-dg2-9:        NOTRUN -> [SKIP][162] ([i915#10307] / [i915#6095]) +14 other tests skip
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_ccs@bad-aux-stride-yf-tiled-ccs@pipe-a-hdmi-a-2.html

  * igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs:
    - shard-mtlp:         NOTRUN -> [SKIP][163] ([i915#6095]) +29 other tests skip
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@kms_ccs@bad-pixel-format-4-tiled-dg2-rc-ccs.html

  * igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc@pipe-b-hdmi-a-4:
    - shard-dg1:          NOTRUN -> [SKIP][164] ([i915#6095]) +133 other tests skip
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc@pipe-b-hdmi-a-4.html

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

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

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

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs:
    - shard-dg2-9:        NOTRUN -> [SKIP][168] ([i915#12313]) +1 other test skip
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html
    - shard-rkl:          NOTRUN -> [SKIP][169] ([i915#12313])
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@kms_ccs@crc-primary-rotation-180-4-tiled-lnl-ccs.html

  * igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-1:
    - shard-tglu-1:       NOTRUN -> [SKIP][170] ([i915#6095]) +34 other tests skip
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_ccs@crc-primary-rotation-180-4-tiled-mtl-rc-ccs@pipe-b-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
    - shard-dg2:          NOTRUN -> [SKIP][171] ([i915#12805])
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-ccs:
    - shard-dg2-9:        NOTRUN -> [SKIP][172] ([i915#6095]) +4 other tests skip
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_ccs@crc-primary-suspend-y-tiled-ccs.html

  * igt@kms_ccs@crc-primary-suspend-y-tiled-ccs@pipe-a-hdmi-a-1:
    - shard-glk:          NOTRUN -> [INCOMPLETE][173] ([i915#12796]) +1 other test incomplete
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk1/igt@kms_ccs@crc-primary-suspend-y-tiled-ccs@pipe-a-hdmi-a-1.html

  * igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs@pipe-b-dp-3:
    - shard-dg2:          NOTRUN -> [SKIP][174] ([i915#6095]) +11 other tests skip
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_ccs@crc-primary-suspend-yf-tiled-ccs@pipe-b-dp-3.html

  * igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-3:
    - shard-dg2:          NOTRUN -> [SKIP][175] ([i915#10307] / [i915#6095]) +211 other tests skip
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-mtl-mc-ccs@pipe-a-hdmi-a-3.html

  * igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs:
    - shard-tglu:         NOTRUN -> [SKIP][176] ([i915#12313]) +1 other test skip
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@kms_ccs@random-ccs-data-4-tiled-lnl-ccs.html

  * igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs-cc:
    - shard-tglu:         NOTRUN -> [SKIP][177] ([i915#6095]) +84 other tests skip
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@kms_ccs@random-ccs-data-4-tiled-mtl-rc-ccs-cc.html

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

  * igt@kms_ccs@random-ccs-data-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-1:
    - shard-glk:          NOTRUN -> [SKIP][179] +563 other tests skip
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk1/igt@kms_ccs@random-ccs-data-y-tiled-gen12-rc-ccs@pipe-a-hdmi-a-1.html

  * igt@kms_cdclk@mode-transition:
    - shard-rkl:          NOTRUN -> [SKIP][180] ([i915#3742])
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@kms_cdclk@mode-transition.html
    - shard-tglu:         NOTRUN -> [SKIP][181] ([i915#3742])
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-9/igt@kms_cdclk@mode-transition.html

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

  * igt@kms_chamelium_edid@hdmi-edid-stress-resolution-4k:
    - shard-tglu:         NOTRUN -> [SKIP][183] ([i915#11151] / [i915#7828]) +11 other tests skip
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-7/igt@kms_chamelium_edid@hdmi-edid-stress-resolution-4k.html

  * igt@kms_chamelium_frames@hdmi-crc-fast:
    - shard-dg2:          NOTRUN -> [SKIP][184] ([i915#11151] / [i915#7828]) +13 other tests skip
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@kms_chamelium_frames@hdmi-crc-fast.html

  * igt@kms_chamelium_frames@hdmi-frame-dump:
    - shard-tglu-1:       NOTRUN -> [SKIP][185] ([i915#11151] / [i915#7828]) +2 other tests skip
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_chamelium_frames@hdmi-frame-dump.html

  * igt@kms_chamelium_hpd@dp-hpd-for-each-pipe:
    - shard-mtlp:         NOTRUN -> [SKIP][186] ([i915#11151] / [i915#7828]) +6 other tests skip
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@kms_chamelium_hpd@dp-hpd-for-each-pipe.html
    - shard-dg1:          NOTRUN -> [SKIP][187] ([i915#11151] / [i915#4423] / [i915#7828])
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_chamelium_hpd@dp-hpd-for-each-pipe.html

  * igt@kms_chamelium_hpd@dp-hpd-with-enabled-mode:
    - shard-dg2-9:        NOTRUN -> [SKIP][188] ([i915#11151] / [i915#7828]) +1 other test skip
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_chamelium_hpd@dp-hpd-with-enabled-mode.html

  * igt@kms_chamelium_hpd@vga-hpd-fast:
    - shard-rkl:          NOTRUN -> [SKIP][189] ([i915#11151] / [i915#7828]) +15 other tests skip
   [189]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@kms_chamelium_hpd@vga-hpd-fast.html

  * igt@kms_chamelium_hpd@vga-hpd-for-each-pipe:
    - shard-dg1:          NOTRUN -> [SKIP][190] ([i915#11151] / [i915#7828]) +3 other tests skip
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-18/igt@kms_chamelium_hpd@vga-hpd-for-each-pipe.html

  * igt@kms_color@gamma@pipe-b-hdmi-a-1:
    - shard-glk:          [PASS][191] -> [DMESG-WARN][192] ([i915#118]) +1 other test dmesg-warn
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-glk9/igt@kms_color@gamma@pipe-b-hdmi-a-1.html
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk8/igt@kms_color@gamma@pipe-b-hdmi-a-1.html

  * igt@kms_content_protection@atomic:
    - shard-dg2:          NOTRUN -> [FAIL][193] ([i915#7173]) +1 other test fail
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_content_protection@atomic.html
    - shard-rkl:          NOTRUN -> [SKIP][194] ([i915#7118] / [i915#9424])
   [194]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@kms_content_protection@atomic.html
    - shard-dg1:          NOTRUN -> [SKIP][195] ([i915#7116] / [i915#9424])
   [195]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-15/igt@kms_content_protection@atomic.html
    - shard-tglu:         NOTRUN -> [SKIP][196] ([i915#6944] / [i915#7116] / [i915#7118] / [i915#9424])
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@kms_content_protection@atomic.html
    - shard-mtlp:         NOTRUN -> [SKIP][197] ([i915#6944] / [i915#9424])
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@kms_content_protection@atomic.html

  * igt@kms_content_protection@dp-mst-lic-type-0:
    - shard-tglu-1:       NOTRUN -> [SKIP][198] ([i915#3116] / [i915#3299])
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_content_protection@dp-mst-lic-type-0.html
    - shard-dg1:          NOTRUN -> [SKIP][199] ([i915#3299])
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-15/igt@kms_content_protection@dp-mst-lic-type-0.html

  * igt@kms_content_protection@dp-mst-lic-type-1:
    - shard-tglu:         NOTRUN -> [SKIP][200] ([i915#3116] / [i915#3299])
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@kms_content_protection@dp-mst-lic-type-1.html

  * igt@kms_content_protection@dp-mst-type-1:
    - shard-dg2:          NOTRUN -> [SKIP][201] ([i915#3299])
   [201]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@kms_content_protection@dp-mst-type-1.html
    - shard-rkl:          NOTRUN -> [SKIP][202] ([i915#3116]) +1 other test skip
   [202]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@kms_content_protection@dp-mst-type-1.html

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

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

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

  * igt@kms_content_protection@srm:
    - shard-dg2-9:        NOTRUN -> [SKIP][206] ([i915#7118])
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_content_protection@srm.html

  * igt@kms_content_protection@uevent:
    - shard-dg2-9:        NOTRUN -> [SKIP][207] ([i915#7118] / [i915#9424])
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_content_protection@uevent.html

  * igt@kms_cursor_crc@cursor-offscreen-512x170:
    - shard-tglu:         NOTRUN -> [SKIP][208] ([i915#13049]) +1 other test skip
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@kms_cursor_crc@cursor-offscreen-512x170.html
    - shard-mtlp:         NOTRUN -> [SKIP][209] ([i915#13049]) +2 other tests skip
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@kms_cursor_crc@cursor-offscreen-512x170.html

  * igt@kms_cursor_crc@cursor-onscreen-256x85@pipe-a-hdmi-a-2:
    - shard-rkl:          [PASS][210] -> [FAIL][211] ([i915#13566]) +1 other test fail
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-3/igt@kms_cursor_crc@cursor-onscreen-256x85@pipe-a-hdmi-a-2.html
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_cursor_crc@cursor-onscreen-256x85@pipe-a-hdmi-a-2.html

  * igt@kms_cursor_crc@cursor-onscreen-max-size:
    - shard-dg1:          NOTRUN -> [SKIP][212] ([i915#3555]) +3 other tests skip
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_cursor_crc@cursor-onscreen-max-size.html

  * igt@kms_cursor_crc@cursor-random-512x512:
    - shard-dg2:          NOTRUN -> [SKIP][213] ([i915#13049]) +5 other tests skip
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_cursor_crc@cursor-random-512x512.html

  * igt@kms_cursor_crc@cursor-random-64x21:
    - shard-tglu:         NOTRUN -> [FAIL][214] ([i915#13566]) +1 other test fail
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-2/igt@kms_cursor_crc@cursor-random-64x21.html

  * igt@kms_cursor_crc@cursor-rapid-movement-64x21:
    - shard-mtlp:         NOTRUN -> [SKIP][215] ([i915#8814]) +1 other test skip
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-7/igt@kms_cursor_crc@cursor-rapid-movement-64x21.html

  * igt@kms_cursor_crc@cursor-sliding-128x42:
    - shard-rkl:          NOTRUN -> [FAIL][216] ([i915#13566]) +3 other tests fail
   [216]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-6/igt@kms_cursor_crc@cursor-sliding-128x42.html

  * igt@kms_cursor_crc@cursor-sliding-32x10:
    - shard-tglu-1:       NOTRUN -> [SKIP][217] ([i915#3555]) +3 other tests skip
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_cursor_crc@cursor-sliding-32x10.html
    - shard-mtlp:         NOTRUN -> [SKIP][218] ([i915#3555] / [i915#8814]) +3 other tests skip
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_cursor_crc@cursor-sliding-32x10.html

  * igt@kms_cursor_crc@cursor-sliding-512x170:
    - shard-dg2-9:        NOTRUN -> [SKIP][219] ([i915#13049]) +1 other test skip
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_cursor_crc@cursor-sliding-512x170.html

  * igt@kms_cursor_crc@cursor-sliding-512x512:
    - shard-rkl:          NOTRUN -> [SKIP][220] ([i915#13049]) +1 other test skip
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_cursor_crc@cursor-sliding-512x512.html
    - shard-dg1:          NOTRUN -> [SKIP][221] ([i915#13049]) +1 other test skip
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-19/igt@kms_cursor_crc@cursor-sliding-512x512.html

  * igt@kms_cursor_legacy@cursora-vs-flipb-atomic:
    - shard-mtlp:         NOTRUN -> [SKIP][222] ([i915#9809]) +1 other test skip
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@kms_cursor_legacy@cursora-vs-flipb-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-atomic:
    - shard-dg2-9:        NOTRUN -> [SKIP][223] ([i915#13046] / [i915#5354]) +1 other test skip
   [223]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-legacy:
    - shard-rkl:          NOTRUN -> [SKIP][224] +23 other tests skip
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_cursor_legacy@cursorb-vs-flipa-legacy.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-legacy:
    - shard-dg2:          NOTRUN -> [SKIP][225] ([i915#13046] / [i915#5354]) +6 other tests skip
   [225]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@kms_cursor_legacy@cursorb-vs-flipb-legacy.html

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

  * igt@kms_dirtyfb@drrs-dirtyfb-ioctl:
    - shard-dg2:          NOTRUN -> [SKIP][227] ([i915#9833])
   [227]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_dirtyfb@drrs-dirtyfb-ioctl.html

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

  * igt@kms_display_modes@extended-mode-basic:
    - shard-dg2:          NOTRUN -> [SKIP][229] ([i915#13691])
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_display_modes@extended-mode-basic.html
    - shard-rkl:          NOTRUN -> [SKIP][230] ([i915#13691])
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@kms_display_modes@extended-mode-basic.html
    - shard-dg1:          NOTRUN -> [SKIP][231] ([i915#13691])
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_display_modes@extended-mode-basic.html
    - shard-tglu:         NOTRUN -> [SKIP][232] ([i915#13691])
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-7/igt@kms_display_modes@extended-mode-basic.html
    - shard-mtlp:         NOTRUN -> [SKIP][233] ([i915#13691])
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_display_modes@extended-mode-basic.html

  * igt@kms_display_modes@mst-extended-mode-negative:
    - shard-dg2-9:        NOTRUN -> [SKIP][234] ([i915#8588])
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_display_modes@mst-extended-mode-negative.html

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

  * igt@kms_dp_aux_dev:
    - shard-rkl:          NOTRUN -> [SKIP][236] ([i915#1257])
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_dp_aux_dev.html

  * igt@kms_dp_link_training@non-uhbr-sst:
    - shard-dg2:          NOTRUN -> [SKIP][237] ([i915#13749])
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-7/igt@kms_dp_link_training@non-uhbr-sst.html
    - shard-tglu-1:       NOTRUN -> [SKIP][238] ([i915#13749])
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_dp_link_training@non-uhbr-sst.html

  * igt@kms_dp_linktrain_fallback@dp-fallback:
    - shard-dg2:          NOTRUN -> [SKIP][239] ([i915#13707])
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@kms_dp_linktrain_fallback@dp-fallback.html
    - shard-rkl:          NOTRUN -> [SKIP][240] ([i915#13707])
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_dp_linktrain_fallback@dp-fallback.html

  * igt@kms_dp_linktrain_fallback@dsc-fallback:
    - shard-tglu:         NOTRUN -> [SKIP][241] ([i915#13707])
   [241]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-4/igt@kms_dp_linktrain_fallback@dsc-fallback.html

  * igt@kms_dsc@dsc-basic:
    - shard-dg2:          NOTRUN -> [SKIP][242] ([i915#3555] / [i915#3840])
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_dsc@dsc-basic.html

  * igt@kms_dsc@dsc-fractional-bpp-with-bpc:
    - shard-dg2:          NOTRUN -> [SKIP][243] ([i915#3840])
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@kms_dsc@dsc-fractional-bpp-with-bpc.html

  * igt@kms_dsc@dsc-with-bpc-formats:
    - shard-rkl:          NOTRUN -> [SKIP][244] ([i915#3555] / [i915#3840])
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@kms_dsc@dsc-with-bpc-formats.html
    - shard-tglu:         NOTRUN -> [SKIP][245] ([i915#3555] / [i915#3840])
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-2/igt@kms_dsc@dsc-with-bpc-formats.html

  * igt@kms_dsc@dsc-with-output-formats-with-bpc:
    - shard-dg2:          NOTRUN -> [SKIP][246] ([i915#3840] / [i915#9053])
   [246]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-7/igt@kms_dsc@dsc-with-output-formats-with-bpc.html
    - shard-rkl:          NOTRUN -> [SKIP][247] ([i915#3840] / [i915#9053])
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@kms_dsc@dsc-with-output-formats-with-bpc.html
    - shard-tglu-1:       NOTRUN -> [SKIP][248] ([i915#3840] / [i915#9053])
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_dsc@dsc-with-output-formats-with-bpc.html
    - shard-mtlp:         NOTRUN -> [SKIP][249] ([i915#3555] / [i915#3840] / [i915#9053])
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_dsc@dsc-with-output-formats-with-bpc.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-dirtyfb-tests:
    - shard-dg1:          NOTRUN -> [SKIP][250] ([i915#13798])
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-dirtyfb-tests.html

  * igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area:
    - shard-tglu:         NOTRUN -> [SKIP][251] ([i915#2575])
   [251]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@kms_fbc_dirty_rect@fbc-dirty-rectangle-out-visible-area.html

  * igt@kms_fbcon_fbt@psr:
    - shard-dg2:          NOTRUN -> [SKIP][252] ([i915#3469])
   [252]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_fbcon_fbt@psr.html

  * igt@kms_feature_discovery@chamelium:
    - shard-dg2:          NOTRUN -> [SKIP][253] ([i915#4854])
   [253]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_feature_discovery@chamelium.html

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

  * igt@kms_feature_discovery@psr2:
    - shard-tglu:         NOTRUN -> [SKIP][255] ([i915#658])
   [255]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@kms_feature_discovery@psr2.html
    - shard-rkl:          NOTRUN -> [SKIP][256] ([i915#658])
   [256]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_feature_discovery@psr2.html

  * igt@kms_fence_pin_leak:
    - shard-dg2-9:        NOTRUN -> [SKIP][257] ([i915#4881])
   [257]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_fence_pin_leak.html

  * igt@kms_flip@2x-absolute-wf_vblank:
    - shard-dg2:          NOTRUN -> [SKIP][258] ([i915#9934]) +12 other tests skip
   [258]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_flip@2x-absolute-wf_vblank.html

  * igt@kms_flip@2x-blocking-absolute-wf_vblank:
    - shard-tglu:         NOTRUN -> [SKIP][259] ([i915#3637]) +6 other tests skip
   [259]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-5/igt@kms_flip@2x-blocking-absolute-wf_vblank.html
    - shard-mtlp:         NOTRUN -> [SKIP][260] ([i915#3637]) +4 other tests skip
   [260]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@kms_flip@2x-blocking-absolute-wf_vblank.html

  * igt@kms_flip@2x-blocking-wf_vblank:
    - shard-dg1:          NOTRUN -> [SKIP][261] ([i915#9934]) +3 other tests skip
   [261]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@kms_flip@2x-blocking-wf_vblank.html

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

  * igt@kms_flip@2x-modeset-vs-vblank-race:
    - shard-tglu-1:       NOTRUN -> [SKIP][263] ([i915#3637]) +3 other tests skip
   [263]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_flip@2x-modeset-vs-vblank-race.html

  * igt@kms_flip@2x-plain-flip:
    - shard-rkl:          NOTRUN -> [SKIP][264] ([i915#9934]) +8 other tests skip
   [264]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_flip@2x-plain-flip.html

  * igt@kms_flip@absolute-wf_vblank-interruptible:
    - shard-rkl:          [PASS][265] -> [DMESG-WARN][266] ([i915#12917] / [i915#12964])
   [265]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-2/igt@kms_flip@absolute-wf_vblank-interruptible.html
   [266]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_flip@absolute-wf_vblank-interruptible.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@a-edp1:
    - shard-mtlp:         [PASS][267] -> [FAIL][268] ([i915#13734]) +1 other test fail
   [267]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-mtlp-7/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@a-edp1.html
   [268]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@a-edp1.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank@a-hdmi-a2:
    - shard-rkl:          [PASS][269] -> [FAIL][270] ([i915#1522]) +1 other test fail
   [269]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-3/igt@kms_flip@flip-vs-blocking-wf-vblank@a-hdmi-a2.html
   [270]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-3/igt@kms_flip@flip-vs-blocking-wf-vblank@a-hdmi-a2.html

  * igt@kms_flip@flip-vs-blocking-wf-vblank@b-hdmi-a1:
    - shard-tglu:         [PASS][271] -> [FAIL][272] ([i915#1522]) +3 other tests fail
   [271]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-tglu-6/igt@kms_flip@flip-vs-blocking-wf-vblank@b-hdmi-a1.html
   [272]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-7/igt@kms_flip@flip-vs-blocking-wf-vblank@b-hdmi-a1.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][273] ([i915#12745] / [i915#4839])
   [273]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk9/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_flip@flip-vs-suspend@a-hdmi-a1:
    - shard-glk:          NOTRUN -> [INCOMPLETE][274] ([i915#12745])
   [274]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk9/igt@kms_flip@flip-vs-suspend@a-hdmi-a1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode:
    - shard-mtlp:         NOTRUN -> [SKIP][275] ([i915#2672] / [i915#8813]) +5 other tests skip
   [275]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling:
    - shard-tglu:         NOTRUN -> [SKIP][276] ([i915#2672] / [i915#3555]) +3 other tests skip
   [276]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-9/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling.html
    - shard-mtlp:         NOTRUN -> [SKIP][277] ([i915#2672] / [i915#3555] / [i915#8813]) +7 other tests skip
   [277]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-32bpp-yftileccs-downscaling.html
    - shard-dg2:          NOTRUN -> [SKIP][278] ([i915#2672] / [i915#3555]) +2 other tests skip
   [278]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-1/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-valid-mode:
    - shard-dg2:          NOTRUN -> [SKIP][279] ([i915#2672]) +5 other tests skip
   [279]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-1/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-downscaling:
    - shard-dg2-9:        NOTRUN -> [SKIP][280] ([i915#2672] / [i915#3555])
   [280]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling@pipe-a-valid-mode:
    - shard-tglu:         NOTRUN -> [SKIP][281] ([i915#2587] / [i915#2672]) +3 other tests skip
   [281]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-7/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling@pipe-a-valid-mode.html
    - shard-dg2-9:        NOTRUN -> [SKIP][282] ([i915#2672])
   [282]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling:
    - shard-dg1:          NOTRUN -> [SKIP][283] ([i915#2587] / [i915#2672] / [i915#3555])
   [283]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/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-dg1:          NOTRUN -> [SKIP][284] ([i915#2587] / [i915#2672])
   [284]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
    - shard-tglu-1:       NOTRUN -> [SKIP][285] ([i915#2672] / [i915#3555])
   [285]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
    - shard-tglu-1:       NOTRUN -> [SKIP][286] ([i915#2587] / [i915#2672])
   [286]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

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

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

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling:
    - shard-dg2:          NOTRUN -> [SKIP][289] ([i915#2672] / [i915#3555] / [i915#5190]) +2 other tests skip
   [289]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytile-downscaling.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-render:
    - shard-dg1:          [PASS][290] -> [DMESG-WARN][291] ([i915#4423])
   [290]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-19/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-render.html
   [291]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-14/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt:
    - shard-dg2:          [PASS][292] -> [FAIL][293] ([i915#6880])
   [292]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-8/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt.html
   [293]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-blt:
    - shard-dg2:          NOTRUN -> [SKIP][294] ([i915#5354]) +40 other tests skip
   [294]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-pwrite:
    - shard-dg1:          NOTRUN -> [SKIP][295] +15 other tests skip
   [295]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-pri-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbc-2p-shrfb-fliptrack-mmap-gtt:
    - shard-dg2-9:        NOTRUN -> [SKIP][296] ([i915#8708]) +5 other tests skip
   [296]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_frontbuffer_tracking@fbc-2p-shrfb-fliptrack-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite:
    - shard-dg2:          NOTRUN -> [SKIP][297] ([i915#10433] / [i915#3458])
   [297]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-plflip-blt:
    - shard-dg2-9:        NOTRUN -> [SKIP][298] ([i915#3458]) +7 other tests skip
   [298]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-shrfb-plflip-blt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-rte:
    - shard-rkl:          NOTRUN -> [SKIP][299] ([i915#3023]) +32 other tests skip
   [299]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@kms_frontbuffer_tracking@fbcpsr-1p-rte.html
    - shard-dg1:          NOTRUN -> [SKIP][300] ([i915#3458]) +6 other tests skip
   [300]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_frontbuffer_tracking@fbcpsr-1p-rte.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-gtt:
    - shard-mtlp:         NOTRUN -> [SKIP][301] ([i915#8708]) +2 other tests skip
   [301]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-2/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-pri-shrfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-pgflip-blt:
    - shard-rkl:          NOTRUN -> [SKIP][302] ([i915#1825]) +55 other tests skip
   [302]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-4/igt@kms_frontbuffer_tracking@fbcpsr-2p-scndscrn-shrfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@pipe-fbc-rte:
    - shard-tglu:         NOTRUN -> [SKIP][303] ([i915#9766])
   [303]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-7/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html

  * igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-mmap-cpu:
    - shard-dg2:          NOTRUN -> [SKIP][304] ([i915#3458]) +23 other tests skip
   [304]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_frontbuffer_tracking@psr-1p-offscren-pri-shrfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-wc:
    - shard-tglu-1:       NOTRUN -> [SKIP][305] +40 other tests skip
   [305]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-mmap-cpu:
    - shard-dg2-9:        NOTRUN -> [SKIP][306] ([i915#5354]) +15 other tests skip
   [306]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-cur-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-render:
    - shard-mtlp:         NOTRUN -> [SKIP][307] ([i915#1825]) +19 other tests skip
   [307]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-indfb-draw-render.html

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

  * igt@kms_frontbuffer_tracking@psr-rgb101010-draw-mmap-wc:
    - shard-dg1:          NOTRUN -> [SKIP][309] ([i915#8708]) +6 other tests skip
   [309]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@kms_frontbuffer_tracking@psr-rgb101010-draw-mmap-wc.html

  * igt@kms_hdr@bpc-switch-suspend:
    - shard-dg2-9:        NOTRUN -> [SKIP][310] ([i915#3555] / [i915#8228]) +2 other tests skip
   [310]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_hdr@bpc-switch-suspend.html

  * igt@kms_hdr@static-toggle:
    - shard-dg2:          [PASS][311] -> [SKIP][312] ([i915#3555] / [i915#8228])
   [311]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-11/igt@kms_hdr@static-toggle.html
   [312]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@kms_hdr@static-toggle.html

  * igt@kms_hdr@static-toggle-suspend:
    - shard-rkl:          NOTRUN -> [SKIP][313] ([i915#3555] / [i915#8228]) +3 other tests skip
   [313]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@kms_hdr@static-toggle-suspend.html

  * igt@kms_joiner@basic-force-ultra-joiner:
    - shard-mtlp:         NOTRUN -> [SKIP][314] ([i915#10656]) +1 other test skip
   [314]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_joiner@basic-force-ultra-joiner.html

  * igt@kms_joiner@invalid-modeset-big-joiner:
    - shard-rkl:          NOTRUN -> [SKIP][315] ([i915#10656])
   [315]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_joiner@invalid-modeset-big-joiner.html
    - shard-dg1:          NOTRUN -> [SKIP][316] ([i915#10656])
   [316]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@kms_joiner@invalid-modeset-big-joiner.html
    - shard-tglu:         NOTRUN -> [SKIP][317] ([i915#10656])
   [317]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-4/igt@kms_joiner@invalid-modeset-big-joiner.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-rkl:          NOTRUN -> [SKIP][318] ([i915#12388])
   [318]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_joiner@invalid-modeset-force-ultra-joiner:
    - shard-dg2:          NOTRUN -> [SKIP][319] ([i915#10656]) +2 other tests skip
   [319]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html
    - shard-tglu-1:       NOTRUN -> [SKIP][320] ([i915#12394]) +1 other test skip
   [320]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_joiner@invalid-modeset-force-ultra-joiner.html

  * igt@kms_plane_alpha_blend@alpha-opaque-fb:
    - shard-glk:          NOTRUN -> [FAIL][321] ([i915#10647] / [i915#12169]) +1 other test fail
   [321]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk8/igt@kms_plane_alpha_blend@alpha-opaque-fb.html

  * igt@kms_plane_alpha_blend@constant-alpha-max@pipe-c-hdmi-a-1:
    - shard-glk:          NOTRUN -> [FAIL][322] ([i915#10647]) +3 other tests fail
   [322]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk9/igt@kms_plane_alpha_blend@constant-alpha-max@pipe-c-hdmi-a-1.html

  * igt@kms_plane_lowres@tiling-y:
    - shard-dg2:          NOTRUN -> [SKIP][323] ([i915#8821])
   [323]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_plane_lowres@tiling-y.html

  * igt@kms_plane_lowres@tiling-yf:
    - shard-dg2-9:        NOTRUN -> [SKIP][324] ([i915#3555] / [i915#8821])
   [324]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_plane_lowres@tiling-yf.html

  * igt@kms_plane_multiple@tiling-y:
    - shard-dg2:          NOTRUN -> [SKIP][325] ([i915#8806])
   [325]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_plane_multiple@tiling-y.html

  * igt@kms_plane_multiple@tiling-yf:
    - shard-rkl:          NOTRUN -> [SKIP][326] ([i915#3555]) +7 other tests skip
   [326]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@kms_plane_multiple@tiling-yf.html

  * igt@kms_plane_scaling@intel-max-src-size:
    - shard-dg2:          NOTRUN -> [SKIP][327] ([i915#6953] / [i915#9423])
   [327]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_plane_scaling@intel-max-src-size.html
    - shard-rkl:          NOTRUN -> [SKIP][328] ([i915#6953])
   [328]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_plane_scaling@intel-max-src-size.html
    - shard-mtlp:         NOTRUN -> [SKIP][329] ([i915#6953])
   [329]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-1/igt@kms_plane_scaling@intel-max-src-size.html

  * igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-a:
    - shard-rkl:          NOTRUN -> [SKIP][330] ([i915#12247]) +12 other tests skip
   [330]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-a.html
    - shard-tglu-1:       NOTRUN -> [SKIP][331] ([i915#12247]) +8 other tests skip
   [331]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_plane_scaling@plane-downscale-factor-0-25-with-modifiers@pipe-a.html

  * igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-c:
    - shard-tglu:         NOTRUN -> [SKIP][332] ([i915#12247]) +17 other tests skip
   [332]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-10/igt@kms_plane_scaling@plane-upscale-20x20-with-rotation@pipe-c.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling:
    - shard-dg2:          NOTRUN -> [SKIP][333] ([i915#12247] / [i915#9423])
   [333]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-d:
    - shard-dg2:          NOTRUN -> [SKIP][334] ([i915#12247]) +7 other tests skip
   [334]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-d.html

  * igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25:
    - shard-tglu-1:       NOTRUN -> [SKIP][335] ([i915#12247] / [i915#6953])
   [335]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25.html

  * igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25:
    - shard-dg2:          NOTRUN -> [SKIP][336] ([i915#12247] / [i915#3555] / [i915#9423])
   [336]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25.html

  * igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-25:
    - shard-tglu:         NOTRUN -> [SKIP][337] ([i915#12247] / [i915#6953])
   [337]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-5/igt@kms_plane_scaling@planes-upscale-factor-0-25-downscale-factor-0-25.html

  * igt@kms_pm_backlight@basic-brightness:
    - shard-dg1:          NOTRUN -> [SKIP][338] ([i915#5354])
   [338]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-14/igt@kms_pm_backlight@basic-brightness.html
    - shard-tglu:         NOTRUN -> [SKIP][339] ([i915#9812])
   [339]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-9/igt@kms_pm_backlight@basic-brightness.html

  * igt@kms_pm_backlight@brightness-with-dpms:
    - shard-tglu-1:       NOTRUN -> [SKIP][340] ([i915#12343])
   [340]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_pm_backlight@brightness-with-dpms.html

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

  * igt@kms_pm_backlight@fade-with-dpms:
    - shard-rkl:          NOTRUN -> [SKIP][342] ([i915#5354]) +2 other tests skip
   [342]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_pm_backlight@fade-with-dpms.html

  * igt@kms_pm_dc@dc5-psr:
    - shard-dg2-9:        NOTRUN -> [SKIP][343] ([i915#9685])
   [343]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_pm_dc@dc5-psr.html

  * igt@kms_pm_dc@dc5-retention-flops:
    - shard-dg2:          NOTRUN -> [SKIP][344] ([i915#3828])
   [344]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_pm_dc@dc5-retention-flops.html
    - shard-rkl:          NOTRUN -> [SKIP][345] ([i915#3828]) +1 other test skip
   [345]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_pm_dc@dc5-retention-flops.html
    - shard-dg1:          NOTRUN -> [SKIP][346] ([i915#3828])
   [346]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-19/igt@kms_pm_dc@dc5-retention-flops.html
    - shard-tglu:         NOTRUN -> [SKIP][347] ([i915#3828]) +1 other test skip
   [347]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@kms_pm_dc@dc5-retention-flops.html
    - shard-mtlp:         NOTRUN -> [SKIP][348] ([i915#3828])
   [348]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-7/igt@kms_pm_dc@dc5-retention-flops.html

  * igt@kms_pm_dc@dc9-dpms:
    - shard-tglu:         [PASS][349] -> [SKIP][350] ([i915#4281])
   [349]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-tglu-10/igt@kms_pm_dc@dc9-dpms.html
   [350]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@kms_pm_dc@dc9-dpms.html

  * igt@kms_pm_lpsp@kms-lpsp:
    - shard-dg2:          NOTRUN -> [SKIP][351] ([i915#9340])
   [351]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-6/igt@kms_pm_lpsp@kms-lpsp.html
    - shard-dg1:          NOTRUN -> [SKIP][352] ([i915#9340])
   [352]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-17/igt@kms_pm_lpsp@kms-lpsp.html

  * igt@kms_pm_rpm@dpms-lpsp:
    - shard-dg2:          [PASS][353] -> [SKIP][354] ([i915#9519])
   [353]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-4/igt@kms_pm_rpm@dpms-lpsp.html
   [354]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@kms_pm_rpm@dpms-lpsp.html

  * igt@kms_pm_rpm@dpms-mode-unset-lpsp:
    - shard-dg2-9:        NOTRUN -> [SKIP][355] ([i915#9519])
   [355]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html

  * igt@kms_pm_rpm@dpms-mode-unset-non-lpsp:
    - shard-dg2:          NOTRUN -> [SKIP][356] ([i915#9519])
   [356]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@kms_pm_rpm@dpms-mode-unset-non-lpsp.html

  * igt@kms_pm_rpm@dpms-non-lpsp:
    - shard-mtlp:         NOTRUN -> [SKIP][357] ([i915#9519]) +1 other test skip
   [357]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-5/igt@kms_pm_rpm@dpms-non-lpsp.html

  * igt@kms_pm_rpm@modeset-lpsp:
    - shard-rkl:          NOTRUN -> [SKIP][358] ([i915#9519])
   [358]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_pm_rpm@modeset-lpsp.html

  * igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait:
    - shard-tglu:         NOTRUN -> [SKIP][359] ([i915#9519])
   [359]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@kms_pm_rpm@modeset-non-lpsp-stress-no-wait.html

  * igt@kms_prime@basic-modeset-hybrid:
    - shard-rkl:          NOTRUN -> [SKIP][360] ([i915#6524]) +1 other test skip
   [360]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-3/igt@kms_prime@basic-modeset-hybrid.html

  * igt@kms_prime@d3hot:
    - shard-tglu:         NOTRUN -> [SKIP][361] ([i915#6524])
   [361]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-2/igt@kms_prime@d3hot.html

  * igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-exceed-fully-sf:
    - shard-mtlp:         NOTRUN -> [SKIP][362] ([i915#12316]) +4 other tests skip
   [362]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-exceed-fully-sf.html

  * igt@kms_psr2_sf@fbc-psr2-cursor-plane-update-sf:
    - shard-dg2-9:        NOTRUN -> [SKIP][363] ([i915#11520]) +3 other tests skip
   [363]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_psr2_sf@fbc-psr2-cursor-plane-update-sf.html

  * igt@kms_psr2_sf@fbc-psr2-plane-move-sf-dmg-area@pipe-a-edp-1:
    - shard-mtlp:         NOTRUN -> [SKIP][364] ([i915#9808])
   [364]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_psr2_sf@fbc-psr2-plane-move-sf-dmg-area@pipe-a-edp-1.html

  * igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area:
    - shard-glk:          NOTRUN -> [SKIP][365] ([i915#11520]) +11 other tests skip
   [365]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk1/igt@kms_psr2_sf@fbc-psr2-primary-plane-update-sf-dmg-area.html

  * igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf:
    - shard-rkl:          NOTRUN -> [SKIP][366] ([i915#11520]) +12 other tests skip
   [366]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf.html
    - shard-snb:          NOTRUN -> [SKIP][367] ([i915#11520]) +6 other tests skip
   [367]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-snb1/igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf.html
    - shard-tglu:         NOTRUN -> [SKIP][368] ([i915#11520]) +8 other tests skip
   [368]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@kms_psr2_sf@pr-overlay-plane-update-continuous-sf.html

  * igt@kms_psr2_sf@psr2-overlay-plane-update-continuous-sf:
    - shard-dg2:          NOTRUN -> [SKIP][369] ([i915#11520]) +9 other tests skip
   [369]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_psr2_sf@psr2-overlay-plane-update-continuous-sf.html
    - shard-dg1:          NOTRUN -> [SKIP][370] ([i915#11520]) +5 other tests skip
   [370]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@kms_psr2_sf@psr2-overlay-plane-update-continuous-sf.html

  * igt@kms_psr2_sf@psr2-overlay-plane-update-sf-dmg-area:
    - shard-tglu-1:       NOTRUN -> [SKIP][371] ([i915#11520]) +2 other tests skip
   [371]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_psr2_sf@psr2-overlay-plane-update-sf-dmg-area.html

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

  * igt@kms_psr2_su@page_flip-xrgb8888:
    - shard-tglu:         NOTRUN -> [SKIP][374] ([i915#9683])
   [374]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-10/igt@kms_psr2_su@page_flip-xrgb8888.html

  * igt@kms_psr@fbc-psr-primary-blt:
    - shard-dg2:          NOTRUN -> [SKIP][375] ([i915#1072] / [i915#9732]) +28 other tests skip
   [375]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_psr@fbc-psr-primary-blt.html

  * igt@kms_psr@fbc-psr-sprite-mmap-cpu:
    - shard-dg2-9:        NOTRUN -> [SKIP][376] ([i915#1072] / [i915#9732]) +9 other tests skip
   [376]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_psr@fbc-psr-sprite-mmap-cpu.html

  * igt@kms_psr@fbc-psr2-primary-mmap-cpu:
    - shard-mtlp:         NOTRUN -> [SKIP][377] ([i915#9688]) +15 other tests skip
   [377]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@kms_psr@fbc-psr2-primary-mmap-cpu.html

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

  * igt@kms_psr@psr-cursor-plane-onoff:
    - shard-dg1:          NOTRUN -> [SKIP][379] ([i915#1072] / [i915#9732]) +13 other tests skip
   [379]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@kms_psr@psr-cursor-plane-onoff.html

  * igt@kms_psr@psr2-cursor-mmap-gtt:
    - shard-rkl:          NOTRUN -> [SKIP][380] ([i915#1072] / [i915#9732]) +32 other tests skip
   [380]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_psr@psr2-cursor-mmap-gtt.html

  * igt@kms_psr@psr2-sprite-mmap-cpu:
    - shard-tglu-1:       NOTRUN -> [SKIP][381] ([i915#9732]) +8 other tests skip
   [381]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_psr@psr2-sprite-mmap-cpu.html

  * igt@kms_rotation_crc@bad-pixel-format:
    - shard-snb:          NOTRUN -> [SKIP][382] +211 other tests skip
   [382]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-snb1/igt@kms_rotation_crc@bad-pixel-format.html
    - shard-mtlp:         NOTRUN -> [SKIP][383] ([i915#12755]) +2 other tests skip
   [383]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-1/igt@kms_rotation_crc@bad-pixel-format.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-270:
    - shard-dg2:          NOTRUN -> [SKIP][384] ([i915#12755] / [i915#5190])
   [384]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-3/igt@kms_rotation_crc@primary-y-tiled-reflect-x-270.html

  * igt@kms_rotation_crc@primary-y-tiled-reflect-x-90:
    - shard-dg2-9:        NOTRUN -> [SKIP][385] ([i915#12755] / [i915#5190])
   [385]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_rotation_crc@primary-y-tiled-reflect-x-90.html

  * igt@kms_rotation_crc@sprite-rotation-90:
    - shard-dg2:          NOTRUN -> [SKIP][386] ([i915#12755]) +1 other test skip
   [386]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@kms_rotation_crc@sprite-rotation-90.html

  * igt@kms_scaling_modes@scaling-mode-full:
    - shard-dg2-9:        NOTRUN -> [SKIP][387] ([i915#3555]) +1 other test skip
   [387]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_scaling_modes@scaling-mode-full.html

  * igt@kms_selftest@drm_framebuffer:
    - shard-glk:          NOTRUN -> [ABORT][388] ([i915#13179]) +1 other test abort
   [388]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk8/igt@kms_selftest@drm_framebuffer.html

  * igt@kms_setmode@clone-exclusive-crtc:
    - shard-mtlp:         NOTRUN -> [SKIP][389] ([i915#3555] / [i915#8809])
   [389]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-6/igt@kms_setmode@clone-exclusive-crtc.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-tglu-1:       NOTRUN -> [SKIP][390] ([i915#8623])
   [390]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-1/igt@kms_tiled_display@basic-test-pattern.html
    - shard-dg1:          NOTRUN -> [SKIP][391] ([i915#8623])
   [391]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-15/igt@kms_tiled_display@basic-test-pattern.html
    - shard-mtlp:         NOTRUN -> [SKIP][392] ([i915#8623])
   [392]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@kms_tiled_display@basic-test-pattern.html
    - shard-glk:          NOTRUN -> [FAIL][393] ([i915#10959])
   [393]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk2/igt@kms_tiled_display@basic-test-pattern.html
    - shard-dg2:          NOTRUN -> [SKIP][394] ([i915#8623])
   [394]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-7/igt@kms_tiled_display@basic-test-pattern.html
    - shard-rkl:          NOTRUN -> [SKIP][395] ([i915#8623])
   [395]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_universal_plane@cursor-fb-leak@pipe-d-edp-1:
    - shard-mtlp:         NOTRUN -> [FAIL][396] ([i915#9196]) +1 other test fail
   [396]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@kms_universal_plane@cursor-fb-leak@pipe-d-edp-1.html

  * igt@kms_vrr@flip-basic:
    - shard-dg2:          NOTRUN -> [SKIP][397] ([i915#3555]) +4 other tests skip
   [397]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-5/igt@kms_vrr@flip-basic.html

  * igt@kms_vrr@flip-basic-fastset:
    - shard-dg2:          NOTRUN -> [SKIP][398] ([i915#9906]) +1 other test skip
   [398]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-6/igt@kms_vrr@flip-basic-fastset.html
    - shard-rkl:          NOTRUN -> [SKIP][399] ([i915#9906]) +1 other test skip
   [399]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@kms_vrr@flip-basic-fastset.html
    - shard-dg1:          NOTRUN -> [SKIP][400] ([i915#9906])
   [400]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@kms_vrr@flip-basic-fastset.html
    - shard-tglu:         NOTRUN -> [SKIP][401] ([i915#9906]) +1 other test skip
   [401]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@kms_vrr@flip-basic-fastset.html
    - shard-mtlp:         NOTRUN -> [SKIP][402] ([i915#8808] / [i915#9906]) +1 other test skip
   [402]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-3/igt@kms_vrr@flip-basic-fastset.html

  * igt@kms_vrr@flip-suspend:
    - shard-tglu:         NOTRUN -> [SKIP][403] ([i915#3555]) +7 other tests skip
   [403]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@kms_vrr@flip-suspend.html

  * igt@kms_vrr@lobf:
    - shard-rkl:          NOTRUN -> [SKIP][404] ([i915#11920])
   [404]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@kms_vrr@lobf.html

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

  * igt@kms_writeback@writeback-check-output-xrgb2101010:
    - shard-dg2-9:        NOTRUN -> [SKIP][406] ([i915#2437] / [i915#9412])
   [406]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@kms_writeback@writeback-check-output-xrgb2101010.html
    - shard-tglu:         NOTRUN -> [SKIP][407] ([i915#2437] / [i915#9412])
   [407]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-7/igt@kms_writeback@writeback-check-output-xrgb2101010.html

  * igt@kms_writeback@writeback-pixel-formats:
    - shard-glk:          NOTRUN -> [SKIP][408] ([i915#2437])
   [408]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk2/igt@kms_writeback@writeback-pixel-formats.html

  * igt@perf@gen8-unprivileged-single-ctx-counters:
    - shard-dg2:          NOTRUN -> [SKIP][409] ([i915#2436])
   [409]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@perf@gen8-unprivileged-single-ctx-counters.html

  * igt@perf@global-sseu-config-invalid:
    - shard-mtlp:         NOTRUN -> [SKIP][410] ([i915#7387])
   [410]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@perf@global-sseu-config-invalid.html
    - shard-dg2:          NOTRUN -> [SKIP][411] ([i915#7387])
   [411]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-1/igt@perf@global-sseu-config-invalid.html

  * igt@perf@non-zero-reason@0-rcs0:
    - shard-dg2:          NOTRUN -> [FAIL][412] ([i915#9100]) +1 other test fail
   [412]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@perf@non-zero-reason@0-rcs0.html

  * igt@perf@polling@0-rcs0:
    - shard-rkl:          [PASS][413] -> [DMESG-WARN][414] ([i915#12964]) +33 other tests dmesg-warn
   [413]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-2/igt@perf@polling@0-rcs0.html
   [414]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@perf@polling@0-rcs0.html

  * igt@perf_pmu@busy-double-start@vecs1:
    - shard-dg2:          NOTRUN -> [FAIL][415] ([i915#4349]) +4 other tests fail
   [415]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@perf_pmu@busy-double-start@vecs1.html

  * igt@perf_pmu@rc6-all-gts:
    - shard-rkl:          NOTRUN -> [SKIP][416] ([i915#8516])
   [416]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@perf_pmu@rc6-all-gts.html
    - shard-tglu:         NOTRUN -> [SKIP][417] ([i915#8516])
   [417]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-8/igt@perf_pmu@rc6-all-gts.html
    - shard-dg2-9:        NOTRUN -> [SKIP][418] ([i915#8516])
   [418]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-9/igt@perf_pmu@rc6-all-gts.html

  * igt@perf_pmu@rc6-suspend:
    - shard-glk:          NOTRUN -> [INCOMPLETE][419] ([i915#13356])
   [419]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk8/igt@perf_pmu@rc6-suspend.html

  * igt@perf_pmu@semaphore-busy@bcs0:
    - shard-mtlp:         [PASS][420] -> [FAIL][421] ([i915#4349]) +2 other tests fail
   [420]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-mtlp-2/igt@perf_pmu@semaphore-busy@bcs0.html
   [421]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-8/igt@perf_pmu@semaphore-busy@bcs0.html

  * igt@perf_pmu@semaphore-wait:
    - shard-rkl:          NOTRUN -> [DMESG-WARN][422] ([i915#12964]) +18 other tests dmesg-warn
   [422]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@perf_pmu@semaphore-wait.html

  * igt@prime_mmap@test_aperture_limit:
    - shard-dg2:          NOTRUN -> [WARN][423] ([i915#9351])
   [423]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@prime_mmap@test_aperture_limit.html

  * igt@prime_mmap@test_aperture_limit@test_aperture_limit-smem:
    - shard-dg2:          NOTRUN -> [CRASH][424] ([i915#9351])
   [424]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-2/igt@prime_mmap@test_aperture_limit@test_aperture_limit-smem.html

  * igt@prime_vgem@basic-fence-read:
    - shard-rkl:          NOTRUN -> [SKIP][425] ([i915#3291] / [i915#3708]) +1 other test skip
   [425]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@prime_vgem@basic-fence-read.html

  * igt@prime_vgem@coherency-gtt:
    - shard-dg2:          NOTRUN -> [SKIP][426] ([i915#3708] / [i915#4077])
   [426]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-6/igt@prime_vgem@coherency-gtt.html
    - shard-rkl:          NOTRUN -> [SKIP][427] ([i915#3708]) +1 other test skip
   [427]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-5/igt@prime_vgem@coherency-gtt.html
    - shard-dg1:          NOTRUN -> [SKIP][428] ([i915#3708] / [i915#4077])
   [428]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-16/igt@prime_vgem@coherency-gtt.html
    - shard-mtlp:         NOTRUN -> [SKIP][429] ([i915#3708] / [i915#4077])
   [429]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-3/igt@prime_vgem@coherency-gtt.html

  * igt@prime_vgem@fence-read-hang:
    - shard-dg2:          NOTRUN -> [SKIP][430] ([i915#3708])
   [430]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@prime_vgem@fence-read-hang.html

  * igt@prime_vgem@fence-write-hang:
    - shard-tglu:         NOTRUN -> [SKIP][431] +100 other tests skip
   [431]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@prime_vgem@fence-write-hang.html

  * igt@sriov_basic@enable-vfs-bind-unbind-each:
    - shard-dg2:          NOTRUN -> [SKIP][432] ([i915#9917]) +1 other test skip
   [432]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@sriov_basic@enable-vfs-bind-unbind-each.html
    - shard-rkl:          NOTRUN -> [SKIP][433] ([i915#9917])
   [433]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@sriov_basic@enable-vfs-bind-unbind-each.html

  
#### Possible fixes ####

  * igt@gem_eio@in-flight-contexts-1us:
    - shard-mtlp:         [ABORT][434] ([i915#13193]) -> [PASS][435] +1 other test pass
   [434]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-mtlp-7/igt@gem_eio@in-flight-contexts-1us.html
   [435]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@gem_eio@in-flight-contexts-1us.html

  * igt@gem_eio@kms:
    - shard-dg2:          [FAIL][436] ([i915#5784]) -> [PASS][437]
   [436]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-10/igt@gem_eio@kms.html
   [437]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-6/igt@gem_eio@kms.html
    - shard-tglu:         [DMESG-WARN][438] ([i915#13363]) -> [PASS][439]
   [438]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-tglu-2/igt@gem_eio@kms.html
   [439]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-6/igt@gem_eio@kms.html

  * igt@gem_lmem_swapping@smem-oom@lmem0:
    - shard-dg2:          [TIMEOUT][440] ([i915#5493]) -> [PASS][441] +1 other test pass
   [440]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-6/igt@gem_lmem_swapping@smem-oom@lmem0.html
   [441]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@gem_lmem_swapping@smem-oom@lmem0.html

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

  * igt@gem_pxp@verify-pxp-key-change-after-suspend-resume:
    - shard-rkl:          [TIMEOUT][444] ([i915#12917] / [i915#12964]) -> [PASS][445]
   [444]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-3/igt@gem_pxp@verify-pxp-key-change-after-suspend-resume.html
   [445]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-8/igt@gem_pxp@verify-pxp-key-change-after-suspend-resume.html

  * igt@gem_tiled_swapping@non-threaded:
    - shard-snb:          [FAIL][446] ([i915#13805]) -> [PASS][447]
   [446]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-snb2/igt@gem_tiled_swapping@non-threaded.html
   [447]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-snb4/igt@gem_tiled_swapping@non-threaded.html

  * igt@i915_module_load@reload:
    - shard-snb:          [ABORT][448] ([i915#11703]) -> [PASS][449]
   [448]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-snb2/igt@i915_module_load@reload.html
   [449]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-snb5/igt@i915_module_load@reload.html

  * igt@i915_pm_rc6_residency@rc6-accuracy:
    - shard-rkl:          [FAIL][450] ([i915#12942]) -> [PASS][451] +1 other test pass
   [450]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-1/igt@i915_pm_rc6_residency@rc6-accuracy.html
   [451]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-3/igt@i915_pm_rc6_residency@rc6-accuracy.html

  * igt@i915_pm_rc6_residency@rc6-idle@gt0-vcs0:
    - shard-dg1:          [FAIL][452] ([i915#3591]) -> [PASS][453] +1 other test pass
   [452]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-19/igt@i915_pm_rc6_residency@rc6-idle@gt0-vcs0.html
   [453]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@i915_pm_rc6_residency@rc6-idle@gt0-vcs0.html

  * igt@i915_pm_rpm@gem-pread:
    - shard-rkl:          [SKIP][454] ([i915#13328]) -> [PASS][455]
   [454]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-2/igt@i915_pm_rpm@gem-pread.html
   [455]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@i915_pm_rpm@gem-pread.html

  * igt@i915_selftest@live@workarounds:
    - shard-mtlp:         [DMESG-FAIL][456] ([i915#12061]) -> [PASS][457] +1 other test pass
   [456]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-mtlp-8/igt@i915_selftest@live@workarounds.html
   [457]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-mtlp-4/igt@i915_selftest@live@workarounds.html

  * igt@kms_async_flips@invalid-async-flip@pipe-a-hdmi-a-1:
    - shard-rkl:          [DMESG-WARN][458] ([i915#12964]) -> [PASS][459] +22 other tests pass
   [458]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-2/igt@kms_async_flips@invalid-async-flip@pipe-a-hdmi-a-1.html
   [459]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-4/igt@kms_async_flips@invalid-async-flip@pipe-a-hdmi-a-1.html

  * igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1:
    - shard-rkl:          [DMESG-FAIL][460] ([i915#12964]) -> [PASS][461] +1 other test pass
   [460]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-4/igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1.html
   [461]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-4/igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1.html
    - shard-tglu:         [FAIL][462] ([i915#13566]) -> [PASS][463] +3 other tests pass
   [462]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-tglu-3/igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1.html
   [463]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@kms_cursor_crc@cursor-random-128x42@pipe-a-hdmi-a-1.html

  * igt@kms_cursor_crc@cursor-random-256x85@pipe-a-hdmi-a-2:
    - shard-rkl:          [FAIL][464] ([i915#13566]) -> [PASS][465] +4 other tests pass
   [464]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-8/igt@kms_cursor_crc@cursor-random-256x85@pipe-a-hdmi-a-2.html
   [465]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-6/igt@kms_cursor_crc@cursor-random-256x85@pipe-a-hdmi-a-2.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy:
    - shard-glk:          [FAIL][466] ([i915#13028]) -> [PASS][467]
   [466]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-glk7/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html
   [467]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk2/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html

  * igt@kms_flip@blocking-wf_vblank:
    - shard-glk:          [DMESG-WARN][468] ([i915#118]) -> [PASS][469] +1 other test pass
   [468]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-glk8/igt@kms_flip@blocking-wf_vblank.html
   [469]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-glk1/igt@kms_flip@blocking-wf_vblank.html

  * igt@kms_flip@plain-flip-ts-check@b-hdmi-a1:
    - shard-tglu:         [FAIL][470] ([i915#1522]) -> [PASS][471] +4 other tests pass
   [470]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-tglu-3/igt@kms_flip@plain-flip-ts-check@b-hdmi-a1.html
   [471]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-2/igt@kms_flip@plain-flip-ts-check@b-hdmi-a1.html

  * igt@kms_hdr@invalid-metadata-sizes:
    - shard-dg2:          [SKIP][472] ([i915#3555] / [i915#8228]) -> [PASS][473]
   [472]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-4/igt@kms_hdr@invalid-metadata-sizes.html
   [473]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_hdr@invalid-metadata-sizes.html

  * igt@kms_joiner@invalid-modeset-force-big-joiner:
    - shard-dg2:          [SKIP][474] ([i915#12388]) -> [PASS][475]
   [474]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-4/igt@kms_joiner@invalid-modeset-force-big-joiner.html
   [475]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-11/igt@kms_joiner@invalid-modeset-force-big-joiner.html

  * igt@kms_pm_rpm@dpms-non-lpsp:
    - shard-rkl:          [SKIP][476] ([i915#9519]) -> [PASS][477]
   [476]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-7/igt@kms_pm_rpm@dpms-non-lpsp.html
   [477]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-1/igt@kms_pm_rpm@dpms-non-lpsp.html

  * igt@kms_pm_rpm@modeset-lpsp-stress:
    - shard-dg2:          [SKIP][478] ([i915#9519]) -> [PASS][479] +1 other test pass
   [478]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-2/igt@kms_pm_rpm@modeset-lpsp-stress.html
   [479]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-8/igt@kms_pm_rpm@modeset-lpsp-stress.html

  * igt@kms_vblank@query-forked-hang:
    - shard-rkl:          [DMESG-WARN][480] ([i915#12917] / [i915#12964]) -> [PASS][481]
   [480]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-1/igt@kms_vblank@query-forked-hang.html
   [481]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-2/igt@kms_vblank@query-forked-hang.html

  * igt@prime_mmap_coherency@write:
    - shard-snb:          [INCOMPLETE][482] -> [PASS][483]
   [482]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-snb1/igt@prime_mmap_coherency@write.html
   [483]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-snb5/igt@prime_mmap_coherency@write.html

  
#### Warnings ####

  * igt@i915_module_load@reload-with-fault-injection:
    - shard-tglu:         [ABORT][484] ([i915#10887] / [i915#12817] / [i915#9820]) -> [ABORT][485] ([i915#12817] / [i915#9820])
   [484]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-tglu-2/igt@i915_module_load@reload-with-fault-injection.html
   [485]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-tglu-3/igt@i915_module_load@reload-with-fault-injection.html

  * igt@i915_selftest@mock:
    - shard-rkl:          [DMESG-WARN][486] ([i915#9311]) -> [DMESG-WARN][487] ([i915#12964] / [i915#9311])
   [486]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-4/igt@i915_selftest@mock.html
   [487]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-7/igt@i915_selftest@mock.html

  * igt@kms_content_protection@type1:
    - shard-dg2:          [SKIP][488] ([i915#7118] / [i915#9424]) -> [SKIP][489] ([i915#7118] / [i915#7162] / [i915#9424])
   [488]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-5/igt@kms_content_protection@type1.html
   [489]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-10/igt@kms_content_protection@type1.html

  * igt@kms_flip@2x-absolute-wf_vblank-interruptible:
    - shard-dg1:          [SKIP][490] ([i915#9934]) -> [SKIP][491] ([i915#4423] / [i915#9934])
   [490]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-17/igt@kms_flip@2x-absolute-wf_vblank-interruptible.html
   [491]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-19/igt@kms_flip@2x-absolute-wf_vblank-interruptible.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling:
    - shard-dg1:          [SKIP][492] ([i915#2672] / [i915#3555]) -> [SKIP][493] ([i915#2672] / [i915#3555] / [i915#4423])
   [492]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-15/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html
   [493]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-15/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling.html

  * igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
    - shard-dg1:          [SKIP][494] ([i915#2587] / [i915#2672]) -> [SKIP][495] ([i915#2587] / [i915#2672] / [i915#4423])
   [494]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-15/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html
   [495]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-15/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt:
    - shard-dg1:          [SKIP][496] -> [SKIP][497] ([i915#4423]) +2 other tests skip
   [496]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-18/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt.html
   [497]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-14/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-indfb-pgflip-blt.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-blt:
    - shard-dg1:          [SKIP][498] ([i915#3458]) -> [SKIP][499] ([i915#3458] / [i915#4423])
   [498]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg1-18/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-blt.html
   [499]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg1-12/igt@kms_frontbuffer_tracking@psr-1p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render:
    - shard-dg2:          [SKIP][500] ([i915#3458]) -> [SKIP][501] ([i915#10433] / [i915#3458]) +1 other test skip
   [500]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-dg2-5/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render.html
   [501]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-dg2-4/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-indfb-draw-render.html

  * igt@kms_hdr@brightness-with-hdr:
    - shard-rkl:          [SKIP][502] ([i915#12713]) -> [SKIP][503] ([i915#1187] / [i915#12713])
   [502]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-2/igt@kms_hdr@brightness-with-hdr.html
   [503]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-3/igt@kms_hdr@brightness-with-hdr.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-rkl:          [SKIP][504] ([i915#4816]) -> [SKIP][505] ([i915#4070] / [i915#4816])
   [504]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_8255/shard-rkl-4/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
   [505]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_12683/shard-rkl-6/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [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#10647]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10647
  [i915#10656]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10656
  [i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
  [i915#10887]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10887
  [i915#10959]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10959
  [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#11520]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11520
  [i915#11527]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11527
  [i915#11703]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11703
  [i915#118]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/118
  [i915#1187]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1187
  [i915#11920]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11920
  [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
  [i915#12169]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12169
  [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#12343]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12343
  [i915#12353]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12353
  [i915#12388]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12388
  [i915#12394]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12394
  [i915#12543]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12543
  [i915#1257]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1257
  [i915#12713]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12713
  [i915#12714]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12714
  [i915#12745]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12745
  [i915#12755]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12755
  [i915#12796]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12796
  [i915#12797]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12797
  [i915#12805]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12805
  [i915#12817]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12817
  [i915#12917]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12917
  [i915#12942]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12942
  [i915#12964]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12964
  [i915#12967]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12967
  [i915#13028]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13028
  [i915#13046]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13046
  [i915#13049]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13049
  [i915#13179]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13179
  [i915#13193]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13193
  [i915#13328]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13328
  [i915#13356]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13356
  [i915#13363]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13363
  [i915#13391]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13391
  [i915#13398]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13398
  [i915#13566]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13566
  [i915#13691]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13691
  [i915#13707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13707
  [i915#13734]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13734
  [i915#13749]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13749
  [i915#13781]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13781
  [i915#13798]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13798
  [i915#13805]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13805
  [i915#1522]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1522
  [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#2436]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2436
  [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#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#3323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3323
  [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#3591]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3591
  [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#4036]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4036
  [i915#4070]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4070
  [i915#4077]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4077
  [i915#4079]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4079
  [i915#4083]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4083
  [i915#4103]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4212
  [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#4387]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4387
  [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#4771]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4771
  [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#4839]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4839
  [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#4873]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4873
  [i915#4880]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4880
  [i915#4881]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4881
  [i915#4885]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4885
  [i915#5190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5190
  [i915#5286]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5286
  [i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
  [i915#5493]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5493
  [i915#5784]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5784
  [i915#5882]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5882
  [i915#5956]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5956
  [i915#6095]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6095
  [i915#6187]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6187
  [i915#6188]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6188
  [i915#6228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6228
  [i915#6230]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6230
  [i915#6245]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/6245
  [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#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#7162]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7162
  [i915#7173]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7173
  [i915#7387]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7387
  [i915#7697]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7697
  [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#8228]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8228
  [i915#8289]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8289
  [i915#8399]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8399
  [i915#8411]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8411
  [i915#8414]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8414
  [i915#8428]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8428
  [i915#8516]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8516
  [i915#8555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8555
  [i915#8588]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8588
  [i915#8623]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8623
  [i915#8708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8708
  [i915#8709]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8709
  [i915#8806]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8806
  [i915#8808]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8808
  [i915#8809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8809
  [i915#8813]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8813
  [i915#8814]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8814
  [i915#8821]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/8821
  [i915#9053]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9053
  [i915#9100]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9100
  [i915#9196]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9196
  [i915#9311]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9311
  [i915#9323]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9323
  [i915#9340]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9340
  [i915#9351]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9351
  [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#9519]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9519
  [i915#9531]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9531
  [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#9766]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9766
  [i915#9808]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9808
  [i915#9809]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9809
  [i915#9812]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9812
  [i915#9820]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9820
  [i915#9833]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9833
  [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_8255 -> IGTPW_12683

  CI-20190529: 20190529
  CI_DRM_16205: ca9d01b66c70413a62a1a28fbf8709d2e8440c1c @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_12683: eca0cbd842bf582a693a3f966b2a1b131705195e @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_8255: 4ef742fae97d2f4af680f9e29f7ea45920f939b7 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git

== Logs ==

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

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

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

* Re: [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type
  2025-02-27 13:12   ` Louis Chauvet
@ 2025-03-13 17:22     ` José Expósito
  0 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-03-13 17:22 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev, Jim Shargo, Marius Vlad

Hi Louis,

On Thu, Feb 27, 2025 at 02:12:13PM +0100, Louis Chauvet wrote:
> 
> 
> Le 18/02/2025 à 17:49, José Expósito a écrit :
> > As we are going to add VKMS specific tests, allow to check if it is
> > available.
> > 
> > Co-developed-by: Jim Shargo <jshargo@chromium.org>
> > Signed-off-by: Jim Shargo <jshargo@chromium.org>
> > Co-developed-by: Marius Vlad <marius.vlad@collabora.com>
> > Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> > Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> > ---
> >   lib/drmtest.c | 18 ++++++++++++++++++
> >   lib/drmtest.h |  8 ++++++--
> >   2 files changed, 24 insertions(+), 2 deletions(-)
> > 
> > diff --git a/lib/drmtest.c b/lib/drmtest.c
> > index 436b6de78..2cc6e0c29 100644
> > --- a/lib/drmtest.c
> > +++ b/lib/drmtest.c
> > @@ -971,3 +971,21 @@ void igt_require_xe(int fd)
> >   {
> >   	igt_require(is_xe_device(fd));
> >   }
> > +
> > +void igt_require_vkms(void)
> > +{
> > +	/*
> > +	 * Since VKMS can create and destroy virtual drivers at will, instead
> > +	 * look to make sure the driver is installed.
> > +	 */
> > +	struct stat s = {};
> > +	int ret;
> > +	const char *vkms_module_dir = "/sys/module/vkms";
> > +
> > +	ret = stat(vkms_module_dir, &s);
> > +
> > +	igt_require_f(ret == 0, "VKMS stat of %s returned %d (%s)\n",
> > +		      vkms_module_dir, ret, strerror(ret));
> > +	igt_require_f(S_ISDIR(s.st_mode),
> > +		      "VKMS stat of %s was not a directory\n", vkms_module_dir);
> > +}
> > diff --git a/lib/drmtest.h b/lib/drmtest.h
> > index 27e5a18e2..1b57e49ec 100644
> > --- a/lib/drmtest.h
> > +++ b/lib/drmtest.h
> > @@ -54,15 +54,18 @@ int __get_drm_device_name(int fd, char *name, int name_size);
> >   #define DRIVER_PANFROST	(1 << 5)
> >   #define DRIVER_MSM	(1 << 6)
> >   #define DRIVER_XE	(1 << 7)
> > -#define DRIVER_VMWGFX   (1 << 8)
> > +#define DRIVER_VKMS	(1 << 8)
> > +#define DRIVER_VMWGFX	(1 << 9)
> 
> Is it normal to change the DRIVER_VMWGFX value?

Ugh, not at all. This looks like poor conflict resolution by me during one of
the multiple rebases.

Thanks for noticing!

> I also found the `module` list in drmtest.c that use this value, I think
> this list is used to do the proper `modprobe` during a open_driver().
> 
> Maybe you can use it, so you will be able to do:
> 
> 	drm_load_module(DRIVER_VKMS); // (If I understand correctly, this fails
> silently)
> 	igt_require_vkms();
> 
> And future tests requiring a vkms device will be able to do:
> 
> 	open_driver(DRIVER_VKMS);

Good point, added the missing bits to drmtest.c and the call to
"drm_load_module(DRIVER_VKMS);" in "igt_fixture".

Sending v2 in a bit with this and other changes :)

Jose

> >   /*
> >    * Exclude DRVER_VGEM from DRIVER_ANY since if you run on a system
> >    * with vgem as well as a supported driver, you can end up with a
> >    * near-100% skip rate if you don't explicitly specify the device,
> >    * depending on device-load ordering.
> > + *
> > + * Exclude VKMS to prefer hardware drivers.
> >    */
> > -#define DRIVER_ANY 	~(DRIVER_VGEM)
> > +#define DRIVER_ANY	~(DRIVER_VGEM | DRIVER_VKMS)
> >   /*
> >    * Compile friendly enum for i915/xe.
> > @@ -135,6 +138,7 @@ void igt_require_i915(int fd);
> >   void igt_require_nouveau(int fd);
> >   void igt_require_vc4(int fd);
> >   void igt_require_xe(int fd);
> > +void igt_require_vkms(void);
> >   bool is_amdgpu_device(int fd);
> >   bool is_i915_device(int fd);
> 
> -- 
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
> 
> 

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

* Re: [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs
  2025-02-27 13:15   ` Louis Chauvet
@ 2025-03-13 17:23     ` José Expósito
  0 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-03-13 17:23 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev

On Thu, Feb 27, 2025 at 02:15:01PM +0100, Louis Chauvet wrote:
> 
> 
> Le 18/02/2025 à 17:49, José Expósito a écrit :
> > Add helpers to attach and detach planes and CRTCs and a test checking
> > the different valid and invalid cases.
> > 
> > Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> > ---
> >   lib/igt_vkms.c             | 91 ++++++++++++++++++++++++++++++++++++++
> >   lib/igt_vkms.h             |  4 ++
> >   tests/vkms/vkms_configfs.c | 81 +++++++++++++++++++++++++++++++++
> >   3 files changed, 176 insertions(+)
> > 
> > diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> > index f5e193a1c..147234e5b 100644
> > --- a/lib/igt_vkms.c
> > +++ b/lib/igt_vkms.c
> > @@ -119,6 +119,22 @@ static const char *get_pipeline_item_dir_name(enum vkms_pipeline_item item)
> >   	igt_assert(!"Cannot be reached: Unknown VKMS pipeline item type");
> >   }
> > +static const char *get_attach_dir_name(enum vkms_pipeline_item item)
> > +{
> > +	switch (item) {
> > +	case VKMS_PIPELINE_ITEM_PLANE:
> > +		return "possible_crtcs";
> > +	case VKMS_PIPELINE_ITEM_ENCODER:
> > +		return "possible_crtcs";
> > +	case VKMS_PIPELINE_ITEM_CONNECTOR:
> > +		return "possible_encoders";
> > +	default:
> > +		break;
> > +	}
> > +
> > +	igt_assert(!"Cannot be reached: Unknown VKMS attach directory name");
> > +}
> > +
> >   static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
> >   			      const char *name)
> >   {
> > @@ -136,6 +152,51 @@ static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
> >   		     path, errno, strerror(errno));
> >   }
> > +static bool attach_pipeline_item(igt_vkms_t *dev,
> > +				 enum vkms_pipeline_item src_item,
> > +				 const char *src_item_name,
> > +				 enum vkms_pipeline_item dst_item,
> > +				 const char *dst_item_name)
> > +{
> > +	char src_path[PATH_MAX];
> > +	char dst_path[PATH_MAX];
> > +	const char *src_dir_name;
> > +	const char *attach_dir_name;
> > +	const char *dst_dir_name;
> > +	int ret;
> > +
> > +	src_dir_name = get_pipeline_item_dir_name(src_item);
> > +	attach_dir_name = get_attach_dir_name(src_item);
> > +	snprintf(src_path, sizeof(src_path), "%s/%s/%s/%s/%s", dev->path,
> > +		 src_dir_name, src_item_name, attach_dir_name, dst_item_name);
> 
> The more I read those functions, the more I think my proposition of having
> full path for pipeline item is better than having only its name.
> 
> Or maybe, to avoid the duplication a macro could help:
> 
> 	#define ITEM_FMT "%s/%s/%s"
> 	#define ITEM_ARGS(dev, src_item, src_item_name) (dev),
> get_pipeline_item_dir_name((src_item)), (src_item_name)
> 
> I don't see major drawbacks for both of my proposition, so take what you
> think is better.
> 
> > +
> > +	dst_dir_name = get_pipeline_item_dir_name(dst_item);
> > +	snprintf(dst_path, sizeof(dst_path), "%s/%s/%s", dev->path,
> > +		 dst_dir_name, dst_item_name);
> > +
> > +	ret = symlink(dst_path, src_path);
> > +	return ret == 0;
> 
> Why this function has a return value? For all the other igt_vkms_device_*
> functions, they return void, and do assertions to stop the test if it fails.

Attaching or detaching pipeline items can fail and I want to be able to test
both the success and the error cases from the tests.

While, it is true that this is not consistent with "igt_vkms_device_add_*()"
functions, adding new pipeline items is not expected to fail and returning a
boolean would add a bunch of additional assertions in the tests for no real
gain.

Jose

> > +}
> > +
> > +static bool detach_pipeline_item(igt_vkms_t *dev,
> > +				 enum vkms_pipeline_item src_item,
> > +				 const char *src_item_name,
> > +				 const char *dst_item_name)
> > +{
> > +	char link_path[PATH_MAX];
> > +	const char *src_dir_name;
> > +	const char *attach_dir_name;
> > +	int ret;
> > +
> > +	src_dir_name = get_pipeline_item_dir_name(src_item);
> > +	attach_dir_name = get_attach_dir_name(src_item);
> > +	snprintf(link_path, sizeof(link_path), "%s/%s/%s/%s/%s", dev->path,
> > +		 src_dir_name, src_item_name, attach_dir_name, dst_item_name);
> > +
> > +	ret = unlink(link_path);
> > +	return ret == 0;
> > +}
> > +
> >   /**
> >    * igt_require_vkms_configfs:
> >    *
> > @@ -368,6 +429,36 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
> >   	write_int(path, type);
> >   }
> > +/**
> > + * igt_vkms_plane_attach_crtc:
> > + * @dev: Target device
> > + * @plane_name: Target plane name
> > + * @crtc_name: Destination CRTC name
> > + *
> > + * Attach a plane to a CRTC. Return true on success and false on error.
> > + */
> > +bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
> > +				const char *crtc_name)
> > +{
> > +	return attach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
> > +				    VKMS_PIPELINE_ITEM_CRTC, crtc_name);
> > +}
> > +
> > +/**
> > + * igt_vkms_plane_detach_crtc:
> > + * @dev: Target device
> > + * @plane_name: Target plane name
> > + * @crtc_name: Destination CRTC name
> > + *
> > + * Detach a plane from a CRTC. Return true on success and false on error.
> > + */
> > +bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
> > +				const char *crtc_name)
> > +{
> > +	return detach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
> > +				    crtc_name);
> > +}
> > +
> >   /**
> >    * igt_vkms_device_add_crtc:
> >    * @dev: Device to add the CRTC to
> > diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> > index 50f42aa4b..fc8db268b 100644
> > --- a/lib/igt_vkms.h
> > +++ b/lib/igt_vkms.h
> > @@ -32,6 +32,10 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
> >   void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
> >   int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
> >   void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
> > +bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
> > +				const char *crtc_name);
> > +bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
> > +				const char *crtc_name);
> >   void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
> >   bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
> > diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> > index ea84d9f82..e1572d65f 100644
> > --- a/tests/vkms/vkms_configfs.c
> > +++ b/tests/vkms/vkms_configfs.c
> > @@ -94,6 +94,20 @@ static void assert_wrong_bool_values(const char *path)
> >   	}
> >   }
> > +static bool attach(const char *src_path, const char *dst_path,
> > +		   const char *link_name)
> > +{
> > +	char link_path[PATH_MAX];
> > +	int ret;
> > +
> > +	ret = snprintf(link_path, sizeof(link_path), "%s/%s", src_path, link_name);
> > +	igt_assert(ret >= 0 && ret < sizeof(link_path));
> > +
> > +	ret = symlink(dst_path, link_path);
> > +
> > +	return ret == 0;
> > +}
> > +
> >   /**
> >    * SUBTEST: device-default-files
> >    * Description: Test that creating a VKMS device creates the default files and
> > @@ -476,6 +490,72 @@ static void test_connector_wrong_values(void)
> >   	igt_vkms_device_destroy(dev);
> >   }
> > +/**
> > + * SUBTEST: attach-plane-to-crtc
> > + * Description: Check that errors are handled while attaching planes to CRTCs.
> > + */
> > +
> > +static void test_attach_plane_to_crtc(void)
> > +{
> > +	igt_vkms_t *dev1;
> > +	igt_vkms_t *dev2;
> > +	char plane1[PATH_MAX];
> > +	char crtc1[PATH_MAX];
> > +	char connector1[PATH_MAX];
> > +	char crtc2[PATH_MAX];
> > +	char dev2_enabled_path[PATH_MAX];
> > +	bool ok;
> > +
> > +	dev1 = igt_vkms_device_create("test_attach_plane_to_crtc_1");
> > +	igt_assert(dev1);
> > +
> > +	dev2 = igt_vkms_device_create("test_attach_plane_to_crtc_2");
> > +	igt_assert(dev2);
> > +
> > +	igt_vkms_device_add_plane(dev1, "plane1");
> > +	igt_vkms_device_add_crtc(dev1, "crtc1");
> > +	igt_vkms_device_add_connector(dev1, "connector1");
> > +	igt_vkms_device_add_crtc(dev2, "crtc2");
> > +
> > +	snprintf(plane1, sizeof(plane1), "%s/planes/plane1/possible_crtcs",
> > +		 dev1->path);
> > +	snprintf(crtc1, sizeof(crtc1), "%s/crtcs/crtc1", dev1->path);
> > +	snprintf(connector1, sizeof(connector1), "%s/connectors/connector1",
> > +		 dev1->path);
> > +	snprintf(crtc2, sizeof(crtc2), "%s/crtcs/crtc2", dev2->path);
> > +	snprintf(dev2_enabled_path, sizeof(dev2_enabled_path), "%s/enabled",
> > +		 dev2->path);
> > +
> > +	/* Error: Attach a plane to a connector */
> > +	ok = attach(plane1, connector1, "connector");
> > +	igt_assert_f(!ok, "Attaching plane1 to connector1 should fail\n");
> > +
> > +	/* Error: Attach a plane to a random file */
> > +	ok = attach(plane1, dev2_enabled_path, "file");
> > +	igt_assert_f(!ok, "Attaching plane1 to a random file should fail\n");
> > +
> > +	/* Error: Attach a plane to a CRTC from other device */
> > +	ok = attach(plane1, crtc2, "crtc2");
> > +	igt_assert_f(!ok, "Attaching plane1 to crtc2 should fail\n");
> > +
> > +	/* OK: Attaching plane1 to crtc1 */
> > +	ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
> > +	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
> > +
> > +	/* Error: Attaching plane1 to crtc1 twice */
> > +	ok = attach(plane1, crtc1, "crtc1_duplicated");
> > +	igt_assert_f(!ok, "Error attaching plane1 to crtc1 twice should fail");
> > +
> > +	/* OK: Detaching and attaching again */
> > +	ok = igt_vkms_plane_detach_crtc(dev1, "plane1", "crtc1");
> > +	igt_assert_f(ok, "Error detaching plane1 from crtc1\n");
> > +	ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
> > +	igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
> > +
> > +	igt_vkms_device_destroy(dev1);
> > +	igt_vkms_device_destroy(dev2);
> > +}
> > +
> >   igt_main
> >   {
> >   	struct {
> > @@ -495,6 +575,7 @@ igt_main
> >   		{ "connector-default-files", test_connector_default_files },
> >   		{ "connector-default-values", test_connector_default_values },
> >   		{ "connector-wrong-values", test_connector_wrong_values },
> > +		{ "attach-plane-to-crtc", test_attach_plane_to_crtc },
> >   	};
> >   	igt_fixture {
> 
> -- 
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
> 
> 

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

* Re: [PATCH i-g-t 13/39] lib/vkms: Test encoder default files
  2025-02-27 13:14   ` Louis Chauvet
@ 2025-03-13 17:25     ` José Expósito
  0 siblings, 0 replies; 84+ messages in thread
From: José Expósito @ 2025-03-13 17:25 UTC (permalink / raw)
  To: Louis Chauvet; +Cc: igt-dev

Hi Louis,

On Thu, Feb 27, 2025 at 02:14:52PM +0100, Louis Chauvet wrote:
> 
> 
> Le 18/02/2025 à 17:49, José Expósito a écrit :
> > Add a helper to create a encoder and a test checking that the default
> > files and directories are created.
> > 
> > Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> > ---
> >   lib/igt_vkms.c             | 12 ++++++++++++
> >   lib/igt_vkms.h             |  2 ++
> >   tests/vkms/vkms_configfs.c | 29 +++++++++++++++++++++++++++++
> >   3 files changed, 43 insertions(+)
> > 
> > diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> > index d881a2417..299891377 100644
> > --- a/lib/igt_vkms.c
> > +++ b/lib/igt_vkms.c
> > @@ -416,3 +416,15 @@ void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
> >   	write_bool(path, writeback);
> >   }
> > +
> > +/**
> > + * igt_vkms_device_add_encoder:
> > + * @dev: Device to add the encoder to
> > + * @name: Encoder name
> > + *
> > + * Add a new encoder to the VKMS device.
> > + */
> > +void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name)
> > +{
> > +	add_pipeline_item(dev, VKMS_PIPELINE_ITEM_ENCODER, name);
> > +}
> > diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> > index cb0278544..b4b048c6d 100644
> > --- a/lib/igt_vkms.h
> > +++ b/lib/igt_vkms.h
> > @@ -38,4 +38,6 @@ bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
> >   void igt_vkms_crtc_set_writeback_enabled(igt_vkms_t *dev, const char *name,
> >   					 bool writeback);
> > +void igt_vkms_device_add_encoder(igt_vkms_t *dev, const char *name);
> > +
> >   #endif /* __IGT_VKMS_H__ */
> > diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> > index af42e364d..753ea2d85 100644
> > --- a/tests/vkms/vkms_configfs.c
> > +++ b/tests/vkms/vkms_configfs.c
> > @@ -345,6 +345,34 @@ static void test_crtc_wrong_values(void)
> >   	igt_vkms_device_destroy(dev);
> >   }
> > +/**
> > + * SUBTEST: encoder-default-files
> > + * Description: Test that creating a encoder creates the default files and
> > + *              directories.
> > + */
> > +
> > +static void test_encoder_default_files(void)
> > +{
> > +	igt_vkms_t *dev;
> > +	char path[PATH_MAX];
> > +
> > +	const char *dirs[] = {
> > +		"possible_crtcs",
> > +	};
> > +
> > +	dev = igt_vkms_device_create(__func__);
> > +	igt_assert(dev);
> > +
> > +	igt_vkms_device_add_encoder(dev, "encoder0");
> 
> I maybe found a solution for the duplication of path generation, can the
> igt_vkms_device_add_* return the path of the object?
> 
> To avoid malloc/free, you can simply add an optional pointer "path":

I decided to add something similar to this, but instead of making it part
of the igt_vkms_device_add_*() functions, I created new helpers that are
used both in the tests and in the lib.

I'll send v2 in a bit with them.

Thanks a lot for the huge effort reviewing all of this.

Jose

> void igt_vkms_device_add_encoder(dev, name, path, max_len) {
> 	if (path)
> 		igt_assert_le(snprintf(path, max_len, "....", ...),
> 				max_len);
> 	[...]
> }
> 
> > +	snprintf(path, sizeof(path), "%s/encoders/encoder0", dev->path);
> > +	assert_default_files(path,
> > +			     NULL, 0,
> > +			     dirs, ARRAY_SIZE(dirs));
> > +
> > +	igt_vkms_device_destroy(dev);
> > +}
> > +
> >   igt_main
> >   {
> >   	struct {
> > @@ -360,6 +388,7 @@ igt_main
> >   		{ "crtc-default-files", test_crtc_default_files },
> >   		{ "crtc-default-values", test_crtc_default_values },
> >   		{ "crtc-wrong-values", test_crtc_wrong_values },
> > +		{ "encoder-default-files", test_encoder_default_files },
> >   	};
> >   	igt_fixture {
> 
> -- 
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
> 
> 

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

end of thread, other threads:[~2025-03-13 17:25 UTC | newest]

Thread overview: 84+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type José Expósito
2025-02-27 13:12   ` Louis Chauvet
2025-03-13 17:22     ` José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 02/39] lib/igt_debugfs: Move is_mountpoint() to igt_aux José Expósito
2025-02-27 13:12   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 03/39] lib/igt_configfs: Add helper to mount configfs José Expósito
2025-02-27 13:14   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 04/39] lib/vkms: Add minimal VKMS library and test device default files José Expósito
2025-02-27 13:12   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 05/39] lib/vkms: Allow to enable/disable VKMS devices José Expósito
2025-02-27 13:15   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 06/39] tests/vkms_configfs: Test device invalid values José Expósito
2025-02-27 13:14   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 07/39] lib/vkms: Test plane default files José Expósito
2025-02-27 13:15   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 08/39] lib/vkms: Test plane default values José Expósito
2025-02-27 13:15   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 09/39] lib/vkms: Test plane invalid values José Expósito
2025-02-27 13:14   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 10/39] lib/vkms: Test CRTC default files José Expósito
2025-02-27 13:15   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 11/39] lib/vkms: Test CRTC default values José Expósito
2025-02-27 13:12   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 12/39] lib/vkms: Test CRTC invalid values José Expósito
2025-02-27 13:12   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 13/39] lib/vkms: Test encoder default files José Expósito
2025-02-27 13:14   ` Louis Chauvet
2025-03-13 17:25     ` José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 14/39] lib/vkms: Test connector " José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 15/39] lib/vkms: Test connector default values José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 16/39] lib/vkms: Test plane connector invalid values José Expósito
2025-02-27 13:12   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs José Expósito
2025-02-27 13:15   ` Louis Chauvet
2025-03-13 17:23     ` José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 18/39] lib/vkms: Test attaching encoders " José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 19/39] lib/vkms: Test attaching connectors to encoders José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items José Expósito
2025-02-27 13:06   ` Louis Chauvet
2025-02-28  1:47     ` Greg Kroah-Hartman
2025-02-28 11:58       ` José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 21/39] lib/vkms: Create VKMS device from static config José Expósito
2025-02-27 14:30   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 22/39] tests/vkms_configfs: Test adding too many planes José Expósito
2025-02-27 14:53   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 23/39] tests/vkms_configfs: Test not adding a primary plane José Expósito
2025-02-27 14:54   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 24/39] tests/vkms_configfs: Test adding multiple primary planes José Expósito
2025-02-27 15:00   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 25/39] tests/vkms_configfs: Test adding multiple cursor planes José Expósito
2025-02-27 15:00   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 26/39] tests/vkms_configfs: Test adding a plane without possible CRTCs José Expósito
2025-02-27 15:01   ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 27/39] tests/vkms_configfs: Test enabling a device without CRTCs José Expósito
2025-02-27 15:15   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 28/39] tests/vkms_configfs: Test enabling a device with too many CRTCs José Expósito
2025-02-27 15:05   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 29/39] tests/vkms_configfs: Test enabling a device without encoders José Expósito
2025-02-27 15:05   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 30/39] tests/vkms_configfs: Test enabling a device with too many encoders José Expósito
2025-02-27 15:05   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 31/39] tests/vkms_configfs: Test adding an encoder without possible CRTCs José Expósito
2025-02-27 15:15   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 32/39] tests/vkms_configfs: Test adding a CRTC without encoders José Expósito
2025-02-27 15:15   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 33/39] tests/vkms_configfs: Test enabling a device without connectors José Expósito
2025-02-27 15:15   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 34/39] tests/vkms_configfs: Test enabling a device with too many connectors José Expósito
2025-02-27 15:15   ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes José Expósito
2025-02-28  8:51   ` Louis Chauvet
2025-02-28 11:52     ` José Expósito
2025-02-28 22:15       ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 36/39] lib/vkms: Test changing enabled device CRTCs José Expósito
2025-02-18 16:50 ` [PATCH i-g-t 37/39] lib/vkms: Test changing enabled device encoders José Expósito
2025-02-18 16:50 ` [PATCH i-g-t 38/39] lib/vkms: Test changing enabled device connectors José Expósito
2025-02-18 16:50 ` [PATCH i-g-t 39/39] tests/vkms_configfs: Test connector hot-plug José Expósito
2025-02-28  8:51   ` Louis Chauvet
2025-02-27 13:11 ` [PATCH i-g-t 00/39] VKMS configfs tests Louis Chauvet
2025-02-28 21:22 ` ✓ Xe.CI.BAT: success for VKMS configfs tests (rev3) Patchwork
2025-02-28 21:25 ` ✓ i915.CI.BAT: " Patchwork
2025-03-01  5:04 ` ✗ Xe.CI.Full: failure " Patchwork
2025-03-01  9:43 ` ✗ i915.CI.Full: " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox