Re: [RFC v2 00/10] acpi/x86: s2idle: Introduce and implement hint class ABI and idle hint for s2idle

From: Dmitry Osipenko

Date: Tue May 12 2026 - 23:12:31 EST


Hello Antheas,

On 4/26/26 00:57, Antheas Kapenekakis wrote:
> This is a two-part RFC series that in the first part cleans up the Modern
> Standby firmware notification order and in the second part exposes them to
> userspace using a new hint class ABI that can be extended in the future to
> add more userspace hints to devices.
>
> For more information, see the V1 description.
>
> In the first part, we begin by renaming the s2idle.c constants to match
> their spec from Windows. Following, we place all MS firmware notifications
> to begin() and end() to match Windows, ensuring that the USB subsystems and
> EC are active when they fire, eliminating a class of bugs due to the
> mismatch. Finally, we add a small delay quirk to begin that is required by
> ROG Ally devices, which is bound to asus-wmi through the handler interface
> exposed by s2idle.
>
> Since these bugs completely fix the sleep behavior for all models and
> firmware versions of Ally devices, including those introduced with the
> previous suspend fixes when mcu_powersave is off (which is part of the
> reason the driver forced it to on; not just standby battery drain), a
> cleanup follows that removes the duplicate handling of CSEE (the underlying
> function of the Display On/Off _DSMs and which malfunctioned because the
> USB subsystem was suspended during its calls) and the now unnecessary
> firmware version checks and error logging.
>
> In the second part, a new /sys/class/hint interface is introduced with an
> initial hint, "idle", which allows modifying the idle state of the device.
> I chose the name "idle" instead of "activity" to leave "activity" free to
> use in the future for e.g. "gaming", "video", which might be useful
> especially for embedded devices. "idle" might alias with "s2idle" so the
> name is not set in stone.
>
> Each driver that wants to implement hints can register a hint class and add
> hints to it, which are then exposed in /sys/class/hint/<class>/idle
> allowing them to receive updates as well. Current WMI drivers should not,
> as their behavior is already handled by the initial s2idle idle hint.
> However, non-MS devices can e.g. the ChromeOS EC or even the CPU scheduler.
>
> The two parts are designed to be independent of each other, so that we can
> merge the re-order in an initial kernel version and the hint interface in a
> later kernel version, if needed. As such, after the first part is cleaned
> up it will be resent as non-RFC and the Asus/hid/px86 maintainers will be
> cc'd. Then, we will iterate on the hint interface.
>
> To test this series, it is recommended to enable logs with:
>
> sudo bash -c "cat > /sys/kernel/debug/dynamic_debug/control" << EOF
> file drivers/acpi/x86/s2idle.c +p
> file kernel/power/suspend.c +p
> file drivers/base/hint.c +p
> EOF
> echo 1 | sudo tee /sys/power/pm_debug_messages
>
> Here are some commands afterwards:
>
> echo "active" | sudo tee /sys/class/hint/s2idle/idle; cat /sys/class/hint/s2idle/idle
> echo "inactive" | sudo tee /sys/class/hint/s2idle/idle; cat /sys/class/hint/s2idle/idle
> echo "snooze" | sudo tee /sys/class/hint/s2idle/idle; cat /sys/class/hint/s2idle/idle
>
> I have not tested this series on Ally devices yet, focusing on the Z13.
> A previous version of the series performed correctly and is what was used
> in e.g., Bazzite, with around 5-10k Ally users.
>
> Signed-off-by: Antheas Kapenekakis <lkml@xxxxxxxxxxx>
> ---
>
> Changes since v1:
> - Rebase to v7.0
> - Other than the first patch, the rest are re-written.
> - The hint class is based on a simplified version of platform-profiles
> - Transition handling is now done in s2idle.c exclusively and is not
> part of the main ABI. Drivers receive idle hints updates instead.
> - The rename patch now also renames upstream ACPI_MS_TURN_ON_DISPLAY to
> ACPI_LPS0_TURN_ON_DISPLAY for consistency. It is also fired
> unconditionally now by the transition handler in patch n-1.
>
> V1: https://lore.kernel.org/all/20251226102656.6296-1-lkml@xxxxxxxxxxx/
>
> Antheas Kapenekakis (10):
> acpi/x86: s2idle: Rename LPS0 constants so they mirror their function
> acpi/x86: s2idle: Move Modern Standby calls to s2idle begin/end
> acpi/x86: s2idle: Add support for adding a delay after begin MS calls
> platform/x86: asus-wmi: add s2idle begin delay for Ally devices
> HID: asus: remove quirk handling for Ally devices
> platform/x86: asus-wmi: Remove Ally s2idle resume fixes
> Documentation: Add documentation for the new sysfs hints class
> hint: Add hint class ABI for devices to receive updates on host
> activity
> acpi/x86: s2idle: Listen to idle hints to perform MS transitions
> acpi/x86: s2idle: Subtract delay from last DSM fire in begin delay
>
> Documentation/ABI/testing/sysfs-class-hint | 78 ++++++
> MAINTAINERS | 8 +
> drivers/acpi/Kconfig | 1 +
> drivers/acpi/x86/s2idle.c | 309 ++++++++++++++++-----
> drivers/base/Kconfig | 3 +
> drivers/base/Makefile | 1 +
> drivers/base/hint.c | 283 +++++++++++++++++++
> drivers/hid/hid-asus.c | 113 +-------
> drivers/platform/x86/asus-nb-wmi.c | 40 +++
> drivers/platform/x86/asus-wmi.c | 132 +--------
> drivers/platform/x86/asus-wmi.h | 14 +
> include/linux/acpi.h | 1 +
> include/linux/hint.h | 38 +++
> include/linux/platform_data/x86/asus-wmi.h | 8 -
> 14 files changed, 727 insertions(+), 302 deletions(-)
> create mode 100644 Documentation/ABI/testing/sysfs-class-hint
> create mode 100644 drivers/base/hint.c
> create mode 100644 include/linux/hint.h
>
>
> base-commit: 028ef9c96e96197026887c0f092424679298aae8

The v2 patches work well on my setup, the hint sysfs works. No problems
was spotted.

Tested-by: Dmitry Osipenko <dmitry.osipenko@xxxxxxxxxxxxx>

--
Best regards,
Dmitry