* [PATCH v6 0/2] SBI SRST extension support @ 2021-03-15 11:04 ` Anup Patel 0 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-15 11:04 UTC (permalink / raw) To: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou Cc: Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel, Anup Patel This series adds SBI SRST extension support to Linux RISC-V. These patches can be found in riscv_sbi_srst_v6 branch at: https://github.com/avpatel/linux Changes since v5: - Factored-out pr_info() related change into separate patch - Added cover letter Changes since v4: - We should compare both major and minor number to ensure that SBI spec version is 0.3 (or above) for detecting SRST extension. Changes since v3: - Rebased on Linux-5.12-rc1 - Check SBI spec version when probing for SRST extension Changes since v2: - Rebased on Linux-5.10-rc5 - Updated patch as-per SBI SRST extension available in the latest SBI v0.3-draft specification Changes since v1: - Updated patch as-per latest SBI SRST extension draft spec where we have only one SBI call with "reset_type" parameter Anup Patel (2): RISC-V: Don't print SBI version for all detected extensions RISC-V: Use SBI SRST extension when available arch/riscv/include/asm/sbi.h | 24 +++++++++++++++++++++ arch/riscv/kernel/sbi.c | 41 +++++++++++++++++++++++++++++++++--- 2 files changed, 62 insertions(+), 3 deletions(-) -- 2.25.1 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v6 0/2] SBI SRST extension support @ 2021-03-15 11:04 ` Anup Patel 0 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-15 11:04 UTC (permalink / raw) To: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou Cc: Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel, Anup Patel This series adds SBI SRST extension support to Linux RISC-V. These patches can be found in riscv_sbi_srst_v6 branch at: https://github.com/avpatel/linux Changes since v5: - Factored-out pr_info() related change into separate patch - Added cover letter Changes since v4: - We should compare both major and minor number to ensure that SBI spec version is 0.3 (or above) for detecting SRST extension. Changes since v3: - Rebased on Linux-5.12-rc1 - Check SBI spec version when probing for SRST extension Changes since v2: - Rebased on Linux-5.10-rc5 - Updated patch as-per SBI SRST extension available in the latest SBI v0.3-draft specification Changes since v1: - Updated patch as-per latest SBI SRST extension draft spec where we have only one SBI call with "reset_type" parameter Anup Patel (2): RISC-V: Don't print SBI version for all detected extensions RISC-V: Use SBI SRST extension when available arch/riscv/include/asm/sbi.h | 24 +++++++++++++++++++++ arch/riscv/kernel/sbi.c | 41 +++++++++++++++++++++++++++++++++--- 2 files changed, 62 insertions(+), 3 deletions(-) -- 2.25.1 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions 2021-03-15 11:04 ` Anup Patel @ 2021-03-15 11:04 ` Anup Patel -1 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-15 11:04 UTC (permalink / raw) To: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou Cc: Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel, Anup Patel The sbi_init() already prints SBI version before detecting various SBI extensions so we don't need to print SBI version for all detected SBI extensions. Signed-off-by: Anup Patel <anup.patel@wdc.com> --- arch/riscv/kernel/sbi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c index f4a7db3d309e..c0dcebdd30ec 100644 --- a/arch/riscv/kernel/sbi.c +++ b/arch/riscv/kernel/sbi.c @@ -577,19 +577,19 @@ void __init sbi_init(void) sbi_get_firmware_id(), sbi_get_firmware_version()); if (sbi_probe_extension(SBI_EXT_TIME) > 0) { __sbi_set_timer = __sbi_set_timer_v02; - pr_info("SBI v0.2 TIME extension detected\n"); + pr_info("SBI TIME extension detected\n"); } else { __sbi_set_timer = __sbi_set_timer_v01; } if (sbi_probe_extension(SBI_EXT_IPI) > 0) { __sbi_send_ipi = __sbi_send_ipi_v02; - pr_info("SBI v0.2 IPI extension detected\n"); + pr_info("SBI IPI extension detected\n"); } else { __sbi_send_ipi = __sbi_send_ipi_v01; } if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { __sbi_rfence = __sbi_rfence_v02; - pr_info("SBI v0.2 RFENCE extension detected\n"); + pr_info("SBI RFENCE extension detected\n"); } else { __sbi_rfence = __sbi_rfence_v01; } -- 2.25.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions @ 2021-03-15 11:04 ` Anup Patel 0 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-15 11:04 UTC (permalink / raw) To: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou Cc: Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel, Anup Patel The sbi_init() already prints SBI version before detecting various SBI extensions so we don't need to print SBI version for all detected SBI extensions. Signed-off-by: Anup Patel <anup.patel@wdc.com> --- arch/riscv/kernel/sbi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c index f4a7db3d309e..c0dcebdd30ec 100644 --- a/arch/riscv/kernel/sbi.c +++ b/arch/riscv/kernel/sbi.c @@ -577,19 +577,19 @@ void __init sbi_init(void) sbi_get_firmware_id(), sbi_get_firmware_version()); if (sbi_probe_extension(SBI_EXT_TIME) > 0) { __sbi_set_timer = __sbi_set_timer_v02; - pr_info("SBI v0.2 TIME extension detected\n"); + pr_info("SBI TIME extension detected\n"); } else { __sbi_set_timer = __sbi_set_timer_v01; } if (sbi_probe_extension(SBI_EXT_IPI) > 0) { __sbi_send_ipi = __sbi_send_ipi_v02; - pr_info("SBI v0.2 IPI extension detected\n"); + pr_info("SBI IPI extension detected\n"); } else { __sbi_send_ipi = __sbi_send_ipi_v01; } if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { __sbi_rfence = __sbi_rfence_v02; - pr_info("SBI v0.2 RFENCE extension detected\n"); + pr_info("SBI RFENCE extension detected\n"); } else { __sbi_rfence = __sbi_rfence_v01; } -- 2.25.1 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions 2021-03-15 11:04 ` Anup Patel @ 2021-03-15 16:52 ` Atish Patra -1 siblings, 0 replies; 12+ messages in thread From: Atish Patra @ 2021-03-15 16:52 UTC (permalink / raw) To: Anup Patel Cc: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou, Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel@vger.kernel.org List On Mon, Mar 15, 2021 at 4:07 AM Anup Patel <anup.patel@wdc.com> wrote: > > The sbi_init() already prints SBI version before detecting > various SBI extensions so we don't need to print SBI version > for all detected SBI extensions. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > --- > arch/riscv/kernel/sbi.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c > index f4a7db3d309e..c0dcebdd30ec 100644 > --- a/arch/riscv/kernel/sbi.c > +++ b/arch/riscv/kernel/sbi.c > @@ -577,19 +577,19 @@ void __init sbi_init(void) > sbi_get_firmware_id(), sbi_get_firmware_version()); > if (sbi_probe_extension(SBI_EXT_TIME) > 0) { > __sbi_set_timer = __sbi_set_timer_v02; > - pr_info("SBI v0.2 TIME extension detected\n"); > + pr_info("SBI TIME extension detected\n"); > } else { > __sbi_set_timer = __sbi_set_timer_v01; > } > if (sbi_probe_extension(SBI_EXT_IPI) > 0) { > __sbi_send_ipi = __sbi_send_ipi_v02; > - pr_info("SBI v0.2 IPI extension detected\n"); > + pr_info("SBI IPI extension detected\n"); > } else { > __sbi_send_ipi = __sbi_send_ipi_v01; > } > if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { > __sbi_rfence = __sbi_rfence_v02; > - pr_info("SBI v0.2 RFENCE extension detected\n"); > + pr_info("SBI RFENCE extension detected\n"); > } else { > __sbi_rfence = __sbi_rfence_v01; > } > -- > 2.25.1 > > > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv Reviewed-by: Atish Patra <atish.patra@wdc.com> -- Regards, Atish ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions @ 2021-03-15 16:52 ` Atish Patra 0 siblings, 0 replies; 12+ messages in thread From: Atish Patra @ 2021-03-15 16:52 UTC (permalink / raw) To: Anup Patel Cc: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou, Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel@vger.kernel.org List On Mon, Mar 15, 2021 at 4:07 AM Anup Patel <anup.patel@wdc.com> wrote: > > The sbi_init() already prints SBI version before detecting > various SBI extensions so we don't need to print SBI version > for all detected SBI extensions. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > --- > arch/riscv/kernel/sbi.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c > index f4a7db3d309e..c0dcebdd30ec 100644 > --- a/arch/riscv/kernel/sbi.c > +++ b/arch/riscv/kernel/sbi.c > @@ -577,19 +577,19 @@ void __init sbi_init(void) > sbi_get_firmware_id(), sbi_get_firmware_version()); > if (sbi_probe_extension(SBI_EXT_TIME) > 0) { > __sbi_set_timer = __sbi_set_timer_v02; > - pr_info("SBI v0.2 TIME extension detected\n"); > + pr_info("SBI TIME extension detected\n"); > } else { > __sbi_set_timer = __sbi_set_timer_v01; > } > if (sbi_probe_extension(SBI_EXT_IPI) > 0) { > __sbi_send_ipi = __sbi_send_ipi_v02; > - pr_info("SBI v0.2 IPI extension detected\n"); > + pr_info("SBI IPI extension detected\n"); > } else { > __sbi_send_ipi = __sbi_send_ipi_v01; > } > if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { > __sbi_rfence = __sbi_rfence_v02; > - pr_info("SBI v0.2 RFENCE extension detected\n"); > + pr_info("SBI RFENCE extension detected\n"); > } else { > __sbi_rfence = __sbi_rfence_v01; > } > -- > 2.25.1 > > > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv Reviewed-by: Atish Patra <atish.patra@wdc.com> -- Regards, Atish _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions 2021-03-15 11:04 ` Anup Patel @ 2021-03-17 5:08 ` Palmer Dabbelt -1 siblings, 0 replies; 12+ messages in thread From: Palmer Dabbelt @ 2021-03-17 5:08 UTC (permalink / raw) To: Anup Patel Cc: Paul Walmsley, aou, Atish Patra, Alistair Francis, anup, linux-riscv, linux-kernel, Anup Patel On Mon, 15 Mar 2021 04:04:59 PDT (-0700), Anup Patel wrote: > The sbi_init() already prints SBI version before detecting > various SBI extensions so we don't need to print SBI version > for all detected SBI extensions. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > --- > arch/riscv/kernel/sbi.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c > index f4a7db3d309e..c0dcebdd30ec 100644 > --- a/arch/riscv/kernel/sbi.c > +++ b/arch/riscv/kernel/sbi.c > @@ -577,19 +577,19 @@ void __init sbi_init(void) > sbi_get_firmware_id(), sbi_get_firmware_version()); > if (sbi_probe_extension(SBI_EXT_TIME) > 0) { > __sbi_set_timer = __sbi_set_timer_v02; > - pr_info("SBI v0.2 TIME extension detected\n"); > + pr_info("SBI TIME extension detected\n"); > } else { > __sbi_set_timer = __sbi_set_timer_v01; > } > if (sbi_probe_extension(SBI_EXT_IPI) > 0) { > __sbi_send_ipi = __sbi_send_ipi_v02; > - pr_info("SBI v0.2 IPI extension detected\n"); > + pr_info("SBI IPI extension detected\n"); > } else { > __sbi_send_ipi = __sbi_send_ipi_v01; > } > if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { > __sbi_rfence = __sbi_rfence_v02; > - pr_info("SBI v0.2 RFENCE extension detected\n"); > + pr_info("SBI RFENCE extension detected\n"); > } else { > __sbi_rfence = __sbi_rfence_v01; > } Thanks. I'm just putting this one on for-next so you don't have to carry around the diff. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions @ 2021-03-17 5:08 ` Palmer Dabbelt 0 siblings, 0 replies; 12+ messages in thread From: Palmer Dabbelt @ 2021-03-17 5:08 UTC (permalink / raw) To: Anup Patel Cc: Paul Walmsley, aou, Atish Patra, Alistair Francis, anup, linux-riscv, linux-kernel, Anup Patel On Mon, 15 Mar 2021 04:04:59 PDT (-0700), Anup Patel wrote: > The sbi_init() already prints SBI version before detecting > various SBI extensions so we don't need to print SBI version > for all detected SBI extensions. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > --- > arch/riscv/kernel/sbi.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c > index f4a7db3d309e..c0dcebdd30ec 100644 > --- a/arch/riscv/kernel/sbi.c > +++ b/arch/riscv/kernel/sbi.c > @@ -577,19 +577,19 @@ void __init sbi_init(void) > sbi_get_firmware_id(), sbi_get_firmware_version()); > if (sbi_probe_extension(SBI_EXT_TIME) > 0) { > __sbi_set_timer = __sbi_set_timer_v02; > - pr_info("SBI v0.2 TIME extension detected\n"); > + pr_info("SBI TIME extension detected\n"); > } else { > __sbi_set_timer = __sbi_set_timer_v01; > } > if (sbi_probe_extension(SBI_EXT_IPI) > 0) { > __sbi_send_ipi = __sbi_send_ipi_v02; > - pr_info("SBI v0.2 IPI extension detected\n"); > + pr_info("SBI IPI extension detected\n"); > } else { > __sbi_send_ipi = __sbi_send_ipi_v01; > } > if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { > __sbi_rfence = __sbi_rfence_v02; > - pr_info("SBI v0.2 RFENCE extension detected\n"); > + pr_info("SBI RFENCE extension detected\n"); > } else { > __sbi_rfence = __sbi_rfence_v01; > } Thanks. I'm just putting this one on for-next so you don't have to carry around the diff. _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions 2021-03-17 5:08 ` Palmer Dabbelt @ 2021-03-17 8:31 ` Anup Patel -1 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-17 8:31 UTC (permalink / raw) To: Palmer Dabbelt Cc: Anup Patel, Paul Walmsley, Albert Ou, Atish Patra, Alistair Francis, linux-riscv, linux-kernel@vger.kernel.org List On Wed, Mar 17, 2021 at 10:38 AM Palmer Dabbelt <palmer@dabbelt.com> wrote: > > On Mon, 15 Mar 2021 04:04:59 PDT (-0700), Anup Patel wrote: > > The sbi_init() already prints SBI version before detecting > > various SBI extensions so we don't need to print SBI version > > for all detected SBI extensions. > > > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > > --- > > arch/riscv/kernel/sbi.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c > > index f4a7db3d309e..c0dcebdd30ec 100644 > > --- a/arch/riscv/kernel/sbi.c > > +++ b/arch/riscv/kernel/sbi.c > > @@ -577,19 +577,19 @@ void __init sbi_init(void) > > sbi_get_firmware_id(), sbi_get_firmware_version()); > > if (sbi_probe_extension(SBI_EXT_TIME) > 0) { > > __sbi_set_timer = __sbi_set_timer_v02; > > - pr_info("SBI v0.2 TIME extension detected\n"); > > + pr_info("SBI TIME extension detected\n"); > > } else { > > __sbi_set_timer = __sbi_set_timer_v01; > > } > > if (sbi_probe_extension(SBI_EXT_IPI) > 0) { > > __sbi_send_ipi = __sbi_send_ipi_v02; > > - pr_info("SBI v0.2 IPI extension detected\n"); > > + pr_info("SBI IPI extension detected\n"); > > } else { > > __sbi_send_ipi = __sbi_send_ipi_v01; > > } > > if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { > > __sbi_rfence = __sbi_rfence_v02; > > - pr_info("SBI v0.2 RFENCE extension detected\n"); > > + pr_info("SBI RFENCE extension detected\n"); > > } else { > > __sbi_rfence = __sbi_rfence_v01; > > } > > Thanks. I'm just putting this one on for-next so you don't have to carry > around the diff. Thanks Palmer. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions @ 2021-03-17 8:31 ` Anup Patel 0 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-17 8:31 UTC (permalink / raw) To: Palmer Dabbelt Cc: Anup Patel, Paul Walmsley, Albert Ou, Atish Patra, Alistair Francis, linux-riscv, linux-kernel@vger.kernel.org List On Wed, Mar 17, 2021 at 10:38 AM Palmer Dabbelt <palmer@dabbelt.com> wrote: > > On Mon, 15 Mar 2021 04:04:59 PDT (-0700), Anup Patel wrote: > > The sbi_init() already prints SBI version before detecting > > various SBI extensions so we don't need to print SBI version > > for all detected SBI extensions. > > > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > > --- > > arch/riscv/kernel/sbi.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c > > index f4a7db3d309e..c0dcebdd30ec 100644 > > --- a/arch/riscv/kernel/sbi.c > > +++ b/arch/riscv/kernel/sbi.c > > @@ -577,19 +577,19 @@ void __init sbi_init(void) > > sbi_get_firmware_id(), sbi_get_firmware_version()); > > if (sbi_probe_extension(SBI_EXT_TIME) > 0) { > > __sbi_set_timer = __sbi_set_timer_v02; > > - pr_info("SBI v0.2 TIME extension detected\n"); > > + pr_info("SBI TIME extension detected\n"); > > } else { > > __sbi_set_timer = __sbi_set_timer_v01; > > } > > if (sbi_probe_extension(SBI_EXT_IPI) > 0) { > > __sbi_send_ipi = __sbi_send_ipi_v02; > > - pr_info("SBI v0.2 IPI extension detected\n"); > > + pr_info("SBI IPI extension detected\n"); > > } else { > > __sbi_send_ipi = __sbi_send_ipi_v01; > > } > > if (sbi_probe_extension(SBI_EXT_RFENCE) > 0) { > > __sbi_rfence = __sbi_rfence_v02; > > - pr_info("SBI v0.2 RFENCE extension detected\n"); > > + pr_info("SBI RFENCE extension detected\n"); > > } else { > > __sbi_rfence = __sbi_rfence_v01; > > } > > Thanks. I'm just putting this one on for-next so you don't have to carry > around the diff. Thanks Palmer. _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v6 2/2] RISC-V: Use SBI SRST extension when available 2021-03-15 11:04 ` Anup Patel @ 2021-03-15 11:05 ` Anup Patel -1 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-15 11:05 UTC (permalink / raw) To: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou Cc: Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel, Anup Patel The SBI SRST extension provides a standard way to poweroff and reboot the system irrespective to whether Linux RISC-V S-mode is running natively (HS-mode) or inside Guest/VM (VS-mode). The SBI SRST extension is available in latest SBI v0.3-draft specification at: https://github.com/riscv/riscv-sbi-doc. This patch extends Linux RISC-V SBI implementation to detect and use SBI SRST extension. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com> --- arch/riscv/include/asm/sbi.h | 24 ++++++++++++++++++++++++ arch/riscv/kernel/sbi.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 99895d9c3bdd..79fa9f28b786 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -27,6 +27,7 @@ enum sbi_ext_id { SBI_EXT_IPI = 0x735049, SBI_EXT_RFENCE = 0x52464E43, SBI_EXT_HSM = 0x48534D, + SBI_EXT_SRST = 0x53525354, }; enum sbi_ext_base_fid { @@ -70,6 +71,21 @@ enum sbi_hsm_hart_status { SBI_HSM_HART_STATUS_STOP_PENDING, }; +enum sbi_ext_srst_fid { + SBI_EXT_SRST_RESET = 0, +}; + +enum sbi_srst_reset_type { + SBI_SRST_RESET_TYPE_SHUTDOWN = 0, + SBI_SRST_RESET_TYPE_COLD_REBOOT, + SBI_SRST_RESET_TYPE_WARM_REBOOT, +}; + +enum sbi_srst_reset_reason { + SBI_SRST_RESET_REASON_NONE = 0, + SBI_SRST_RESET_REASON_SYS_FAILURE, +}; + #define SBI_SPEC_VERSION_DEFAULT 0x1 #define SBI_SPEC_VERSION_MAJOR_SHIFT 24 #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f @@ -145,6 +161,14 @@ static inline unsigned long sbi_minor_version(void) return sbi_spec_version & SBI_SPEC_VERSION_MINOR_MASK; } +/* Make SBI version */ +static inline unsigned long sbi_mk_version(unsigned long major, + unsigned long minor) +{ + return ((major & SBI_SPEC_VERSION_MAJOR_MASK) << + SBI_SPEC_VERSION_MAJOR_SHIFT) | minor; +} + int sbi_err_map_linux_errno(int err); #else /* CONFIG_RISCV_SBI */ static inline int sbi_remote_fence_i(const unsigned long *hart_mask) { return -1; } diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c index c0dcebdd30ec..e94ea8053984 100644 --- a/arch/riscv/kernel/sbi.c +++ b/arch/riscv/kernel/sbi.c @@ -7,6 +7,7 @@ #include <linux/init.h> #include <linux/pm.h> +#include <linux/reboot.h> #include <asm/sbi.h> #include <asm/smp.h> @@ -501,6 +502,32 @@ int sbi_remote_hfence_vvma_asid(const unsigned long *hart_mask, } EXPORT_SYMBOL(sbi_remote_hfence_vvma_asid); +static void sbi_srst_reset(unsigned long type, unsigned long reason) +{ + sbi_ecall(SBI_EXT_SRST, SBI_EXT_SRST_RESET, type, reason, + 0, 0, 0, 0); + pr_warn("%s: type=0x%lx reason=0x%lx failed\n", + __func__, type, reason); +} + +static int sbi_srst_reboot(struct notifier_block *this, + unsigned long mode, void *cmd) +{ + sbi_srst_reset((mode == REBOOT_WARM || mode == REBOOT_SOFT) ? + SBI_SRST_RESET_TYPE_WARM_REBOOT : + SBI_SRST_RESET_TYPE_COLD_REBOOT, + SBI_SRST_RESET_REASON_NONE); + return NOTIFY_DONE; +} + +static struct notifier_block sbi_srst_reboot_nb; + +static void sbi_srst_power_off(void) +{ + sbi_srst_reset(SBI_SRST_RESET_TYPE_SHUTDOWN, + SBI_SRST_RESET_REASON_NONE); +} + /** * sbi_probe_extension() - Check if an SBI extension ID is supported or not. * @extid: The extension ID to be probed. @@ -593,6 +620,14 @@ void __init sbi_init(void) } else { __sbi_rfence = __sbi_rfence_v01; } + if ((sbi_spec_version >= sbi_mk_version(0, 3)) && + (sbi_probe_extension(SBI_EXT_SRST) > 0)) { + pr_info("SBI SRST extension detected\n"); + pm_power_off = sbi_srst_power_off; + sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot; + sbi_srst_reboot_nb.priority = 192; + register_restart_handler(&sbi_srst_reboot_nb); + } } else { __sbi_set_timer = __sbi_set_timer_v01; __sbi_send_ipi = __sbi_send_ipi_v01; -- 2.25.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 2/2] RISC-V: Use SBI SRST extension when available @ 2021-03-15 11:05 ` Anup Patel 0 siblings, 0 replies; 12+ messages in thread From: Anup Patel @ 2021-03-15 11:05 UTC (permalink / raw) To: Palmer Dabbelt, Palmer Dabbelt, Paul Walmsley, Albert Ou Cc: Atish Patra, Alistair Francis, Anup Patel, linux-riscv, linux-kernel, Anup Patel The SBI SRST extension provides a standard way to poweroff and reboot the system irrespective to whether Linux RISC-V S-mode is running natively (HS-mode) or inside Guest/VM (VS-mode). The SBI SRST extension is available in latest SBI v0.3-draft specification at: https://github.com/riscv/riscv-sbi-doc. This patch extends Linux RISC-V SBI implementation to detect and use SBI SRST extension. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com> --- arch/riscv/include/asm/sbi.h | 24 ++++++++++++++++++++++++ arch/riscv/kernel/sbi.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 99895d9c3bdd..79fa9f28b786 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -27,6 +27,7 @@ enum sbi_ext_id { SBI_EXT_IPI = 0x735049, SBI_EXT_RFENCE = 0x52464E43, SBI_EXT_HSM = 0x48534D, + SBI_EXT_SRST = 0x53525354, }; enum sbi_ext_base_fid { @@ -70,6 +71,21 @@ enum sbi_hsm_hart_status { SBI_HSM_HART_STATUS_STOP_PENDING, }; +enum sbi_ext_srst_fid { + SBI_EXT_SRST_RESET = 0, +}; + +enum sbi_srst_reset_type { + SBI_SRST_RESET_TYPE_SHUTDOWN = 0, + SBI_SRST_RESET_TYPE_COLD_REBOOT, + SBI_SRST_RESET_TYPE_WARM_REBOOT, +}; + +enum sbi_srst_reset_reason { + SBI_SRST_RESET_REASON_NONE = 0, + SBI_SRST_RESET_REASON_SYS_FAILURE, +}; + #define SBI_SPEC_VERSION_DEFAULT 0x1 #define SBI_SPEC_VERSION_MAJOR_SHIFT 24 #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f @@ -145,6 +161,14 @@ static inline unsigned long sbi_minor_version(void) return sbi_spec_version & SBI_SPEC_VERSION_MINOR_MASK; } +/* Make SBI version */ +static inline unsigned long sbi_mk_version(unsigned long major, + unsigned long minor) +{ + return ((major & SBI_SPEC_VERSION_MAJOR_MASK) << + SBI_SPEC_VERSION_MAJOR_SHIFT) | minor; +} + int sbi_err_map_linux_errno(int err); #else /* CONFIG_RISCV_SBI */ static inline int sbi_remote_fence_i(const unsigned long *hart_mask) { return -1; } diff --git a/arch/riscv/kernel/sbi.c b/arch/riscv/kernel/sbi.c index c0dcebdd30ec..e94ea8053984 100644 --- a/arch/riscv/kernel/sbi.c +++ b/arch/riscv/kernel/sbi.c @@ -7,6 +7,7 @@ #include <linux/init.h> #include <linux/pm.h> +#include <linux/reboot.h> #include <asm/sbi.h> #include <asm/smp.h> @@ -501,6 +502,32 @@ int sbi_remote_hfence_vvma_asid(const unsigned long *hart_mask, } EXPORT_SYMBOL(sbi_remote_hfence_vvma_asid); +static void sbi_srst_reset(unsigned long type, unsigned long reason) +{ + sbi_ecall(SBI_EXT_SRST, SBI_EXT_SRST_RESET, type, reason, + 0, 0, 0, 0); + pr_warn("%s: type=0x%lx reason=0x%lx failed\n", + __func__, type, reason); +} + +static int sbi_srst_reboot(struct notifier_block *this, + unsigned long mode, void *cmd) +{ + sbi_srst_reset((mode == REBOOT_WARM || mode == REBOOT_SOFT) ? + SBI_SRST_RESET_TYPE_WARM_REBOOT : + SBI_SRST_RESET_TYPE_COLD_REBOOT, + SBI_SRST_RESET_REASON_NONE); + return NOTIFY_DONE; +} + +static struct notifier_block sbi_srst_reboot_nb; + +static void sbi_srst_power_off(void) +{ + sbi_srst_reset(SBI_SRST_RESET_TYPE_SHUTDOWN, + SBI_SRST_RESET_REASON_NONE); +} + /** * sbi_probe_extension() - Check if an SBI extension ID is supported or not. * @extid: The extension ID to be probed. @@ -593,6 +620,14 @@ void __init sbi_init(void) } else { __sbi_rfence = __sbi_rfence_v01; } + if ((sbi_spec_version >= sbi_mk_version(0, 3)) && + (sbi_probe_extension(SBI_EXT_SRST) > 0)) { + pr_info("SBI SRST extension detected\n"); + pm_power_off = sbi_srst_power_off; + sbi_srst_reboot_nb.notifier_call = sbi_srst_reboot; + sbi_srst_reboot_nb.priority = 192; + register_restart_handler(&sbi_srst_reboot_nb); + } } else { __sbi_set_timer = __sbi_set_timer_v01; __sbi_send_ipi = __sbi_send_ipi_v01; -- 2.25.1 _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2021-03-17 8:32 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-03-15 11:04 [PATCH v6 0/2] SBI SRST extension support Anup Patel 2021-03-15 11:04 ` Anup Patel 2021-03-15 11:04 ` [PATCH v6 1/2] RISC-V: Don't print SBI version for all detected extensions Anup Patel 2021-03-15 11:04 ` Anup Patel 2021-03-15 16:52 ` Atish Patra 2021-03-15 16:52 ` Atish Patra 2021-03-17 5:08 ` Palmer Dabbelt 2021-03-17 5:08 ` Palmer Dabbelt 2021-03-17 8:31 ` Anup Patel 2021-03-17 8:31 ` Anup Patel 2021-03-15 11:05 ` [PATCH v6 2/2] RISC-V: Use SBI SRST extension when available Anup Patel 2021-03-15 11:05 ` Anup Patel
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.