From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 68FB0C433EF for ; Thu, 28 Oct 2021 09:53:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 45C3260FF2 for ; Thu, 28 Oct 2021 09:53:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230054AbhJ1J4D (ORCPT ); Thu, 28 Oct 2021 05:56:03 -0400 Received: from mail-ot1-f44.google.com ([209.85.210.44]:34581 "EHLO mail-ot1-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229775AbhJ1J4A (ORCPT ); Thu, 28 Oct 2021 05:56:00 -0400 Received: by mail-ot1-f44.google.com with SMTP id t17-20020a056830083100b00553ced10177so7601568ots.1; Thu, 28 Oct 2021 02:53:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=uz31be5RzrXoa4uAxe1xyKZoIQd0wtsVVy1gZjyOGeo=; b=jdFl/je3Je6T/jpCHs04XX6ITK/a6Yki3Je6sLTq60sPpv8KU3wjQzb7JSWZUuh8Ea E1WhkuHpY/SLaMOFwPpIcpW+Xb3w8MOgphjjDRjOU6zRKQFs8LWQJUPrEduBRmASipAM bPQUtTZoRe6qAUaZfPajlfft820o9J3COt+JFiSYvJxs2d4XftSLrXqkmtZ+12DcunbJ R0+L1t0K7JjQ4QBEcwn3s7kcGoMHl0l1ysAYkvJ1fQYEdg6YvFOJgKQ+vtBH0LIbABle Pi8Go4QlHquNyrdGZuRIvAtfYxXcaGp+h8VTW0DD1Xmtsuutpo61grFpw7QhkgzyqvZu MFlQ== X-Gm-Message-State: AOAM532in2NVxr1p+JR32IP/S7/gtP+PmtkbO4WLA3C9ycT+YBthrKNW o2W8Dkq0sIqWcv54+iwf4+qJ56qK90vujKrPxmc= X-Google-Smtp-Source: ABdhPJzOhFRTFEQQ+n5tEP/bBwTFb0889hJMVw20FWNyFAcerxAE3whFQ+5AhX1ip3T9ogNIhdu7wA8+/uN9VNCEoX8= X-Received: by 2002:a9d:65c1:: with SMTP id z1mr2411564oth.198.1635414812552; Thu, 28 Oct 2021 02:53:32 -0700 (PDT) MIME-Version: 1.0 References: <20211027211715.12671-1-digetx@gmail.com> <20211027211715.12671-9-digetx@gmail.com> In-Reply-To: <20211027211715.12671-9-digetx@gmail.com> From: "Rafael J. Wysocki" Date: Thu, 28 Oct 2021 11:53:20 +0200 Message-ID: Subject: Re: [PATCH v2 08/45] kernel: Add combined power-off+restart handler call chain API To: Dmitry Osipenko Cc: Thierry Reding , Jonathan Hunter , Lee Jones , "Rafael J . Wysocki" , Mark Brown , Andrew Morton , Guenter Roeck , Russell King , Daniel Lezcano , Andy Shevchenko , Ulf Hansson , Catalin Marinas , Will Deacon , Guo Ren , Geert Uytterhoeven , Greg Ungerer , Joshua Thompson , Thomas Bogendoerfer , Nick Hu , Greentime Hu , Vincent Chen , "James E.J. Bottomley" , Helge Deller , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Paul Walmsley , Palmer Dabbelt , Albert Ou , Yoshinori Sato , Rich Felker , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "the arch/x86 maintainers" , "H. Peter Anvin" , Boris Ostrovsky , Juergen Gross , Stefano Stabellini , Len Brown , Santosh Shilimkar , Krzysztof Kozlowski , Linus Walleij , Chen-Yu Tsai , =?UTF-8?Q?Jonathan_Neusch=C3=A4fer?= , Tony Lindgren , Liam Girdwood , Philipp Zabel , Vladimir Zapolskiy , Avi Fishman , Tomer Maimon , Tali Perry , Patrick Venture , Nancy Yuen , Benjamin Fair , Pavel Machek , Linux ARM , Linux Kernel Mailing List , linux-csky@vger.kernel.org, linux-ia64@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev , linux-riscv@lists.infradead.org, Linux-sh list , xen-devel@lists.xenproject.org, ACPI Devel Maling List , Linux OMAP Mailing List , openbmc@lists.ozlabs.org, linux-tegra , Linux PM Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org On Wed, Oct 27, 2021 at 11:18 PM Dmitry Osipenko wrote: > > SoC platforms often have multiple options of how to perform system's > power-off and restart operations. Meanwhile today's kernel is limited to > a single option. Add combined power-off+restart handler call chain API, > which is inspired by the restart API. The new API provides both power-off > and restart functionality. > > The old pm_power_off method will be kept around till all users are > converted to the new API. > > Current restart API will be replaced by the new unified API since > new API is its superset. The restart functionality of the power-handler > API is built upon the existing restart-notifier APIs. > > In order to ease conversion to the new API, convenient helpers are added > for the common use-cases. They will reduce amount of boilerplate code and > remove global variables. These helpers preserve old behaviour for cases > where only one power-off handler is executed, this is what existing > drivers want, and thus, they could be easily converted to the new API. > Users of the new API should explicitly enable power-off chaining by > setting corresponding flag of the power_handler structure. > > Signed-off-by: Dmitry Osipenko > --- > include/linux/reboot.h | 176 +++++++++++- > kernel/power/hibernate.c | 2 +- > kernel/reboot.c | 601 ++++++++++++++++++++++++++++++++++++++- > 3 files changed, 768 insertions(+), 11 deletions(-) > > diff --git a/include/linux/reboot.h b/include/linux/reboot.h > index b7fa25726323..0ec835338c27 100644 > --- a/include/linux/reboot.h > +++ b/include/linux/reboot.h > @@ -8,10 +8,16 @@ > > struct device; > > -#define SYS_DOWN 0x0001 /* Notify of system down */ > -#define SYS_RESTART SYS_DOWN > -#define SYS_HALT 0x0002 /* Notify of system halt */ > -#define SYS_POWER_OFF 0x0003 /* Notify of system power off */ > +enum reboot_prepare_mode { > + SYS_DOWN = 1, /* Notify of system down */ > + SYS_RESTART = SYS_DOWN, > + SYS_HALT, /* Notify of system halt */ > + SYS_POWER_OFF, /* Notify of system power off */ > +}; > + > +#define RESTART_PRIO_RESERVED 0 > +#define RESTART_PRIO_DEFAULT 128 > +#define RESTART_PRIO_HIGH 192 > > enum reboot_mode { > REBOOT_UNDEFINED = -1, > @@ -49,6 +55,167 @@ int register_restart_handler(struct notifier_block *); > int unregister_restart_handler(struct notifier_block *); > void do_kernel_restart(char *cmd); > > +/* > + * Unified poweroff + restart API. > + */ > + > +#define POWEROFF_PRIO_RESERVED 0 > +#define POWEROFF_PRIO_PLATFORM 1 > +#define POWEROFF_PRIO_DEFAULT 128 > +#define POWEROFF_PRIO_HIGH 192 > +#define POWEROFF_PRIO_FIRMWARE 224 > + > +enum poweroff_mode { > + POWEROFF_NORMAL = 0, > + POWEROFF_PREPARE, > +}; > + > +struct power_off_data { > + void *cb_data; > +}; > + > +struct power_off_prep_data { > + void *cb_data; > +}; > + > +struct restart_data { > + void *cb_data; > + const char *cmd; > + enum reboot_mode mode; > +}; > + > +struct reboot_prep_data { > + void *cb_data; > + const char *cmd; > + enum reboot_prepare_mode mode; > +}; > + > +struct power_handler_private_data { > + struct notifier_block reboot_prep_nb; > + struct notifier_block power_off_nb; > + struct notifier_block restart_nb; > + void (*trivial_power_off_cb)(void); > + void (*simple_power_off_cb)(void *data); > + void *simple_power_off_cb_data; > + bool registered; > +}; > + > +/** > + * struct power_handler - Machine power-off + restart handler > + * > + * Describes power-off and restart handlers which are invoked by kernel > + * to power off or restart this machine. Supports prioritized chaining for > + * both restart and power-off handlers. Callback's priority must be unique. > + * Intended to be used by device drivers that are responsible for restarting > + * and powering off hardware which kernel is running on. > + * > + * Struct power_handler can be static. Members of this structure must not be > + * altered while handler is registered. > + * > + * Fill the structure members and pass it to register_power_handler(). > + */ > +struct power_handler { The name of this structure is too generic IMV. There are many things that it might apply to in principle. What about calling power_off_handler or sys_off_handler as it need not be about power at all?