[PATCH] lib: sbi: Fix hw a/d updating defaults

Anup Patel apatel at ventanamicro.com
Mon May 11 06:48:17 PDT 2026


On Thu, Apr 2, 2026 at 3:41 AM Andrew Jones
<andrew.jones at oss.qualcomm.com> wrote:
>
> The Svade dt-binding description states that Svadu should only
> be enabled at boot time when only Svadu is present in the DT.
> Ensure that's the case. Also, when only Svadu is supported,
> disable FWFT.PTE_AD_HW_UPDATING, as we need both to support
> toggling.
>
> Signed-off-by: Andrew Jones <andrew.jones at oss.qualcomm.com>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_fwft.c | 10 +++++++++-
>  lib/sbi/sbi_hart.c | 18 ++++++++++--------
>  2 files changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/lib/sbi/sbi_fwft.c b/lib/sbi/sbi_fwft.c
> index 373140b746bd..574b875e408d 100644
> --- a/lib/sbi/sbi_fwft.c
> +++ b/lib/sbi/sbi_fwft.c
> @@ -160,8 +160,16 @@ static int fwft_get_double_trap(struct fwft_config *conf, unsigned long *value)
>
>  static int fwft_adue_supported(struct fwft_config *conf)
>  {
> +       /*
> +        * FWFT.PTE_AD_HW_UPDATING is only supported when both Svade and Svadu
> +        * are supported. We need both in order to support toggling and to
> +        * ensure the reset value of zero is valid (it wouldn't be when only
> +        * Svadu is supported).
> +        */
>         if (!sbi_hart_has_extension(sbi_scratch_thishart_ptr(),
> -                                   SBI_HART_EXT_SVADU))
> +                                   SBI_HART_EXT_SVADU) ||
> +           !sbi_hart_has_extension(sbi_scratch_thishart_ptr(),
> +                                   SBI_HART_EXT_SVADE))
>                 return SBI_ENOTSUPP;
>
>         return SBI_OK;
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index 99e13990aa60..0df11d0d1029 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -137,6 +137,9 @@ static void mstatus_init(struct sbi_scratch *scratch)
>         if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) {
>                 menvcfg_val = csr_read64(CSR_MENVCFG);
>
> +               /* Disable HW A/D updating by default */
> +               menvcfg_val &= ~ENVCFG_ADUE;
> +
>                 /* Disable double trap by default */
>                 menvcfg_val &= ~ENVCFG_DTE;
>
> @@ -158,18 +161,17 @@ static void mstatus_init(struct sbi_scratch *scratch)
>  #endif
>                 __set_menvcfg_ext(SBI_HART_EXT_SSTC, ENVCFG_STCE)
>                 __set_menvcfg_ext(SBI_HART_EXT_SMCDELEG, ENVCFG_CDE);
> -               __set_menvcfg_ext(SBI_HART_EXT_SVADU, ENVCFG_ADUE);
> -
> -#undef __set_menvcfg_ext
>
>                 /*
> -                * When both Svade and Svadu are present in DT, the default scheme for managing
> -                * the PTE A/D bits should use Svade. Check Svadu before Svade extension to ensure
> -                * that the ADUE bit is cleared when the Svade support are specified.
> +                * Assume only Svadu is supported when it is the only extension
> +                * present in the ISA string. Svade is assumed when neither are
> +                * present. When both are present we must default to Svade (see
> +                * the zero reset value of FWFT.PTE_AD_HW_UPDATING).
>                  */
> +               if (!sbi_hart_has_extension(scratch, SBI_HART_EXT_SVADE))
> +                       __set_menvcfg_ext(SBI_HART_EXT_SVADU, ENVCFG_ADUE);
>
> -               if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SVADE))
> -                       menvcfg_val &= ~ENVCFG_ADUE;
> +#undef __set_menvcfg_ext
>
>                 csr_write64(CSR_MENVCFG, menvcfg_val);
>
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list