]> www.infradead.org Git - users/dwmw2/linux.git/commit
arm64: Use SYSTEM_OFF2 PSCI call to power off for hibernate psci-hibernate psci-hibernate-6
authorDavid Woodhouse <dwmw@amazon.co.uk>
Mon, 11 Mar 2024 13:29:02 +0000 (13:29 +0000)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 18 Oct 2024 20:13:34 +0000 (21:13 +0100)
commit6a1f568e62a64fcb58bc79d52b4c454acd6687f8
tree36bed0e87a35fc689905ccba838e896b6e654483
parent5bf787d1a54007578ce1e716ec386cc4f9bdcb98
arm64: Use SYSTEM_OFF2 PSCI call to power off for hibernate

The PSCI v1.3 specification adds support for a SYSTEM_OFF2 function
which is analogous to ACPI S4 state. This will allow hosting
environments to determine that a guest is hibernated rather than just
powered off, and handle that state appropriately on subsequent launches.

Since commit 60c0d45a7f7a ("efi/arm64: use UEFI for system reset and
poweroff") the EFI shutdown method is deliberately preferred over PSCI
or other methods. So register a SYS_OFF_MODE_POWER_OFF handler which
*only* handles the hibernation, leaving the original PSCI SYSTEM_OFF as
a last resort via the legacy pm_power_off function pointer.

The hibernation code already exports a system_entering_hibernation()
function which is be used by the higher-priority handler to check for
hibernation. That existing function just returns the value of a static
boolean variable from hibernate.c, which was previously only set in the
hibernation_platform_enter() code path. Set the same flag in the simpler
code path around the call to kernel_power_off() too.

An alternative way to hook SYSTEM_OFF2 into the hibernation code would
be to register a platform_hibernation_ops structure with an ->enter()
method which makes the new SYSTEM_OFF2 call. But that would have the
unwanted side-effect of making hibernation take a completely different
code path in hibernation_platform_enter(), invoking a lot of special dpm
callbacks.

Another option might be to add a new SYS_OFF_MODE_HIBERNATE mode, with
fallback to SYS_OFF_MODE_POWER_OFF. Or to use the sys_off_data to
indicate whether the power off is for hibernation.

But this version works and is relatively simple.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Acked-by: Rafael J. Wysocki <rafael@kernel.org>
drivers/firmware/psci/psci.c
kernel/power/hibernate.c