On Tue, Sep 9, 2025 at 9:16 PM Mario Limonciello (AMD)
<supe...@kernel.org> wrote:
>
> PMSG_POWEROFF will be used for the PM core to allow differentiating between
> a hibernation or shutdown sequence when re-using callbacks.
>
> This event should not have wakeups enabled

Why?

It surely is valid to wake up the system while it is being powered
off, especially in the hibernation case.

The "poweroff" transition is generally not recoverable, however, so it
may be better to complete it and trigger a reboot if wakeup has been
signaled.

> so update PMSG_NO_WAKEUP() to match it as well.

No, please.

> Tested-by: Eric Naim <dn...@cachyos.org>
> Signed-off-by: Mario Limonciello (AMD) <supe...@kernel.org>
> ---
> v7:
>  * Reword commit
> v5:
>  * Re-order and split
>  * Add tags
> v4:
>  * 
> https://lore.kernel.org/linux-pci/20250616175019.3471583-1-supe...@kernel.org/
> ---
>  drivers/base/power/main.c    | 7 +++++++
>  include/linux/pm.h           | 5 ++++-
>  include/trace/events/power.h | 3 ++-
>  3 files changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
> index 2ea6e05e6ec90..86661c94e8cef 100644
> --- a/drivers/base/power/main.c
> +++ b/drivers/base/power/main.c
> @@ -99,6 +99,8 @@ static const char *pm_verb(int event)
>                 return "restore";
>         case PM_EVENT_RECOVER:
>                 return "recover";
> +       case PM_EVENT_POWEROFF:
> +               return "poweroff";
>         default:
>                 return "(unknown PM event)";
>         }
> @@ -369,6 +371,7 @@ static pm_callback_t pm_op(const struct dev_pm_ops *ops, 
> pm_message_t state)
>         case PM_EVENT_FREEZE:
>         case PM_EVENT_QUIESCE:
>                 return ops->freeze;
> +       case PM_EVENT_POWEROFF:
>         case PM_EVENT_HIBERNATE:
>                 return ops->poweroff;
>         case PM_EVENT_THAW:
> @@ -403,6 +406,7 @@ static pm_callback_t pm_late_early_op(const struct 
> dev_pm_ops *ops,
>         case PM_EVENT_FREEZE:
>         case PM_EVENT_QUIESCE:
>                 return ops->freeze_late;
> +       case PM_EVENT_POWEROFF:
>         case PM_EVENT_HIBERNATE:
>                 return ops->poweroff_late;
>         case PM_EVENT_THAW:
> @@ -437,6 +441,7 @@ static pm_callback_t pm_noirq_op(const struct dev_pm_ops 
> *ops, pm_message_t stat
>         case PM_EVENT_FREEZE:
>         case PM_EVENT_QUIESCE:
>                 return ops->freeze_noirq;
> +       case PM_EVENT_POWEROFF:
>         case PM_EVENT_HIBERNATE:
>                 return ops->poweroff_noirq;
>         case PM_EVENT_THAW:
> @@ -1370,6 +1375,8 @@ static pm_message_t resume_event(pm_message_t 
> sleep_state)
>                 return PMSG_RECOVER;
>         case PM_EVENT_HIBERNATE:
>                 return PMSG_RESTORE;
> +       case PM_EVENT_POWEROFF:
> +               return PMSG_ON;
>         }
>         return PMSG_ON;
>  }
> diff --git a/include/linux/pm.h b/include/linux/pm.h
> index cc7b2dc28574c..892bd93f13dad 100644
> --- a/include/linux/pm.h
> +++ b/include/linux/pm.h
> @@ -507,6 +507,7 @@ const struct dev_pm_ops name = { \
>   * RECOVER     Creation of a hibernation image or restoration of the main
>   *             memory contents from a hibernation image has failed, call
>   *             ->thaw() and ->complete() for all devices.
> + * POWEROFF    System will poweroff, call ->poweroff() for all devices.
>   *
>   * The following PM_EVENT_ messages are defined for internal use by
>   * kernel subsystems.  They are never issued by the PM core.
> @@ -537,6 +538,7 @@ const struct dev_pm_ops name = { \
>  #define PM_EVENT_USER          0x0100
>  #define PM_EVENT_REMOTE                0x0200
>  #define PM_EVENT_AUTO          0x0400
> +#define PM_EVENT_POWEROFF      0x0800
>
>  #define PM_EVENT_SLEEP         (PM_EVENT_SUSPEND | PM_EVENT_HIBERNATE)
>  #define PM_EVENT_USER_SUSPEND  (PM_EVENT_USER | PM_EVENT_SUSPEND)
> @@ -551,6 +553,7 @@ const struct dev_pm_ops name = { \
>  #define PMSG_QUIESCE   ((struct pm_message){ .event = PM_EVENT_QUIESCE, })
>  #define PMSG_SUSPEND   ((struct pm_message){ .event = PM_EVENT_SUSPEND, })
>  #define PMSG_HIBERNATE ((struct pm_message){ .event = PM_EVENT_HIBERNATE, })
> +#define PMSG_POWEROFF  ((struct pm_message){ .event = PM_EVENT_POWEROFF, })
>  #define PMSG_RESUME    ((struct pm_message){ .event = PM_EVENT_RESUME, })
>  #define PMSG_THAW      ((struct pm_message){ .event = PM_EVENT_THAW, })
>  #define PMSG_RESTORE   ((struct pm_message){ .event = PM_EVENT_RESTORE, })
> @@ -568,7 +571,7 @@ const struct dev_pm_ops name = { \
>
>  #define PMSG_IS_AUTO(msg)      (((msg).event & PM_EVENT_AUTO) != 0)
>  #define PMSG_NO_WAKEUP(msg)    (((msg).event & \
> -                               (PM_EVENT_FREEZE | PM_EVENT_QUIESCE)) != 0)
> +                               (PM_EVENT_FREEZE | PM_EVENT_QUIESCE | 
> PM_EVENT_POWEROFF)) != 0)
>  /*
>   * Device run-time power management status.
>   *
> diff --git a/include/trace/events/power.h b/include/trace/events/power.h
> index 82904291c2b81..370f8df2fdb4b 100644
> --- a/include/trace/events/power.h
> +++ b/include/trace/events/power.h
> @@ -179,7 +179,8 @@ TRACE_EVENT(pstate_sample,
>                 { PM_EVENT_HIBERNATE, "hibernate" }, \
>                 { PM_EVENT_THAW, "thaw" }, \
>                 { PM_EVENT_RESTORE, "restore" }, \
> -               { PM_EVENT_RECOVER, "recover" })
> +               { PM_EVENT_RECOVER, "recover" }, \
> +               { PM_EVENT_POWEROFF, "poweroff" })
>
>  DEFINE_EVENT(cpu, cpu_frequency,
>
> --
> 2.43.0
>

Reply via email to