* [RFC v2 PATCH 0/1] riscv: Introduce system suspend support
@ 2023-01-18 18:03 Andrew Jones
2023-01-18 18:03 ` [RFC v2 PATCH 1/1] riscv: sbi: " Andrew Jones
0 siblings, 1 reply; 5+ messages in thread
From: Andrew Jones @ 2023-01-18 18:03 UTC (permalink / raw)
To: linux-riscv
Cc: 'Ley Foon Tan ', 'Palmer Dabbelt ',
'Sia Jee Heng ', 'Paul Walmsley ',
'Albert Ou ', 'Anup Patel '
Booting with an OpenSBI including the RFC series[1] implementing the
draft proposal for SBI system suspend[2] we can add system support to
Linux. This support implements "suspend-to-RAM", which means when a
kernel is built with CONFIG_SUSPEND 'echo mem > /sys/power/state' will
initiate a suspension.
This has only been tested on QEMU using the OpenSBI system suspend
test. The test just waits 5 seconds and then resumes. To truly use
system suspend a platform must have a low-level firmware implementation
and provide at least one wake-up event, such as from a wakeup-capable
RTC alarm, to resume.
[1] https://github.com/jones-drew/opensbi/commits/susp-v1
Posting: http://lists.infradead.org/pipermail/opensbi/2023-January/004260.html
[2] https://github.com/jones-drew/riscv-sbi-doc/commit/d9e43e9a938fc3eb510e023c3f352462876f7785
Posting: https://lists.riscv.org/g/tech-prs/message/75
This patch is also available at
https://github.com/jones-drew/linux/commits/riscv/sbi-susp-rfc
Note, this is a v2 of an RFC because I'm leaving the patch in RFC
state until the spec is approved.
RFC-v2:
- RISCV_SBI dependency [Conor]
- Rename SBI_EXT_SUSP_SUSPEND to SBI_EXT_SUSP_SYSTEM_SUSPEND and
SBI_SUSP_SLEEP_TYPE_SUSPEND to SBI_SUSP_SLEEP_TYPE_SUSPEND_TO_RAM [Ley Foon]
Andrew Jones (1):
riscv: sbi: Introduce system suspend support
arch/riscv/Kconfig | 5 ++++-
arch/riscv/include/asm/sbi.h | 9 ++++++++
arch/riscv/kernel/suspend.c | 43 ++++++++++++++++++++++++++++++++++++
3 files changed, 56 insertions(+), 1 deletion(-)
--
2.39.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 5+ messages in thread* [RFC v2 PATCH 1/1] riscv: sbi: Introduce system suspend support 2023-01-18 18:03 [RFC v2 PATCH 0/1] riscv: Introduce system suspend support Andrew Jones @ 2023-01-18 18:03 ` Andrew Jones 2023-02-28 15:54 ` Palmer Dabbelt 0 siblings, 1 reply; 5+ messages in thread From: Andrew Jones @ 2023-01-18 18:03 UTC (permalink / raw) To: linux-riscv Cc: 'Ley Foon Tan ', 'Palmer Dabbelt ', 'Sia Jee Heng ', 'Paul Walmsley ', 'Albert Ou ', 'Anup Patel ' When the SUSP SBI extension is present it implies that the standard "suspend to RAM" type is available. Wire it up to the generic platform suspend support, also applying the already present support for non-retentive CPU suspend. When the kernel is built with CONFIG_SUSPEND, one can do 'echo mem > /sys/power/state' to suspend. Resumption will occur when a platform-specific wake-up event arrives. Signed-off-by: Andrew Jones <ajones@ventanamicro.com> --- arch/riscv/Kconfig | 5 ++++- arch/riscv/include/asm/sbi.h | 9 ++++++++ arch/riscv/kernel/suspend.c | 43 ++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index e2b656043abf..28f182b611a7 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -52,7 +52,7 @@ config RISCV select CLONE_BACKWARDS select CLINT_TIMER if !MMU select COMMON_CLK - select CPU_PM if CPU_IDLE + select CPU_PM if (SUSPEND || CPU_IDLE) select EDAC_SUPPORT select GENERIC_ARCH_TOPOLOGY select GENERIC_ATOMIC64 if !64BIT @@ -686,6 +686,9 @@ config PORTABLE select OF select MMU +config ARCH_SUSPEND_POSSIBLE + def_bool RISCV_SBI + menu "Power management options" source "kernel/power/Kconfig" diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 4ca7fbacff42..1250321e4e6c 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -29,6 +29,7 @@ enum sbi_ext_id { SBI_EXT_RFENCE = 0x52464E43, SBI_EXT_HSM = 0x48534D, SBI_EXT_SRST = 0x53525354, + SBI_EXT_SUSP = 0x53555350, SBI_EXT_PMU = 0x504D55, /* Experimentals extensions must lie within this range */ @@ -113,6 +114,14 @@ enum sbi_srst_reset_reason { SBI_SRST_RESET_REASON_SYS_FAILURE, }; +enum sbi_ext_susp_fid { + SBI_EXT_SUSP_SYSTEM_SUSPEND = 0, +}; + +enum sbi_ext_susp_sleep_type { + SBI_SUSP_SLEEP_TYPE_SUSPEND_TO_RAM = 0, +}; + enum sbi_ext_pmu_fid { SBI_EXT_PMU_NUM_COUNTERS = 0, SBI_EXT_PMU_COUNTER_GET_INFO, diff --git a/arch/riscv/kernel/suspend.c b/arch/riscv/kernel/suspend.c index 9ba24fb8cc93..2109adeae594 100644 --- a/arch/riscv/kernel/suspend.c +++ b/arch/riscv/kernel/suspend.c @@ -4,8 +4,12 @@ * Copyright (c) 2022 Ventana Micro Systems Inc. */ +#define pr_fmt(fmt) "suspend: " fmt + #include <linux/ftrace.h> +#include <linux/suspend.h> #include <asm/csr.h> +#include <asm/sbi.h> #include <asm/suspend.h> static void suspend_save_csrs(struct suspend_context *context) @@ -85,3 +89,42 @@ int cpu_suspend(unsigned long arg, return rc; } + +#ifdef CONFIG_RISCV_SBI +static int sbi_system_suspend(unsigned long sleep_type, + unsigned long resume_addr, + unsigned long opaque) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_SUSP, SBI_EXT_SUSP_SYSTEM_SUSPEND, + sleep_type, resume_addr, opaque, 0, 0, 0); + if (ret.error) + return sbi_err_map_linux_errno(ret.error); + + return ret.value; +} + +static int sbi_system_suspend_enter(suspend_state_t state) +{ + return cpu_suspend(SBI_SUSP_SLEEP_TYPE_SUSPEND_TO_RAM, sbi_system_suspend); +} + +static const struct platform_suspend_ops sbi_system_suspend_ops = { + .valid = suspend_valid_only_mem, + .enter = sbi_system_suspend_enter, +}; + +static int __init sbi_system_suspend_init(void) +{ + if (!sbi_spec_is_0_1() && sbi_probe_extension(SBI_EXT_SUSP) > 0) { + pr_info("SBI SUSP extension detected\n"); + if (IS_ENABLED(CONFIG_SUSPEND)) + suspend_set_ops(&sbi_system_suspend_ops); + } + + return 0; +} + +arch_initcall(sbi_system_suspend_init); +#endif /* CONFIG_RISCV_SBI */ -- 2.39.0 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [RFC v2 PATCH 1/1] riscv: sbi: Introduce system suspend support 2023-01-18 18:03 ` [RFC v2 PATCH 1/1] riscv: sbi: " Andrew Jones @ 2023-02-28 15:54 ` Palmer Dabbelt 2023-02-28 16:48 ` Conor Dooley 2023-02-28 17:05 ` Andrew Jones 0 siblings, 2 replies; 5+ messages in thread From: Palmer Dabbelt @ 2023-02-28 15:54 UTC (permalink / raw) To: ajones, apatel, Atish Patra Cc: linux-riscv, leyfoon.tan, jeeheng.sia, Paul Walmsley, aou On Wed, 18 Jan 2023 10:03:38 PST (-0800), ajones@ventanamicro.com wrote: > When the SUSP SBI extension is present it implies that the standard > "suspend to RAM" type is available. Wire it up to the generic > platform suspend support, also applying the already present support > for non-retentive CPU suspend. When the kernel is built with > CONFIG_SUSPEND, one can do 'echo mem > /sys/power/state' to suspend. > Resumption will occur when a platform-specific wake-up event arrives. > > Signed-off-by: Andrew Jones <ajones@ventanamicro.com> > --- > arch/riscv/Kconfig | 5 ++++- > arch/riscv/include/asm/sbi.h | 9 ++++++++ > arch/riscv/kernel/suspend.c | 43 ++++++++++++++++++++++++++++++++++++ > 3 files changed, 56 insertions(+), 1 deletion(-) > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > index e2b656043abf..28f182b611a7 100644 > --- a/arch/riscv/Kconfig > +++ b/arch/riscv/Kconfig > @@ -52,7 +52,7 @@ config RISCV > select CLONE_BACKWARDS > select CLINT_TIMER if !MMU > select COMMON_CLK > - select CPU_PM if CPU_IDLE > + select CPU_PM if (SUSPEND || CPU_IDLE) > select EDAC_SUPPORT > select GENERIC_ARCH_TOPOLOGY > select GENERIC_ATOMIC64 if !64BIT > @@ -686,6 +686,9 @@ config PORTABLE > select OF > select MMU > > +config ARCH_SUSPEND_POSSIBLE > + def_bool RISCV_SBI > + > menu "Power management options" > > source "kernel/power/Kconfig" > diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h > index 4ca7fbacff42..1250321e4e6c 100644 > --- a/arch/riscv/include/asm/sbi.h > +++ b/arch/riscv/include/asm/sbi.h > @@ -29,6 +29,7 @@ enum sbi_ext_id { > SBI_EXT_RFENCE = 0x52464E43, > SBI_EXT_HSM = 0x48534D, > SBI_EXT_SRST = 0x53525354, > + SBI_EXT_SUSP = 0x53555350, > SBI_EXT_PMU = 0x504D55, > > /* Experimentals extensions must lie within this range */ > @@ -113,6 +114,14 @@ enum sbi_srst_reset_reason { > SBI_SRST_RESET_REASON_SYS_FAILURE, > }; > > +enum sbi_ext_susp_fid { > + SBI_EXT_SUSP_SYSTEM_SUSPEND = 0, > +}; > + > +enum sbi_ext_susp_sleep_type { > + SBI_SUSP_SLEEP_TYPE_SUSPEND_TO_RAM = 0, > +}; > + > enum sbi_ext_pmu_fid { > SBI_EXT_PMU_NUM_COUNTERS = 0, > SBI_EXT_PMU_COUNTER_GET_INFO, > diff --git a/arch/riscv/kernel/suspend.c b/arch/riscv/kernel/suspend.c > index 9ba24fb8cc93..2109adeae594 100644 > --- a/arch/riscv/kernel/suspend.c > +++ b/arch/riscv/kernel/suspend.c > @@ -4,8 +4,12 @@ > * Copyright (c) 2022 Ventana Micro Systems Inc. > */ > > +#define pr_fmt(fmt) "suspend: " fmt > + > #include <linux/ftrace.h> > +#include <linux/suspend.h> > #include <asm/csr.h> > +#include <asm/sbi.h> > #include <asm/suspend.h> > > static void suspend_save_csrs(struct suspend_context *context) > @@ -85,3 +89,42 @@ int cpu_suspend(unsigned long arg, > > return rc; > } > + > +#ifdef CONFIG_RISCV_SBI > +static int sbi_system_suspend(unsigned long sleep_type, > + unsigned long resume_addr, > + unsigned long opaque) > +{ > + struct sbiret ret; > + > + ret = sbi_ecall(SBI_EXT_SUSP, SBI_EXT_SUSP_SYSTEM_SUSPEND, > + sleep_type, resume_addr, opaque, 0, 0, 0); > + if (ret.error) > + return sbi_err_map_linux_errno(ret.error); > + > + return ret.value; > +} > + > +static int sbi_system_suspend_enter(suspend_state_t state) > +{ > + return cpu_suspend(SBI_SUSP_SLEEP_TYPE_SUSPEND_TO_RAM, sbi_system_suspend); > +} > + > +static const struct platform_suspend_ops sbi_system_suspend_ops = { > + .valid = suspend_valid_only_mem, > + .enter = sbi_system_suspend_enter, > +}; > + > +static int __init sbi_system_suspend_init(void) > +{ > + if (!sbi_spec_is_0_1() && sbi_probe_extension(SBI_EXT_SUSP) > 0) { > + pr_info("SBI SUSP extension detected\n"); > + if (IS_ENABLED(CONFIG_SUSPEND)) > + suspend_set_ops(&sbi_system_suspend_ops); > + } > + > + return 0; > +} > + > +arch_initcall(sbi_system_suspend_init); > +#endif /* CONFIG_RISCV_SBI */ The code looks fine, but I can't find the SUSP extension anywhere. There's just hart suspend in <https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/riscv-sbi.adoc>. _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC v2 PATCH 1/1] riscv: sbi: Introduce system suspend support 2023-02-28 15:54 ` Palmer Dabbelt @ 2023-02-28 16:48 ` Conor Dooley 2023-02-28 17:05 ` Andrew Jones 1 sibling, 0 replies; 5+ messages in thread From: Conor Dooley @ 2023-02-28 16:48 UTC (permalink / raw) To: Palmer Dabbelt Cc: ajones, apatel, Atish Patra, linux-riscv, leyfoon.tan, jeeheng.sia, Paul Walmsley, aou [-- Attachment #1.1: Type: text/plain, Size: 1012 bytes --] On Tue, Feb 28, 2023 at 07:54:56AM -0800, Palmer Dabbelt wrote: > On Wed, 18 Jan 2023 10:03:38 PST (-0800), ajones@ventanamicro.com wrote: > > When the SUSP SBI extension is present it implies that the standard > > "suspend to RAM" type is available. Wire it up to the generic > > platform suspend support, also applying the already present support > > for non-retentive CPU suspend. When the kernel is built with > > CONFIG_SUSPEND, one can do 'echo mem > /sys/power/state' to suspend. > > Resumption will occur when a platform-specific wake-up event arrives. > > > The code looks fine, but I can't find the SUSP extension anywhere. There's > just hart suspend in > <https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/riscv-sbi.adoc>. It's not merged yet, so: https://lists.riscv.org/g/tech-prs/message/222 & https://lists.riscv.org/g/tech-prs/message/228 Or on GitHub for those who are not members of the RVI stuff: https://github.com/jones-drew/riscv-sbi-doc/commits/susp-v1 [-- Attachment #1.2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] [-- Attachment #2: Type: text/plain, Size: 161 bytes --] _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC v2 PATCH 1/1] riscv: sbi: Introduce system suspend support 2023-02-28 15:54 ` Palmer Dabbelt 2023-02-28 16:48 ` Conor Dooley @ 2023-02-28 17:05 ` Andrew Jones 1 sibling, 0 replies; 5+ messages in thread From: Andrew Jones @ 2023-02-28 17:05 UTC (permalink / raw) To: Palmer Dabbelt Cc: apatel, Atish Patra, linux-riscv, leyfoon.tan, jeeheng.sia, Paul Walmsley, aou On Tue, Feb 28, 2023 at 07:54:56AM -0800, Palmer Dabbelt wrote: > On Wed, 18 Jan 2023 10:03:38 PST (-0800), ajones@ventanamicro.com wrote: > > +#endif /* CONFIG_RISCV_SBI */ > > The code looks fine, but I can't find the SUSP extension anywhere. There's > just hart suspend in > <https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/riscv-sbi.adoc>. Thanks for looking, Palmer. It looks like Conor got you pointed at the draft spec addition[1]. When the spec addition gets accepted, I'll rebase and repost this patch without the RFC. [1] https://github.com/jones-drew/riscv-sbi-doc/commit/0a7ddb1786b0566287efaa6b55321dafecc885ca Thanks, drew _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-02-28 17:05 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-01-18 18:03 [RFC v2 PATCH 0/1] riscv: Introduce system suspend support Andrew Jones 2023-01-18 18:03 ` [RFC v2 PATCH 1/1] riscv: sbi: " Andrew Jones 2023-02-28 15:54 ` Palmer Dabbelt 2023-02-28 16:48 ` Conor Dooley 2023-02-28 17:05 ` Andrew Jones
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.