* [PATCH i-g-t 0/1] tests/intel/xe_pm: Check root-port D3cold entry
@ 2026-11-02 9:58 Karthik Poosa
2026-11-02 9:58 ` [PATCH i-g-t] tests/intel/xe_pm: Validate root-port D3cold entry on system suspend Karthik Poosa
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Karthik Poosa @ 2026-11-02 9:58 UTC (permalink / raw)
To: igt-dev
Cc: rodrigo.vivi, anshuman.gupta, badal.nilawar, raag.jadav,
riana.tauro, sk.anirban, mallesh.koujalagi, soham.purkait,
ravi.kishore.koppuravuri, Karthik Poosa
Existing Xe runtime-PM tests verify root-port D3cold by polling the ACPI
firmware node's real_power_state. This approach cannot verify the state
during system suspend: userspace cannot read sysfs while suspended, and
reading it after resume only reports the post-resume state.
This patch adds ACPI transition-log checking to the system-suspend tests.
It looks for the root port's D0 -> D3cold message in /dev/kmsg across
suspend/resume, deriving the expected ACPI path from the root port's
firmware node and accounting for kmsg escaping.
The relevant ACPI dynamic-debug call site is enabled when needed and
disabled on process exit only if enabled by the test. Validation requires
D3cold support and d3cold_allowed=1. If the root port is already in D3cold
at suspend entry, suspend/resume runs without asserting a new transition.
The check covers basic, execution, VM-bind and MOCS system-suspend tests.
Runtime-PM validation remains unchanged, and explicit D3hot tests retain
their existing behavior.
The log window spans the suspend/resume operation; a runtime D3cold
transition within that window can also satisfy the check. The check
therefore detects a transition within the window rather than uniquely
attributing it to system suspend.
Karthik Poosa (1):
tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
tests/intel/xe_pm.c | 234 +++++++++++++++++++++++++++++++++++++++++---
1 file changed, 221 insertions(+), 13 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH i-g-t] tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
2026-11-02 9:58 [PATCH i-g-t 0/1] tests/intel/xe_pm: Check root-port D3cold entry Karthik Poosa
@ 2026-11-02 9:58 ` Karthik Poosa
2026-11-11 18:45 ` Rodrigo Vivi
2026-11-02 19:45 ` ✓ Xe.CI.BAT: success for " Patchwork
` (3 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Karthik Poosa @ 2026-11-02 9:58 UTC (permalink / raw)
To: igt-dev
Cc: rodrigo.vivi, anshuman.gupta, badal.nilawar, raag.jadav,
riana.tauro, sk.anirban, mallesh.koujalagi, soham.purkait,
ravi.kishore.koppuravuri, Karthik Poosa
When D3cold is supported and allowed, check the root port's ACPI
transition log across system suspend and resume for a D0 -> D3cold
transition. Skip the transition assertion if the root port is already
in D3cold at suspend entry.
Signed-off-by: Karthik Poosa <karthik.poosa@intel.com>
Assisted-by: LLM
---
tests/intel/xe_pm.c | 234 +++++++++++++++++++++++++++++++++++++++++---
1 file changed, 221 insertions(+), 13 deletions(-)
diff --git a/tests/intel/xe_pm.c b/tests/intel/xe_pm.c
index 543f46f5b..2eb70a383 100644
--- a/tests/intel/xe_pm.c
+++ b/tests/intel/xe_pm.c
@@ -12,8 +12,10 @@
*/
#include <dirent.h>
+#include <errno.h>
#include <limits.h>
#include <fcntl.h>
+#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
@@ -63,6 +65,9 @@ typedef struct {
uint64_t orig_threshold;
int fw_handle = -1;
+static int fd_kmsg = -1;
+static char d3cold_kmsg_entry[512];
+static bool acpi_d3cold_debug_enabled_by_test;
static pthread_mutex_t suspend_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t suspend_cond = PTHREAD_COND_INITIALIZER;
@@ -192,6 +197,120 @@ static void cleanup_d3(device_t device)
dpms_on_off(device, DRM_MODE_DPMS_ON);
}
+static int count_kmsg_entries(int kmsg, const char *entry)
+{
+ char buf[4096];
+ char *kmsg_entry, *p;
+ const unsigned char *src;
+ size_t entry_len = strlen(entry);
+ int count = 0;
+ ssize_t len;
+
+ igt_assert(entry_len <= (SIZE_MAX - 1) / 4);
+ kmsg_entry = malloc(4 * entry_len + 1);
+ igt_assert(kmsg_entry);
+
+ /* Match /dev/kmsg's escaping of backslashes and non-printable bytes. */
+ for (src = (const unsigned char *)entry, p = kmsg_entry; *src; src++) {
+ if (*src < ' ' || *src >= 127 || *src == '\\')
+ p += sprintf(p, "\\x%02x", (unsigned int)*src);
+ else
+ *p++ = *src;
+ }
+ *p = '\0';
+
+ errno = 0;
+ while ((len = read(kmsg, buf, sizeof(buf) - 1)) > 0) {
+ buf[len] = '\0';
+ if (strstr(buf, kmsg_entry)) {
+ igt_debug("Found dmesg entry: %s\n", buf);
+ count++;
+ }
+ }
+
+ free(kmsg_entry);
+
+ if (len == 0)
+ return count;
+
+ igt_assert_f(len == -1 && (errno == EAGAIN || errno == EWOULDBLOCK),
+ "Unexpected /dev/kmsg read result len=%zd errno=%d\n", len, errno);
+
+ return count;
+}
+
+static void build_rp_d3cold_kmsg_str(struct pci_device *pci_root, char *buf, size_t len)
+{
+ char path[PATH_MAX], fw_path[256];
+ ssize_t n;
+ int fd;
+
+ snprintf(path, sizeof(path),
+ "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/firmware_node/path",
+ pci_root->domain, pci_root->bus, pci_root->dev, pci_root->func);
+
+ fd = open(path, O_RDONLY);
+ igt_require_fd(fd);
+ n = read(fd, fw_path, sizeof(fw_path) - 1);
+ igt_assert_lte(0, (int)n);
+ fw_path[n] = '\0';
+ if (n > 0 && fw_path[n - 1] == '\n')
+ fw_path[n - 1] = '\0';
+ close(fd);
+
+ snprintf(buf, len, "%s: PM: Power state change: D0 -> D3cold", fw_path);
+}
+
+#define ACPI_DYNDDBG_CONTROL "/sys/kernel/debug/dynamic_debug/control"
+#define ACPI_D3COLD_DYNDDBG_QUERY \
+ "file drivers/acpi/device_pm.c format \"Power state change: %s -> %s\""
+
+static bool acpi_d3cold_debug_is_enabled(void)
+{
+ char line[1024];
+ FILE *fp;
+ bool enabled = false;
+
+ fp = fopen(ACPI_DYNDDBG_CONTROL, "r");
+ if (!fp)
+ return false;
+
+ while (fgets(line, sizeof(line), fp)) {
+ char *message = strstr(line, "Power state change: %s -> %s");
+ char *flags = strchr(line, '=');
+
+ if (message && flags && flags < message && memchr(flags, 'p', message - flags)) {
+ enabled = true;
+ break;
+ }
+ }
+
+ fclose(fp);
+ return enabled;
+}
+
+static bool set_acpi_d3cold_debug(bool enable)
+{
+ FILE *fp;
+ int ret;
+
+ fp = fopen(ACPI_DYNDDBG_CONTROL, "w");
+ if (!fp)
+ return false;
+
+ ret = fprintf(fp, "%s %sp\n", ACPI_D3COLD_DYNDDBG_QUERY, enable ? "+" : "-");
+ if (fclose(fp))
+ return false;
+
+ return ret > 0;
+}
+
+static void restore_acpi_d3cold_debug(int sig)
+{
+ if (acpi_d3cold_debug_enabled_by_test)
+ set_acpi_d3cold_debug(false);
+}
+
static bool in_d3(device_t device, enum igt_acpi_d_state state)
{
uint16_t val;
@@ -228,6 +347,85 @@ static void close_fw_handle(int sig)
close(fw_handle);
}
+static void close_d3cold_kmsg_handle(int sig)
+{
+ if (fd_kmsg < 0)
+ return;
+
+ close(fd_kmsg);
+ fd_kmsg = -1;
+}
+
+static void start_d3cold_kmsg_logging(void)
+{
+ igt_require_fd(fd_kmsg);
+ igt_assert_neq(lseek(fd_kmsg, 0, SEEK_END), -1);
+}
+
+static void check_d3cold_kmsg_count(void)
+{
+ int count;
+
+ igt_require_fd(fd_kmsg);
+ count = count_kmsg_entries(fd_kmsg, d3cold_kmsg_entry);
+ igt_info("Root port D3cold entry count=%d\n", count);
+ igt_assert_f(count > 0,
+ "No root port D3cold entry detected during system suspend\n");
+}
+
+static bool d3cold_validation_enabled(device_t device)
+{
+ uint32_t d3cold_allowed;
+
+ if (!igt_pm_acpi_d3cold_supported(device.pci_root))
+ return false;
+
+ igt_pm_get_d3cold_allowed(device.pci_slot_name, &d3cold_allowed);
+
+ return d3cold_allowed;
+}
+
+static void prepare_d3cold_kmsg(device_t device)
+{
+ igt_require_f(d3cold_validation_enabled(device),
+ "D3Cold validation requires a D3Cold-capable root port and d3cold_allowed=1\n");
+
+ if (fd_kmsg < 0) {
+ build_rp_d3cold_kmsg_str(device.pci_root, d3cold_kmsg_entry,
+ sizeof(d3cold_kmsg_entry));
+ fd_kmsg = open("/dev/kmsg", O_RDONLY | O_NONBLOCK);
+ igt_require_fd(fd_kmsg);
+ }
+
+ if (!acpi_d3cold_debug_is_enabled()) {
+ igt_require_f(set_acpi_d3cold_debug(true),
+ "ACPI D3Cold dynamic debug is unavailable\n");
+ acpi_d3cold_debug_enabled_by_test = true;
+ igt_require_f(acpi_d3cold_debug_is_enabled(),
+ "Failed to enable ACPI D3Cold dynamic debug\n");
+ }
+}
+
+static void suspend_check_d3cold(device_t device, enum igt_suspend_state s_state,
+ enum igt_suspend_test test)
+{
+ igt_require_f(d3cold_validation_enabled(device),
+ "D3Cold validation requires a D3Cold-capable root port and d3cold_allowed=1\n");
+
+ if (igt_pm_get_acpi_real_d_state(device.pci_root) == IGT_ACPI_D3Cold) {
+ igt_info("Root port already in D3cold at suspend entry; skip transition check\n");
+ igt_system_suspend_autoresume(s_state, test);
+ return;
+ }
+
+ prepare_d3cold_kmsg(device);
+
+ /* Seek to end before suspend so only new messages are scanned */
+ start_d3cold_kmsg_logging();
+ igt_system_suspend_autoresume(s_state, test);
+ check_d3cold_kmsg_count();
+}
+
#define MAX_VMAS 2
static void*
@@ -578,7 +776,7 @@ child_exec(void *arguments)
static void
test_exec(device_t device, int n_exec_queues, int n_execs,
enum igt_suspend_state s_state, enum igt_acpi_d_state d_state,
- unsigned int flags)
+ unsigned int flags, bool validate_d3cold)
{
enum igt_suspend_test test = s_state == SUSPEND_STATE_DISK ?
SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
@@ -587,6 +785,10 @@ test_exec(device_t device, int n_exec_queues, int n_execs,
pthread_t threads[65]; /* MAX_ENGINES + 1 */
child_exec_args args;
+ if (validate_d3cold && n_execs > 1 && s_state != NO_SUSPEND) {
+ prepare_d3cold_kmsg(device);
+ }
+
xe_for_each_engine(device.fd_xe, eci) {
args.device = device;
args.eci = eci;
@@ -607,7 +809,10 @@ test_exec(device_t device, int n_exec_queues, int n_execs,
}
if (n_execs > 1 && s_state != NO_SUSPEND) {
- igt_system_suspend_autoresume(s_state, test);
+ if (validate_d3cold)
+ suspend_check_d3cold(device, s_state, test);
+ else
+ igt_system_suspend_autoresume(s_state, test);
pthread_mutex_lock(&suspend_lock);
pthread_cond_broadcast(&suspend_cond);
@@ -845,7 +1050,7 @@ static void test_mocs_suspend_resume(device_t device, enum igt_suspend_state s_s
enum igt_suspend_test test = s_state == SUSPEND_STATE_DISK ?
SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
- igt_system_suspend_autoresume(s_state, test);
+ suspend_check_d3cold(device, s_state, test);
}
}
igt_assert(igt_debugfs_exists(device.fd_xe, path, O_RDONLY));
@@ -981,7 +1186,7 @@ int igt_main()
igt_device_get_pci_slot_name(device.fd_xe, device.pci_slot_name);
/* Always perform initial once-basic exec checking for health */
- test_exec(device, 1, 1, NO_SUSPEND, NO_RPM, 0);
+ test_exec(device, 1, 1, NO_SUSPEND, NO_RPM, 0, false);
igt_pm_get_d3cold_allowed(device.pci_slot_name, &d3cold_allowed);
has_runtime_pm = igt_setup_runtime_pm(device.fd_xe);
@@ -989,6 +1194,8 @@ int igt_main()
device.res = drmModeGetResources(device.fd_xe);
igt_install_exit_handler(igt_drm_debug_mask_reset_exit_handler);
+ igt_install_exit_handler(close_d3cold_kmsg_handle);
+ igt_install_exit_handler(restore_acpi_d3cold_debug);
update_debug_mask_if_ci(DRM_UT_KMS);
errno = 0;
}
@@ -997,28 +1204,28 @@ int igt_main()
igt_subtest_f("%s-basic", s->name) {
enum igt_suspend_test test = s->state == SUSPEND_STATE_DISK ?
SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
- igt_system_suspend_autoresume(s->state, test);
+ suspend_check_d3cold(device, s->state, test);
}
igt_subtest_f("%s-basic-exec", s->name) {
- test_exec(device, 1, 2, s->state, NO_RPM, 0);
+ test_exec(device, 1, 2, s->state, NO_RPM, 0, true);
}
igt_subtest_f("%s-exec-after", s->name) {
enum igt_suspend_test test = s->state == SUSPEND_STATE_DISK ?
SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
- igt_system_suspend_autoresume(s->state, test);
- test_exec(device, 1, 2, NO_SUSPEND, NO_RPM, 0);
+ suspend_check_d3cold(device, s->state, test);
+ test_exec(device, 1, 2, NO_SUSPEND, NO_RPM, 0, false);
}
igt_subtest_f("%s-multiple-execs", s->name) {
- test_exec(device, 16, 32, s->state, NO_RPM, 0);
+ test_exec(device, 16, 32, s->state, NO_RPM, 0, true);
}
for (const struct vm_op *op = vm_op; op->name; op++) {
igt_subtest_f("%s-vm-bind-%s", s->name, op->name) {
- test_exec(device, 16, 32, s->state, NO_RPM, op->flags);
+ test_exec(device, 16, 32, s->state, NO_RPM, op->flags, true);
}
}
@@ -1026,7 +1233,8 @@ int igt_main()
igt_subtest_f("%s-%s-basic-exec", s->name, d->name) {
igt_require_f(has_runtime_pm, "Runtime PM not available\n");
igt_assert(setup_d3(device, d->state));
- test_exec(device, 1, 2, s->state, NO_RPM, 0);
+ test_exec(device, 1, 2, s->state, NO_RPM, 0,
+ d->state == IGT_ACPI_D3Cold);
cleanup_d3(device);
}
}
@@ -1050,7 +1258,7 @@ int igt_main()
igt_subtest_f("%s-basic-exec", d->name) {
igt_require_f(has_runtime_pm, "Runtime PM not available\n");
igt_assert(setup_d3(device, d->state));
- test_exec(device, 1, 1, NO_SUSPEND, d->state, 0);
+ test_exec(device, 1, 1, NO_SUSPEND, d->state, 0, false);
cleanup_d3(device);
}
@@ -1065,7 +1273,7 @@ int igt_main()
igt_subtest_f("%s-multiple-execs", d->name) {
igt_require_f(has_runtime_pm, "Runtime PM not available\n");
igt_assert(setup_d3(device, d->state));
- test_exec(device, 16, 32, NO_SUSPEND, d->state, 0);
+ test_exec(device, 16, 32, NO_SUSPEND, d->state, 0, false);
cleanup_d3(device);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* ✓ Xe.CI.BAT: success for tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
2026-11-02 9:58 [PATCH i-g-t 0/1] tests/intel/xe_pm: Check root-port D3cold entry Karthik Poosa
2026-11-02 9:58 ` [PATCH i-g-t] tests/intel/xe_pm: Validate root-port D3cold entry on system suspend Karthik Poosa
@ 2026-11-02 19:45 ` Patchwork
2026-11-02 19:46 ` ✓ i915.CI.BAT: " Patchwork
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2026-11-02 19:45 UTC (permalink / raw)
To: Karthik Poosa; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 1086 bytes --]
== Series Details ==
Series: tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
URL : https://patchwork.freedesktop.org/series/177433/
State : success
== Summary ==
CI Bug Log - changes from XEIGT_9175_BAT -> XEIGTPW_16084_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (15 -> 14)
------------------------------
Missing (1): bat-bmg-2
Changes
-------
No changes found
Build changes
-------------
* IGT: IGT_9175 -> IGTPW_16084
* Linux: xe-6046-79cefeb775e63da397152ab01c2f1d4fa1b9b46d -> xe-6047-2cd78713d917a02987f21b437561a5e1e13ddda2
IGTPW_16084: 087594154a27752788c40e9497ffcd68752aee2d @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
IGT_9175: 9175
xe-6046-79cefeb775e63da397152ab01c2f1d4fa1b9b46d: 79cefeb775e63da397152ab01c2f1d4fa1b9b46d
xe-6047-2cd78713d917a02987f21b437561a5e1e13ddda2: 2cd78713d917a02987f21b437561a5e1e13ddda2
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_16084/index.html
[-- Attachment #2: Type: text/html, Size: 1645 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* ✓ i915.CI.BAT: success for tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
2026-11-02 9:58 [PATCH i-g-t 0/1] tests/intel/xe_pm: Check root-port D3cold entry Karthik Poosa
2026-11-02 9:58 ` [PATCH i-g-t] tests/intel/xe_pm: Validate root-port D3cold entry on system suspend Karthik Poosa
2026-11-02 19:45 ` ✓ Xe.CI.BAT: success for " Patchwork
@ 2026-11-02 19:46 ` Patchwork
2026-11-02 20:35 ` ✓ Xe.CI.FULL: " Patchwork
2026-11-02 21:31 ` ✓ i915.CI.Full: " Patchwork
4 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2026-11-02 19:46 UTC (permalink / raw)
To: Karthik Poosa; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 1717 bytes --]
== Series Details ==
Series: tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
URL : https://patchwork.freedesktop.org/series/177433/
State : success
== Summary ==
CI Bug Log - changes from IGT_9175 -> IGTPW_16084
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/index.html
Participating hosts (38 -> 39)
------------------------------
Additional (2): bat-arls-5 bat-adls-6
Missing (1): bat-dg2-13
Known issues
------------
Here are the changes found in IGTPW_16084 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@runner@aborted:
- bat-adls-6: NOTRUN -> [FAIL][1] ([i915#17747])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/bat-adls-6/igt@runner@aborted.html
- bat-arls-5: NOTRUN -> [FAIL][2] ([i915#17747])
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/bat-arls-5/igt@runner@aborted.html
[i915#17747]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/17747
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_9175 -> IGTPW_16084
* Linux: CI_DRM_19430 -> CI_DRM_19431
CI-20190529: 20190529
CI_DRM_19430: 79cefeb775e63da397152ab01c2f1d4fa1b9b46d @ git://anongit.freedesktop.org/gfx-ci/linux
CI_DRM_19431: 2cd78713d917a02987f21b437561a5e1e13ddda2 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_16084: 087594154a27752788c40e9497ffcd68752aee2d @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
IGT_9175: 9175
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/index.html
[-- Attachment #2: Type: text/html, Size: 2403 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* ✓ Xe.CI.FULL: success for tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
2026-11-02 9:58 [PATCH i-g-t 0/1] tests/intel/xe_pm: Check root-port D3cold entry Karthik Poosa
` (2 preceding siblings ...)
2026-11-02 19:46 ` ✓ i915.CI.BAT: " Patchwork
@ 2026-11-02 20:35 ` Patchwork
2026-11-02 21:31 ` ✓ i915.CI.Full: " Patchwork
4 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2026-11-02 20:35 UTC (permalink / raw)
To: Karthik Poosa; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 1093 bytes --]
== Series Details ==
Series: tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
URL : https://patchwork.freedesktop.org/series/177433/
State : success
== Summary ==
CI Bug Log - changes from XEIGT_9175_FULL -> XEIGTPW_16084_FULL
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (3 -> 3)
------------------------------
No changes in participating hosts
Changes
-------
No changes found
Build changes
-------------
* IGT: IGT_9175 -> IGTPW_16084
* Linux: xe-6046-79cefeb775e63da397152ab01c2f1d4fa1b9b46d -> xe-6047-2cd78713d917a02987f21b437561a5e1e13ddda2
IGTPW_16084: 087594154a27752788c40e9497ffcd68752aee2d @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
IGT_9175: 9175
xe-6046-79cefeb775e63da397152ab01c2f1d4fa1b9b46d: 79cefeb775e63da397152ab01c2f1d4fa1b9b46d
xe-6047-2cd78713d917a02987f21b437561a5e1e13ddda2: 2cd78713d917a02987f21b437561a5e1e13ddda2
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/IGTPW_16084/index.html
[-- Attachment #2: Type: text/html, Size: 1652 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* ✓ i915.CI.Full: success for tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
2026-11-02 9:58 [PATCH i-g-t 0/1] tests/intel/xe_pm: Check root-port D3cold entry Karthik Poosa
` (3 preceding siblings ...)
2026-11-02 20:35 ` ✓ Xe.CI.FULL: " Patchwork
@ 2026-11-02 21:31 ` Patchwork
4 siblings, 0 replies; 7+ messages in thread
From: Patchwork @ 2026-11-02 21:31 UTC (permalink / raw)
To: Karthik Poosa; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 6033 bytes --]
== Series Details ==
Series: tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
URL : https://patchwork.freedesktop.org/series/177433/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_19431_full -> IGTPW_16084_full
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/index.html
Participating hosts (11 -> 10)
------------------------------
Missing (1): pig-kbl-iris
Known issues
------------
Here are the changes found in IGTPW_16084_full that come from known issues:
### IGT changes ###
#### Possible fixes ####
* igt@i915_module_load@load:
- shard-tglu: ([PASS][1], [PASS][2], [PASS][3], [PASS][4], [PASS][5], [PASS][6], [PASS][7], [PASS][8], [PASS][9], [PASS][10], [PASS][11], [PASS][12], [PASS][13], [PASS][14], [PASS][15], [PASS][16], [PASS][17], [PASS][18], [SKIP][19], [PASS][20]) ([i915#17257]) -> ([PASS][21], [PASS][22], [PASS][23], [PASS][24], [PASS][25], [PASS][26], [PASS][27], [PASS][28], [PASS][29], [PASS][30], [PASS][31], [PASS][32], [PASS][33], [PASS][34], [PASS][35], [PASS][36], [PASS][37], [PASS][38], [PASS][39])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-5/igt@i915_module_load@load.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-4/igt@i915_module_load@load.html
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-7/igt@i915_module_load@load.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-10/igt@i915_module_load@load.html
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-5/igt@i915_module_load@load.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-4/igt@i915_module_load@load.html
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-9/igt@i915_module_load@load.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-2/igt@i915_module_load@load.html
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-2/igt@i915_module_load@load.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-4/igt@i915_module_load@load.html
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-9/igt@i915_module_load@load.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-10/igt@i915_module_load@load.html
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-8/igt@i915_module_load@load.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-3/igt@i915_module_load@load.html
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-2/igt@i915_module_load@load.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-9/igt@i915_module_load@load.html
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-8/igt@i915_module_load@load.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-5/igt@i915_module_load@load.html
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-7/igt@i915_module_load@load.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_19431/shard-tglu-3/igt@i915_module_load@load.html
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-10/igt@i915_module_load@load.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-10/igt@i915_module_load@load.html
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-2/igt@i915_module_load@load.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-2/igt@i915_module_load@load.html
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-3/igt@i915_module_load@load.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-3/igt@i915_module_load@load.html
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-4/igt@i915_module_load@load.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-4/igt@i915_module_load@load.html
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-5/igt@i915_module_load@load.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-5/igt@i915_module_load@load.html
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-5/igt@i915_module_load@load.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-7/igt@i915_module_load@load.html
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-7/igt@i915_module_load@load.html
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-8/igt@i915_module_load@load.html
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-8/igt@i915_module_load@load.html
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-8/igt@i915_module_load@load.html
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-9/igt@i915_module_load@load.html
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-9/igt@i915_module_load@load.html
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/shard-tglu-9/igt@i915_module_load@load.html
[i915#17257]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/17257
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_9175 -> IGTPW_16084
* Piglit: piglit_4509 -> None
CI-20190529: 20190529
CI_DRM_19431: 2cd78713d917a02987f21b437561a5e1e13ddda2 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_16084: 087594154a27752788c40e9497ffcd68752aee2d @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
IGT_9175: 9175
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_16084/index.html
[-- Attachment #2: Type: text/html, Size: 6665 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH i-g-t] tests/intel/xe_pm: Validate root-port D3cold entry on system suspend
2026-11-02 9:58 ` [PATCH i-g-t] tests/intel/xe_pm: Validate root-port D3cold entry on system suspend Karthik Poosa
@ 2026-11-11 18:45 ` Rodrigo Vivi
0 siblings, 0 replies; 7+ messages in thread
From: Rodrigo Vivi @ 2026-11-11 18:45 UTC (permalink / raw)
To: Karthik Poosa
Cc: igt-dev, anshuman.gupta, badal.nilawar, raag.jadav, riana.tauro,
sk.anirban, mallesh.koujalagi, soham.purkait,
ravi.kishore.koppuravuri
On Mon, Nov 02, 2026 at 03:28:02PM +0530, Karthik Poosa wrote:
> When D3cold is supported and allowed, check the root port's ACPI
> transition log across system suspend and resume for a D0 -> D3cold
> transition. Skip the transition assertion if the root port is already
> in D3cold at suspend entry.
>
> Signed-off-by: Karthik Poosa <karthik.poosa@intel.com>
> Assisted-by: LLM
> ---
> tests/intel/xe_pm.c | 234 +++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 221 insertions(+), 13 deletions(-)
>
> diff --git a/tests/intel/xe_pm.c b/tests/intel/xe_pm.c
> index 543f46f5b..2eb70a383 100644
> --- a/tests/intel/xe_pm.c
> +++ b/tests/intel/xe_pm.c
> @@ -12,8 +12,10 @@
> */
>
> #include <dirent.h>
> +#include <errno.h>
> #include <limits.h>
> #include <fcntl.h>
> +#include <stdio.h>
> #include <string.h>
> #include <sys/ioctl.h>
>
> @@ -63,6 +65,9 @@ typedef struct {
>
> uint64_t orig_threshold;
> int fw_handle = -1;
> +static int fd_kmsg = -1;
> +static char d3cold_kmsg_entry[512];
> +static bool acpi_d3cold_debug_enabled_by_test;
>
> static pthread_mutex_t suspend_lock = PTHREAD_MUTEX_INITIALIZER;
> static pthread_cond_t suspend_cond = PTHREAD_COND_INITIALIZER;
> @@ -192,6 +197,120 @@ static void cleanup_d3(device_t device)
> dpms_on_off(device, DRM_MODE_DPMS_ON);
> }
>
> +static int count_kmsg_entries(int kmsg, const char *entry)
> +{
> + char buf[4096];
> + char *kmsg_entry, *p;
> + const unsigned char *src;
> + size_t entry_len = strlen(entry);
> + int count = 0;
> + ssize_t len;
> +
> + igt_assert(entry_len <= (SIZE_MAX - 1) / 4);
> + kmsg_entry = malloc(4 * entry_len + 1);
> + igt_assert(kmsg_entry);
> +
> + /* Match /dev/kmsg's escaping of backslashes and non-printable bytes. */
> + for (src = (const unsigned char *)entry, p = kmsg_entry; *src; src++) {
> + if (*src < ' ' || *src >= 127 || *src == '\\')
> + p += sprintf(p, "\\x%02x", (unsigned int)*src);
> + else
> + *p++ = *src;
> + }
> + *p = '\0';
> +
> + errno = 0;
> + while ((len = read(kmsg, buf, sizeof(buf) - 1)) > 0) {
> + buf[len] = '\0';
> + if (strstr(buf, kmsg_entry)) {
> + igt_debug("Found dmesg entry: %s\n", buf);
> + count++;
> + }
> + }
> +
> + free(kmsg_entry);
> +
> + if (len == 0)
> + return count;
> +
> + igt_assert_f(len == -1 && (errno == EAGAIN || errno == EWOULDBLOCK),
> + "Unexpected /dev/kmsg read result len=%zd errno=%d\n", len, errno);
> +
> + return count;
> +}
> +
> +static void build_rp_d3cold_kmsg_str(struct pci_device *pci_root, char *buf, size_t len)
> +{
> + char path[PATH_MAX], fw_path[256];
> + ssize_t n;
> + int fd;
> +
> + snprintf(path, sizeof(path),
> + "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/firmware_node/path",
> + pci_root->domain, pci_root->bus, pci_root->dev, pci_root->func);
> +
> + fd = open(path, O_RDONLY);
> + igt_require_fd(fd);
> + n = read(fd, fw_path, sizeof(fw_path) - 1);
> + igt_assert_lte(0, (int)n);
> + fw_path[n] = '\0';
> + if (n > 0 && fw_path[n - 1] == '\n')
> + fw_path[n - 1] = '\0';
> + close(fd);
> +
> + snprintf(buf, len, "%s: PM: Power state change: D0 -> D3cold", fw_path);
I'm a bit confused by this message and the order, but I will trust
more your tests...
> +}
> +
> +#define ACPI_DYNDDBG_CONTROL "/sys/kernel/debug/dynamic_debug/control"
> +#define ACPI_D3COLD_DYNDDBG_QUERY \
> + "file drivers/acpi/device_pm.c format \"Power state change: %s -> %s\""
> +
> +static bool acpi_d3cold_debug_is_enabled(void)
> +{
> + char line[1024];
> + FILE *fp;
> + bool enabled = false;
> +
> + fp = fopen(ACPI_DYNDDBG_CONTROL, "r");
> + if (!fp)
> + return false;
> +
> + while (fgets(line, sizeof(line), fp)) {
> + char *message = strstr(line, "Power state change: %s -> %s");
> + char *flags = strchr(line, '=');
> +
> + if (message && flags && flags < message && memchr(flags, 'p', message - flags)) {
> + enabled = true;
> + break;
> + }
> + }
> +
> + fclose(fp);
> + return enabled;
> +}
> +
> +static bool set_acpi_d3cold_debug(bool enable)
> +{
> + FILE *fp;
> + int ret;
> +
> + fp = fopen(ACPI_DYNDDBG_CONTROL, "w");
> + if (!fp)
> + return false;
> +
> + ret = fprintf(fp, "%s %sp\n", ACPI_D3COLD_DYNDDBG_QUERY, enable ? "+" : "-");
> + if (fclose(fp))
> + return false;
> +
> + return ret > 0;
> +}
> +
> +static void restore_acpi_d3cold_debug(int sig)
> +{
> + if (acpi_d3cold_debug_enabled_by_test)
> + set_acpi_d3cold_debug(false);
> +}
> +
> static bool in_d3(device_t device, enum igt_acpi_d_state state)
> {
> uint16_t val;
> @@ -228,6 +347,85 @@ static void close_fw_handle(int sig)
> close(fw_handle);
> }
>
> +static void close_d3cold_kmsg_handle(int sig)
> +{
> + if (fd_kmsg < 0)
> + return;
> +
> + close(fd_kmsg);
> + fd_kmsg = -1;
> +}
> +
> +static void start_d3cold_kmsg_logging(void)
> +{
> + igt_require_fd(fd_kmsg);
> + igt_assert_neq(lseek(fd_kmsg, 0, SEEK_END), -1);
> +}
> +
> +static void check_d3cold_kmsg_count(void)
> +{
> + int count;
> +
> + igt_require_fd(fd_kmsg);
> + count = count_kmsg_entries(fd_kmsg, d3cold_kmsg_entry);
> + igt_info("Root port D3cold entry count=%d\n", count);
> + igt_assert_f(count > 0,
> + "No root port D3cold entry detected during system suspend\n");
> +}
> +
> +static bool d3cold_validation_enabled(device_t device)
> +{
> + uint32_t d3cold_allowed;
> +
> + if (!igt_pm_acpi_d3cold_supported(device.pci_root))
> + return false;
> +
> + igt_pm_get_d3cold_allowed(device.pci_slot_name, &d3cold_allowed);
> +
> + return d3cold_allowed;
> +}
> +
> +static void prepare_d3cold_kmsg(device_t device)
> +{
> + igt_require_f(d3cold_validation_enabled(device),
> + "D3Cold validation requires a D3Cold-capable root port and d3cold_allowed=1\n");
> +
> + if (fd_kmsg < 0) {
> + build_rp_d3cold_kmsg_str(device.pci_root, d3cold_kmsg_entry,
> + sizeof(d3cold_kmsg_entry));
> + fd_kmsg = open("/dev/kmsg", O_RDONLY | O_NONBLOCK);
> + igt_require_fd(fd_kmsg);
> + }
> +
> + if (!acpi_d3cold_debug_is_enabled()) {
> + igt_require_f(set_acpi_d3cold_debug(true),
> + "ACPI D3Cold dynamic debug is unavailable\n");
> + acpi_d3cold_debug_enabled_by_test = true;
> + igt_require_f(acpi_d3cold_debug_is_enabled(),
> + "Failed to enable ACPI D3Cold dynamic debug\n");
> + }
> +}
> +
> +static void suspend_check_d3cold(device_t device, enum igt_suspend_state s_state,
> + enum igt_suspend_test test)
> +{
> + igt_require_f(d3cold_validation_enabled(device),
> + "D3Cold validation requires a D3Cold-capable root port and d3cold_allowed=1\n");
This makes all the generic suspend subtests skip on machines without d3cold.
Please ensure this is only called or checked in d3cold related tests
> +
> + if (igt_pm_get_acpi_real_d_state(device.pci_root) == IGT_ACPI_D3Cold) {
> + igt_info("Root port already in D3cold at suspend entry; skip transition check\n");
> + igt_system_suspend_autoresume(s_state, test);
> + return;
> + }
> +
> + prepare_d3cold_kmsg(device);
> +
> + /* Seek to end before suspend so only new messages are scanned */
> + start_d3cold_kmsg_logging();
> + igt_system_suspend_autoresume(s_state, test);
> + check_d3cold_kmsg_count();
> +}
> +
> #define MAX_VMAS 2
>
> static void*
> @@ -578,7 +776,7 @@ child_exec(void *arguments)
> static void
> test_exec(device_t device, int n_exec_queues, int n_execs,
> enum igt_suspend_state s_state, enum igt_acpi_d_state d_state,
> - unsigned int flags)
> + unsigned int flags, bool validate_d3cold)
> {
> enum igt_suspend_test test = s_state == SUSPEND_STATE_DISK ?
> SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
> @@ -587,6 +785,10 @@ test_exec(device_t device, int n_exec_queues, int n_execs,
> pthread_t threads[65]; /* MAX_ENGINES + 1 */
> child_exec_args args;
>
> + if (validate_d3cold && n_execs > 1 && s_state != NO_SUSPEND) {
> + prepare_d3cold_kmsg(device);
> + }
> +
> xe_for_each_engine(device.fd_xe, eci) {
> args.device = device;
> args.eci = eci;
> @@ -607,7 +809,10 @@ test_exec(device_t device, int n_exec_queues, int n_execs,
> }
>
> if (n_execs > 1 && s_state != NO_SUSPEND) {
> - igt_system_suspend_autoresume(s_state, test);
> + if (validate_d3cold)
> + suspend_check_d3cold(device, s_state, test);
> + else
> + igt_system_suspend_autoresume(s_state, test);
>
> pthread_mutex_lock(&suspend_lock);
> pthread_cond_broadcast(&suspend_cond);
> @@ -845,7 +1050,7 @@ static void test_mocs_suspend_resume(device_t device, enum igt_suspend_state s_s
> enum igt_suspend_test test = s_state == SUSPEND_STATE_DISK ?
> SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
>
> - igt_system_suspend_autoresume(s_state, test);
> + suspend_check_d3cold(device, s_state, test);
> }
> }
> igt_assert(igt_debugfs_exists(device.fd_xe, path, O_RDONLY));
> @@ -981,7 +1186,7 @@ int igt_main()
> igt_device_get_pci_slot_name(device.fd_xe, device.pci_slot_name);
>
> /* Always perform initial once-basic exec checking for health */
> - test_exec(device, 1, 1, NO_SUSPEND, NO_RPM, 0);
> + test_exec(device, 1, 1, NO_SUSPEND, NO_RPM, 0, false);
>
> igt_pm_get_d3cold_allowed(device.pci_slot_name, &d3cold_allowed);
> has_runtime_pm = igt_setup_runtime_pm(device.fd_xe);
> @@ -989,6 +1194,8 @@ int igt_main()
> device.res = drmModeGetResources(device.fd_xe);
>
> igt_install_exit_handler(igt_drm_debug_mask_reset_exit_handler);
> + igt_install_exit_handler(close_d3cold_kmsg_handle);
> + igt_install_exit_handler(restore_acpi_d3cold_debug);
> update_debug_mask_if_ci(DRM_UT_KMS);
> errno = 0;
> }
> @@ -997,28 +1204,28 @@ int igt_main()
> igt_subtest_f("%s-basic", s->name) {
> enum igt_suspend_test test = s->state == SUSPEND_STATE_DISK ?
> SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
> - igt_system_suspend_autoresume(s->state, test);
> + suspend_check_d3cold(device, s->state, test);
s4 shouldn't check for d3cold... I believe not even s3... so, let's limit
the scope of this test
> }
>
> igt_subtest_f("%s-basic-exec", s->name) {
> - test_exec(device, 1, 2, s->state, NO_RPM, 0);
> + test_exec(device, 1, 2, s->state, NO_RPM, 0, true);
> }
>
> igt_subtest_f("%s-exec-after", s->name) {
> enum igt_suspend_test test = s->state == SUSPEND_STATE_DISK ?
> SUSPEND_TEST_DEVICES : SUSPEND_TEST_NONE;
>
> - igt_system_suspend_autoresume(s->state, test);
> - test_exec(device, 1, 2, NO_SUSPEND, NO_RPM, 0);
> + suspend_check_d3cold(device, s->state, test);
> + test_exec(device, 1, 2, NO_SUSPEND, NO_RPM, 0, false);
> }
>
> igt_subtest_f("%s-multiple-execs", s->name) {
> - test_exec(device, 16, 32, s->state, NO_RPM, 0);
> + test_exec(device, 16, 32, s->state, NO_RPM, 0, true);
> }
>
> for (const struct vm_op *op = vm_op; op->name; op++) {
> igt_subtest_f("%s-vm-bind-%s", s->name, op->name) {
> - test_exec(device, 16, 32, s->state, NO_RPM, op->flags);
> + test_exec(device, 16, 32, s->state, NO_RPM, op->flags, true);
> }
> }
>
> @@ -1026,7 +1233,8 @@ int igt_main()
> igt_subtest_f("%s-%s-basic-exec", s->name, d->name) {
> igt_require_f(has_runtime_pm, "Runtime PM not available\n");
> igt_assert(setup_d3(device, d->state));
> - test_exec(device, 1, 2, s->state, NO_RPM, 0);
> + test_exec(device, 1, 2, s->state, NO_RPM, 0,
> + d->state == IGT_ACPI_D3Cold);
> cleanup_d3(device);
> }
> }
> @@ -1050,7 +1258,7 @@ int igt_main()
> igt_subtest_f("%s-basic-exec", d->name) {
> igt_require_f(has_runtime_pm, "Runtime PM not available\n");
> igt_assert(setup_d3(device, d->state));
> - test_exec(device, 1, 1, NO_SUSPEND, d->state, 0);
> + test_exec(device, 1, 1, NO_SUSPEND, d->state, 0, false);
> cleanup_d3(device);
> }
>
> @@ -1065,7 +1273,7 @@ int igt_main()
> igt_subtest_f("%s-multiple-execs", d->name) {
> igt_require_f(has_runtime_pm, "Runtime PM not available\n");
> igt_assert(setup_d3(device, d->state));
> - test_exec(device, 16, 32, NO_SUSPEND, d->state, 0);
> + test_exec(device, 16, 32, NO_SUSPEND, d->state, 0, false);
> cleanup_d3(device);
> }
>
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-11-11 18:48 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-02 9:58 [PATCH i-g-t 0/1] tests/intel/xe_pm: Check root-port D3cold entry Karthik Poosa
2026-11-02 9:58 ` [PATCH i-g-t] tests/intel/xe_pm: Validate root-port D3cold entry on system suspend Karthik Poosa
2026-11-11 18:45 ` Rodrigo Vivi
2026-11-02 19:45 ` ✓ Xe.CI.BAT: success for " Patchwork
2026-11-02 19:46 ` ✓ i915.CI.BAT: " Patchwork
2026-11-02 20:35 ` ✓ Xe.CI.FULL: " Patchwork
2026-11-02 21:31 ` ✓ i915.CI.Full: " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox