summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorTom Chung <chiahsuan.chung@amd.com>2025-03-11 16:13:36 +0800
committerAlex Hung <alex.hung@amd.com>2025-03-13 10:53:53 -0600
commit6796e79abba2893f34b6df41a190fcf4ea879ddd (patch)
tree3d7c011e9ea8782fb71507a907c968f60da97b42 /tests
parente582faa38f9466303b4634a60053c3201dae9539 (diff)
tests/amdgpu/amd_hotplug: Check the suspend state after resume
[Why & How] Check the last hardware sleep state after resume to make sure last suspend really reached hardware sleep state. Make sure to enable the suspend related settings in kernel config Linux Kernel Configuration └─>Power management and ACPI options Suspend to RAM and standby ACPI (Advanced Configuration and Power Interface) Support Signed-off-by: Tom Chung <chiahsuan.chung@amd.com> Reviewed-by: Alex Hung <alex.hung@amd.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/amdgpu/amd_hotplug.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/amdgpu/amd_hotplug.c b/tests/amdgpu/amd_hotplug.c
index c13bf49d3..ee3256c0b 100644
--- a/tests/amdgpu/amd_hotplug.c
+++ b/tests/amdgpu/amd_hotplug.c
@@ -27,6 +27,8 @@ IGT_TEST_DESCRIPTION("Test simulated hotplugging on connectors");
/* Maximum pipes on any AMD ASIC. */
#define MAX_PIPES 6
+#define LAST_HW_SLEEP_PATH "/sys/power/suspend_stats/last_hw_sleep"
+#define MEM_SLEEP_PATH "/sys/power/mem_sleep"
/* Common test data. */
typedef struct data {
@@ -98,6 +100,46 @@ static void test_fini(data_t *data)
igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, 0);
}
+/* Check if mem_sleep is s2idle */
+static bool is_system_s2idle(void)
+{
+ int fd;
+ char dst[64];
+ int read_byte;
+
+ fd = open(MEM_SLEEP_PATH, O_RDONLY);
+ if (fd == -1)
+ igt_skip("Open %s file error\n", MEM_SLEEP_PATH);
+
+ read_byte = read(fd, dst, sizeof(dst));
+ close(fd);
+
+ if (read_byte <= 0)
+ igt_skip("Read %s file error\n", MEM_SLEEP_PATH);
+
+ return strstr(dst, "[s2idle]");
+}
+
+/* return the last hw_sleep duration time */
+static int get_last_hw_sleep_time(void)
+{
+ int fd;
+ char dst[64];
+ int read_byte;
+
+ fd = open(LAST_HW_SLEEP_PATH, O_RDONLY);
+ if (fd == -1)
+ igt_skip("Open HW sleep statistics file error\n");
+
+ read_byte = read(fd, dst, sizeof(dst));
+ close(fd);
+
+ if (read_byte <= 0)
+ igt_skip("Read HW sleep statistics file error\n");
+
+ return strtol(dst, NULL, 10);
+}
+
static void test_hotplug_basic(data_t *data, bool suspend)
{
igt_output_t *output;
@@ -131,8 +173,13 @@ static void test_hotplug_basic(data_t *data, bool suspend)
}
if (suspend) {
+ if (!is_system_s2idle())
+ igt_skip("System is not configured for s2idle\n");
+
igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
SUSPEND_TEST_NONE);
+ igt_assert_f(get_last_hw_sleep_time() > 0,
+ "Suspend did not reach hardware sleep state\n");
}
/* Trigger hotplug and confirm reference image is the same. */