[PATCH v2] tests/intel/xe_configfs: Add i2c adapter check in survivability mode
Sk Anirban
sk.anirban at intel.com
Wed Aug 13 10:01:11 UTC 2025
Add i2c adapter presence check in survivability mode to ensure
the Add-In Management Controller (AMC) can receive firmware updates
when the device is in survivability mode.
v2: Create new file for test (Riana)
Signed-off-by: Sk Anirban <sk.anirban at intel.com>
---
tests/intel/xe_configfs.c | 36 +------
tests/intel/xe_survivability.c | 174 +++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 177 insertions(+), 34 deletions(-)
create mode 100644 tests/intel/xe_survivability.c
diff --git a/tests/intel/xe_configfs.c b/tests/intel/xe_configfs.c
index 5c65cd01d..e573421aa 100644
--- a/tests/intel/xe_configfs.c
+++ b/tests/intel/xe_configfs.c
@@ -2,7 +2,9 @@
/*
* Copyright © 2025 Intel Corporation
*/
+#include <dirent.h>
#include <limits.h>
+#include <fcntl.h>
#include "igt.h"
#include "igt_configfs.h"
@@ -31,33 +33,6 @@ static void restore(int sig)
igt_kmod_bind("xe", bus_addr);
}
-static void set_survivability_mode(int configfs_device_fd, bool value)
-{
- igt_kmod_unbind("xe", bus_addr);
- igt_sysfs_set_boolean(configfs_device_fd, "survivability_mode", value);
- igt_kmod_bind("xe", bus_addr);
-}
-
-/**
- * SUBTEST: survivability-mode
- * Description: Validate survivability mode by setting configfs
- */
-static void test_survivability_mode(int configfs_device_fd)
-{
- char path[PATH_MAX];
- int fd;
-
- /* Enable survivability mode */
- set_survivability_mode(configfs_device_fd, true);
-
- /* check presence of survivability mode sysfs */
- snprintf(path, PATH_MAX, "/sys/bus/pci/devices/%s/survivability_mode", bus_addr);
-
- fd = open(path, O_RDONLY);
- igt_assert_f(fd >= 0, "Survivability mode not set\n");
- close(fd);
-}
-
/**
* SUBTEST: engines-allowed-invalid
* Description: Validate engines_allowed attribute for invalid values
@@ -128,13 +103,6 @@ igt_main
configfs_device_fd = create_device_configfs_group(configfs_fd, fd);
}
- igt_describe("Validate survivability mode");
- igt_subtest("survivability-mode") {
- igt_require(IS_BATTLEMAGE(intel_get_drm_devid(fd)));
- igt_install_exit_handler(restore);
- test_survivability_mode(configfs_device_fd);
- }
-
igt_describe("Validate engines_allowed with invalid options");
igt_subtest("engines-allowed-invalid") {
igt_install_exit_handler(restore);
diff --git a/tests/intel/xe_survivability.c b/tests/intel/xe_survivability.c
new file mode 100644
index 000000000..1bfcb2756
--- /dev/null
+++ b/tests/intel/xe_survivability.c
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+#include <dirent.h>
+#include <limits.h>
+#include <fcntl.h>
+
+#include "igt.h"
+#include "igt_configfs.h"
+#include "igt_device.h"
+#include "igt_fs.h"
+#include "igt_kmod.h"
+#include "igt_sysfs.h"
+#include "xe/xe_query.h"
+
+/**
+ * TEST: Comprehensive survivability mode testing
+ * Category: Core
+ * Mega feature: General Core features
+ * Sub-category: survivability
+ * Functionality: survivability mode
+ * Description: validate survivability mode functionality including i2c and runtime behavior
+ * Test category: functionality test
+ */
+
+static char bus_addr[NAME_MAX];
+
+static int find_i2c_adapter(struct pci_device *pci_xe)
+{
+ char device_path[PATH_MAX];
+ struct dirent *dirent;
+ int i2c_adapter = -1;
+ DIR *device_dir;
+ int ret;
+
+ igt_require(igt_kmod_load("i2c-dev", NULL) == 0);
+
+ snprintf(device_path, sizeof(device_path), "/sys/bus/pci/devices/%s/%s.%hu", bus_addr,
+ "i2c_designware", (pci_xe->bus << 8) | (pci_xe->dev));
+ device_dir = opendir(device_path);
+
+ if (!device_dir)
+ return -1;
+
+ while ((dirent = readdir(device_dir))) {
+ if (strncmp(dirent->d_name, "i2c-", 4) == 0) {
+ ret = sscanf(dirent->d_name, "i2c-%d", &i2c_adapter);
+ igt_assert_f(ret == 1, "Failed to parse i2c adapter number");
+ closedir(device_dir);
+ return i2c_adapter;
+ }
+ }
+
+ closedir(device_dir);
+ return i2c_adapter;
+}
+
+static void restore(int sig)
+{
+ /* Restore after survivability mode */
+ igt_kmod_unbind("xe", bus_addr);
+ igt_kmod_bind("xe", bus_addr);
+}
+
+static void set_survivability_mode(int configfs_device_fd, bool value)
+{
+ igt_kmod_unbind("xe", bus_addr);
+ igt_sysfs_set_boolean(configfs_device_fd, "survivability_mode", value);
+ igt_kmod_bind("xe", bus_addr);
+}
+
+/**
+ * SUBTEST: i2c-functionality
+ * Description: Validate i2c adapter functionality in survivability mode
+ */
+static void test_i2c_functionality(int configfs_device_fd, struct pci_device *pci_xe)
+{
+ int i2c_adapter_before, i2c_adapter_after;
+ char path[PATH_MAX];
+ int fd;
+
+ /* Check i2c adapter before survivability mode */
+ i2c_adapter_before = find_i2c_adapter(pci_xe);
+
+ /* Enable survivability mode */
+ set_survivability_mode(configfs_device_fd, true);
+
+ /* check presence of survivability mode sysfs */
+ snprintf(path, PATH_MAX, "/sys/bus/pci/devices/%s/survivability_mode", bus_addr);
+
+ fd = open(path, O_RDONLY);
+ igt_assert_f(fd >= 0, "Survivability mode not set\n");
+ close(fd);
+
+ /* Check i2c adapter after survivability mode */
+ i2c_adapter_after = find_i2c_adapter(pci_xe);
+ if (i2c_adapter_before >= 0) {
+ igt_assert_f(i2c_adapter_after >= 0,
+ "i2c adapter disappeared in survivability mode (was %d)",
+ i2c_adapter_before);
+ }
+}
+
+/**
+ * SUBTEST: survivability-mode
+ * Description: Validate survivability mode by setting configfs
+ */
+static void test_survivability_mode(int configfs_device_fd)
+{
+ char path[PATH_MAX];
+ int fd;
+
+ /* Enable survivability mode */
+ set_survivability_mode(configfs_device_fd, true);
+
+ /* check presence of survivability mode sysfs */
+ snprintf(path, PATH_MAX, "/sys/bus/pci/devices/%s/survivability_mode", bus_addr);
+
+ fd = open(path, O_RDONLY);
+ igt_assert_f(fd >= 0, "Survivability mode not set\n");
+ close(fd);
+}
+
+static int create_device_configfs_group(int configfs_fd, int fd)
+{
+ int configfs_device_fd;
+ struct pci_device *pci_dev;
+ mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
+
+ 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);
+
+ configfs_device_fd = igt_fs_create_dir(configfs_fd, bus_addr, mode);
+ igt_assert(configfs_device_fd);
+
+ return configfs_device_fd;
+}
+
+igt_main
+{
+ int fd, configfs_fd, configfs_device_fd;
+ struct pci_device *pci_xe;
+
+ igt_fixture {
+ fd = drm_open_driver(DRIVER_XE);
+ pci_xe = igt_device_get_pci_device(fd);
+ configfs_fd = igt_configfs_open("xe");
+ igt_require(configfs_fd != -1);
+ configfs_device_fd = create_device_configfs_group(configfs_fd, fd);
+ igt_require(IS_BATTLEMAGE(intel_get_drm_devid(fd)));
+ }
+
+ igt_describe("Validate survivability mode");
+ igt_subtest("survivability-mode") {
+ igt_require(IS_BATTLEMAGE(intel_get_drm_devid(fd)));
+ igt_install_exit_handler(restore);
+ test_survivability_mode(configfs_device_fd);
+ }
+
+ igt_describe("Validate i2c adapter functionality in survivability mode");
+ igt_subtest("i2c-functionality") {
+ igt_install_exit_handler(restore);
+ test_i2c_functionality(configfs_device_fd, pci_xe);
+ }
+
+ igt_fixture {
+ igt_fs_remove_dir(configfs_fd, bus_addr);
+ close(configfs_device_fd);
+ close(configfs_fd);
+ close(fd);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 5c01c64e9..8f264d8e8 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -329,6 +329,7 @@ intel_xe_progs = [
'xe_sriov_auto_provisioning',
'xe_sriov_flr',
'xe_sriov_scheduling',
+ 'xe_survivability',
'xe_sysfs_defaults',
'xe_sysfs_preempt_timeout',
'xe_sysfs_scheduler',
--
2.43.0
More information about the igt-dev
mailing list