[PATCH 2/3] s3: Add support for checking last sleep cycle residency

Mario Limonciello mario.limonciello at amd.com
Thu Dec 7 10:19:26 UTC 2023


A good system will spend at least 70% of an s2idle sleep cycle in
a hardware sleep state.  Check for this.

Link: https://bugs.launchpad.net/fwts/+bug/2019728
Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
---
 src/acpi/s3/s3.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/acpi/s3/s3.c b/src/acpi/s3/s3.c
index ba705441..222d9f57 100644
--- a/src/acpi/s3/s3.c
+++ b/src/acpi/s3/s3.c
@@ -33,6 +33,7 @@
 #define PM_SUSPEND_PMUTILS		"pm-suspend"
 #define PM_SUSPEND_HYBRID_PMUTILS	"pm-suspend-hybrid"
 #define PM_SUSPEND_PATH			"/sys/power/mem_sleep"
+#define PM_SUSPEND_LAST_HW_SLEEP	"/sys/power/suspend_stats/last_hw_sleep"
 #define PM_SUSPEND_TOTAL_HW_SLEEP	"/sys/power/suspend_stats/total_hw_sleep"
 #define WAKEUP_SOURCE_PATH		"/sys/kernel/debug/wakeup_sources"
 #define INTEL_PM_S2IDLE_SLP_S0		"/sys/kernel/debug/pmc_core/slp_s0_residency_usec"
@@ -377,6 +378,22 @@ static uint64_t get_uint64_sysfs(const char *path)
 	return val;
 }
 
+/*
+ *  get_last_s2idle_residency()
+ *
+ *  Returns:
+ *  - Hardware sleep residency from the last sleep cycle
+ *  - 0 if it is not available
+ *
+ */
+static uint64_t get_last_s2idle_residency(void)
+{
+	if (access(PM_SUSPEND_LAST_HW_SLEEP, F_OK) != 0)
+		return 0;
+
+	return get_uint64_sysfs(PM_SUSPEND_LAST_HW_SLEEP);
+}
+
 /*
  *  get_total_s2idle_residency()
  *  @fname: Optional parameter to set the filename used to check residency
@@ -562,6 +579,18 @@ static int s3_do_suspend_resume(fwts_framework *fw,
 				    fname, *total_s2idle_residency, residency);
 		}
 		*total_s2idle_residency = residency;
+
+		residency = get_last_s2idle_residency();
+		if (duration > 10 && residency) {
+			float pct = (float)residency / ((float)duration * 1000000) * 100.0;
+			if (pct < 70) {
+				(*s2idle_errors)++;
+				fwts_failed(fw, LOG_LEVEL_HIGH, "S2idleNotDeepest",
+					    "Expected %s to be at least 70%% of the last sleep cycle, got %.2f%%.",
+					    PM_SUSPEND_LAST_HW_SLEEP, pct);
+				} else
+					fwts_log_info(fw, "Spent %.2f%% of %ds in hardware sleep state", pct, duration);
+		}
 	}
 
 	if (duration < delay) {
-- 
2.34.1




More information about the fwts-devel mailing list