mbox series

[v6,0/6] Add PSCI v1.3 SYSTEM_OFF2 support for hibernation

Message ID 20241019172459.2241939-1-dwmw2@infradead.org
Headers show
Series Add PSCI v1.3 SYSTEM_OFF2 support for hibernation | expand

Message

David Woodhouse Oct. 19, 2024, 5:15 p.m. UTC
The PSCI v1.3 spec (https://developer.arm.com/documentation/den0022)
adds support for a SYSTEM_OFF2 function enabling a HIBERNATE_OFF state
which is analogous to ACPI S4. This will allow hosting environments to
determine that a guest is hibernated rather than just powered off, and
ensure that they preserve the virtual environment appropriately to
allow the guest to resume safely (or bump the hardware_signature in the
FACS to trigger a clean reboot instead).

This updates KVM to support advertising PSCI v1.3, and unconditionally
enables the SYSTEM_OFF2 support when PSCI v1.3 is enabled.

For the guest side, add a new SYS_OFF_MODE_POWER_OFF handler with higher
priority than the EFI one, but which *only* triggers when there's a
hibernation in progress. There are other ways to do this (see the commit
message for more details) but this seemed like the simplest.

Version 2 of the patch series splits out the psci.h definitions into a
separate commit (a dependency for both the guest and KVM side), and adds
definitions for the other new functions added in v1.3. It also moves the
pKVM psci-relay support to a separate commit; although in arch/arm64/kvm
that's actually about the *guest* side of SYSTEM_OFF2 (i.e. using it
from the host kernel, relayed through nVHE).

Version 3 dropped the KVM_CAP which allowed userspace to explicitly opt
in to the new feature like with SYSTEM_SUSPEND, and makes it depend only
on PSCI v1.3 being exposed to the guest.

Version 4 is no longer RFC, as the PSCI v1.3 spec is finally published.
Minor fixes from the last round of review, and an added KVM self test.

Version 5 drops some of the changes which didn't make it to the final
v1.3 spec, and cleans up a couple of places which still referred to it
as 'alpha' or 'beta'. It also temporarily drops the guest-side patch to
invoke SYSTEM_OFF2 for hibernation, pending confirmation that the final
PSCI v1.3 spec just has a typo where it changed to saying that 0x1
should be passed to mean HIBERNATE_OFF, even though it's advertised as
bit 0. That can be sent under separate cover, and perhaps should have
been anyway. The change in question doesn't matter for any of the KVM
patches, because we just treat SYSTEM_OFF2 like the existing
SYSTEM_RESET2, setting a flag to indicate that it was a SYSTEM_OFF2
call, but not actually caring about the argument; that's for userspace
to worry about.

Version 6 is updated to revision F.b of the specification, allowing both 
0x0 and 0x1 to indicate HIBERNATE_OFF in the SYSTEM_OFF2 call, as well 
as disallowing anything but zero in the second argument. The test is 
expanded to cover those variants, and to require PSCI v1.3 instead of 
skipping on older kernels. The final guest-side patch in the series is 
reinstated, using zero as the argument for compatibility with existing 
hypervisors in the field as permitted by revision F.b. allows for zero 
as well as 0x1 for HIBERNATE_OFF to accommodate the change in the final 
version of the spec, and expands the test to cover both forms as well as 
checking that a non-zero second argument is correctly rejected.

David Woodhouse (6):
      firmware/psci: Add definitions for PSCI v1.3 specification
      KVM: arm64: Add PSCI v1.3 SYSTEM_OFF2 function for hibernation
      KVM: arm64: Add support for PSCI v1.2 and v1.3
      KVM: selftests: Add test for PSCI SYSTEM_OFF2
      KVM: arm64: nvhe: Pass through PSCI v1.3 SYSTEM_OFF2 call
      arm64: Use SYSTEM_OFF2 PSCI call to power off for hibernate

 Documentation/virt/kvm/api.rst                  | 11 +++
 arch/arm64/include/uapi/asm/kvm.h               |  6 ++
 arch/arm64/kvm/hyp/nvhe/psci-relay.c            |  2 +
 arch/arm64/kvm/hypercalls.c                     |  2 +
 arch/arm64/kvm/psci.c                           | 50 ++++++++++++-
 drivers/firmware/psci/psci.c                    | 42 +++++++++++
 include/kvm/arm_psci.h                          |  4 +-
 include/uapi/linux/psci.h                       |  5 ++
 kernel/power/hibernate.c                        |  5 +-
 tools/testing/selftests/kvm/aarch64/psci_test.c | 93 +++++++++++++++++++++++++
 10 files changed, 217 insertions(+), 3 deletions(-)

Comments

Oliver Upton Oct. 31, 2024, 5:56 p.m. UTC | #1
On Sat, 19 Oct 2024 18:15:41 +0100, David Woodhouse wrote:
> The PSCI v1.3 spec (https://developer.arm.com/documentation/den0022)
> adds support for a SYSTEM_OFF2 function enabling a HIBERNATE_OFF state
> which is analogous to ACPI S4. This will allow hosting environments to
> determine that a guest is hibernated rather than just powered off, and
> ensure that they preserve the virtual environment appropriately to
> allow the guest to resume safely (or bump the hardware_signature in the
> FACS to trigger a clean reboot instead).
> 
> [...]

Thanks Catalin for the ack, as promised:

Applied to kvmarm/next, thanks!

[6/6] arm64: Use SYSTEM_OFF2 PSCI call to power off for hibernate
      https://git.kernel.org/kvmarm/kvmarm/c/3e251afaec9a

--
Best,
Oliver
David Woodhouse Oct. 31, 2024, 6:01 p.m. UTC | #2
On Thu, 2024-10-31 at 17:56 +0000, Oliver Upton wrote:
> On Sat, 19 Oct 2024 18:15:41 +0100, David Woodhouse wrote:
> > The PSCI v1.3 spec (https://developer.arm.com/documentation/den0022)
> > adds support for a SYSTEM_OFF2 function enabling a HIBERNATE_OFF state
> > which is analogous to ACPI S4. This will allow hosting environments to
> > determine that a guest is hibernated rather than just powered off, and
> > ensure that they preserve the virtual environment appropriately to
> > allow the guest to resume safely (or bump the hardware_signature in the
> > FACS to trigger a clean reboot instead).
> > 
> > [...]
> 
> Thanks Catalin for the ack, as promised:
> 
> Applied to kvmarm/next, thanks!
> 
> [6/6] arm64: Use SYSTEM_OFF2 PSCI call to power off for hibernate
>       https://git.kernel.org/kvmarm/kvmarm/c/3e251afaec9a

Thank you.