[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260127200121.1292216-1-riemenschneiderjakob@gmail.com>
Date: Tue, 27 Jan 2026 21:01:21 +0100
From: Jakob Riemenschneider <riemenschneiderjakob@...il.com>
To: "Rafael J . Wysocki" <rafael@...nel.org>
Cc: Len Brown <lenb@...nel.org>,
lkml@...heas.dev,
linux-acpi@...r.kernel.org,
linux-kernel@...r.kernel.org,
Jakob Riemenschneider <riemenschneiderjakob@...il.com>,
Antheas Kapenekakis <antheas@...heas.dev>
Subject: [PATCH v2] ACPI: x86: s2idle: Invoke Microsoft _DSM Function 9 (Turn On Display)
Windows 11, version 22H2 introduced a new function index (Function 9) to
the Microsoft LPS0 _DSM, titled "Turn On Display Notification".
According to Microsoft documentation, this function signals to the system
firmware that the OS intends to turn on the display when exiting Modern
Standby. This allows the firmware to release Power Limits (PLx) earlier.
Crucially, this patch fixes a functional issue observed on the Lenovo Yoga
Slim 7i Aura (15ILL9), where system fans and keyboard backlights fail to
resume after suspend. Investigation linked shows the EC on this device
turns off these components during sleep but requires the Function 9
notification to wake them up again.
This patch defines the new function index (ACPI_MS_TURN_ON_DISPLAY) and
invokes it in acpi_s2idle_restore_early_lps0(). The execution order is
updated to match the logic of an "intent" signal:
1. LPS0 Exit (Function 6)
2. Turn On Display Intent (Function 9)
3. Modern Standby Exit (Function 8)
4. Screen On (Function 4)
Invoking Function 9 before the Modern Standby Exit ensures the firmware
has time to restore power rails and functionality (like fans) before the
software fully exits the sleep state.
Link: https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-firmware-notifications#turn-on-display-notification-function-9
Link: https://bugzilla.kernel.org/show_bug.cgi?id=220505
Suggested-by: Antheas Kapenekakis <antheas@...heas.dev>
Signed-off-by: Jakob Riemenschneider <riemenschneiderjakob@...il.com>
---
v2:
- Renamed constant from ACPI_LPS0_MS_DISPLAY_ON to ACPI_MS_TURN_ON_DISPLAY per feedback.
- Moved the Function 9 call to occur before MS Exit (Function 8) to act as an intent signal.
drivers/acpi/x86/s2idle.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
index 6d4d06236..de94b57f7 100644
--- a/drivers/acpi/x86/s2idle.c
+++ b/drivers/acpi/x86/s2idle.c
@@ -45,6 +45,7 @@ static const struct acpi_device_id lps0_device_ids[] = {
#define ACPI_LPS0_EXIT 6
#define ACPI_LPS0_MS_ENTRY 7
#define ACPI_LPS0_MS_EXIT 8
+#define ACPI_MS_TURN_ON_DISPLAY 9
/* AMD */
#define ACPI_LPS0_DSM_UUID_AMD "e3f32452-febc-43ce-9039-932122d37721"
@@ -352,6 +353,8 @@ static const char *acpi_sleep_dsm_state_to_str(unsigned int state)
return "lps0 ms entry";
case ACPI_LPS0_MS_EXIT:
return "lps0 ms exit";
+ case ACPI_MS_TURN_ON_DISPLAY:
+ return "lps0 ms turn on display";
}
} else {
switch (state) {
@@ -612,6 +615,9 @@ static void acpi_s2idle_restore_early_lps0(void)
if (lps0_dsm_func_mask_microsoft > 0) {
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
+ /* Intent to turn on display */
+ acpi_sleep_run_lps0_dsm(ACPI_MS_TURN_ON_DISPLAY,
+ lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
/* Modern Standby exit */
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_EXIT,
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
--
2.52.0
Powered by blists - more mailing lists