Message ID | 20191028121043.22934-5-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/12] riscv: abstract out CSR names for supervisor vs machine mode | expand |
On Mon, 28 Oct 2019, Christoph Hellwig wrote: > Move the sbi poweroff to a separate function and file that is only > compiled if CONFIG_SBI is set. Provide a new default fallback > power off that just sits in a wfi loop to save some power. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Anup Patel <anup@brainfault.org> > Reviewed-by: Atish Patra <atish.patra@wdc.com> Thanks, I've split the WFI optimization out into a separate patch (below) and queued it for v5.5-rc1. - Paul From: Christoph Hellwig <hch@lst.de> Date: Wed, 30 Oct 2019 16:11:47 -0700 Subject: [PATCH] riscv: enter WFI in default_power_off() if SBI does not shutdown Provide a new default fallback power off that just sits in a wfi loop to save some power. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Atish Patra <atish.patra@wdc.com> [paul.walmsley@sifive.com: split the WFI improvement apart from the nommu-related default_power_off() changes; wrote commit summary] Signed-off-by: Paul Walmsley <paul.walmsley@sifive.com> --- arch/riscv/kernel/reset.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/riscv/kernel/reset.c b/arch/riscv/kernel/reset.c index aa56bb135ec4..485be426d9b1 100644 --- a/arch/riscv/kernel/reset.c +++ b/arch/riscv/kernel/reset.c @@ -10,7 +10,8 @@ static void default_power_off(void) { sbi_shutdown(); - while (1); + while (1) + wait_for_interrupt(); } void (*pm_power_off)(void) = default_power_off;
On Mon, 28 Oct 2019, Christoph Hellwig wrote: > Move the sbi poweroff to a separate function and file that is only > compiled if CONFIG_SBI is set. Provide a new default fallback > power off that just sits in a wfi loop to save some power. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Anup Patel <anup@brainfault.org> > Reviewed-by: Atish Patra <atish.patra@wdc.com> And here's the other part of this patch, queued for v5.5-rc1. - Paul From: Christoph Hellwig <hch@lst.de> Date: Mon, 28 Oct 2019 13:10:35 +0100 Subject: [PATCH] riscv: cleanup the default power off implementation Move the sbi poweroff to a separate function and file that is only compiled if CONFIG_SBI is set. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Atish Patra <atish.patra@wdc.com> [paul.walmsley@sifive.com: split the WFI fix into a separate patch] Signed-off-by: Paul Walmsley <paul.walmsley@sifive.com> --- arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/reset.c | 2 -- arch/riscv/kernel/sbi.c | 17 +++++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 arch/riscv/kernel/sbi.c diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile index 696020ff72db..d8c35fa93cc6 100644 --- a/arch/riscv/kernel/Makefile +++ b/arch/riscv/kernel/Makefile @@ -41,5 +41,6 @@ obj-$(CONFIG_DYNAMIC_FTRACE) += mcount-dyn.o obj-$(CONFIG_PERF_EVENTS) += perf_event.o obj-$(CONFIG_PERF_EVENTS) += perf_callchain.o obj-$(CONFIG_HAVE_PERF_REGS) += perf_regs.o +obj-$(CONFIG_RISCV_SBI) += sbi.o clean: diff --git a/arch/riscv/kernel/reset.c b/arch/riscv/kernel/reset.c index 485be426d9b1..ee5878d968cc 100644 --- a/arch/riscv/kernel/reset.c +++ b/arch/riscv/kernel/reset.c @@ -5,11 +5,9 @@ #include <linux/reboot.h> #include <linux/pm.h> -#include <asm/sbi.h> static void default_power_off(void) { - sbi_shutdown(); while (1) wait_for_interrupt(); } diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c new file mode 100644 index 000000000000..f6c7c3e82d28 --- /dev/null +++ b/arch/riscv/kernel/sbi.c @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <linux/init.h> +#include <linux/pm.h> +#include <asm/sbi.h> + +static void sbi_power_off(void) +{ + sbi_shutdown(); +} + +static int __init sbi_init(void) +{ + pm_power_off = sbi_power_off; + return 0; +} +early_initcall(sbi_init);
diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile index 696020ff72db..d8c35fa93cc6 100644 --- a/arch/riscv/kernel/Makefile +++ b/arch/riscv/kernel/Makefile @@ -41,5 +41,6 @@ obj-$(CONFIG_DYNAMIC_FTRACE) += mcount-dyn.o obj-$(CONFIG_PERF_EVENTS) += perf_event.o obj-$(CONFIG_PERF_EVENTS) += perf_callchain.o obj-$(CONFIG_HAVE_PERF_REGS) += perf_regs.o +obj-$(CONFIG_RISCV_SBI) += sbi.o clean: diff --git a/arch/riscv/kernel/reset.c b/arch/riscv/kernel/reset.c index d0fe623bfb8f..5e4e69859af1 100644 --- a/arch/riscv/kernel/reset.c +++ b/arch/riscv/kernel/reset.c @@ -4,12 +4,11 @@ */ #include <linux/reboot.h> -#include <asm/sbi.h> static void default_power_off(void) { - sbi_shutdown(); - while (1); + while (1) + wait_for_interrupt(); } void (*pm_power_off)(void) = default_power_off; diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c new file mode 100644 index 000000000000..f6c7c3e82d28 --- /dev/null +++ b/arch/riscv/kernel/sbi.c @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <linux/init.h> +#include <linux/pm.h> +#include <asm/sbi.h> + +static void sbi_power_off(void) +{ + sbi_shutdown(); +} + +static int __init sbi_init(void) +{ + pm_power_off = sbi_power_off; + return 0; +} +early_initcall(sbi_init);