[PATCH] lib: sbi: sbi_system_reset() if not supported

Anup Patel anup at brainfault.org
Sun Oct 17 21:23:49 PDT 2021


On Fri, Oct 15, 2021 at 7:49 PM Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> The SBI specification requires that if a reset type or reason is not
> supported the system reset function returns SBI_ERR_NOT_SUPPORTED.
>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>

This patch is not required because the sbi_ecall_srst_handler() will only
call sbi_system_reset() if sbi_system_reset_supported() returns true.

Regards,
Anup

> ---
> Yet another patch will be needed to return SBI_ERR_FAILED if the reset
> did not succeed.
> ---
>  include/sbi/sbi_system.h |  2 +-
>  lib/sbi/sbi_system.c     | 22 ++++++++++++++--------
>  2 files changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/include/sbi/sbi_system.h b/include/sbi/sbi_system.h
> index 84c2813..3c98133 100644
> --- a/include/sbi/sbi_system.h
> +++ b/include/sbi/sbi_system.h
> @@ -41,6 +41,6 @@ void sbi_system_reset_add_device(struct sbi_system_reset_device *dev);
>
>  bool sbi_system_reset_supported(u32 reset_type, u32 reset_reason);
>
> -void __noreturn sbi_system_reset(u32 reset_type, u32 reset_reason);
> +void sbi_system_reset(u32 reset_type, u32 reset_reason);
>
>  #endif
> diff --git a/lib/sbi/sbi_system.c b/lib/sbi/sbi_system.c
> index 9cea3c0..5c328fb 100644
> --- a/lib/sbi/sbi_system.c
> +++ b/lib/sbi/sbi_system.c
> @@ -62,12 +62,23 @@ bool sbi_system_reset_supported(u32 reset_type, u32 reset_reason)
>         return !!sbi_system_reset_get_device(reset_type, reset_reason);
>  }
>
> -void __noreturn sbi_system_reset(u32 reset_type, u32 reset_reason)
> +void sbi_system_reset(u32 reset_type, u32 reset_reason)
>  {
>         ulong hbase = 0, hmask;
>         u32 cur_hartid = current_hartid();
>         struct sbi_domain *dom = sbi_domain_thishart_ptr();
>         struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
> +       const struct sbi_system_reset_device *dev =
> +               sbi_system_reset_get_device(reset_type, reset_reason);
> +
> +       /* Check if domain allows system reset */
> +       if (!dom->system_reset_allowed)
> +               return;
> +
> +       /* Check if we have a reset device supporting the reset type */
> +       dev = sbi_system_reset_get_device(reset_type, reset_reason);
> +       if (!dev)
> +               return;
>
>         /* Send HALT IPI to every hart other than the current hart */
>         while (!sbi_hsm_hart_interruptible_mask(dom, hbase, &hmask)) {
> @@ -81,13 +92,8 @@ void __noreturn sbi_system_reset(u32 reset_type, u32 reset_reason)
>         /* Stop current HART */
>         sbi_hsm_hart_stop(scratch, FALSE);
>
> -       /* Platform specific reset if domain allowed system reset */
> -       if (dom->system_reset_allowed) {
> -               const struct sbi_system_reset_device *dev =
> -                       sbi_system_reset_get_device(reset_type, reset_reason);
> -               if (dev)
> -                       dev->system_reset(reset_type, reset_reason);
> -       }
> +       /* Execute platform specific reset */
> +       dev->system_reset(reset_type, reset_reason);
>
>         /* If platform specific reset did not work then do sbi_exit() */
>         sbi_exit(scratch);
> --
> 2.32.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list