From 6796e79abba2893f34b6df41a190fcf4ea879ddd Mon Sep 17 00:00:00 2001
From: Tom Chung <chiahsuan.chung@amd.com>
Date: Tue, 11 Mar 2025 16:13:36 +0800
Subject: [PATCH] tests/amdgpu/amd_hotplug: Check the suspend state after
 resume
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

[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>
---
 tests/amdgpu/amd_hotplug.c | 47 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

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. */
-- 
GitLab