[PATCH 4/4] lib: sbi: detect extensions from menvcfg

Anup Patel anup at brainfault.org
Fri Oct 6 05:21:44 PDT 2023


On Wed, Sep 27, 2023 at 4:07 PM Yong-Xuan Wang <yongxuan.wang at sifive.com> wrote:
>
> Hi Anup,
>
>
> On Fri, Sep 22, 2023 at 4:59 PM Anup Patel <anup at brainfault.org> wrote:
> >
> > On Thu, Sep 7, 2023 at 2:57 PM Yong-Xuan Wang <yongxuan.wang at sifive.com> wrote:
> > >
> > > Currently "Boot HART ISA Extensions" only shows extensions which can be
> > > detected by test and set their CSRs. We can expand this functionality to
> > > detect additional extensions from menvcfg that do not introduce new CSRs
> > > but are controlled through menvcfg settings.
> >
> > To detect extensions this way, we have to write the CSR and some of the
> > CSR fields can have side effects. For example, the MML bit is a sticky bit
> > and enables ePMP mode.
> >
> > Instead, I suggest detecting extensions from the ISA string provided in the
> > DT. We have already done this for Smepmp extension so it should be easy
> > to extend.
>
> Thank you! I will update it in patch v2.
>
> And at present, OpenSBI employs two mechanisms for extension detection:
> one is parsing ISA string in fdt_parse_isa_extensions(), the other one
> is by testing CSRs in hart_detect_features(). Maybe we can delete the
> CSR testing method and only detect extensions from DT?

Instead of totally abandoning the CSR testing mechanism, I suggest keep
it but for future extensions prefer ISA string parsing (i.e. discover extensions
from DT passed by previous booting stage).

Regards,
Anup

>
> Regards,
> Yong-Xuan
>
>
> >
> > Regards,
> > Anup
> >
> > >
> > > Signed-off-by: Yong-Xuan Wang <yongxuan.wang at sifive.com>
> > > ---
> > >  include/sbi/sbi_hart.h |  8 +++++++
> > >  lib/sbi/sbi_hart.c     | 49 ++++++++++++++++++++++++++++++++++++++++++
> > >  2 files changed, 57 insertions(+)
> > >
> > > diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h
> > > index e60f415..a0e5f58 100644
> > > --- a/include/sbi/sbi_hart.h
> > > +++ b/include/sbi/sbi_hart.h
> > > @@ -42,6 +42,14 @@ enum sbi_hart_extensions {
> > >         SBI_HART_EXT_ZIHPM,
> > >         /** Hart has Smcntrpmf extension */
> > >         SBI_HART_EXT_SMCNTRPMF,
> > > +       /** Hart has Smcntrpmf extension */
> > > +       SBI_HART_EXT_ZICBOZ,
> > > +       /** Hart has Smcntrpmf extension */
> > > +       SBI_HART_EXT_ZICBOM,
> > > +       /** Hart has Smcntrpmf extension */
> > > +       SBI_HART_EXT_SVPBMT,
> > > +       /** Hart has Svadu extension */
> > > +       SBI_HART_EXT_SVADU,
> > >
> > >         /** Maximum index of Hart extension */
> > >         SBI_HART_EXT_MAX,
> > > diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> > > index b7ca0e6..9a0572e 100644
> > > --- a/lib/sbi/sbi_hart.c
> > > +++ b/lib/sbi/sbi_hart.c
> > > @@ -604,6 +604,18 @@ static inline char *sbi_hart_extension_id2string(int ext)
> > >         case SBI_HART_EXT_SMCNTRPMF:
> > >                 estr = "smcntrpmf";
> > >                 break;
> > > +       case SBI_HART_EXT_ZICBOZ:
> > > +               estr = "zicboz";
> > > +               break;
> > > +       case SBI_HART_EXT_ZICBOM:
> > > +               estr = "zicbom";
> > > +               break;
> > > +       case SBI_HART_EXT_SVPBMT:
> > > +               estr = "svpbmt";
> > > +               break;
> > > +       case SBI_HART_EXT_SVADU:
> > > +               estr = "svadu";
> > > +               break;
> > >         default:
> > >                 break;
> > >         }
> > > @@ -875,6 +887,43 @@ __pmp_skip:
> > >                 __sbi_hart_update_extension(hfeatures,
> > >                                         SBI_HART_EXT_ZIHPM, true);
> > >
> > > +       if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) {
> > > +               unsigned long orig_menvcfg_val, menvcfg_val;
> > > +
> > > +               orig_menvcfg_val = csr_read(CSR_MENVCFG);
> > > +               csr_write(CSR_MENVCFG, ~0);
> > > +               menvcfg_val = csr_read(CSR_MENVCFG);
> > > +
> > > +#if __riscv_xlen == 32
> > > +               orig_menvcfg_val |= ((uint64_t)csr_read(CSR_MENVCFGH)) << 32;
> > > +               csr_write(CSR_MENVCFGH, ~0);
> > > +               menvcfg_val |= ((uint64_t)csr_read(CSR_MENVCFGH)) << 32;
> > > +#endif
> > > +
> > > +#define __check_ext_menvcfg(__bit, __ext)                              \
> > > +               if (menvcfg_val & (__bit))                              \
> > > +                       __sbi_hart_update_extension(hfeatures,          \
> > > +                                                   __ext, true);       \
> > > +
> > > +               /* If the extension is not implemented, the related fields in
> > > +                * menvcfg are read-only zero.
> > > +                */
> > > +               __check_ext_menvcfg(ENVCFG_CBZE, SBI_HART_EXT_ZICBOZ);
> > > +               __check_ext_menvcfg(ENVCFG_CBCFE |
> > > +                                   (ENVCFG_CBIE_INV << ENVCFG_CBIE_SHIFT),
> > > +                                   SBI_HART_EXT_ZICBOM);
> > > +               __check_ext_menvcfg(ENVCFG_PBMTE, SBI_HART_EXT_SVPBMT);
> > > +               __check_ext_menvcfg(ENVCFG_HADE, SBI_HART_EXT_SVADU);
> > > +
> > > +#undef __check_ext_menvcfg
> > > +
> > > +               csr_write(CSR_MENVCFG, orig_menvcfg_val);
> > > +#if __riscv_xlen == 32
> > > +               csr_write(CSR_MENVCFGH, orig_menvcfg_val >> 32);
> > > +#endif
> > > +
> > > +       }
> > > +
> > >         /* Mark hart feature detection done */
> > >         hfeatures->detected = true;
> > >
> > > --
> > > 2.17.1
> > >
> > >
> > > --
> > > opensbi mailing list
> > > opensbi at lists.infradead.org
> > > http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list