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

Antheas Kapenekakis posted 10 patches 1 month, 3 weeks ago
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
[RFC v2 00/10] acpi/x86: s2idle: Introduce and implement hint class ABI and idle hint for s2idle
Posted by Antheas Kapenekakis 1 month, 3 weeks ago
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@antheas.dev>
---

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@antheas.dev/

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
-- 
2.53.0
Re: [RFC v2 00/10] acpi/x86: s2idle: Introduce and implement hint class ABI and idle hint for s2idle
Posted by Dmitry Osipenko 1 month, 1 week ago
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@antheas.dev>
> ---
> 
> 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@antheas.dev/
> 
> 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@collabora.com>

-- 
Best regards,
Dmitry