[PATCH] lib: sbi: Align system suspend errors with spec
Anup Patel
anup at brainfault.org
Sun Jun 4 02:52:46 PDT 2023
On Thu, Jun 1, 2023 at 1:18 PM Andrew Jones <ajones at ventanamicro.com> wrote:
>
> The spec says sbi_system_suspend() will return SBI_ERR_INVALID_PARAM
> when "sleep_type is reserved or is platform-specific and unimplemented"
> and SBI_ERR_NOT_SUPPORTED when sleep_type "is not reserved and is
> implemented, but the platform does not support it due to one or more
> missing dependencies." Ensure SBI_ERR_INVALID_PARAM is returned for
> reserved sleep types and that the system suspend driver can choose
> which of the two error types to return itself by returning an error
> from its check function rather than a boolean.
>
> Signed-off-by: Andrew Jones <ajones at ventanamicro.com>
Looks good to me.
Reviewed-by: Anup Patel <anup at brainfault.org>
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
> include/sbi/sbi_system.h | 9 ++++++++-
> lib/sbi/sbi_system.c | 14 ++++++++------
> 2 files changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/include/sbi/sbi_system.h b/include/sbi/sbi_system.h
> index 33ff7f1a44a6..0fdcc98cce5d 100644
> --- a/include/sbi/sbi_system.h
> +++ b/include/sbi/sbi_system.h
> @@ -48,7 +48,14 @@ struct sbi_system_suspend_device {
> /** Name of the system suspend device */
> char name[32];
>
> - /* Check whether sleep type is supported by the device */
> + /**
> + * Check whether sleep type is supported by the device
> + *
> + * Returns 0 when @sleep_type supported, SBI_ERR_INVALID_PARAM
> + * when @sleep_type is reserved, or SBI_ERR_NOT_SUPPORTED when
> + * @sleep_type is not reserved and is implemented, but the
> + * platform doesn't support it due to missing dependencies.
> + */
> int (*system_suspend_check)(u32 sleep_type);
>
> /**
> diff --git a/lib/sbi/sbi_system.c b/lib/sbi/sbi_system.c
> index 6933915a12ed..d803ffa84189 100644
> --- a/lib/sbi/sbi_system.c
> +++ b/lib/sbi/sbi_system.c
> @@ -111,7 +111,7 @@ void sbi_system_suspend_set_device(struct sbi_system_suspend_device *dev)
>
> static int sbi_system_suspend_test_check(u32 sleep_type)
> {
> - return sleep_type == SBI_SUSP_SLEEP_TYPE_SUSPEND;
> + return sleep_type == SBI_SUSP_SLEEP_TYPE_SUSPEND ? 0 : SBI_EINVAL;
> }
>
> static int sbi_system_suspend_test_suspend(u32 sleep_type,
> @@ -142,27 +142,29 @@ void sbi_system_suspend_test_enable(void)
> bool sbi_system_suspend_supported(u32 sleep_type)
> {
> return suspend_dev && suspend_dev->system_suspend_check &&
> - suspend_dev->system_suspend_check(sleep_type);
> + suspend_dev->system_suspend_check(sleep_type) == 0;
> }
>
> int sbi_system_suspend(u32 sleep_type, ulong resume_addr, ulong opaque)
> {
> - int ret = SBI_ENOTSUPP;
> const struct sbi_domain *dom = sbi_domain_thishart_ptr();
> struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
> void (*jump_warmboot)(void) = (void (*)(void))scratch->warmboot_addr;
> unsigned int hartid = current_hartid();
> unsigned long prev_mode;
> unsigned long i;
> + int ret;
>
> if (!dom || !dom->system_suspend_allowed)
> return SBI_EFAIL;
>
> - if (!suspend_dev || !suspend_dev->system_suspend)
> + if (!suspend_dev || !suspend_dev->system_suspend ||
> + !suspend_dev->system_suspend_check)
> return SBI_EFAIL;
>
> - if (!sbi_system_suspend_supported(sleep_type))
> - return SBI_ENOTSUPP;
> + ret = suspend_dev->system_suspend_check(sleep_type);
> + if (ret != SBI_OK)
> + return ret;
>
> prev_mode = (csr_read(CSR_MSTATUS) & MSTATUS_MPP) >> MSTATUS_MPP_SHIFT;
> if (prev_mode != PRV_S && prev_mode != PRV_U)
> --
> 2.40.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list