[i-g-t] tests/intel/xe_wedged: Add new test csc-wedged

Sk Anirban sk.anirban at intel.com
Tue Jul 8 09:23:03 UTC 2025


Inject a CSC error through uevent to cause the Xe device to enter a wedged
state. To return the device to a normal state, reload the driver, as
the wedged state can only be resolved by rebinding/reprobing the driver.

Signed-off-by: Sk Anirban <sk.anirban at intel.com>
---
 tests/intel/xe_wedged.c | 85 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/tests/intel/xe_wedged.c b/tests/intel/xe_wedged.c
index 7fc7ca9eb..b29e9bcb5 100644
--- a/tests/intel/xe_wedged.c
+++ b/tests/intel/xe_wedged.c
@@ -14,6 +14,7 @@
 
 #include <limits.h>
 #include <dirent.h>
+#include <libudev.h>
 
 #include "igt.h"
 #include "igt_device.h"
@@ -46,6 +47,46 @@ static void force_wedged(int fd)
 	sleep(1);
 }
 
+static void force_wedged_csc_error(int fd)
+{
+	igt_debugfs_write(fd, "inject_csc_hw_error/probability", "100");
+	igt_debugfs_write(fd, "inject_csc_hw_error/times", "1");
+
+	xe_force_gt_reset_sync(fd, 0);
+	sleep(1);
+}
+
+static char bus_addr[NAME_MAX];
+
+static int check_survivability_mode(int fd)
+{
+	struct pci_device *pci_dev;
+	char path[PATH_MAX];
+	int dirfd;
+
+	pci_dev = igt_device_get_pci_device(fd);
+	snprintf(bus_addr, sizeof(bus_addr), "%04x:%02x:%02x.%01x",
+		 pci_dev->domain, pci_dev->bus, pci_dev->dev, pci_dev->func);
+	snprintf(path, PATH_MAX, "/sys/bus/pci/devices/%s/survivability_mode", bus_addr);
+	dirfd = open(path, O_RDONLY);
+
+	return dirfd;
+}
+
+static void intercept_udev_events(struct udev_device *device)
+{
+	const char *dev_path = udev_device_get_property_value(device, "DEVPATH");
+	const char *wedged = udev_device_get_property_value(device, "WEDGED");
+
+	igt_assert_f(wedged && !strcmp(wedged, "vendor-specific"),
+		     "Expected WEDGED property to be 'vendor-specific', got '%s'",
+		     wedged);
+
+	igt_assert_f(dev_path && strstr(dev_path, bus_addr),
+		     "Expected bus address '%s' to be part of DEVPATH '%s'",
+		     bus_addr, dev_path);
+}
+
 static int simple_ioctl(int fd)
 {
 	int ret;
@@ -208,6 +249,11 @@ simple_hang(int fd, struct drm_xe_sync *sync)
  * SUBTEST: basic-wedged-read
  * Description: Read wedged_mode debugfs
  */
+/**
+ * SUBTEST: csc-wedged
+ * Description: Force Xe device wedged after injecting a failure in CSC
+ */
+
 igt_main
 {
 	struct drm_xe_engine_class_instance *hwe;
@@ -300,12 +346,51 @@ igt_main
 		igt_assert_f(str[0] != '\0', "Failed to read wedged_mode from debugfs!\n");
 	}
 
+	igt_subtest("csc-wedged") {
+		struct udev *udev = udev_new();
+		struct udev_monitor *monitor;
+		struct udev_device *device;
+
+		igt_require(igt_debugfs_exists(fd, "inject_csc_hw_error/probability",
+					       O_RDWR));
+
+		igt_assert_f(check_survivability_mode(fd) < 0,
+			     "survivability_mode sysfs available");
+
+		igt_debugfs_write(fd, "inject_csc_hw_error/verbose", "1");
+		igt_assert_eq(simple_ioctl(fd), 0);
+		ignore_wedged_in_dmesg();
+
+		monitor = udev_monitor_new_from_netlink(udev, "kernel");
+		udev_monitor_enable_receiving(monitor);
+
+		force_wedged_csc_error(fd);
+
+		device = udev_monitor_receive_device(monitor);
+		intercept_udev_events(device);
+
+		igt_assert_f(check_survivability_mode(fd) >= 0,
+			     "survivability_mode sysfs not available");
+
+		drm_close_driver(fd);
+		igt_kmod_rebind("xe", pci_slot);
+		fd = drm_open_driver(DRIVER_XE);
+		igt_assert_eq(simple_ioctl(fd), 0);
+		xe_for_each_engine(fd, hwe)
+			simple_exec(fd, hwe);
+	}
+
 	igt_fixture {
 		if (igt_debugfs_exists(fd, "fail_gt_reset/probability", O_RDWR)) {
 			igt_debugfs_write(fd, "fail_gt_reset/probability", "0");
 			igt_debugfs_write(fd, "fail_gt_reset/times", "1");
 		}
 
+		if (igt_debugfs_exists(fd, "inject_csc_hw_error/probability", O_RDWR)) {
+			igt_debugfs_write(fd, "inject_csc_hw_error/probability", "0");
+			igt_debugfs_write(fd, "inject_csc_hw_error/times", "1");
+		}
+
 		/* Tests might have failed, force a rebind before exiting */
 		drm_close_driver(fd);
 		igt_kmod_rebind("xe", pci_slot);
-- 
2.43.0



More information about the igt-dev mailing list