[PATCH v2] tests/intel/xe_configfs: Add i2c adapter check in survivability mode
Riana Tauro
riana.tauro at intel.com
Thu Aug 28 06:12:30 UTC 2025
Hi Anirban
On 8/13/2025 3:31 PM, Sk Anirban wrote:
> 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.
Add the csc-wedged here not the survivability_mode existing test case.
You could modify that to only set the configfs and move the
functionality check here. But don't remove the entire test from configfs.
Thanks
Riana
>
> 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',
More information about the igt-dev
mailing list