Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features
@ 2023-06-23 23:09 James Shargo
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 1/3] lib/drmtest: Add VKMS as a known driver type James Shargo
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: James Shargo @ 2023-06-23 23:09 UTC (permalink / raw)
  To: Development mailing list for IGT GPU Tools

From: Jim Shargo <jshargo@chromium.org>

These changes include new library functionality for working with mount
points and the creation of ConfigFS-based devices.

The ConfigFS functionality is currently under review. You can take a
look at the patches here:
https://gitlab.freedesktop.org/jshargo/compositor-kernel-explorations/-/merge_requests/4/commits

Thanks for taking a look! I'm still new to IGT, so please look with
extra care. I am excited to be contributing :).

Jim Shargo (3):
  lib/drmtest: Add VKMS as a known driver type
  lib/igt_aux: Make "is_mountpoint" public ("igt_is_mountpoint")
  tests/vkms: Adds VKMS tests and library functions to support them

 lib/drmtest.c              |  26 +++
 lib/drmtest.h              |   7 +-
 lib/igt.h                  |   2 +
 lib/igt_aux.c              |  25 +++
 lib/igt_aux.h              |   2 +
 lib/igt_configfs.c         | 105 +++++++++++
 lib/igt_configfs.h         |  35 ++++
 lib/igt_debugfs.c          |  29 +--
 lib/igt_vkms.c             | 362 +++++++++++++++++++++++++++++++++++++
 lib/igt_vkms.h             |  58 ++++++
 lib/meson.build            |   2 +
 tests/meson.build          |  13 ++
 tests/vkms/vkms_configfs.c | 189 +++++++++++++++++++
 13 files changed, 827 insertions(+), 28 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/vkms_configfs.c

-- 
2.41.0.162.gfafddb0af9-goog

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

* [igt-dev] [PATCH i-g-t 1/3] lib/drmtest: Add VKMS as a known driver type
  2023-06-23 23:09 [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features James Shargo
@ 2023-06-23 23:09 ` James Shargo
  2023-06-28 18:50   ` Kamil Konieczny
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 2/3] lib/igt_aux: Make "is_mountpoint" public ("igt_is_mountpoint") James Shargo
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: James Shargo @ 2023-06-23 23:09 UTC (permalink / raw)
  To: Development mailing list for IGT GPU Tools

From: Jim Shargo <jshargo@chromium.org>

Signed-off-by: Jim Shargo <jshargo@chromium.org>
---
 lib/drmtest.c | 26 ++++++++++++++++++++++++++
 lib/drmtest.h |  7 ++++++-
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 220cfb64d..ad8cbe302 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -150,6 +150,16 @@ bool is_intel_device(int fd)
 	return is_i915_device(fd) || is_xe_device(fd);
 }
 
+bool is_vkms_device(int fd)
+{
+	char name[64] = "";
+
+	if (__get_drm_device_name(fd, name, sizeof(name) - 1))
+		return false;
+
+	return strncmp("vkms", name, strlen("vkms")) == 0;
+}
+
 static char _forced_driver[16] = "";
 
 /**
@@ -734,3 +744,19 @@ 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;
+	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 ae86ee19a..1d418e1f6 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -53,14 +53,17 @@
 #define DRIVER_MSM	(1 << 6)
 #define DRIVER_XE	(1 << 7)
 #define DRIVER_VMWGFX   (1 << 8)
+#define DRIVER_VKMS	(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.
@@ -114,6 +117,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);
@@ -123,6 +127,7 @@ bool is_nouveau_device(int fd);
 bool is_vc4_device(int fd);
 bool is_xe_device(int fd);
 bool is_intel_device(int fd);
+bool is_vkms_device(int fd);
 
 /**
  * do_or_die:
-- 
2.41.0.162.gfafddb0af9-goog

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

* [igt-dev] [PATCH i-g-t 2/3] lib/igt_aux: Make "is_mountpoint" public ("igt_is_mountpoint")
  2023-06-23 23:09 [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features James Shargo
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 1/3] lib/drmtest: Add VKMS as a known driver type James Shargo
@ 2023-06-23 23:09 ` James Shargo
  2023-06-28 18:57   ` Kamil Konieczny
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 3/3] tests/vkms: Adds VKMS tests and library functions to support them James Shargo
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: James Shargo @ 2023-06-23 23:09 UTC (permalink / raw)
  To: Development mailing list for IGT GPU Tools

From: Jim Shargo <jshargo@chromium.org>

This change supports the subsequent testing of ConfigFS-based VKMS
features, which require their own mounting.

Signed-off-by: Jim Shargo <jshargo@chromium.org>
---
 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 386e25783..4ec5fc154 100644
--- a/lib/igt_aux.c
+++ b/lib/igt_aux.c
@@ -1970,6 +1970,31 @@ bool igt_allow_unlimited_files(void)
 	return setrlimit(RLIMIT_NOFILE, &rlim) == 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;
+}
+
 /**
  * vfs_file_max: report maximum number of files
  *
diff --git a/lib/igt_aux.h b/lib/igt_aux.h
index fb76b0313..298c610f2 100644
--- a/lib/igt_aux.h
+++ b/lib/igt_aux.h
@@ -311,6 +311,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 a7b54bae5..63fc6b9e7 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.41.0.162.gfafddb0af9-goog

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

* [igt-dev] [PATCH i-g-t 3/3] tests/vkms: Adds VKMS tests and library functions to support them
  2023-06-23 23:09 [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features James Shargo
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 1/3] lib/drmtest: Add VKMS as a known driver type James Shargo
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 2/3] lib/igt_aux: Make "is_mountpoint" public ("igt_is_mountpoint") James Shargo
@ 2023-06-23 23:09 ` James Shargo
  2023-06-28 19:27   ` Kamil Konieczny
  2023-06-24  0:49 ` [igt-dev] ✗ GitLab.Pipeline: warning for Add tests and support for VKMS's new ConfigFS features Patchwork
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: James Shargo @ 2023-06-23 23:09 UTC (permalink / raw)
  To: Development mailing list for IGT GPU Tools

From: Jim Shargo <jshargo@chromium.org>

The library functions include useful tools for creating configfs-backed
devices.

The tests exercise some basic functionality of new ConfigFS
functionality, both positive and negative cases.

Signed-off-by: Jim Shargo <jshargo@chromium.org>
---
 lib/igt.h                  |   2 +
 lib/igt_configfs.c         | 105 +++++++++++
 lib/igt_configfs.h         |  35 ++++
 lib/igt_vkms.c             | 362 +++++++++++++++++++++++++++++++++++++
 lib/igt_vkms.h             |  58 ++++++
 lib/meson.build            |   2 +
 tests/meson.build          |  13 ++
 tests/vkms/vkms_configfs.c | 189 +++++++++++++++++++
 8 files changed, 766 insertions(+)
 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/vkms_configfs.c

diff --git a/lib/igt.h b/lib/igt.h
index 73b6f7727..4c5d16715 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_core.h"
 #include "igt_debugfs.h"
@@ -41,6 +42,7 @@
 #include "igt_pm.h"
 #include "igt_stats.h"
 #include "igt_dsc.h"
+#include "igt_vkms.h"
 #ifdef HAVE_CHAMELIUM
 #include "igt_alsa.h"
 #include "igt_audio.h"
diff --git a/lib/igt_configfs.c b/lib/igt_configfs.c
new file mode 100644
index 000000000..874948482
--- /dev/null
+++ b/lib/igt_configfs.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2023 Google LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include "igt_configfs.h"
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mount.h>
+
+#include "igt_aux.h"
+
+/**
+ * SECTION:igt_configfs
+ * @short_description: Support code for configfs features
+ * @title: configfs
+ * @include: igt.h
+ *
+ * Helper methods for managing configfs.
+ */
+
+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 searches for configfs in typical locations and will try to mount at
+ * /sys/kernel/config if it can't be found.
+ *
+ * Returns:
+ * The path to the configfs mount point (e.g. /sys/kernel/debug)
+ */
+const char *igt_configfs_mount(void)
+{
+	static const char *path;
+
+	if (!path)
+		path = __igt_configfs_mount();
+
+	return path;
+}
+
+const char *igt_configfs_vkms_mount(void)
+{
+	static char vkms_path[CONFIGFS_VKMS_DIR_SIZE] = { 0 };
+	const char *path = igt_configfs_mount();
+
+	if (!path)
+		return NULL;
+
+	if (strcmp(vkms_path, "") == 0) {
+		strncpy(vkms_path, path, CONFIGFS_VKMS_DIR_SIZE - 1);
+		strncat(vkms_path, "/vkms", CONFIGFS_VKMS_DIR_SIZE - 1);
+	}
+	return vkms_path;
+}
+
+/**
+ * igt_configfs_dir: Open and return the fd of configfs, or -1 on failure.
+ *
+ * Returns:
+ */
+int igt_configfs_dir(void)
+{
+	const char *path = igt_configfs_mount();
+
+	if (!path)
+		return -1;
+
+	igt_debug("Opening configfs directory '%s'\n", path);
+	return open(path, O_RDWR);
+}
diff --git a/lib/igt_configfs.h b/lib/igt_configfs.h
new file mode 100644
index 000000000..0f1fd5faa
--- /dev/null
+++ b/lib/igt_configfs.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2023 Google LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#ifndef __IGT_CONFIGFS_H__
+#define __IGT_CONFIGFS_H__
+
+#define CONFIGFS_VKMS_DIR_SIZE 64
+
+const char *igt_configfs_mount(void);
+const char *igt_configfs_vkms_mount(void);
+
+int igt_configfs_dir(void);
+
+#endif /* __IGT_CONFIGFS_H__ */
diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
new file mode 100644
index 000000000..552c637cf
--- /dev/null
+++ b/lib/igt_vkms.c
@@ -0,0 +1,362 @@
+/*
+ * Copyright 2023 Google LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include "igt_vkms.h"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <ftw.h>
+#include <libgen.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "drmtest.h"
+#include "igt_configfs.h"
+#include "igt_core.h"
+
+static void __create_device_from_directory(igt_vkms_t *device, const char *name)
+{
+	const char *vkms_root = igt_configfs_vkms_mount();
+	memset(device, 0, sizeof(*device));
+
+	strncpy(device->name, name, ARRAY_SIZE(device->name) - 1);
+	snprintf(device->device_dir, ARRAY_SIZE(device->device_dir) - 1, "%s/%s",
+		 vkms_root, name);
+}
+
+void igt_vkms_destroy_all_devices(void)
+{
+	const char *vkms_root = igt_configfs_vkms_mount();
+	igt_vkms_t device = { 0 };
+	DIR *dir;
+	struct dirent *ent;
+	int ret = 0;
+
+	if (!vkms_root) {
+		igt_warn("Unable to find VKMS configfs directory.\n");
+		return;
+	}
+
+	dir = opendir(vkms_root);
+	if (!dir) {
+		igt_warn(
+			"Unable to open VKMS configfs directory '%s'. Got errno=%d (%s)\n",
+			vkms_root, errno, strerror(errno));
+		return;
+	}
+
+	while ((ent = readdir(dir)) != NULL) {
+		if (strcmp(ent->d_name, ".") == 0 ||
+		    strcmp(ent->d_name, "..") == 0)
+			continue;
+
+		__create_device_from_directory(&device, ent->d_name);
+		igt_vkms_device_destroy(&device);
+		if (ret)
+			igt_warn("Unable to reset device '%s/%s'\n", vkms_root,
+				 ent->d_name);
+	}
+
+	closedir(dir);
+}
+
+void igt_vkms_device_create(igt_vkms_t *device, const char *name)
+{
+	const char *vkms_root = igt_configfs_vkms_mount();
+	DIR *dir;
+	int ret;
+
+	igt_assert_f(vkms_root, "Unable to find VKMS root '%s'.\n", name);
+
+	dir = opendir(vkms_root);
+	igt_assert_f(
+		dir,
+		"VKMS configfs directory not available at '%s'. Got errno=%d (%s)\n",
+		vkms_root, errno, strerror(errno));
+	if (dir)
+		closedir(dir);
+
+	igt_assert_f(strlen(name) > (ARRAY_SIZE(device->name) - 1),
+		     "Name '%s' is too long for a VKMS device.\n", name);
+	igt_assert_f(strlen(vkms_root) + strlen(name) >
+			     (ARRAY_SIZE(device->device_dir) - 1),
+		     "Desired path is too long when creating '%s/vkms/%s'.\n",
+		     vkms_root, name);
+
+	memset(device, 0, sizeof(*device));
+	strncpy(device->name, name, ARRAY_SIZE(device->name) - 1);
+	snprintf(device->device_dir, ARRAY_SIZE(device->device_dir), "%s/%s", vkms_root,
+		 name);
+
+	igt_debug("mkdir'ing VKMS device at '%s'\n", device->device_dir);
+
+	ret = mkdir(device->device_dir, 0777);
+	igt_assert_f(ret != 0,
+		     "Unable to mkdir device directory '%s'. Got errno=%d (%s)\n",
+		     device->device_dir, errno, strerror(errno));
+	memset(device, 0, sizeof(*device));
+}
+
+static int __igt_vkms_unlink_symlinks(const char *fpath, const struct stat *sb,
+				      int typeflag, struct FTW *ftwbuf)
+{
+	if (typeflag != FTW_SL)
+		return 0;
+
+	if (unlink(fpath)) {
+		igt_warn(
+			"Unable to unlink vkms object: '%s'. Got errno=%d (%s)\n",
+			fpath, errno, strerror(errno));
+		return -1;
+	}
+	return 0;
+}
+
+static int __igt_vkms_delete_objects(const char *fpath, const struct stat *sb,
+				     int typeflag, struct FTW *ftwbuf)
+{
+	char *dirbase, path_buf[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+
+	strncpy(path_buf, fpath, VKMS_CARD_OBJECT_DIR_SIZE - 1);
+	dirbase = basename(dirname(path_buf));
+
+	if (strcmp(dirbase, "planes") != 0 &&
+	    strcmp(dirbase, "encoders") != 0 &&
+	    strcmp(dirbase, "connectors") != 0 &&
+	    strcmp(dirbase, "crtcs") != 0) {
+		return 0;
+	}
+
+	if (rmdir(fpath)) {
+		igt_warn(
+			"Unable to rmdir vkms object: '%s'. Got errno=%d (%s)\n",
+			fpath, errno, strerror(errno));
+		return -1;
+	}
+
+	return 0;
+}
+
+void igt_vkms_device_destroy(igt_vkms_t *device)
+{
+	int ret = 0;
+
+	/*
+	 * Some notes on device destruction:
+	 *   - FTW_PHYS keeps us from following symlinks
+	 *   - FTW_DEPTH does a DFS of the tree, which lets us delete bottom-up.
+	 */
+
+	ret = nftw(device->device_dir, &__igt_vkms_unlink_symlinks,
+		   /* nopenfd= */ 16, FTW_PHYS | FTW_DEPTH);
+	igt_assert_f(ret != 0,
+		     "Unable to remove symlinks for device directory '%s'\n",
+		     device->device_dir);
+
+	ret = nftw(device->device_dir, &__igt_vkms_delete_objects,
+		   /* nopenfd= */ 16, FTW_PHYS | FTW_DEPTH);
+	igt_assert_f(ret != 0,
+		     "Unable to remove objects for device directory '%s'\n",
+		     device->device_dir);
+
+	ret = rmdir(device->device_dir);
+	igt_assert_f(ret != 0,
+		     "Unable to rmdir device directory '%s'. Got errno=%d (%s)\n",
+		     device->device_dir, errno, strerror(errno));
+
+	memset(device, 0, sizeof(*device));
+}
+
+void igt_vkms_device_add_plane(igt_vkms_t *device, const char *name, int type)
+{
+	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 }, writebuf[2] = { 0 };
+	int fd, ret;
+
+	snprintf(path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/planes/%s",
+		 device->device_dir, name);
+
+	ret = mkdir(path, 0777);
+	igt_assert_f(ret != 0,
+		     "Failed to mkdir VKMS plane '%s'. Got errno=%d (%s)\n",
+		     path, errno, strerror(errno));
+
+	strcat(path, "/type");
+	fd = open(path, O_WRONLY);
+	igt_assert_f(
+		fd > 0,
+		"Failed to open plane type for writing '%s'. Got errno=%d (%s)\n",
+		path, errno, strerror(errno));
+
+	snprintf(writebuf, 2, "%d", type);
+	write(fd, writebuf, 1);
+	close(fd);
+}
+
+void igt_vkms_device_add_connector(igt_vkms_t *device, const char *name)
+{
+	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	int ret;
+
+	sprintf(path, "%s/connectors/%s", device->device_dir, name);
+
+	ret = mkdir(path, 0777);
+	igt_assert_f(ret != 0,
+		     "Failed to mkdir VKMS plane '%s'. Got errno=%d (%s)\n",
+		     path, errno, strerror(errno));
+}
+
+void igt_vkms_device_add_encoder(igt_vkms_t *device, const char *name)
+{
+	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	int ret;
+
+	sprintf(path, "%s/encoders/%s", device->device_dir, name);
+
+	ret = mkdir(path, 0777);
+	igt_assert_f(ret != 0,
+		     "Failed to mkdir VKMS encoder '%s'. Got errno=%d (%s)\n",
+		     path, errno, strerror(errno));
+}
+
+void igt_vkms_device_add_crtc(igt_vkms_t *device, const char *name)
+{
+	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	int ret;
+
+	sprintf(path, "%s/crtcs/%s", device->device_dir, name);
+
+	ret = mkdir(path, 0777);
+	igt_assert_f(ret != 0,
+		     "Failed to mkdir VKMS crtc '%s'. Got errno=%d (%s)\n",
+		     path, errno, strerror(errno));
+}
+
+void igt_vkms_device_permit_plane_crtc(igt_vkms_t *device, const char *plane_name,
+				     const char *crtc_name)
+{
+	char plane_crtcs_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	char crtc_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	int ret;
+
+	snprintf(plane_crtcs_path, VKMS_CARD_OBJECT_DIR_SIZE - 1,
+		 "%s/planes/%s/possible_crtcs/%s", device->device_dir, plane_name,
+		 crtc_name);
+	snprintf(crtc_path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/crtcs/%s",
+		 device->device_dir, crtc_name);
+
+	ret = symlink(crtc_path, plane_crtcs_path);
+	igt_assert_f(
+		ret != 0,
+		"Failed to symlink VKMS crtc '%s' to plane '%s'. Got errno=%d (%s)\n",
+		crtc_name, plane_name, errno, strerror(errno));
+}
+
+void igt_vkms_device_permit_encoder_crtc(igt_vkms_t *device,
+				       const char *encoder_name,
+				       const char *crtc_name)
+{
+	char encoder_crtcs_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	char crtc_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	int ret;
+
+	snprintf(encoder_crtcs_path, VKMS_CARD_OBJECT_DIR_SIZE - 1,
+		 "%s/encoders/%s/possible_crtcs/%s", device->device_dir,
+		 encoder_name, crtc_name);
+	snprintf(crtc_path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/crtcs/%s",
+		 device->device_dir, crtc_name);
+
+	ret = symlink(crtc_path, encoder_crtcs_path);
+	igt_assert_f(
+		ret != 0,
+		"Failed to symlink VKMS crtc '%s' to encoder '%s'. Got errno=%d (%s)\n",
+		crtc_name, encoder_name, errno, strerror(errno));
+}
+
+void igt_vkms_device_permit_connector_encoder(igt_vkms_t *device,
+					    const char *connector_name,
+					    const char *encoder_name)
+{
+	char connector_encoders_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	char encoder_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	int ret;
+
+	snprintf(connector_encoders_path, VKMS_CARD_OBJECT_DIR_SIZE - 1,
+		 "%s/connectors/%s/possible_encoders/%s", device->device_dir,
+		 connector_name, encoder_name);
+	snprintf(encoder_path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/encoders/%s",
+		 device->device_dir, encoder_name);
+
+	ret = symlink(encoder_path, connector_encoders_path);
+	igt_assert_f(
+		ret != 0,
+		"Failed to symlink VKMS encoder '%s' to connector '%s'. Got "
+		"errno=%d (%s)\n",
+		encoder_name, connector_name, errno, strerror(errno));
+}
+
+void igt_vkms_enable(igt_vkms_t *device)
+{
+	char enabled_file[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
+	int fd, ret;
+
+	snprintf(enabled_file, VKMS_CARD_OBJECT_DIR_SIZE - 1,
+		 "%s/enabled", device->device_dir);
+
+	fd = open(enabled_file, O_WRONLY);
+	igt_assert_f(fd > 0, "Unable to open '%s'\n",
+		     enabled_file);
+
+	ret = write(fd, "1", 1);
+	igt_assert_f(
+		ret >= 0,
+		"Unable to write '%s'. Got errno=%d (%s)\n",
+		enabled_file, errno, strerror(errno));
+
+	ret = close(fd);
+	igt_assert_eq(ret, 0);
+}
+
+int igt_vkms_is_enabled(igt_vkms_t *device)
+{
+	char registration_file[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 },
+	     is_enabled[2] = { 0 };
+	int fd, ret = 0;
+
+	snprintf(registration_file, VKMS_CARD_OBJECT_DIR_SIZE - 1,
+		 "%s/enabled", device->device_dir);
+
+	fd = open(registration_file, O_RDONLY);
+	igt_assert_f(fd > 0, "Unable to open '%s'\n",
+		     registration_file);
+
+	ret = read(fd, is_enabled, ARRAY_SIZE(is_enabled));
+	igt_assert_eq(0, close(fd));
+	if (ret < 0) {
+		return false;
+	}
+
+	return strcmp("1", is_enabled) == 0;
+}
diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
new file mode 100644
index 000000000..d0473a16a
--- /dev/null
+++ b/lib/igt_vkms.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2023 Google LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#ifndef __IGT_VKMS_H__
+#define __IGT_VKMS_H__
+
+#define VKMS_CARD_DIR_SIZE 128
+#define VKMS_CARD_OBJECT_DIR_SIZE (VKMS_CARD_DIR_SIZE + 128)
+
+void igt_vkms_destroy_all_devices(void);
+
+typedef struct igt_vkms {
+	char name[64];
+	char device_dir[VKMS_CARD_DIR_SIZE];
+} igt_vkms_t;
+
+void igt_vkms_device_create(igt_vkms_t *device, const char *name);
+void igt_vkms_device_destroy(igt_vkms_t *device);
+
+void igt_vkms_device_add_plane(igt_vkms_t *device, const char *name, int type);
+void igt_vkms_device_add_connector(igt_vkms_t *device, const char *name);
+void igt_vkms_device_add_encoder(igt_vkms_t *device, const char *name);
+void igt_vkms_device_add_crtc(igt_vkms_t *device, const char *name);
+
+void igt_vkms_device_permit_plane_crtc(igt_vkms_t *device, const char *plane_name,
+				     const char *crtc_name);
+void igt_vkms_device_permit_encoder_crtc(igt_vkms_t *device,
+				       const char *encoder_name,
+				       const char *crtc_name);
+void igt_vkms_device_permit_connector_encoder(igt_vkms_t *device,
+					    const char *connector_name,
+					    const char *encoder_name);
+
+void igt_vkms_enable(igt_vkms_t *device);
+int igt_vkms_is_enabled(igt_vkms_t *device);
+
+#endif /* __IGT_VKMS_H__ */
diff --git a/lib/meson.build b/lib/meson.build
index 8e9977083..c6bd908ca 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_crc.c',
 	'igt_debugfs.c',
 	'igt_device.c',
@@ -47,6 +48,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/tests/meson.build b/tests/meson.build
index 61dcc0769..7c2b59df9 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -285,6 +285,10 @@ chamelium_progs = [
 	'kms_chamelium_hpd',
 ]
 
+vkms_progs = [
+  'vkms_configfs',
+]
+
 test_deps = [ igt_deps ]
 
 if libdrm_nouveau.found()
@@ -355,6 +359,15 @@ if chamelium.found()
 	test_deps += chamelium
 endif
 
+foreach prog : vkms_progs
+	test_executables += executable(prog, join_paths('vkms', prog + '.c'),
+				       dependencies : test_deps,
+				       install_dir : libexecdir,
+				       install_rpath : libexecdir_rpathdir,
+				       install : true)
+	test_list += prog
+endforeach
+
 test_executables += executable('drm_fdinfo',
 	   join_paths('i915', 'drm_fdinfo.c'),
 	   dependencies : test_deps + [ lib_igt_drm_fdinfo ],
diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
new file mode 100644
index 000000000..39af6dd07
--- /dev/null
+++ b/tests/vkms/vkms_configfs.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2023 Google LLC.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <string.h>
+#include <xf86drmMode.h>
+
+#include "drmtest.h"
+#include "igt.h"
+#include "igt_configfs.h"
+#include "igt_core.h"
+#include "igt_vkms.h"
+
+IGT_TEST_DESCRIPTION("Basic tests for VKMS, including configfs support");
+
+static void vkms_crtc_no_primary_test(igt_vkms_t *device)
+{
+	igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
+	igt_vkms_device_add_crtc(device, "crtc");
+	igt_vkms_device_add_encoder(device, "encoder");
+	igt_vkms_device_add_connector(device, "connector");
+
+	igt_vkms_device_permit_plane_crtc(device, "primary", "crtc");
+	igt_vkms_device_permit_connector_encoder(device, "connector", "encoder");
+	igt_vkms_device_permit_encoder_crtc(device, "encoder", "crtc");
+
+	igt_vkms_enable(device);
+	igt_assert(!igt_vkms_is_enabled(device));
+}
+
+static void vkms_basic_test(igt_vkms_t *device)
+{
+	igt_warn("Path: %s\n", device->device_dir);
+
+	igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
+	igt_vkms_device_add_crtc(device, "crtc");
+	igt_vkms_device_add_encoder(device, "encoder");
+	igt_vkms_device_add_connector(device, "connector");
+
+	igt_vkms_device_permit_plane_crtc(device, "primary", "crtc");
+	igt_vkms_device_permit_connector_encoder(device, "connector", "encoder");
+	igt_vkms_device_permit_encoder_crtc(device, "encoder", "crtc");
+
+	igt_vkms_enable(device);
+	igt_assert(igt_vkms_is_enabled(device));
+}
+
+static void vkms_multiple_overlays_test(igt_vkms_t *device)
+{
+	igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
+	igt_vkms_device_add_plane(device, "cursor", DRM_PLANE_TYPE_CURSOR);
+	igt_vkms_device_add_plane(device, "overlay0", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_plane(device, "overlay1", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_plane(device, "overlay2", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_plane(device, "overlay3", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_crtc(device, "crtc");
+	igt_vkms_device_add_encoder(device, "encoder");
+	igt_vkms_device_add_connector(device, "connector");
+
+	igt_vkms_device_permit_plane_crtc(device, "primary", "crtc");
+	igt_vkms_device_permit_plane_crtc(device, "cursor", "crtc");
+	igt_vkms_device_permit_plane_crtc(device, "overlay0", "crtc");
+	igt_vkms_device_permit_plane_crtc(device, "overlay1", "crtc");
+	igt_vkms_device_permit_plane_crtc(device, "overlay2", "crtc");
+	igt_vkms_device_permit_plane_crtc(device, "overlay3", "crtc");
+	igt_vkms_device_permit_connector_encoder(device, "connector", "encoder");
+	igt_vkms_device_permit_encoder_crtc(device, "encoder", "crtc");
+
+	igt_vkms_enable(device);
+	igt_assert(igt_vkms_is_enabled(device));
+}
+
+static void vkms_multiple_displays_test(igt_vkms_t *device)
+{
+	igt_vkms_device_add_plane(device, "primary0", DRM_PLANE_TYPE_PRIMARY);
+	igt_vkms_device_add_plane(device, "primary1", DRM_PLANE_TYPE_PRIMARY);
+	igt_vkms_device_add_plane(device, "cursor0", DRM_PLANE_TYPE_CURSOR);
+	igt_vkms_device_add_plane(device, "cursor1", DRM_PLANE_TYPE_CURSOR);
+	igt_vkms_device_add_plane(device, "overlay0", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_plane(device, "overlay1", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_plane(device, "overlay2", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_plane(device, "overlay3", DRM_PLANE_TYPE_OVERLAY);
+	igt_vkms_device_add_crtc(device, "crtc0");
+	igt_vkms_device_add_crtc(device, "crtc1");
+	igt_vkms_device_add_encoder(device, "encoder0");
+	igt_vkms_device_add_encoder(device, "encoder1");
+	igt_vkms_device_add_connector(device, "connector0");
+	igt_vkms_device_add_connector(device, "connector1");
+
+	igt_vkms_device_permit_plane_crtc(device, "primary0", "crtc0");
+	igt_vkms_device_permit_plane_crtc(device, "cursor0", "crtc0");
+	igt_vkms_device_permit_plane_crtc(device, "overlay0", "crtc0");
+	igt_vkms_device_permit_plane_crtc(device, "overlay1", "crtc0");
+	igt_vkms_device_permit_plane_crtc(device, "overlay2", "crtc0");
+	igt_vkms_device_permit_plane_crtc(device, "overlay3", "crtc0");
+	igt_vkms_device_permit_connector_encoder(device, "connector0", "encoder0");
+	igt_vkms_device_permit_encoder_crtc(device, "encoder0", "crtc0");
+
+	igt_vkms_device_permit_plane_crtc(device, "primary1", "crtc1");
+	igt_vkms_device_permit_plane_crtc(device, "cursor1", "crtc1");
+	igt_vkms_device_permit_plane_crtc(device, "overlay0", "crtc1");
+	igt_vkms_device_permit_plane_crtc(device, "overlay1", "crtc1");
+	igt_vkms_device_permit_plane_crtc(device, "overlay2", "crtc1");
+	igt_vkms_device_permit_plane_crtc(device, "overlay3", "crtc1");
+	igt_vkms_device_permit_connector_encoder(device, "connector1", "encoder1");
+	igt_vkms_device_permit_encoder_crtc(device, "encoder1", "crtc1");
+
+	igt_vkms_enable(device);
+	igt_assert(igt_vkms_is_enabled(device));
+}
+
+igt_main
+{
+	igt_vkms_t device = { 0 };
+
+	igt_require_vkms();
+
+	// By clearing out all existing devices, we don't end up with
+	// confusing name collision errors.
+	igt_fixture
+	{
+		igt_vkms_destroy_all_devices();
+	}
+
+	igt_describe("Registering an empty device fails");
+	igt_subtest("empty")
+	{
+		igt_vkms_device_create(&device, "empty-device");
+		igt_vkms_enable(&device);
+		igt_vkms_device_destroy(&device);
+	}
+
+	igt_describe("Registering a CRTC with no primary fails");
+	igt_subtest("no_primary")
+	{
+		igt_vkms_device_create(&device, "no-primary");
+		vkms_crtc_no_primary_test(&device);
+		igt_vkms_device_destroy(&device);
+	}
+
+	igt_describe("Can create a minimal device.");
+	igt_subtest("basic_device")
+	{
+		igt_vkms_device_create(&device, "basic-device");
+		vkms_basic_test(&device);
+		igt_vkms_device_destroy(&device);
+	}
+
+	igt_describe("Can create a device with multiple overlays");
+	igt_subtest("multiple_overlays_device")
+	{
+		igt_vkms_device_create(&device, "multiple-overlays-device");
+		vkms_multiple_overlays_test(&device);
+		igt_vkms_device_destroy(&device);
+	}
+
+	igt_describe("Can create a device with multiple displays");
+	igt_subtest("multiple_displays_device")
+	{
+		igt_vkms_device_create(&device, "multiple-displays-device");
+		vkms_multiple_displays_test(&device);
+		igt_vkms_device_destroy(&device);
+	}
+
+	igt_fixture
+	{
+		if (strcmp(device.name, "") != 0)
+			igt_vkms_device_destroy(&device);
+	}
+}
-- 
2.41.0.162.gfafddb0af9-goog

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

* [igt-dev] ✗ GitLab.Pipeline: warning for Add tests and support for VKMS's new ConfigFS features
  2023-06-23 23:09 [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features James Shargo
                   ` (2 preceding siblings ...)
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 3/3] tests/vkms: Adds VKMS tests and library functions to support them James Shargo
@ 2023-06-24  0:49 ` Patchwork
  2023-06-24  1:23 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
  2023-06-24  3:36 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  5 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2023-06-24  0:49 UTC (permalink / raw)
  To: James Shargo; +Cc: igt-dev

== Series Details ==

Series: Add tests and support for VKMS's new ConfigFS features
URL   : https://patchwork.freedesktop.org/series/119814/
State : warning

== Summary ==

Pipeline status: FAILED.

see https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/917454 for the overview.

build:tests-debian-meson has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351956):
    ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    uint32_t lessees[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    uint32_t count;
    ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    uint32_t objects[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
   extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
                                         ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567541:step_script
  section_start:1687567541:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567542:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-debian-meson-arm64 has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351959):
    ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    uint32_t lessees[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    uint32_t count;
    ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    uint32_t objects[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
   extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
                                         ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567533:step_script
  section_start:1687567533:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567533:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-debian-meson-armhf has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351958):
    ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    uint32_t lessees[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    uint32_t count;
    ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    uint32_t objects[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
   extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
                                         ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567521:step_script
  section_start:1687567521:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567522:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-debian-meson-mips has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351960):
    ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    uint32_t lessees[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    uint32_t count;
    ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    uint32_t objects[0];
    ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
   extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
                                         ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567525:step_script
  section_start:1687567525:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567526:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-fedora has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351951):
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    533 |  uint32_t lessees[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    539 |  uint32_t count;
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    540 |  uint32_t objects[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
    545 | extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
        |                                       ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567527:step_script
  section_start:1687567527:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567528:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-fedora-clang has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351955):
          uint32_t bpp;
          ^
  /usr/include/xf86drmMode.h:221:2: error: unknown type name 'uint32_t'
          uint32_t depth;
          ^
  /usr/include/xf86drmMode.h:223:2: error: unknown type name 'uint32_t'
          uint32_t handle;
          ^
  /usr/include/xf86drmMode.h:229:2: error: unknown type name 'uint32_t'
          uint32_t id;
          ^
  fatal error: too many errors emitted, stopping now [-ferror-limit=]
  20 errors generated.
  ninja: build stopped: subcommand failed.
  section_end:1687567549:step_script
  section_start:1687567549:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567549:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-fedora-no-libdrm-nouveau has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351954):
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    533 |  uint32_t lessees[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    539 |  uint32_t count;
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    540 |  uint32_t objects[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
    545 | extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
        |                                       ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567540:step_script
  section_start:1687567540:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567542:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-fedora-no-libunwind has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351952):
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    533 |  uint32_t lessees[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    539 |  uint32_t count;
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    540 |  uint32_t objects[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
    545 | extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
        |                                       ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567541:step_script
  section_start:1687567541:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567541:cleanup_file_variables
  ERROR: Job failed: exit code 1
  

build:tests-fedora-oldest-meson has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/44351953):
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:533:2: error: unknown type name ‘uint32_t’
    533 |  uint32_t lessees[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:539:2: error: unknown type name ‘uint32_t’
    539 |  uint32_t count;
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:540:2: error: unknown type name ‘uint32_t’
    540 |  uint32_t objects[0];
        |  ^~~~~~~~
  /usr/include/xf86drmMode.h:545:39: error: unknown type name ‘uint32_t’
    545 | extern int drmModeRevokeLease(int fd, uint32_t lessee_id);
        |                                       ^~~~~~~~
  ninja: build stopped: subcommand failed.
  section_end:1687567529:step_script
  section_start:1687567529:cleanup_file_variables
  Cleaning up project directory and file based variables
  section_end:1687567529:cleanup_file_variables
  ERROR: Job failed: exit code 1

== Logs ==

For more details see: https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/917454

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

* [igt-dev] ✓ Fi.CI.BAT: success for Add tests and support for VKMS's new ConfigFS features
  2023-06-23 23:09 [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features James Shargo
                   ` (3 preceding siblings ...)
  2023-06-24  0:49 ` [igt-dev] ✗ GitLab.Pipeline: warning for Add tests and support for VKMS's new ConfigFS features Patchwork
@ 2023-06-24  1:23 ` Patchwork
  2023-06-24  3:36 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  5 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2023-06-24  1:23 UTC (permalink / raw)
  To: James Shargo; +Cc: igt-dev

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

== Series Details ==

Series: Add tests and support for VKMS's new ConfigFS features
URL   : https://patchwork.freedesktop.org/series/119814/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_13317 -> IGTPW_9249
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

Participating hosts (39 -> 39)
------------------------------

  Additional (2): bat-rplp-1 fi-pnv-d510 
  Missing    (2): fi-kbl-soraka fi-snb-2520m 

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

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

### IGT changes ###

#### Issues hit ####

  * igt@debugfs_test@basic-hwmon:
    - bat-rplp-1:         NOTRUN -> [SKIP][1] ([i915#7456])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rplp-1/igt@debugfs_test@basic-hwmon.html

  * igt@gem_tiled_pread_basic:
    - bat-rplp-1:         NOTRUN -> [SKIP][2] ([i915#3282])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rplp-1/igt@gem_tiled_pread_basic.html

  * igt@i915_selftest@live@migrate:
    - bat-dg2-11:         [PASS][3] -> [DMESG-WARN][4] ([i915#7699])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/bat-dg2-11/igt@i915_selftest@live@migrate.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-dg2-11/igt@i915_selftest@live@migrate.html
    - bat-mtlp-8:         [PASS][5] -> [DMESG-FAIL][6] ([i915#7699])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/bat-mtlp-8/igt@i915_selftest@live@migrate.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-mtlp-8/igt@i915_selftest@live@migrate.html

  * igt@i915_selftest@live@mman:
    - bat-rpls-2:         [PASS][7] -> [TIMEOUT][8] ([i915#6794] / [i915#7392])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/bat-rpls-2/igt@i915_selftest@live@mman.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rpls-2/igt@i915_selftest@live@mman.html

  * igt@i915_selftest@live@requests:
    - bat-mtlp-8:         [PASS][9] -> [DMESG-FAIL][10] ([i915#7269])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/bat-mtlp-8/igt@i915_selftest@live@requests.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-mtlp-8/igt@i915_selftest@live@requests.html
    - bat-rpls-1:         [PASS][11] -> [ABORT][12] ([i915#7911] / [i915#7920] / [i915#7982])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/bat-rpls-1/igt@i915_selftest@live@requests.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rpls-1/igt@i915_selftest@live@requests.html

  * igt@i915_suspend@basic-s2idle-without-i915:
    - bat-rpls-2:         NOTRUN -> [ABORT][13] ([i915#6687] / [i915#8668])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rpls-2/igt@i915_suspend@basic-s2idle-without-i915.html

  * igt@kms_chamelium_frames@dp-crc-fast:
    - bat-rplp-1:         NOTRUN -> [SKIP][14] ([i915#7828]) +7 similar issues
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rplp-1/igt@kms_chamelium_frames@dp-crc-fast.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
    - bat-rplp-1:         NOTRUN -> [SKIP][15] ([i915#4103] / [i915#4213]) +1 similar issue
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rplp-1/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_force_connector_basic@force-load-detect:
    - bat-rplp-1:         NOTRUN -> [SKIP][16] ([fdo#109285])
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rplp-1/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_pipe_crc_basic@nonblocking-crc:
    - bat-dg2-11:         NOTRUN -> [SKIP][17] ([i915#1845] / [i915#5354])
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-dg2-11/igt@kms_pipe_crc_basic@nonblocking-crc.html

  * igt@kms_psr@primary_page_flip:
    - fi-pnv-d510:        NOTRUN -> [SKIP][18] ([fdo#109271]) +37 similar issues
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/fi-pnv-d510/igt@kms_psr@primary_page_flip.html
    - bat-rplp-1:         NOTRUN -> [SKIP][19] ([i915#1072]) +3 similar issues
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rplp-1/igt@kms_psr@primary_page_flip.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - bat-rplp-1:         NOTRUN -> [ABORT][20] ([i915#4579] / [i915#8260])
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-rplp-1/igt@kms_setmode@basic-clone-single-crtc.html
    - fi-pnv-d510:        NOTRUN -> [SKIP][21] ([fdo#109271] / [i915#4579])
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/fi-pnv-d510/igt@kms_setmode@basic-clone-single-crtc.html

  
#### Possible fixes ####

  * igt@i915_selftest@live@gt_mocs:
    - bat-mtlp-6:         [DMESG-FAIL][22] ([i915#7059]) -> [PASS][23]
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/bat-mtlp-6/igt@i915_selftest@live@gt_mocs.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-mtlp-6/igt@i915_selftest@live@gt_mocs.html

  * igt@kms_pipe_crc_basic@suspend-read-crc@pipe-a-hdmi-a-1:
    - fi-rkl-11600:       [FAIL][24] ([fdo#103375]) -> [PASS][25]
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/fi-rkl-11600/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-a-hdmi-a-1.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/fi-rkl-11600/igt@kms_pipe_crc_basic@suspend-read-crc@pipe-a-hdmi-a-1.html

  
#### Warnings ####

  * igt@core_auth@basic-auth:
    - bat-adlp-11:        [ABORT][26] ([i915#8011]) -> [ABORT][27] ([i915#4423] / [i915#8011])
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/bat-adlp-11/igt@core_auth@basic-auth.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/bat-adlp-11/igt@core_auth@basic-auth.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4213]: https://gitlab.freedesktop.org/drm/intel/issues/4213
  [i915#4423]: https://gitlab.freedesktop.org/drm/intel/issues/4423
  [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#6687]: https://gitlab.freedesktop.org/drm/intel/issues/6687
  [i915#6794]: https://gitlab.freedesktop.org/drm/intel/issues/6794
  [i915#7059]: https://gitlab.freedesktop.org/drm/intel/issues/7059
  [i915#7269]: https://gitlab.freedesktop.org/drm/intel/issues/7269
  [i915#7392]: https://gitlab.freedesktop.org/drm/intel/issues/7392
  [i915#7456]: https://gitlab.freedesktop.org/drm/intel/issues/7456
  [i915#7699]: https://gitlab.freedesktop.org/drm/intel/issues/7699
  [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
  [i915#7911]: https://gitlab.freedesktop.org/drm/intel/issues/7911
  [i915#7920]: https://gitlab.freedesktop.org/drm/intel/issues/7920
  [i915#7982]: https://gitlab.freedesktop.org/drm/intel/issues/7982
  [i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
  [i915#8260]: https://gitlab.freedesktop.org/drm/intel/issues/8260
  [i915#8668]: https://gitlab.freedesktop.org/drm/intel/issues/8668


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

  * CI: CI-20190529 -> None
  * IGT: IGT_7347 -> IGTPW_9249

  CI-20190529: 20190529
  CI_DRM_13317: e77d4da4d2bd8d0accd04f83c0008b206f522bc7 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_9249: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/index.html
  IGT_7347: 621c2d3115d40a1ba0b53668413ea21edf03a5ff @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git

== Logs ==

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

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

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

* [igt-dev] ✓ Fi.CI.IGT: success for Add tests and support for VKMS's new ConfigFS features
  2023-06-23 23:09 [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features James Shargo
                   ` (4 preceding siblings ...)
  2023-06-24  1:23 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
@ 2023-06-24  3:36 ` Patchwork
  5 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2023-06-24  3:36 UTC (permalink / raw)
  To: James Shargo; +Cc: igt-dev

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

== Series Details ==

Series: Add tests and support for VKMS's new ConfigFS features
URL   : https://patchwork.freedesktop.org/series/119814/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_13317_full -> IGTPW_9249_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

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

  Missing    (1): shard-rkl0 

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

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

### IGT changes ###

#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-fullscreen:
    - {shard-dg2}:        [PASS][1] -> [FAIL][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-fullscreen.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-10/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-fullscreen.html

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

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

### IGT changes ###

#### Issues hit ####

  * igt@api_intel_bb@object-reloc-purge-cache:
    - shard-rkl:          NOTRUN -> [SKIP][3] ([i915#8411])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@api_intel_bb@object-reloc-purge-cache.html

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

  * igt@drm_fdinfo@most-busy-check-all@rcs0:
    - shard-rkl:          [PASS][5] -> [FAIL][6] ([i915#7742])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-4/igt@drm_fdinfo@most-busy-check-all@rcs0.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-2/igt@drm_fdinfo@most-busy-check-all@rcs0.html

  * igt@feature_discovery@display-4x:
    - shard-tglu:         NOTRUN -> [SKIP][7] ([i915#1839])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-7/igt@feature_discovery@display-4x.html

  * igt@gem_bad_reloc@negative-reloc-lut:
    - shard-rkl:          NOTRUN -> [SKIP][8] ([i915#3281]) +5 similar issues
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@gem_bad_reloc@negative-reloc-lut.html

  * igt@gem_ccs@ctrl-surf-copy:
    - shard-tglu:         NOTRUN -> [SKIP][9] ([i915#3555] / [i915#4579] / [i915#5325])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-4/igt@gem_ccs@ctrl-surf-copy.html

  * igt@gem_ccs@suspend-resume:
    - shard-rkl:          NOTRUN -> [SKIP][10] ([i915#4579] / [i915#5325])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@gem_ccs@suspend-resume.html

  * igt@gem_create@create-ext-cpu-access-big:
    - shard-rkl:          NOTRUN -> [SKIP][11] ([i915#6335])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@gem_create@create-ext-cpu-access-big.html

  * igt@gem_ctx_exec@basic-nohangcheck:
    - shard-rkl:          NOTRUN -> [FAIL][12] ([i915#6268])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@gem_ctx_exec@basic-nohangcheck.html

  * igt@gem_ctx_sseu@invalid-sseu:
    - shard-rkl:          NOTRUN -> [SKIP][13] ([i915#280])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@gem_ctx_sseu@invalid-sseu.html

  * igt@gem_eio@hibernate:
    - shard-rkl:          NOTRUN -> [ABORT][14] ([i915#7975] / [i915#8213])
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@gem_eio@hibernate.html

  * igt@gem_exec_balancer@parallel-balancer:
    - shard-rkl:          NOTRUN -> [SKIP][15] ([i915#4525])
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@gem_exec_balancer@parallel-balancer.html

  * igt@gem_exec_fair@basic-deadline:
    - shard-rkl:          [PASS][16] -> [FAIL][17] ([i915#2846])
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-1/igt@gem_exec_fair@basic-deadline.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@gem_exec_fair@basic-deadline.html

  * igt@gem_exec_fair@basic-none-share@rcs0:
    - shard-glk:          NOTRUN -> [FAIL][18] ([i915#2842])
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk2/igt@gem_exec_fair@basic-none-share@rcs0.html

  * igt@gem_exec_fair@basic-pace@vcs0:
    - shard-rkl:          [PASS][19] -> [FAIL][20] ([i915#2842])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-6/igt@gem_exec_fair@basic-pace@vcs0.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@gem_exec_fair@basic-pace@vcs0.html

  * igt@gem_lmem_swapping@basic:
    - shard-glk:          NOTRUN -> [SKIP][21] ([fdo#109271] / [i915#4613])
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk3/igt@gem_lmem_swapping@basic.html

  * igt@gem_lmem_swapping@parallel-random:
    - shard-rkl:          NOTRUN -> [SKIP][22] ([i915#4613]) +1 similar issue
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@gem_lmem_swapping@parallel-random.html

  * igt@gem_lmem_swapping@parallel-random-verify-ccs:
    - shard-tglu:         NOTRUN -> [SKIP][23] ([i915#4613])
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-9/igt@gem_lmem_swapping@parallel-random-verify-ccs.html

  * igt@gem_mmap_gtt@coherency:
    - shard-tglu:         NOTRUN -> [SKIP][24] ([fdo#111656])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-9/igt@gem_mmap_gtt@coherency.html

  * igt@gem_partial_pwrite_pread@writes-after-reads-snoop:
    - shard-rkl:          NOTRUN -> [SKIP][25] ([i915#3282]) +1 similar issue
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@gem_partial_pwrite_pread@writes-after-reads-snoop.html

  * igt@gem_pxp@create-valid-protected-context:
    - shard-rkl:          NOTRUN -> [SKIP][26] ([i915#4270]) +1 similar issue
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@gem_pxp@create-valid-protected-context.html

  * igt@gem_pxp@reject-modify-context-protection-on:
    - shard-tglu:         NOTRUN -> [SKIP][27] ([i915#4270]) +1 similar issue
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-4/igt@gem_pxp@reject-modify-context-protection-on.html

  * igt@gem_softpin@evict-snoop:
    - shard-rkl:          NOTRUN -> [SKIP][28] ([fdo#109312])
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@gem_softpin@evict-snoop.html

  * igt@gem_userptr_blits@readonly-pwrite-unsync:
    - shard-tglu:         NOTRUN -> [SKIP][29] ([i915#3297])
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-7/igt@gem_userptr_blits@readonly-pwrite-unsync.html

  * igt@gem_userptr_blits@unsync-overlap:
    - shard-rkl:          NOTRUN -> [SKIP][30] ([i915#3297])
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@gem_userptr_blits@unsync-overlap.html

  * igt@gen7_exec_parse@cmd-crossing-page:
    - shard-rkl:          NOTRUN -> [SKIP][31] ([fdo#109289])
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@gen7_exec_parse@cmd-crossing-page.html

  * igt@gen9_exec_parse@bb-secure:
    - shard-tglu:         NOTRUN -> [SKIP][32] ([i915#2527] / [i915#2856]) +1 similar issue
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-7/igt@gen9_exec_parse@bb-secure.html

  * igt@gen9_exec_parse@bb-start-out:
    - shard-rkl:          NOTRUN -> [SKIP][33] ([i915#2527])
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@gen9_exec_parse@bb-start-out.html

  * igt@i915_pm_dc@dc5-psr:
    - shard-rkl:          NOTRUN -> [SKIP][34] ([i915#658])
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@i915_pm_dc@dc5-psr.html

  * igt@i915_pm_freq_mult@media-freq@gt0:
    - shard-rkl:          NOTRUN -> [SKIP][35] ([i915#4579] / [i915#6590])
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@i915_pm_freq_mult@media-freq@gt0.html

  * igt@i915_pm_rpm@dpms-mode-unset-lpsp:
    - shard-rkl:          [PASS][36] -> [SKIP][37] ([i915#1397]) +1 similar issue
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-7/igt@i915_pm_rpm@dpms-mode-unset-lpsp.html
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@i915_pm_rpm@dpms-mode-unset-lpsp.html

  * igt@i915_pm_rpm@gem-execbuf-stress-pc8:
    - shard-rkl:          NOTRUN -> [SKIP][38] ([fdo#109506])
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@i915_pm_rpm@gem-execbuf-stress-pc8.html

  * igt@i915_pm_rps@reset:
    - shard-snb:          [PASS][39] -> [INCOMPLETE][40] ([i915#7790])
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-snb4/igt@i915_pm_rps@reset.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-snb6/igt@i915_pm_rps@reset.html

  * igt@kms_async_flips@alternate-sync-async-flip@pipe-b-vga-1:
    - shard-snb:          [PASS][41] -> [FAIL][42] ([i915#2521])
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-snb5/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-vga-1.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-snb7/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-vga-1.html

  * igt@kms_big_fb@4-tiled-8bpp-rotate-180:
    - shard-tglu:         NOTRUN -> [SKIP][43] ([fdo#111615] / [i915#5286]) +1 similar issue
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-3/igt@kms_big_fb@4-tiled-8bpp-rotate-180.html

  * igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-async-flip:
    - shard-rkl:          NOTRUN -> [SKIP][44] ([i915#5286])
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-async-flip.html

  * igt@kms_big_fb@linear-32bpp-rotate-90:
    - shard-tglu:         NOTRUN -> [SKIP][45] ([fdo#111614])
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-8/igt@kms_big_fb@linear-32bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-16bpp-rotate-270:
    - shard-glk:          NOTRUN -> [SKIP][46] ([fdo#109271]) +19 similar issues
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk8/igt@kms_big_fb@x-tiled-16bpp-rotate-270.html

  * igt@kms_big_fb@x-tiled-64bpp-rotate-90:
    - shard-rkl:          NOTRUN -> [SKIP][47] ([fdo#111614] / [i915#3638])
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@kms_big_fb@x-tiled-64bpp-rotate-90.html

  * igt@kms_big_fb@yf-tiled-addfb-size-overflow:
    - shard-rkl:          NOTRUN -> [SKIP][48] ([fdo#111615])
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_big_fb@yf-tiled-addfb-size-overflow.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip:
    - shard-rkl:          NOTRUN -> [SKIP][49] ([fdo#110723]) +1 similar issue
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-async-flip:
    - shard-tglu:         NOTRUN -> [SKIP][50] ([fdo#111615]) +1 similar issue
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-4/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-async-flip.html

  * igt@kms_ccs@pipe-a-ccs-on-another-bo-4_tiled_mtl_rc_ccs_cc:
    - shard-rkl:          NOTRUN -> [SKIP][51] ([i915#5354] / [i915#6095]) +6 similar issues
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@kms_ccs@pipe-a-ccs-on-another-bo-4_tiled_mtl_rc_ccs_cc.html

  * igt@kms_ccs@pipe-b-crc-primary-basic-y_tiled_ccs:
    - shard-rkl:          NOTRUN -> [SKIP][52] ([i915#3734] / [i915#5354] / [i915#6095]) +1 similar issue
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@kms_ccs@pipe-b-crc-primary-basic-y_tiled_ccs.html

  * igt@kms_ccs@pipe-b-random-ccs-data-4_tiled_mtl_rc_ccs_cc:
    - shard-tglu:         NOTRUN -> [SKIP][53] ([i915#5354] / [i915#6095]) +7 similar issues
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-6/igt@kms_ccs@pipe-b-random-ccs-data-4_tiled_mtl_rc_ccs_cc.html

  * igt@kms_ccs@pipe-c-bad-aux-stride-y_tiled_gen12_rc_ccs_cc:
    - shard-rkl:          NOTRUN -> [SKIP][54] ([i915#5354]) +14 similar issues
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@kms_ccs@pipe-c-bad-aux-stride-y_tiled_gen12_rc_ccs_cc.html

  * igt@kms_ccs@pipe-c-bad-pixel-format-y_tiled_ccs:
    - shard-tglu:         NOTRUN -> [SKIP][55] ([i915#3689] / [i915#5354] / [i915#6095]) +4 similar issues
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-9/igt@kms_ccs@pipe-c-bad-pixel-format-y_tiled_ccs.html

  * igt@kms_chamelium_color@ctm-limited-range:
    - shard-tglu:         NOTRUN -> [SKIP][56] ([fdo#111827]) +1 similar issue
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-8/igt@kms_chamelium_color@ctm-limited-range.html

  * igt@kms_chamelium_frames@vga-frame-dump:
    - shard-rkl:          NOTRUN -> [SKIP][57] ([i915#7828]) +3 similar issues
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@kms_chamelium_frames@vga-frame-dump.html

  * igt@kms_chamelium_hpd@vga-hpd-for-each-pipe:
    - shard-tglu:         NOTRUN -> [SKIP][58] ([i915#7828]) +1 similar issue
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-9/igt@kms_chamelium_hpd@vga-hpd-for-each-pipe.html

  * igt@kms_content_protection@atomic-dpms:
    - shard-tglu:         NOTRUN -> [SKIP][59] ([i915#4579] / [i915#6944] / [i915#7116] / [i915#7118])
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-8/igt@kms_content_protection@atomic-dpms.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x32:
    - shard-rkl:          NOTRUN -> [SKIP][60] ([i915#3555] / [i915#4579]) +5 similar issues
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html

  * igt@kms_cursor_crc@cursor-sliding-512x170:
    - shard-tglu:         NOTRUN -> [SKIP][61] ([i915#3359])
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-10/igt@kms_cursor_crc@cursor-sliding-512x170.html

  * igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size:
    - shard-tglu:         NOTRUN -> [SKIP][62] ([fdo#109274])
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-10/igt@kms_cursor_legacy@cursorb-vs-flipa-varying-size.html

  * igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions:
    - shard-tglu:         NOTRUN -> [SKIP][63] ([fdo#109274] / [fdo#111767])
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-10/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
    - shard-glk:          [PASS][64] -> [FAIL][65] ([i915#2346])
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-glk5/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk3/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size:
    - shard-apl:          [PASS][66] -> [FAIL][67] ([i915#2346])
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-apl2/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-apl3/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
    - shard-tglu:         NOTRUN -> [SKIP][68] ([i915#4103])
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-8/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@single-bo@pipe-b:
    - shard-rkl:          [PASS][69] -> [INCOMPLETE][70] ([i915#8011])
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-2/igt@kms_cursor_legacy@single-bo@pipe-b.html
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@kms_cursor_legacy@single-bo@pipe-b.html

  * igt@kms_dp_aux_dev:
    - shard-rkl:          NOTRUN -> [SKIP][71] ([i915#1257])
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@kms_dp_aux_dev.html

  * igt@kms_dsc@dsc-with-bpc-formats:
    - shard-tglu:         NOTRUN -> [SKIP][72] ([i915#3840] / [i915#4579])
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-6/igt@kms_dsc@dsc-with-bpc-formats.html

  * igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible:
    - shard-rkl:          NOTRUN -> [SKIP][73] ([fdo#111825]) +3 similar issues
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-2/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html

  * igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2:
    - shard-glk:          [PASS][74] -> [FAIL][75] ([i915#79])
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk3/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@2x-flip-vs-wf_vblank-interruptible:
    - shard-tglu:         NOTRUN -> [SKIP][76] ([fdo#109274] / [i915#3637])
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-3/igt@kms_flip@2x-flip-vs-wf_vblank-interruptible.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling@pipe-a-valid-mode:
    - shard-rkl:          NOTRUN -> [SKIP][77] ([i915#2672] / [i915#4579]) +1 similar issue
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-downscaling@pipe-a-valid-mode.html

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

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-gtt:
    - shard-tglu:         NOTRUN -> [SKIP][79] ([fdo#109280]) +9 similar issues
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-10/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-pwrite:
    - shard-rkl:          NOTRUN -> [SKIP][80] ([i915#3023]) +11 similar issues
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_frontbuffer_tracking@fbcpsr-rgb101010-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-pwrite:
    - shard-tglu:         NOTRUN -> [SKIP][81] ([fdo#110189]) +8 similar issues
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-4/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt:
    - shard-rkl:          NOTRUN -> [SKIP][82] ([fdo#111825] / [i915#1825]) +10 similar issues
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html

  * igt@kms_hdr@invalid-hdr:
    - shard-rkl:          NOTRUN -> [SKIP][83] ([i915#4579] / [i915#6953] / [i915#8228])
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_hdr@invalid-hdr.html

  * igt@kms_plane_scaling@plane-downscale-with-modifiers-factor-0-25@pipe-a-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][84] ([i915#5176]) +1 similar issue
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_plane_scaling@plane-downscale-with-modifiers-factor-0-25@pipe-a-hdmi-a-2.html

  * igt@kms_plane_scaling@plane-downscale-with-modifiers-factor-0-25@pipe-b-hdmi-a-2:
    - shard-rkl:          NOTRUN -> [SKIP][85] ([i915#4579] / [i915#5176]) +1 similar issue
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_plane_scaling@plane-downscale-with-modifiers-factor-0-25@pipe-b-hdmi-a-2.html

  * igt@kms_plane_scaling@plane-upscale-with-modifiers-20x20@pipe-b-hdmi-a-1:
    - shard-snb:          NOTRUN -> [SKIP][86] ([fdo#109271] / [i915#4579]) +8 similar issues
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-snb1/igt@kms_plane_scaling@plane-upscale-with-modifiers-20x20@pipe-b-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-a-hdmi-a-1:
    - shard-snb:          NOTRUN -> [SKIP][87] ([fdo#109271]) +17 similar issues
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-snb1/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling@pipe-a-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-a-hdmi-a-1:
    - shard-rkl:          NOTRUN -> [SKIP][88] ([i915#5235])
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-a-hdmi-a-1.html

  * igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-b-hdmi-a-1:
    - shard-rkl:          NOTRUN -> [SKIP][89] ([i915#4579] / [i915#5235])
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@kms_plane_scaling@planes-downscale-factor-0-25-upscale-20x20@pipe-b-hdmi-a-1.html

  * igt@kms_psr2_sf@cursor-plane-update-sf:
    - shard-rkl:          NOTRUN -> [SKIP][90] ([fdo#111068] / [i915#658])
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_psr2_sf@cursor-plane-update-sf.html

  * igt@kms_psr2_sf@overlay-primary-update-sf-dmg-area:
    - shard-glk:          NOTRUN -> [SKIP][91] ([fdo#109271] / [i915#658])
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk3/igt@kms_psr2_sf@overlay-primary-update-sf-dmg-area.html

  * igt@kms_psr2_sf@plane-move-sf-dmg-area:
    - shard-tglu:         NOTRUN -> [SKIP][92] ([fdo#111068] / [i915#658])
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-5/igt@kms_psr2_sf@plane-move-sf-dmg-area.html

  * igt@kms_psr@primary_mmap_cpu:
    - shard-rkl:          NOTRUN -> [SKIP][93] ([i915#1072]) +3 similar issues
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_psr@primary_mmap_cpu.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-tglu:         NOTRUN -> [SKIP][94] ([fdo#111615] / [i915#5289])
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-8/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

  * igt@kms_tiled_display@basic-test-pattern:
    - shard-tglu:         NOTRUN -> [SKIP][95] ([i915#8623])
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-8/igt@kms_tiled_display@basic-test-pattern.html

  * igt@kms_universal_plane@universal-plane-pipe-d-functional:
    - shard-rkl:          NOTRUN -> [SKIP][96] ([i915#4070] / [i915#533] / [i915#6768]) +1 similar issue
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-7/igt@kms_universal_plane@universal-plane-pipe-d-functional.html

  * igt@kms_vrr@flip-suspend:
    - shard-tglu:         NOTRUN -> [SKIP][97] ([i915#3555] / [i915#4579])
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-9/igt@kms_vrr@flip-suspend.html

  * igt@kms_writeback@writeback-invalid-parameters:
    - shard-glk:          NOTRUN -> [SKIP][98] ([fdo#109271] / [i915#2437])
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk6/igt@kms_writeback@writeback-invalid-parameters.html

  * igt@prime_vgem@coherency-gtt:
    - shard-tglu:         NOTRUN -> [SKIP][99] ([fdo#109295] / [fdo#111656])
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-9/igt@prime_vgem@coherency-gtt.html

  * igt@prime_vgem@fence-read-hang:
    - shard-rkl:          NOTRUN -> [SKIP][100] ([fdo#109295] / [i915#3708])
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@prime_vgem@fence-read-hang.html

  * igt@prime_vgem@fence-write-hang:
    - shard-tglu:         NOTRUN -> [SKIP][101] ([fdo#109295])
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-3/igt@prime_vgem@fence-write-hang.html

  * igt@v3d/v3d_perfmon@create-perfmon-exceed:
    - shard-rkl:          NOTRUN -> [SKIP][102] ([fdo#109315]) +3 similar issues
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-4/igt@v3d/v3d_perfmon@create-perfmon-exceed.html

  * igt@v3d/v3d_perfmon@get-values-invalid-pointer:
    - shard-tglu:         NOTRUN -> [SKIP][103] ([fdo#109315] / [i915#2575]) +4 similar issues
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-8/igt@v3d/v3d_perfmon@get-values-invalid-pointer.html

  * igt@vc4/vc4_perfmon@destroy-invalid-perfmon:
    - shard-tglu:         NOTRUN -> [SKIP][104] ([i915#2575]) +3 similar issues
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-4/igt@vc4/vc4_perfmon@destroy-invalid-perfmon.html

  * igt@vc4/vc4_tiling@get-bad-handle:
    - shard-rkl:          NOTRUN -> [SKIP][105] ([i915#7711]) +3 similar issues
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-2/igt@vc4/vc4_tiling@get-bad-handle.html

  
#### Possible fixes ####

  * igt@gem_ctx_persistence@smoketest:
    - shard-tglu:         [FAIL][106] ([i915#5099]) -> [PASS][107]
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-tglu-4/igt@gem_ctx_persistence@smoketest.html
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-3/igt@gem_ctx_persistence@smoketest.html

  * igt@gem_eio@hibernate:
    - {shard-dg1}:        [ABORT][108] ([i915#4391] / [i915#7975] / [i915#8213]) -> [PASS][109]
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg1-14/igt@gem_eio@hibernate.html
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg1-13/igt@gem_eio@hibernate.html
    - {shard-dg2}:        [ABORT][110] -> [PASS][111]
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-3/igt@gem_eio@hibernate.html
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-11/igt@gem_eio@hibernate.html

  * igt@gem_eio@kms:
    - {shard-dg2}:        [FAIL][112] ([i915#5784]) -> [PASS][113]
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-10/igt@gem_eio@kms.html
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-10/igt@gem_eio@kms.html

  * igt@gem_exec_fair@basic-none-solo@rcs0:
    - shard-apl:          [FAIL][114] ([i915#2842]) -> [PASS][115]
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-apl2/igt@gem_exec_fair@basic-none-solo@rcs0.html
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-apl6/igt@gem_exec_fair@basic-none-solo@rcs0.html

  * igt@gem_exec_fair@basic-pace-solo@rcs0:
    - shard-rkl:          [FAIL][116] ([i915#2842]) -> [PASS][117]
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-2/igt@gem_exec_fair@basic-pace-solo@rcs0.html
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/igt@gem_exec_fair@basic-pace-solo@rcs0.html

  * igt@gem_ppgtt@blt-vs-render-ctx0:
    - shard-snb:          [DMESG-FAIL][118] ([i915#8295]) -> [PASS][119]
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-snb1/igt@gem_ppgtt@blt-vs-render-ctx0.html
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-snb1/igt@gem_ppgtt@blt-vs-render-ctx0.html

  * igt@gem_workarounds@suspend-resume-fd:
    - shard-tglu:         [ABORT][120] ([i915#5122] / [i915#5251]) -> [PASS][121]
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-tglu-8/igt@gem_workarounds@suspend-resume-fd.html
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-10/igt@gem_workarounds@suspend-resume-fd.html

  * igt@i915_module_load@reload-with-fault-injection:
    - {shard-dg2}:        [DMESG-WARN][122] ([i915#7061]) -> [PASS][123]
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-11/igt@i915_module_load@reload-with-fault-injection.html
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-7/igt@i915_module_load@reload-with-fault-injection.html

  * igt@i915_pm_dc@dc6-dpms:
    - shard-tglu:         [FAIL][124] ([i915#3989] / [i915#454]) -> [PASS][125]
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-tglu-8/igt@i915_pm_dc@dc6-dpms.html
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-10/igt@i915_pm_dc@dc6-dpms.html

  * igt@i915_pm_rc6_residency@rc6-idle@vecs0:
    - {shard-dg1}:        [FAIL][126] ([i915#3591]) -> [PASS][127]
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg1-13/igt@i915_pm_rc6_residency@rc6-idle@vecs0.html
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg1-15/igt@i915_pm_rc6_residency@rc6-idle@vecs0.html

  * igt@i915_pm_rpm@dpms-mode-unset-non-lpsp:
    - {shard-dg2}:        [SKIP][128] ([i915#1397]) -> [PASS][129]
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-10/igt@i915_pm_rpm@dpms-mode-unset-non-lpsp.html
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-5/igt@i915_pm_rpm@dpms-mode-unset-non-lpsp.html

  * igt@i915_pm_rpm@modeset-lpsp-stress:
    - {shard-dg1}:        [SKIP][130] ([i915#1397]) -> [PASS][131]
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg1-16/igt@i915_pm_rpm@modeset-lpsp-stress.html
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg1-19/igt@i915_pm_rpm@modeset-lpsp-stress.html

  * igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size:
    - shard-glk:          [FAIL][132] ([i915#2346]) -> [PASS][133]
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-glk1/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk6/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions-varying-size.html

  * igt@kms_cursor_legacy@single-move@pipe-b:
    - {shard-dg2}:        [INCOMPLETE][134] ([i915#8011]) -> [PASS][135]
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-10/igt@kms_cursor_legacy@single-move@pipe-b.html
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-7/igt@kms_cursor_legacy@single-move@pipe-b.html

  * igt@kms_fbcon_fbt@fbc-suspend:
    - shard-rkl:          [FAIL][136] ([fdo#103375]) -> [PASS][137]
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-6/igt@kms_fbcon_fbt@fbc-suspend.html
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-2/igt@kms_fbcon_fbt@fbc-suspend.html

  * igt@kms_vblank@pipe-b-ts-continuation-dpms-suspend:
    - {shard-dg2}:        [FAIL][138] ([fdo#103375]) -> [PASS][139] +3 similar issues
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-5/igt@kms_vblank@pipe-b-ts-continuation-dpms-suspend.html
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-1/igt@kms_vblank@pipe-b-ts-continuation-dpms-suspend.html

  * igt@perf@non-zero-reason@0-rcs0:
    - {shard-dg2}:        [FAIL][140] ([i915#7757]) -> [PASS][141]
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-dg2-11/igt@perf@non-zero-reason@0-rcs0.html
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-dg2-7/igt@perf@non-zero-reason@0-rcs0.html

  * igt@perf@stress-open-close@0-rcs0:
    - shard-glk:          [ABORT][142] ([i915#5213] / [i915#7941]) -> [PASS][143]
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-glk7/igt@perf@stress-open-close@0-rcs0.html
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-glk2/igt@perf@stress-open-close@0-rcs0.html

  
#### Warnings ####

  * igt@i915_pm_rc6_residency@rc6-idle@vecs0:
    - shard-tglu:         [FAIL][144] ([i915#2681] / [i915#3591]) -> [WARN][145] ([i915#2681])
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-tglu-9/igt@i915_pm_rc6_residency@rc6-idle@vecs0.html
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-tglu-6/igt@i915_pm_rc6_residency@rc6-idle@vecs0.html

  * igt@kms_fbcon_fbt@psr-suspend:
    - shard-rkl:          [SKIP][146] ([fdo#110189] / [i915#3955]) -> [SKIP][147] ([i915#3955])
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-2/igt@kms_fbcon_fbt@psr-suspend.html
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_fbcon_fbt@psr-suspend.html

  * igt@kms_force_connector_basic@force-load-detect:
    - shard-rkl:          [SKIP][148] ([fdo#109285] / [i915#4098]) -> [SKIP][149] ([fdo#109285])
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-4/igt@kms_force_connector_basic@force-load-detect.html
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-6/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
    - shard-rkl:          [SKIP][150] ([i915#4816]) -> [SKIP][151] ([i915#4070] / [i915#4816])
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13317/shard-rkl-4/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/shard-rkl-1/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).

  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
  [fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
  [fdo#109300]: https://bugs.freedesktop.org/show_bug.cgi?id=109300
  [fdo#109312]: https://bugs.freedesktop.org/show_bug.cgi?id=109312
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#109506]: https://bugs.freedesktop.org/show_bug.cgi?id=109506
  [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
  [fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
  [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
  [fdo#111656]: https://bugs.freedesktop.org/show_bug.cgi?id=111656
  [fdo#111767]: https://bugs.freedesktop.org/show_bug.cgi?id=111767
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#1257]: https://gitlab.freedesktop.org/drm/intel/issues/1257
  [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
  [i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
  [i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
  [i915#1937]: https://gitlab.freedesktop.org/drm/intel/issues/1937
  [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
  [i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
  [i915#2521]: https://gitlab.freedesktop.org/drm/intel/issues/2521
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
  [i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
  [i915#2681]: https://gitlab.freedesktop.org/drm/intel/issues/2681
  [i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
  [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
  [i915#2846]: https://gitlab.freedesktop.org/drm/intel/issues/2846
  [i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
  [i915#3023]: https://gitlab.freedesktop.org/drm/intel/issues/3023
  [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
  [i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
  [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3591]: https://gitlab.freedesktop.org/drm/intel/issues/3591
  [i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
  [i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
  [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
  [i915#3743]: https://gitlab.freedesktop.org/drm/intel/issues/3743
  [i915#3840]: https://gitlab.freedesktop.org/drm/intel/issues/3840
  [i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955
  [i915#3989]: https://gitlab.freedesktop.org/drm/intel/issues/3989
  [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
  [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
  [i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
  [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
  [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4349]: https://gitlab.freedesktop.org/drm/intel/issues/4349
  [i915#4391]: https://gitlab.freedesktop.org/drm/intel/issues/4391
  [i915#4423]: https://gitlab.freedesktop.org/drm/intel/issues/4423
  [i915#4525]: https://gitlab.freedesktop.org/drm/intel/issues/4525
  [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
  [i915#454]: https://gitlab.freedesktop.org/drm/intel/issues/454
  [i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4816]: https://gitlab.freedesktop.org/drm/intel/issues/4816
  [i915#5099]: https://gitlab.freedesktop.org/drm/intel/issues/5099
  [i915#5122]: https://gitlab.freedesktop.org/drm/intel/issues/5122
  [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
  [i915#5213]: https://gitlab.freedesktop.org/drm/intel/issues/5213
  [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
  [i915#5251]: https://gitlab.freedesktop.org/drm/intel/issues/5251
  [i915#5274]: https://gitlab.freedesktop.org/drm/intel/issues/5274
  [i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
  [i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
  [i915#5325]: https://gitlab.freedesktop.org/drm/intel/issues/5325
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
  [i915#5493]: https://gitlab.freedesktop.org/drm/intel/issues/5493
  [i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
  [i915#5892]: https://gitlab.freedesktop.org/drm/intel/issues/5892
  [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
  [i915#6121]: https://gitlab.freedesktop.org/drm/intel/issues/6121
  [i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268
  [i915#6335]: https://gitlab.freedesktop.org/drm/intel/issues/6335
  [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
  [i915#6590]: https://gitlab.freedesktop.org/drm/intel/issues/6590
  [i915#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
  [i915#6880]: https://gitlab.freedesktop.org/drm/intel/issues/6880
  [i915#6944]: https://gitlab.freedesktop.org/drm/intel/issues/6944
  [i915#6953]: https://gitlab.freedesktop.org/drm/intel/issues/6953
  [i915#7052]: https://gitlab.freedesktop.org/drm/intel/issues/7052
  [i915#7061]: https://gitlab.freedesktop.org/drm/intel/issues/7061
  [i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
  [i915#7118]: https://gitlab.freedesktop.org/drm/intel/issues/7118
  [i915#7461]: https://gitlab.freedesktop.org/drm/intel/issues/7461
  [i915#7679]: https://gitlab.freedesktop.org/drm/intel/issues/7679
  [i915#7701]: https://gitlab.freedesktop.org/drm/intel/issues/7701
  [i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
  [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742
  [i915#7757]: https://gitlab.freedesktop.org/drm/intel/issues/7757
  [i915#7790]: https://gitlab.freedesktop.org/drm/intel/issues/7790
  [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
  [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
  [i915#7941]: https://gitlab.freedesktop.org/drm/intel/issues/7941
  [i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975
  [i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
  [i915#8211]: https://gitlab.freedesktop.org/drm/intel/issues/8211
  [i915#8213]: https://gitlab.freedesktop.org/drm/intel/issues/8213
  [i915#8228]: https://gitlab.freedesktop.org/drm/intel/issues/8228
  [i915#8234]: https://gitlab.freedesktop.org/drm/intel/issues/8234
  [i915#8247]: https://gitlab.freedesktop.org/drm/intel/issues/8247
  [i915#8292]: https://gitlab.freedesktop.org/drm/intel/issues/8292
  [i915#8295]: https://gitlab.freedesktop.org/drm/intel/issues/8295
  [i915#8304]: https://gitlab.freedesktop.org/drm/intel/issues/8304
  [i915#8347]: https://gitlab.freedesktop.org/drm/intel/issues/8347
  [i915#8411]: https://gitlab.freedesktop.org/drm/intel/issues/8411
  [i915#8623]: https://gitlab.freedesktop.org/drm/intel/issues/8623
  [i915#8661]: https://gitlab.freedesktop.org/drm/intel/issues/8661
  [i915#8682]: https://gitlab.freedesktop.org/drm/intel/issues/8682
  [i915#8708]: https://gitlab.freedesktop.org/drm/intel/issues/8708
  [i915#8709]: https://gitlab.freedesktop.org/drm/intel/issues/8709


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

  * CI: CI-20190529 -> None
  * IGT: IGT_7347 -> IGTPW_9249
  * Piglit: piglit_4509 -> None

  CI-20190529: 20190529
  CI_DRM_13317: e77d4da4d2bd8d0accd04f83c0008b206f522bc7 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_9249: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9249/index.html
  IGT_7347: 621c2d3115d40a1ba0b53668413ea21edf03a5ff @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

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

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

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

* Re: [igt-dev] [PATCH i-g-t 1/3] lib/drmtest: Add VKMS as a known driver type
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 1/3] lib/drmtest: Add VKMS as a known driver type James Shargo
@ 2023-06-28 18:50   ` Kamil Konieczny
  0 siblings, 0 replies; 10+ messages in thread
From: Kamil Konieczny @ 2023-06-28 18:50 UTC (permalink / raw)
  To: IGT GPU Tools

Hi James,

On 2023-06-23 at 19:09:52 -0400, James Shargo wrote:
> From: Jim Shargo <jshargo@chromium.org>

Please write here description what do you added to lib.
Use checkpatch.pl perl script from Linux kernel to spot
some problems with patches.

> 
> Signed-off-by: Jim Shargo <jshargo@chromium.org>
> ---
>  lib/drmtest.c | 26 ++++++++++++++++++++++++++
>  lib/drmtest.h |  7 ++++++-
>  2 files changed, 32 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 220cfb64d..ad8cbe302 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -150,6 +150,16 @@ bool is_intel_device(int fd)
>  	return is_i915_device(fd) || is_xe_device(fd);
>  }
>  

Document each new public function.

> +bool is_vkms_device(int fd)

Why not make it as other functions? Use __is_device()

> +{
> +	char name[64] = "";
> +
> +	if (__get_drm_device_name(fd, name, sizeof(name) - 1))
> +		return false;
> +
> +	return strncmp("vkms", name, strlen("vkms")) == 0;
> +}
> +
>  static char _forced_driver[16] = "";
>  
>  /**
> @@ -734,3 +744,19 @@ void igt_require_xe(int fd)
>  {
>  	igt_require(is_xe_device(fd));
>  }
> +

Same here, write documentation.

> +void igt_require_vkms(void)
> +{
> +	// Since VKMS can create and destroy virtual drivers at will,
> +	// instead look to make sure the driver is installed.
---------- ^ ----- ^ -- ^^
s/instead look to //
imho here you should use C-style comment.

> +	struct stat s = {};
> +	int ret;
> +	char *vkms_module_dir = "/sys/module/vkms";
------- ^
const
btw maybe this should be first param.

> +
> +	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);
> +}

You should also add this into modules[] struct in libdrm.c

> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index ae86ee19a..1d418e1f6 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -53,14 +53,17 @@
>  #define DRIVER_MSM	(1 << 6)
>  #define DRIVER_XE	(1 << 7)
>  #define DRIVER_VMWGFX   (1 << 8)
> +#define DRIVER_VKMS	(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.
> @@ -114,6 +117,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);

Keep it sorted aplhabetically.

>  
>  bool is_amdgpu_device(int fd);
>  bool is_i915_device(int fd);
> @@ -123,6 +127,7 @@ bool is_nouveau_device(int fd);
>  bool is_vc4_device(int fd);
>  bool is_xe_device(int fd);
>  bool is_intel_device(int fd);
> +bool is_vkms_device(int fd);

Move it after is_vc4_device.

Regards,
Kamil

>  
>  /**
>   * do_or_die:
> -- 
> 2.41.0.162.gfafddb0af9-goog
> 

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

* Re: [igt-dev] [PATCH i-g-t 2/3] lib/igt_aux: Make "is_mountpoint" public ("igt_is_mountpoint")
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 2/3] lib/igt_aux: Make "is_mountpoint" public ("igt_is_mountpoint") James Shargo
@ 2023-06-28 18:57   ` Kamil Konieczny
  0 siblings, 0 replies; 10+ messages in thread
From: Kamil Konieczny @ 2023-06-28 18:57 UTC (permalink / raw)
  To: IGT GPU Tools

Hi James,

On 2023-06-23 at 19:09:53 -0400, James Shargo wrote:
> From: Jim Shargo <jshargo@chromium.org>
> 
> This change supports the subsequent testing of ConfigFS-based VKMS
> features, which require their own mounting.
> 
> Signed-off-by: Jim Shargo <jshargo@chromium.org>
> ---
>  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 386e25783..4ec5fc154 100644
> --- a/lib/igt_aux.c
> +++ b/lib/igt_aux.c
> @@ -1970,6 +1970,31 @@ bool igt_allow_unlimited_files(void)
>  	return setrlimit(RLIMIT_NOFILE, &rlim) == 0;
>  }
>  

Add documentation.

Regards,
Kamil

> +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;
> +}
> +
>  /**
>   * vfs_file_max: report maximum number of files
>   *
> diff --git a/lib/igt_aux.h b/lib/igt_aux.h
> index fb76b0313..298c610f2 100644
> --- a/lib/igt_aux.h
> +++ b/lib/igt_aux.h
> @@ -311,6 +311,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 a7b54bae5..63fc6b9e7 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.41.0.162.gfafddb0af9-goog
> 

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

* Re: [igt-dev] [PATCH i-g-t 3/3] tests/vkms: Adds VKMS tests and library functions to support them
  2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 3/3] tests/vkms: Adds VKMS tests and library functions to support them James Shargo
@ 2023-06-28 19:27   ` Kamil Konieczny
  0 siblings, 0 replies; 10+ messages in thread
From: Kamil Konieczny @ 2023-06-28 19:27 UTC (permalink / raw)
  To: Development mailing list for IGT GPU Tools

Hi James,

On 2023-06-23 at 19:09:54 -0400, James Shargo wrote:
> From: Jim Shargo <jshargo@chromium.org>
> 
> The library functions include useful tools for creating configfs-backed
> devices.
> 
> The tests exercise some basic functionality of new ConfigFS
> functionality, both positive and negative cases.

I will review lib changes but please find someone for review
from chromium or vkms dev.

> 
> Signed-off-by: Jim Shargo <jshargo@chromium.org>
> ---
>  lib/igt.h                  |   2 +
>  lib/igt_configfs.c         | 105 +++++++++++
>  lib/igt_configfs.h         |  35 ++++
>  lib/igt_vkms.c             | 362 +++++++++++++++++++++++++++++++++++++
>  lib/igt_vkms.h             |  58 ++++++
>  lib/meson.build            |   2 +
>  tests/meson.build          |  13 ++
>  tests/vkms/vkms_configfs.c | 189 +++++++++++++++++++
>  8 files changed, 766 insertions(+)
>  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/vkms_configfs.c
> 
> diff --git a/lib/igt.h b/lib/igt.h
> index 73b6f7727..4c5d16715 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_core.h"
>  #include "igt_debugfs.h"
> @@ -41,6 +42,7 @@
>  #include "igt_pm.h"
>  #include "igt_stats.h"
>  #include "igt_dsc.h"
> +#include "igt_vkms.h"
>  #ifdef HAVE_CHAMELIUM
>  #include "igt_alsa.h"
>  #include "igt_audio.h"
> diff --git a/lib/igt_configfs.c b/lib/igt_configfs.c
> new file mode 100644
> index 000000000..874948482
> --- /dev/null
> +++ b/lib/igt_configfs.c
> @@ -0,0 +1,105 @@
> +/*
> + * Copyright 2023 Google LLC.
> + *

Use SPDX licence instead, look at other lib files which uses
them. Also use checkpatch.pl

> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#include "igt_configfs.h"

Move this include after igt_aux.h

> +
> +#include <fcntl.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/mount.h>
> +
> +#include "igt_aux.h"
> +
> +/**
> + * SECTION:igt_configfs
> + * @short_description: Support code for configfs features
> + * @title: configfs
> + * @include: igt.h
> + *
> + * Helper methods for managing configfs.
> + */
> +
> +static const char *__igt_configfs_mount(void)
> +{
> +	if (igt_is_mountpoint("/sys/kernel/config"))
> +		return "/sys/kernel/config";
---------------------- ^
You repeat this string here, why not make it const static ?

> +
> +	if (igt_is_mountpoint("/config"))
------------------------------ ^
> +		return "/config";
---------------------- ^
Same here.

> +
> +	if (mount("config", "/sys/kernel/config", "configfs", 0, 0))
> +		return NULL;
--------------- ^
Maybe print some debugs here.

> +
> +	return "/sys/kernel/config";
> +}
> +
> +/**
> + * igt_configfs_mount:
> + *
> + * This searches for configfs in typical locations and will try to mount at
> + * /sys/kernel/config if it can't be found.
> + *
> + * Returns:
> + * The path to the configfs mount point (e.g. /sys/kernel/debug)

or NULL if failed

> + */
> +const char *igt_configfs_mount(void)
> +{
> +	static const char *path;
> +
> +	if (!path)
> +		path = __igt_configfs_mount();
> +
> +	return path;
> +}
> +

Add description.

> +const char *igt_configfs_vkms_mount(void)
> +{
> +	static char vkms_path[CONFIGFS_VKMS_DIR_SIZE] = { 0 };
> +	const char *path = igt_configfs_mount();
> +
> +	if (!path)
> +		return NULL;
> +
> +	if (strcmp(vkms_path, "") == 0) {
> +		strncpy(vkms_path, path, CONFIGFS_VKMS_DIR_SIZE - 1);
> +		strncat(vkms_path, "/vkms", CONFIGFS_VKMS_DIR_SIZE - 1);
> +	}
> +	return vkms_path;
> +}
> +
> +/**
> + * igt_configfs_dir: Open and return the fd of configfs, or -1 on failure.
----------------------------------------------------------- ^^^^^^^^^^^^^^^^

> + *
> + * Returns:

Incomplete descripton.

> + */
> +int igt_configfs_dir(void)
> +{
> +	const char *path = igt_configfs_mount();
> +
> +	if (!path)
> +		return -1;
> +
> +	igt_debug("Opening configfs directory '%s'\n", path);

Add newline.

> +	return open(path, O_RDWR);
> +}
> diff --git a/lib/igt_configfs.h b/lib/igt_configfs.h
> new file mode 100644
> index 000000000..0f1fd5faa
> --- /dev/null
> +++ b/lib/igt_configfs.h
> @@ -0,0 +1,35 @@
> +/*
> + * Copyright 2023 Google LLC.
> + *

Use SPDX. Note that .c and .h files have them a little different.

> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#ifndef __IGT_CONFIGFS_H__
> +#define __IGT_CONFIGFS_H__
> +
> +#define CONFIGFS_VKMS_DIR_SIZE 64
--------------------------------- ^^
Is it enough?

> +
> +const char *igt_configfs_mount(void);
> +const char *igt_configfs_vkms_mount(void);
> +
> +int igt_configfs_dir(void);
> +
> +#endif /* __IGT_CONFIGFS_H__ */
> diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> new file mode 100644
> index 000000000..552c637cf
> --- /dev/null
> +++ b/lib/igt_vkms.c
> @@ -0,0 +1,362 @@
> +/*
> + * Copyright 2023 Google LLC.
> + *

Use SPDX.

> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#include "igt_vkms.h"
----------- ^^
Move it after system includes, after itg_core.h

> +
> +#include <dirent.h>
> +#include <fcntl.h>
> +#include <ftw.h>
> +#include <libgen.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> +
> +#include "drmtest.h"
> +#include "igt_configfs.h"
> +#include "igt_core.h"
> +
> +static void __create_device_from_directory(igt_vkms_t *device, const char *name)
> +{
> +	const char *vkms_root = igt_configfs_vkms_mount();

Add newline.

> +	memset(device, 0, sizeof(*device));
> +
> +	strncpy(device->name, name, ARRAY_SIZE(device->name) - 1);
> +	snprintf(device->device_dir, ARRAY_SIZE(device->device_dir) - 1, "%s/%s",
> +		 vkms_root, name);
> +}
> +

Add documentation to each new library function, here and below.

> +void igt_vkms_destroy_all_devices(void)
> +{
> +	const char *vkms_root = igt_configfs_vkms_mount();
> +	igt_vkms_t device = { 0 };
> +	DIR *dir;
> +	struct dirent *ent;
> +	int ret = 0;
> +
> +	if (!vkms_root) {
> +		igt_warn("Unable to find VKMS configfs directory.\n");
> +		return;
> +	}
> +
> +	dir = opendir(vkms_root);
> +	if (!dir) {
> +		igt_warn(
> +			"Unable to open VKMS configfs directory '%s'. Got errno=%d (%s)\n",
> +			vkms_root, errno, strerror(errno));
> +		return;
> +	}
> +
> +	while ((ent = readdir(dir)) != NULL) {
> +		if (strcmp(ent->d_name, ".") == 0 ||
> +		    strcmp(ent->d_name, "..") == 0)
> +			continue;
> +
> +		__create_device_from_directory(&device, ent->d_name);
> +		igt_vkms_device_destroy(&device);
> +		if (ret)
------------------- ^^^
Where is it changing?

> +			igt_warn("Unable to reset device '%s/%s'\n", vkms_root,
> +				 ent->d_name);
> +	}
> +
> +	closedir(dir);
> +}
> +
> +void igt_vkms_device_create(igt_vkms_t *device, const char *name)
> +{
> +	const char *vkms_root = igt_configfs_vkms_mount();
> +	DIR *dir;
> +	int ret;
> +
> +	igt_assert_f(vkms_root, "Unable to find VKMS root '%s'.\n", name);
> +
> +	dir = opendir(vkms_root);
> +	igt_assert_f(
> +		dir,
> +		"VKMS configfs directory not available at '%s'. Got errno=%d (%s)\n",
> +		vkms_root, errno, strerror(errno));

imho little better:
	igt_assert_f(dir,
		     "VKMS configfs directory not available at '%s'. Got errno=%d (%s)\n",
		     vkms_root, errno, strerror(errno));

> +	if (dir)
> +		closedir(dir);
> +
> +	igt_assert_f(strlen(name) > (ARRAY_SIZE(device->name) - 1),
> +		     "Name '%s' is too long for a VKMS device.\n", name);
> +	igt_assert_f(strlen(vkms_root) + strlen(name) >
> +			     (ARRAY_SIZE(device->device_dir) - 1),
> +		     "Desired path is too long when creating '%s/vkms/%s'.\n",
> +		     vkms_root, name);
> +
> +	memset(device, 0, sizeof(*device));
> +	strncpy(device->name, name, ARRAY_SIZE(device->name) - 1);
> +	snprintf(device->device_dir, ARRAY_SIZE(device->device_dir), "%s/%s", vkms_root,
> +		 name);
> +
> +	igt_debug("mkdir'ing VKMS device at '%s'\n", device->device_dir);
------------------ ^
Creating

> +
> +	ret = mkdir(device->device_dir, 0777);
> +	igt_assert_f(ret != 0,
> +		     "Unable to mkdir device directory '%s'. Got errno=%d (%s)\n",
------------------------------- ^
create

> +		     device->device_dir, errno, strerror(errno));
> +	memset(device, 0, sizeof(*device));
> +}
> +
> +static int __igt_vkms_unlink_symlinks(const char *fpath, const struct stat *sb,
> +				      int typeflag, struct FTW *ftwbuf)
> +{
> +	if (typeflag != FTW_SL)
> +		return 0;
> +
> +	if (unlink(fpath)) {
> +		igt_warn(
> +			"Unable to unlink vkms object: '%s'. Got errno=%d (%s)\n",
> +			fpath, errno, strerror(errno));

imho better:
		igt_warn("Unable to unlink vkms object: '%s'. Got errno=%d (%s)\n",
			 fpath, errno, strerror(errno));

> +		return -1;
> +	}
> +	return 0;
> +}
> +
> +static int __igt_vkms_delete_objects(const char *fpath, const struct stat *sb,
> +				     int typeflag, struct FTW *ftwbuf)
> +{
> +	char *dirbase, path_buf[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +
> +	strncpy(path_buf, fpath, VKMS_CARD_OBJECT_DIR_SIZE - 1);
> +	dirbase = basename(dirname(path_buf));
> +
> +	if (strcmp(dirbase, "planes") != 0 &&
> +	    strcmp(dirbase, "encoders") != 0 &&
> +	    strcmp(dirbase, "connectors") != 0 &&
> +	    strcmp(dirbase, "crtcs") != 0) {
> +		return 0;
> +	}
> +
> +	if (rmdir(fpath)) {
> +		igt_warn(
> +			"Unable to rmdir vkms object: '%s'. Got errno=%d (%s)\n",
> +			fpath, errno, strerror(errno));
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +void igt_vkms_device_destroy(igt_vkms_t *device)
> +{
> +	int ret = 0;
> +
> +	/*
> +	 * Some notes on device destruction:
> +	 *   - FTW_PHYS keeps us from following symlinks
> +	 *   - FTW_DEPTH does a DFS of the tree, which lets us delete bottom-up.
> +	 */
> +
> +	ret = nftw(device->device_dir, &__igt_vkms_unlink_symlinks,
> +		   /* nopenfd= */ 16, FTW_PHYS | FTW_DEPTH);
> +	igt_assert_f(ret != 0,
> +		     "Unable to remove symlinks for device directory '%s'\n",
> +		     device->device_dir);
> +
> +	ret = nftw(device->device_dir, &__igt_vkms_delete_objects,
> +		   /* nopenfd= */ 16, FTW_PHYS | FTW_DEPTH);
> +	igt_assert_f(ret != 0,
> +		     "Unable to remove objects for device directory '%s'\n",
> +		     device->device_dir);
> +
> +	ret = rmdir(device->device_dir);
> +	igt_assert_f(ret != 0,
> +		     "Unable to rmdir device directory '%s'. Got errno=%d (%s)\n",
> +		     device->device_dir, errno, strerror(errno));
> +
> +	memset(device, 0, sizeof(*device));
> +}
> +
> +void igt_vkms_device_add_plane(igt_vkms_t *device, const char *name, int type)
> +{
> +	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 }, writebuf[2] = { 0 };
> +	int fd, ret;
> +
> +	snprintf(path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/planes/%s",
> +		 device->device_dir, name);
> +
> +	ret = mkdir(path, 0777);
> +	igt_assert_f(ret != 0,
> +		     "Failed to mkdir VKMS plane '%s'. Got errno=%d (%s)\n",
> +		     path, errno, strerror(errno));
> +
> +	strcat(path, "/type");
> +	fd = open(path, O_WRONLY);
> +	igt_assert_f(
> +		fd > 0,
> +		"Failed to open plane type for writing '%s'. Got errno=%d (%s)\n",
> +		path, errno, strerror(errno));
> +
> +	snprintf(writebuf, 2, "%d", type);
> +	write(fd, writebuf, 1);
> +	close(fd);
> +}
> +
> +void igt_vkms_device_add_connector(igt_vkms_t *device, const char *name)
> +{
> +	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	int ret;
> +
> +	sprintf(path, "%s/connectors/%s", device->device_dir, name);
> +
> +	ret = mkdir(path, 0777);
> +	igt_assert_f(ret != 0,
> +		     "Failed to mkdir VKMS plane '%s'. Got errno=%d (%s)\n",
> +		     path, errno, strerror(errno));
> +}
> +
> +void igt_vkms_device_add_encoder(igt_vkms_t *device, const char *name)
> +{
> +	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	int ret;
> +
> +	sprintf(path, "%s/encoders/%s", device->device_dir, name);
> +
> +	ret = mkdir(path, 0777);
> +	igt_assert_f(ret != 0,
> +		     "Failed to mkdir VKMS encoder '%s'. Got errno=%d (%s)\n",
> +		     path, errno, strerror(errno));
> +}
> +
> +void igt_vkms_device_add_crtc(igt_vkms_t *device, const char *name)
> +{
> +	char path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	int ret;
> +
> +	sprintf(path, "%s/crtcs/%s", device->device_dir, name);
> +
> +	ret = mkdir(path, 0777);
> +	igt_assert_f(ret != 0,
> +		     "Failed to mkdir VKMS crtc '%s'. Got errno=%d (%s)\n",
> +		     path, errno, strerror(errno));
> +}
> +
> +void igt_vkms_device_permit_plane_crtc(igt_vkms_t *device, const char *plane_name,
> +				     const char *crtc_name)
> +{
> +	char plane_crtcs_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	char crtc_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	int ret;
> +
> +	snprintf(plane_crtcs_path, VKMS_CARD_OBJECT_DIR_SIZE - 1,
> +		 "%s/planes/%s/possible_crtcs/%s", device->device_dir, plane_name,
> +		 crtc_name);
> +	snprintf(crtc_path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/crtcs/%s",
> +		 device->device_dir, crtc_name);
> +
> +	ret = symlink(crtc_path, plane_crtcs_path);
> +	igt_assert_f(
> +		ret != 0,
> +		"Failed to symlink VKMS crtc '%s' to plane '%s'. Got errno=%d (%s)\n",
> +		crtc_name, plane_name, errno, strerror(errno));
> +}
> +
> +void igt_vkms_device_permit_encoder_crtc(igt_vkms_t *device,
> +				       const char *encoder_name,
> +				       const char *crtc_name)
> +{
> +	char encoder_crtcs_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	char crtc_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	int ret;
> +
> +	snprintf(encoder_crtcs_path, VKMS_CARD_OBJECT_DIR_SIZE - 1,
> +		 "%s/encoders/%s/possible_crtcs/%s", device->device_dir,
> +		 encoder_name, crtc_name);
> +	snprintf(crtc_path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/crtcs/%s",
> +		 device->device_dir, crtc_name);
> +
> +	ret = symlink(crtc_path, encoder_crtcs_path);
> +	igt_assert_f(
> +		ret != 0,
> +		"Failed to symlink VKMS crtc '%s' to encoder '%s'. Got errno=%d (%s)\n",
> +		crtc_name, encoder_name, errno, strerror(errno));
> +}
> +
> +void igt_vkms_device_permit_connector_encoder(igt_vkms_t *device,
> +					    const char *connector_name,
> +					    const char *encoder_name)
> +{
> +	char connector_encoders_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	char encoder_path[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	int ret;
> +
> +	snprintf(connector_encoders_path, VKMS_CARD_OBJECT_DIR_SIZE - 1,
> +		 "%s/connectors/%s/possible_encoders/%s", device->device_dir,
> +		 connector_name, encoder_name);
> +	snprintf(encoder_path, VKMS_CARD_OBJECT_DIR_SIZE - 1, "%s/encoders/%s",
> +		 device->device_dir, encoder_name);
> +
> +	ret = symlink(encoder_path, connector_encoders_path);
> +	igt_assert_f(
> +		ret != 0,
> +		"Failed to symlink VKMS encoder '%s' to connector '%s'. Got "
> +		"errno=%d (%s)\n",
> +		encoder_name, connector_name, errno, strerror(errno));
> +}
> +
> +void igt_vkms_enable(igt_vkms_t *device)
> +{
> +	char enabled_file[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 };
> +	int fd, ret;
> +
> +	snprintf(enabled_file, VKMS_CARD_OBJECT_DIR_SIZE - 1,
> +		 "%s/enabled", device->device_dir);
> +
> +	fd = open(enabled_file, O_WRONLY);
> +	igt_assert_f(fd > 0, "Unable to open '%s'\n",
> +		     enabled_file);
> +
> +	ret = write(fd, "1", 1);
> +	igt_assert_f(
> +		ret >= 0,
> +		"Unable to write '%s'. Got errno=%d (%s)\n",
> +		enabled_file, errno, strerror(errno));
> +
> +	ret = close(fd);
> +	igt_assert_eq(ret, 0);
> +}
> +
> +int igt_vkms_is_enabled(igt_vkms_t *device)
> +{
> +	char registration_file[VKMS_CARD_OBJECT_DIR_SIZE] = { 0 },
> +	     is_enabled[2] = { 0 };
> +	int fd, ret = 0;
> +
> +	snprintf(registration_file, VKMS_CARD_OBJECT_DIR_SIZE - 1,
> +		 "%s/enabled", device->device_dir);
> +
> +	fd = open(registration_file, O_RDONLY);
> +	igt_assert_f(fd > 0, "Unable to open '%s'\n",
> +		     registration_file);
> +
> +	ret = read(fd, is_enabled, ARRAY_SIZE(is_enabled));
> +	igt_assert_eq(0, close(fd));
> +	if (ret < 0) {
-------------------- ^
No need for braces for single instruction.

> +		return false;
> +	}
> +
> +	return strcmp("1", is_enabled) == 0;
> +}
> diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> new file mode 100644
> index 000000000..d0473a16a
> --- /dev/null
> +++ b/lib/igt_vkms.h
> @@ -0,0 +1,58 @@
> +/*
> + * Copyright 2023 Google LLC.
> + *

Use SPDX.

> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#ifndef __IGT_VKMS_H__
> +#define __IGT_VKMS_H__
> +
> +#define VKMS_CARD_DIR_SIZE 128
> +#define VKMS_CARD_OBJECT_DIR_SIZE (VKMS_CARD_DIR_SIZE + 128)
> +
> +void igt_vkms_destroy_all_devices(void);
> +
> +typedef struct igt_vkms {
> +	char name[64];
> +	char device_dir[VKMS_CARD_DIR_SIZE];
> +} igt_vkms_t;
> +
> +void igt_vkms_device_create(igt_vkms_t *device, const char *name);
> +void igt_vkms_device_destroy(igt_vkms_t *device);
> +
> +void igt_vkms_device_add_plane(igt_vkms_t *device, const char *name, int type);
> +void igt_vkms_device_add_connector(igt_vkms_t *device, const char *name);
> +void igt_vkms_device_add_encoder(igt_vkms_t *device, const char *name);
> +void igt_vkms_device_add_crtc(igt_vkms_t *device, const char *name);
> +
> +void igt_vkms_device_permit_plane_crtc(igt_vkms_t *device, const char *plane_name,
> +				     const char *crtc_name);
> +void igt_vkms_device_permit_encoder_crtc(igt_vkms_t *device,
> +				       const char *encoder_name,
> +				       const char *crtc_name);
> +void igt_vkms_device_permit_connector_encoder(igt_vkms_t *device,
> +					    const char *connector_name,
> +					    const char *encoder_name);
> +
> +void igt_vkms_enable(igt_vkms_t *device);
> +int igt_vkms_is_enabled(igt_vkms_t *device);
> +
> +#endif /* __IGT_VKMS_H__ */
> diff --git a/lib/meson.build b/lib/meson.build
> index 8e9977083..c6bd908ca 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_crc.c',
>  	'igt_debugfs.c',
>  	'igt_device.c',
> @@ -47,6 +48,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/tests/meson.build b/tests/meson.build
> index 61dcc0769..7c2b59df9 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -285,6 +285,10 @@ chamelium_progs = [
>  	'kms_chamelium_hpd',
>  ]
>  
> +vkms_progs = [
> +  'vkms_configfs',
> +]
> +
>  test_deps = [ igt_deps ]
>  
>  if libdrm_nouveau.found()
> @@ -355,6 +359,15 @@ if chamelium.found()
>  	test_deps += chamelium
>  endif
>  
> +foreach prog : vkms_progs
> +	test_executables += executable(prog, join_paths('vkms', prog + '.c'),
> +				       dependencies : test_deps,
> +				       install_dir : libexecdir,
> +				       install_rpath : libexecdir_rpathdir,
> +				       install : true)
> +	test_list += prog
> +endforeach
> +
>  test_executables += executable('drm_fdinfo',
>  	   join_paths('i915', 'drm_fdinfo.c'),
>  	   dependencies : test_deps + [ lib_igt_drm_fdinfo ],
> diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> new file mode 100644
> index 000000000..39af6dd07
> --- /dev/null
> +++ b/tests/vkms/vkms_configfs.c
> @@ -0,0 +1,189 @@
> +/*
> + * Copyright 2023 Google LLC.
> + *

Add SPDX.

> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +#include <string.h>
> +#include <xf86drmMode.h>
> +
> +#include "drmtest.h"
> +#include "igt.h"
> +#include "igt_configfs.h"
> +#include "igt_core.h"
> +#include "igt_vkms.h"
> +
> +IGT_TEST_DESCRIPTION("Basic tests for VKMS, including configfs support");
> +
> +static void vkms_crtc_no_primary_test(igt_vkms_t *device)
> +{
> +	igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
> +	igt_vkms_device_add_crtc(device, "crtc");
> +	igt_vkms_device_add_encoder(device, "encoder");
> +	igt_vkms_device_add_connector(device, "connector");
> +
> +	igt_vkms_device_permit_plane_crtc(device, "primary", "crtc");
> +	igt_vkms_device_permit_connector_encoder(device, "connector", "encoder");
> +	igt_vkms_device_permit_encoder_crtc(device, "encoder", "crtc");
> +
> +	igt_vkms_enable(device);
> +	igt_assert(!igt_vkms_is_enabled(device));
> +}
> +
> +static void vkms_basic_test(igt_vkms_t *device)
> +{
> +	igt_warn("Path: %s\n", device->device_dir);
> +
> +	igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
> +	igt_vkms_device_add_crtc(device, "crtc");
> +	igt_vkms_device_add_encoder(device, "encoder");
> +	igt_vkms_device_add_connector(device, "connector");
> +
> +	igt_vkms_device_permit_plane_crtc(device, "primary", "crtc");
> +	igt_vkms_device_permit_connector_encoder(device, "connector", "encoder");
> +	igt_vkms_device_permit_encoder_crtc(device, "encoder", "crtc");
> +
> +	igt_vkms_enable(device);
> +	igt_assert(igt_vkms_is_enabled(device));
> +}
> +
> +static void vkms_multiple_overlays_test(igt_vkms_t *device)
> +{
> +	igt_vkms_device_add_plane(device, "primary", DRM_PLANE_TYPE_PRIMARY);
> +	igt_vkms_device_add_plane(device, "cursor", DRM_PLANE_TYPE_CURSOR);
> +	igt_vkms_device_add_plane(device, "overlay0", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_plane(device, "overlay1", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_plane(device, "overlay2", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_plane(device, "overlay3", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_crtc(device, "crtc");
> +	igt_vkms_device_add_encoder(device, "encoder");
> +	igt_vkms_device_add_connector(device, "connector");
> +
> +	igt_vkms_device_permit_plane_crtc(device, "primary", "crtc");
> +	igt_vkms_device_permit_plane_crtc(device, "cursor", "crtc");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay0", "crtc");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay1", "crtc");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay2", "crtc");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay3", "crtc");
> +	igt_vkms_device_permit_connector_encoder(device, "connector", "encoder");
> +	igt_vkms_device_permit_encoder_crtc(device, "encoder", "crtc");
> +
> +	igt_vkms_enable(device);
> +	igt_assert(igt_vkms_is_enabled(device));
> +}
> +
> +static void vkms_multiple_displays_test(igt_vkms_t *device)
> +{
> +	igt_vkms_device_add_plane(device, "primary0", DRM_PLANE_TYPE_PRIMARY);
> +	igt_vkms_device_add_plane(device, "primary1", DRM_PLANE_TYPE_PRIMARY);
> +	igt_vkms_device_add_plane(device, "cursor0", DRM_PLANE_TYPE_CURSOR);
> +	igt_vkms_device_add_plane(device, "cursor1", DRM_PLANE_TYPE_CURSOR);
> +	igt_vkms_device_add_plane(device, "overlay0", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_plane(device, "overlay1", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_plane(device, "overlay2", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_plane(device, "overlay3", DRM_PLANE_TYPE_OVERLAY);
> +	igt_vkms_device_add_crtc(device, "crtc0");
> +	igt_vkms_device_add_crtc(device, "crtc1");
> +	igt_vkms_device_add_encoder(device, "encoder0");
> +	igt_vkms_device_add_encoder(device, "encoder1");
> +	igt_vkms_device_add_connector(device, "connector0");
> +	igt_vkms_device_add_connector(device, "connector1");
> +
> +	igt_vkms_device_permit_plane_crtc(device, "primary0", "crtc0");
> +	igt_vkms_device_permit_plane_crtc(device, "cursor0", "crtc0");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay0", "crtc0");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay1", "crtc0");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay2", "crtc0");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay3", "crtc0");
> +	igt_vkms_device_permit_connector_encoder(device, "connector0", "encoder0");
> +	igt_vkms_device_permit_encoder_crtc(device, "encoder0", "crtc0");
> +
> +	igt_vkms_device_permit_plane_crtc(device, "primary1", "crtc1");
> +	igt_vkms_device_permit_plane_crtc(device, "cursor1", "crtc1");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay0", "crtc1");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay1", "crtc1");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay2", "crtc1");
> +	igt_vkms_device_permit_plane_crtc(device, "overlay3", "crtc1");
> +	igt_vkms_device_permit_connector_encoder(device, "connector1", "encoder1");
> +	igt_vkms_device_permit_encoder_crtc(device, "encoder1", "crtc1");
> +
> +	igt_vkms_enable(device);
> +	igt_assert(igt_vkms_is_enabled(device));
> +}
> +
> +igt_main
> +{
> +	igt_vkms_t device = { 0 };
> +
> +	igt_require_vkms();
------- ^
Move this into fixture.

> +
> +	// By clearing out all existing devices, we don't end up with
> +	// confusing name collision errors.
> +	igt_fixture
> +	{
> +		igt_vkms_destroy_all_devices();
> +	}
> +
> +	igt_describe("Registering an empty device fails");
> +	igt_subtest("empty")
> +	{
> +		igt_vkms_device_create(&device, "empty-device");
> +		igt_vkms_enable(&device);
> +		igt_vkms_device_destroy(&device);
> +	}
> +
> +	igt_describe("Registering a CRTC with no primary fails");
> +	igt_subtest("no_primary")
> +	{
> +		igt_vkms_device_create(&device, "no-primary");
> +		vkms_crtc_no_primary_test(&device);
> +		igt_vkms_device_destroy(&device);
> +	}
> +
> +	igt_describe("Can create a minimal device.");
--------------------- ^^^
Use "Check that we can" or "Verify that we can"

> +	igt_subtest("basic_device")
> +	{
> +		igt_vkms_device_create(&device, "basic-device");
> +		vkms_basic_test(&device);
> +		igt_vkms_device_destroy(&device);
> +	}
> +
> +	igt_describe("Can create a device with multiple overlays");
--------------------- ^^^
Same here.

> +	igt_subtest("multiple_overlays_device")
> +	{
> +		igt_vkms_device_create(&device, "multiple-overlays-device");
> +		vkms_multiple_overlays_test(&device);
> +		igt_vkms_device_destroy(&device);
> +	}
> +
> +	igt_describe("Can create a device with multiple displays");
--------------------- ^^^
Same here.

Please look also at GitLab compilation errors.

Regards,
Kamil

> +	igt_subtest("multiple_displays_device")
> +	{
> +		igt_vkms_device_create(&device, "multiple-displays-device");
> +		vkms_multiple_displays_test(&device);
> +		igt_vkms_device_destroy(&device);
> +	}
> +
> +	igt_fixture
> +	{
> +		if (strcmp(device.name, "") != 0)
> +			igt_vkms_device_destroy(&device);
> +	}
> +}
> -- 
> 2.41.0.162.gfafddb0af9-goog
> 

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

end of thread, other threads:[~2023-06-28 19:27 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-23 23:09 [igt-dev] [PATCH i-g-t 0/3] Add tests and support for VKMS's new ConfigFS features James Shargo
2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 1/3] lib/drmtest: Add VKMS as a known driver type James Shargo
2023-06-28 18:50   ` Kamil Konieczny
2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 2/3] lib/igt_aux: Make "is_mountpoint" public ("igt_is_mountpoint") James Shargo
2023-06-28 18:57   ` Kamil Konieczny
2023-06-23 23:09 ` [igt-dev] [PATCH i-g-t 3/3] tests/vkms: Adds VKMS tests and library functions to support them James Shargo
2023-06-28 19:27   ` Kamil Konieczny
2023-06-24  0:49 ` [igt-dev] ✗ GitLab.Pipeline: warning for Add tests and support for VKMS's new ConfigFS features Patchwork
2023-06-24  1:23 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2023-06-24  3:36 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox