Message ID | 20191012214735.1127009-1-stefan@agner.ch (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drivers: firmware: psci: use kernel restart handler functionality | expand |
On Sat, Oct 12, 2019 at 11:47:35PM +0200, Stefan Agner wrote: > From: Stefan Agner <stefan.agner@toradex.com> > > Use the kernels restart handler to register the PSCI system reset > capability. The restart handler use notifier chains along with > priorities. This allows to use restart handlers with higher priority > (in case available) while still supporting PSCI. > > Since the ARM handler had priority over the kernels restart handler > before this patch, use a slightly elevated priority of 160 to make > sure PSCI is used before most of the other handlers are called. > There's an attempt(rather pull request[1]) to consolidate these into new system power/restart handler. -- Regards, Sudeep [1] https://lore.kernel.org/linux-arm-kernel/20191002131228.4085560-1-thierry.reding@gmail.com
Hi Sudeep, On 2019-10-14 12:07, Sudeep Holla wrote: > On Sat, Oct 12, 2019 at 11:47:35PM +0200, Stefan Agner wrote: >> From: Stefan Agner <stefan.agner@toradex.com> >> >> Use the kernels restart handler to register the PSCI system reset >> capability. The restart handler use notifier chains along with >> priorities. This allows to use restart handlers with higher priority >> (in case available) while still supporting PSCI. >> >> Since the ARM handler had priority over the kernels restart handler >> before this patch, use a slightly elevated priority of 160 to make >> sure PSCI is used before most of the other handlers are called. >> > > There's an attempt(rather pull request[1]) to consolidate these into new > system power/restart handler. Oh thanks for the pointer! Interesting timing :-) -- Stefan > > -- > Regards, > Sudeep > > [1] > https://lore.kernel.org/linux-arm-kernel/20191002131228.4085560-1-thierry.reding@gmail.com
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c index 84f4ff351c62..d8677b54132f 100644 --- a/drivers/firmware/psci/psci.c +++ b/drivers/firmware/psci/psci.c @@ -82,6 +82,7 @@ static u32 psci_function_id[PSCI_FN_MAX]; static u32 psci_cpu_suspend_feature; static bool psci_system_reset2_supported; +static struct notifier_block psci_restart_handler; static inline bool psci_has_ext_power_state(void) { @@ -250,7 +251,8 @@ static int get_set_conduit_method(struct device_node *np) return 0; } -static void psci_sys_reset(enum reboot_mode reboot_mode, const char *cmd) +static int psci_sys_reset(struct notifier_block *this, + unsigned long reboot_mode, void *cmd) { if ((reboot_mode == REBOOT_WARM || reboot_mode == REBOOT_SOFT) && psci_system_reset2_supported) { @@ -263,6 +265,8 @@ static void psci_sys_reset(enum reboot_mode reboot_mode, const char *cmd) } else { invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0); } + + return NOTIFY_DONE; } static void psci_sys_poweroff(void) @@ -411,6 +415,8 @@ static void __init psci_init_smccc(void) static void __init psci_0_2_set_functions(void) { + int ret; + pr_info("Using standard PSCI v0.2 function IDs\n"); psci_ops.get_version = psci_get_version; @@ -431,7 +437,14 @@ static void __init psci_0_2_set_functions(void) psci_ops.migrate_info_type = psci_migrate_info_type; - arm_pm_restart = psci_sys_reset; + psci_restart_handler.notifier_call = psci_sys_reset; + psci_restart_handler.priority = 160; + + ret = register_restart_handler(&psci_restart_handler); + if (ret) { + pr_err("Cannot register restart handler, %d\n", ret); + return; + } pm_power_off = psci_sys_poweroff; }