On Tue, Sep 09, 2025 at 02:16:18PM -0500, Mario Limonciello (AMD) wrote:
> When the system is powered off the kernel will call device_shutdown()
> which will issue callbacks into PCI core to wake up a device and call
> it's shutdown() callback.  This will leave devices in ACPI D0 which can
> cause some devices to misbehave with spurious wakeups and also leave some
> devices on which will consume power needlessly.

The connection between this change and spurious wakeups seems pretty
tenuous.  If we don't want wakeups, powering off the device seems like
a sledgehammer approach.

s/it's/its/

> The issue won't happen if the device is in D3 before system shutdown, so
> putting device to low power state before shutdown solves the issue.
> 
> ACPI Spec 6.5, "7.4.2.5 System \_S4 State" says "Devices states are
> compatible with the current Power Resource states. In other words, all
> devices are in the D3 state when the system state is S4."

Re patch 05/12, also interesting that this section mentions "devices
that are enabled to wake the system and that can do so from their
device state in S4 can initiate a hardware event that transitions the
system state to S0."

So it looks like wakeup from S4 should work in at least some cases.

> The following "7.4.2.6 System \_S5 State (Soft Off)" states "The S5
> state is similar to the S4 state except that OSPM does not save any
> context." so it's safe to assume devices should be at D3 for S5.
> 
> To accomplish this, use the PMSG_POWEROFF event to call all the device
> hibernate callbacks when the kernel is compiled with hibernate support.
> If compiled without hibernate support or hibernate fails fall back into
> the previous shutdown flow.
> 
> Cc: AceLan Kao <[email protected]>
> Cc: Kai-Heng Feng <[email protected]>
> Cc: Mark Pearson <[email protected]>
> Cc: Merthan Karakaş <[email protected]>
> Tested-by: Eric Naim <[email protected]>
> Tested-by: Denis Benato <[email protected]>
> Link: 
> https://lore.kernel.org/linux-pci/[email protected]/
> Link: 
> https://lore.kernel.org/linux-pci/[email protected]/
> Signed-off-by: Mario Limonciello (AMD) <[email protected]>
> ---
> v5:
>  * split to multiple commits, re-order
> v4:
>  * 
> https://lore.kernel.org/linux-pci/[email protected]/
> v3:
>  * Add new PMSG_POWEROFF and PM_EVENT_POWEROFF which alias to poweroff
>    callbacks
>  * Don't try to cleanup on dpm_suspend_start() or dpm_suspend_end() failures
>    Jump right into normal shutdown flow instead.
>  * 
> https://lore.kernel.org/linux-pm/[email protected]/T/#me6db0fb946e3d604a8f3d455128844ed802c82bb
> ---
>  kernel/reboot.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/kernel/reboot.c b/kernel/reboot.c
> index ec087827c85cd..c8835f8e5f271 100644
> --- a/kernel/reboot.c
> +++ b/kernel/reboot.c
> @@ -13,6 +13,7 @@
>  #include <linux/kexec.h>
>  #include <linux/kmod.h>
>  #include <linux/kmsg_dump.h>
> +#include <linux/pm.h>
>  #include <linux/reboot.h>
>  #include <linux/suspend.h>
>  #include <linux/syscalls.h>
> @@ -305,6 +306,11 @@ static void kernel_shutdown_prepare(enum system_states 
> state)
>               (state == SYSTEM_HALT) ? SYS_HALT : SYS_POWER_OFF, NULL);
>       system_state = state;
>       usermodehelper_disable();
> +#ifdef CONFIG_HIBERNATE_CALLBACKS
> +     if (!dpm_suspend_start(PMSG_POWEROFF) && 
> !dpm_suspend_end(PMSG_POWEROFF))
> +             return;
> +     pr_emerg("Failed to power off devices, using shutdown instead.\n");
> +#endif
>       device_shutdown();
>  }
>  /**
> -- 
> 2.43.0
> 

Reply via email to