From: "Purkait, Soham" <soham.purkait@intel.com>
To: Ravi Kishore Koppuravuri <ravi.kishore.koppuravuri@intel.com>,
<igt-dev@lists.freedesktop.org>
Cc: Riana Tauro <riana.tauro@intel.com>,
Gupta Anshuman <anshuman.gupta@intel.com>,
Jadav Raag <raag.jadav@intel.com>,
Nilawar Badal <badal.nilawar@intel.com>,
Koujalagi Mallesh <mallesh.koujalagi@intel.com>,
Harish Chegondi <harish.chegondi@intel.com>
Subject: Re: [PATCH v4 07/10] tests/intel/xe_err_injection: Add GT UC Unicast GAM Walker Command Parity Error Injection
Date: Thu, 3 Sep 2026 22:15:04 +0530 [thread overview]
Message-ID: <33037b1d-95a4-4eaa-b64b-c7169e0c1fb0@intel.com> (raw)
In-Reply-To: <20260903073335.339540-8-ravi.kishore.koppuravuri@intel.com>
Hi Ravi,
On 03-09-2026 13:03, Ravi Kishore Koppuravuri wrote:
> MMIO based GT Uncorrectable Unicast GAM Walker command parity error
> injection to verify the Xe driver error handling and recovery flows with
> the help of DRM Netlink API suite
>
> Cc: Purkait Soham <soham.purkait@intel.com>
> Cc: Riana Tauro <riana.tauro@intel.com>
> Cc: Gupta Anshuman <anshuman.gupta@intel.com>
> Cc: Jadav Raag <raag.jadav@intel.com>
> Cc: Nilawar Badal <badal.nilawar@intel.com>
> Cc: Koujalagi Mallesh <mallesh.koujalagi@intel.com>
> Cc: Harish Chegondi <harish.chegondi@intel.com>
> Signed-off-by: Ravi Kishore Koppuravuri <ravi.kishore.koppuravuri@intel.com>
> ---
> v4:
> - Added Steer Semaphore for disabling and enabling multicast
> operation(soham)
> - Increased device recovery check timeout from 5secs to 10secs
> - Used updated library names with igt_drm_netlink_* prefix (Nikula
> Jani & Kamil)
> ---
> tests/intel/xe_err_injection.c | 342 +++++++++++++++++++++++++++++++++
> tests/intel/xe_err_injection.h | 31 +++
> tests/meson.build | 1 +
> 3 files changed, 374 insertions(+)
> create mode 100644 tests/intel/xe_err_injection.c
> create mode 100644 tests/intel/xe_err_injection.h
>
> diff --git a/tests/intel/xe_err_injection.c b/tests/intel/xe_err_injection.c
> new file mode 100644
> index 000000000..683994d1c
> --- /dev/null
> +++ b/tests/intel/xe_err_injection.c
> @@ -0,0 +1,342 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2026 Intel Corporation
> + */
> +
> +/**
> + * TEST: MMIO based Error Injection
> + * Category: RAS
> + * Mega feature: Telemetry
> + * Sub-category: Driver
> + * Test category: Error Injection
> + */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <time.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +
> +#include "igt.h"
> +#include "lib/igt_drm_netlink.h"
> +#include "lib/intel_reg.h"
> +#include "lib/intel_compute.h"
> +
> +#include "xe_drm.h"
> +#include "xe/xe_ioctl.h"
> +#include "xe/xe_mmio.h"
> +#include "xe/xe_query.h"
> +#include "xe_err_injection.h"
> +
> +enum {
> + RECOVERY_SUCCESS = 1,
> + RECOVERY_FAILED,
> + RECOVERY_TIMEOUT,
> +};
> +
> +static void run_xe_compute_on_all_engines(int fd, bool state)
> +{
> + struct drm_xe_engine_class_instance *hwe;
> +
> + if (state == POST_ARMING_INJECTION_WL)
> + igt_info("Running compute-square on all engines post injection\n");
> + else if (state == POST_RECOVERY_WL)
> + igt_info("Running compute-square on all engines post recovery\n");
> +
> + xe_for_each_engine(fd, hwe) {
> + if (hwe->engine_class != DRM_XE_ENGINE_CLASS_COMPUTE)
> + continue;
> +
> + igt_require_f(xe_run_intel_compute_kernel_on_engine(fd, hwe, NULL,
> + EXECENV_PREF_SYSTEM),
> + "GPU does not support "
> + "compute on engine\n");
> + }
> +}
> +
> +static void write_reg(struct xe_mmio *mmio, uint32_t reg, uint32_t value)
> +{
> + xe_mmio_write32(mmio, reg, value);
> +}
> +
> +static void modify_reg_bit(struct xe_mmio *mmio, uint32_t reg_addr,
> + uint32_t bit_mask, bool set)
> +{
> + uint32_t regval;
> +
> + regval = xe_mmio_read32(mmio, reg_addr);
> + if (set)
> + regval |= bit_mask;
> + else
> + regval &= ~bit_mask;
> +
> + xe_mmio_write32(mmio, reg_addr, regval);
> +}
> +
> +static void acquire_steering_semaphore(struct xe_mmio *mmio)
> +{
> + uint32_t regval;
> +
> + while (true) {
> + regval = xe_mmio_read32(mmio, STEER_SEMAPHORE_MGSR_3D);
> + if (regval == STEER_SEMAPHORE_MGSR_3D_VALUE) {
> + xe_mmio_write32(mmio, STEER_SEMAPHORE_MGSR_3D, 0x0);
> + return;
> + }
> + }
> +}
> +
> +static void release_steering_semaphore(struct xe_mmio *mmio)
> +{
> + xe_mmio_write32(mmio, STEER_SEMAPHORE_MGSR_3D,
> + STEER_SEMAPHORE_MGSR_3D_VALUE);
> +}
> +
> +static int acquire_forcewake(int fd)
> +{
> + int fw_handle;
> +
> + fw_handle = igt_debugfs_open(fd, "forcewake_all", O_RDONLY);
> + igt_assert_lte(0, fw_handle);
> + return fw_handle;
> +}
> +
> +static void release_forcewake(int fw_handle)
> +{
> + if (fw_handle >= 0)
> + close(fw_handle);
> +}
> +
> +static uint32_t get_counter(uint32_t node_id, uint32_t error_id)
> +{
> + struct app_context ctx;
> + int ret;
> + uint32_t error_value = UINT32_MAX;
> +
> + ret = igt_drm_netlink_init(&ctx);
> + if (ret < 0) {
> + igt_warn("Failed to initialize netlink socket for error command (ret=%d)\n", ret);
> + return error_value;
> + }
> +
> + ctx.node_id = node_id;
> + ctx.error_id = error_id;
> +
> + ret = igt_drm_netlink_get_error_counter(&ctx);
> + if (ret < 0) {
> + igt_warn("get_error_counter failed from error command path (ret=%d)\n", ret);
> + } else {
> + error_value = ctx.error_value;
> + igt_info("get_error_counter: node_id=%u error_id=%u value=%u\n",
> + ctx.node_id, ctx.error_id, ctx.error_value);
> + }
> +
> + igt_drm_netlink_cleanup(&ctx);
> +
> + return error_value;
> +}
> +
> +static int check_dmesg(const char *marker, int elapsed_secs)
> +{
> + static const char * const recovery_messages[] = {
> + "AER: device recovery successful",
> + "AER: device recovery failed",
> + };
Make this as static global and keep the name generic, something like
"dmesg_status". Better approach would be like :
static const char * const dmesg_status[] = {
[RECOVERY_SUCCESS] = "AER: device recovery successful",
[RECOVERY_FAILED] = "AER: device recovery failed",
};
To be on the safe side, make sure these strings remain unchanged in the
future, since they are used to detect the corresponding status in dmesg.
thanks,
Soham
> + char *buff = NULL;
> + size_t buff_size = 0;
> + size_t i;
> + ssize_t line_len;
> + FILE *fp;
> + bool marker_seen = false;
> +
> + fp = popen("dmesg", "r");
> + if (!fp) {
> + igt_warn("Unable to open dmesg to check recovery status\n");
> + return -1;
> + }
> +
> + while ((line_len = getline(&buff, &buff_size, fp)) != -1) {
> + if (!marker_seen) {
> + if (strstr(buff, marker))
> + marker_seen = true;
> + continue;
> + }
> +
> + for (i = 0; i < ARRAY_SIZE(recovery_messages); i++) {
> + if (!strstr(buff, recovery_messages[i]))
> + continue;
> +
> + igt_debug("Found \"%s\" in dmesg after %d secs\n",
> + recovery_messages[i], elapsed_secs);
> + free(buff);
> + pclose(fp);
> + return RECOVERY_SUCCESS + i;
> + }
> + }
> +
> + free(buff);
> + pclose(fp);
> + return RECOVERY_TIMEOUT;
> +}
> +
> +static int check_err_recovery(void)
> +{
> + time_t start_time = time(NULL);
> + time_t timeout = 10 * 60; /* 10 secs */
> + int time_interval = 30;
> + time_t elapsed_time;
> + int status;
> + char marker[128];
> +
> + snprintf(marker, sizeof(marker),
> + "IGT xe_err_injection recovery marker pid=%d start=%lld",
> + getpid(), (long long)start_time);
> + igt_kmsg(KMSG_INFO "%s\n", marker);
> +
> + while (1) {
> + elapsed_time = time(NULL) - start_time;
> + status = check_dmesg(marker, elapsed_time);
> + if (status < 0) {
> + igt_warn("Failed to query dmesg for recovery status\n");
> + return RECOVERY_FAILED;
> + }
> + if (status == RECOVERY_SUCCESS || status == RECOVERY_FAILED)
> + return status;
> +
> + if (elapsed_time >= timeout) {
> + igt_warn("Timed out while waiting for error recovery\n");
> + return RECOVERY_TIMEOUT;
> + }
> +
> + sleep(time_interval);
> + }
> +}
> +
> +static void print_aer_recovery_status(void)
> +{
> + int recovery_ret;
> +
> + recovery_ret = check_err_recovery();
> + igt_assert_f(recovery_ret != RECOVERY_TIMEOUT,
> + "AER error recovery timed out\n");
> + igt_assert_f(recovery_ret != RECOVERY_FAILED,
> + "AER device recovery failed\n");
> + if (recovery_ret == RECOVERY_SUCCESS)
> + igt_info("AER device recovery successful\n");
> +}
> +
> +static void log_status(bool val, const char *err_name)
> +{
> + if (val)
> + igt_info("Injection: %s Success\n", err_name);
> + else
> + igt_info("Injection: %s Failed\n", err_name);
> +}
> +
> +static bool gt_uc_wkr_parity_recovered;
> +
> +/**
> + * SUBTEST: test_GT-UC-unicast-wkr-cmd-parity-err
> + * Description: GT Uncorrectable Unicast Walker Command parity error injection
> + * Functionality: error injection
> + */
> +static void wkr_cmd_parity_err_injection(struct xe_mmio *mmio, int fd)
> +{
> + int fw_handle;
> + uint32_t error_counter_before_inj;
> + uint32_t error_counter_after_inj;
> + /** TODO
> + * Fetching node_id and error_id dynamically is pending to implement.
> + * For now, using
> + * node_id=1 (uncorrectable_errors) and
> + * error_id=1 (core_compute)
> + */
> + uint32_t node_id = NODE_ID_UNCORRECTABLE_ERROR;
> + uint32_t error_id = ERROR_ID_CORE_COMPUTE;
> +
> + fw_handle = acquire_forcewake(fd);
> +
> + error_counter_before_inj = get_counter(node_id, error_id);
> +
> + acquire_steering_semaphore(mmio);
> + /* Arm the injection sequence. */
> + write_reg(mmio, MC_PKT_CTRL_MGSR_3D_ADDRESS, 0x0);
> + modify_reg_bit(mmio,
> + WKR_FABRIC_ERR_INJ_GAMWALK_3D_ADDRESS,
> + WKR_FABRIC_ERR_INJ_GAMWALK_3D_VALUE,
> + true);
> + modify_reg_bit(mmio,
> + MC_PKT_CTRL_MGSR_3D_ADDRESS,
> + MC_PKT_CTRL_MGSR_3D_VALUE,
> + true);
> + release_steering_semaphore(mmio);
> + igt_info("Injected GT Uncorrectable Unicast Walker Cmd parity error\n");
> +
> + run_xe_compute_on_all_engines(fd, POST_ARMING_INJECTION_WL);
> +
> + release_forcewake(fw_handle);
> + print_aer_recovery_status();
> + error_counter_after_inj = get_counter(node_id, error_id);
> +
> + igt_assert_f(error_counter_before_inj != UINT32_MAX &&
> + error_counter_after_inj != UINT32_MAX,
> + "Failed to fetch valid error counters: before=%u after=%u\n",
> + error_counter_before_inj, error_counter_after_inj);
> +
> + igt_info("error counter: before injection=%u after injection=%u\n",
> + error_counter_before_inj, error_counter_after_inj);
> +
> + igt_assert_f(error_counter_after_inj > error_counter_before_inj,
> + "GT Uncorrectable Unicast Walker Cmd parity error injection "
> + "failed: before injection=%u after injection=%u\n",
> + error_counter_before_inj, error_counter_after_inj);
> + igt_info("GT Uncorrectable Unicast Walker Cmd parity error injection successful\n");
> + gt_uc_wkr_parity_recovered = true;
> +}
> +
> +static void inject_error(const char *injection, struct xe_mmio *mmio, int fd)
> +{
> + igt_info("Starting Error Injection test: %s\n", injection);
> + if (strcmp(injection, "test_GT-UC-unicast-wkr-cmd-parity-err") == 0)
> + wkr_cmd_parity_err_injection(mmio, fd);
> + else if (strcmp(injection, "test_GT-UC-unicast-wkr-cmd-parity-err-post-recovery-wl") == 0)
> + run_xe_compute_on_all_engines(fd, POST_RECOVERY_WL);
> + else
> + igt_info("Invalid Error Injection specified\n");
> +}
> +
> +/**
> + * SUBTEST: test_GT-UC-unicast-wkr-cmd-parity-err-post-recovery-wl
> + * Description: Run a post-recovery Xe workload after parity error injection.
> + * Functionality: workload validation
> + */
> +
> +int igt_main()
> +{
> + int fd;
> + struct xe_mmio mmio;
> +
> + igt_fixture() {
> + fd = drm_open_driver(DRIVER_XE);
> + igt_require(igt_debugfs_exists(fd, "forcewake_all", O_RDONLY));
> + xe_mmio_access_init(fd, &mmio);
> + igt_require(xe_mmio_is_initialized(&mmio));
> + }
> +
> + igt_describe("Inject GT uncorrectable unicast worker command parity error.");
> + igt_subtest("test_GT-UC-unicast-wkr-cmd-parity-err")
> + inject_error("test_GT-UC-unicast-wkr-cmd-parity-err", &mmio, fd);
> +
> + igt_describe("Run post-recovery workload after GT parity error injection test.");
> + igt_subtest("test_GT-UC-unicast-wkr-cmd-parity-err-post-recovery-wl") {
> + igt_require_f(gt_uc_wkr_parity_recovered,
> + "Run GT-UC-unicast-wkr-cmd-parity-err first\n");
> + inject_error("test_GT-UC-unicast-wkr-cmd-parity-err-post-recovery-wl", &mmio, fd);
> + }
> +
> + igt_fixture() {
> + xe_mmio_access_fini(&mmio);
> + drm_close_driver(fd);
> + }
> +}
> diff --git a/tests/intel/xe_err_injection.h b/tests/intel/xe_err_injection.h
> new file mode 100644
> index 000000000..a70e6af22
> --- /dev/null
> +++ b/tests/intel/xe_err_injection.h
> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2026 Intel Corporation
> + */
> +
> +#ifndef XE_ERR_INJECTION_H
> +#define XE_ERR_INJECTION_H
> +
> +/* Steering Control Register (MC_PKT_CTRL) */
> +#define MC_PKT_CTRL_MGSR_3D_ADDRESS 0x00FD4
> +#define MC_PKT_CTRL_MGSR_3D_VALUE 0x80000000
> +
> +/* GT Uncorrectable worker command parity error injection */
> +#define WKR_FABRIC_ERR_INJ_GAMWALK_3D_ADDRESS 0xF310
> +#define WKR_FABRIC_ERR_INJ_GAMWALK_3D_VALUE 0x1
> +
> +#define POST_RECOVERY_WL 1
> +#define POST_ARMING_INJECTION_WL 0
> +
> +/* STEER_SEMAPHORE_MGSR_3D */
> +#define STEER_SEMAPHORE_MGSR_3D 0x00FD0
> +#define STEER_SEMAPHORE_MGSR_3D_VALUE 0x1
> +
> +/* Node types for error counters*/
> +#define NODE_ID_UNCORRECTABLE_ERROR 1
> +
> +/* Error types for error counter */
> +#define ERROR_ID_CORE_COMPUTE 1
> +
> +#endif /* XE_ERR_INJECTION_H */
> +
> diff --git a/tests/meson.build b/tests/meson.build
> index a62f447df..0f090dcee 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -292,6 +292,7 @@ intel_xe_progs = [
> 'xe_debugfs',
> 'xe_dma_buf_sync',
> 'xe_drm_fdinfo',
> + 'xe_err_injection',
> 'xe_eu_stall',
> 'xe_evict',
> 'xe_evict_ccs',
next prev parent reply other threads:[~2026-09-03 16:46 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 7:33 [PATCH v4 00/10] Xe3P GPU Error Injection Test Suite with DRM RAS Netlink Support Ravi Kishore Koppuravuri
2026-09-03 7:33 ` [PATCH v4 01/10] drm-uapi/drm_ras: Sync with kernel b2207d4c4e84 Ravi Kishore Koppuravuri
2026-09-10 11:12 ` Raag Jadav
2026-09-11 4:19 ` Koppuravuri, Ravi Kishore
2026-09-03 7:33 ` [PATCH v4 02/10] lib/meson: Add libnl dependencies for DRM RAS support Ravi Kishore Koppuravuri
2026-09-10 8:45 ` Purkait, Soham
2026-09-03 7:33 ` [PATCH v4 03/10] lib/igt_drm_netlink: Introduce DRM RAS Netlink interface library Ravi Kishore Koppuravuri
2026-09-10 6:17 ` Purkait, Soham
2026-09-03 7:33 ` [PATCH v4 04/10] lib/igt_drm_netlink: add get_error_counter support Ravi Kishore Koppuravuri
2026-09-10 12:05 ` Purkait, Soham
2026-09-03 7:33 ` [PATCH v4 05/10] lib/igt_drm_netlink: add get_error_threshold command support Ravi Kishore Koppuravuri
2026-09-03 7:33 ` [PATCH v4 06/10] lib/igt_drm_netlink: add set_error_threshold " Ravi Kishore Koppuravuri
2026-09-11 11:48 ` Purkait, Soham
2026-09-03 7:33 ` [PATCH v4 07/10] tests/intel/xe_err_injection: Add GT UC Unicast GAM Walker Command Parity Error Injection Ravi Kishore Koppuravuri
2026-09-03 16:45 ` Purkait, Soham [this message]
2026-09-11 15:03 ` Kamil Konieczny
2026-09-03 7:33 ` [PATCH v4 08/10] lib/igt_drm_netlink: add event notify subscription and event wait support Ravi Kishore Koppuravuri
2026-09-03 7:33 ` [PATCH v4 09/10] tests/intel/xe_err_injection: Add tests for L2 bank Corr err threshold scenarios Ravi Kishore Koppuravuri
2026-09-11 8:14 ` Purkait, Soham
2026-09-03 7:33 ` [PATCH v4 10/10] tests/intel/xe_err_injection: add CRI GPU requirement check Ravi Kishore Koppuravuri
2026-09-10 6:19 ` Purkait, Soham
2026-09-03 20:21 ` ✓ Xe.CI.BAT: success for Xe3P GPU Error Injection Test Suite with DRM RAS Netlink Support (rev7) Patchwork
2026-09-03 20:56 ` ✓ i915.CI.BAT: " Patchwork
2026-09-04 8:50 ` ✓ Xe.CI.FULL: " Patchwork
2026-09-04 10:51 ` ✗ i915.CI.Full: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=33037b1d-95a4-4eaa-b64b-c7169e0c1fb0@intel.com \
--to=soham.purkait@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=badal.nilawar@intel.com \
--cc=harish.chegondi@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=mallesh.koujalagi@intel.com \
--cc=raag.jadav@intel.com \
--cc=ravi.kishore.koppuravuri@intel.com \
--cc=riana.tauro@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.