[PATCH 4/4] lib: sbi: detect extensions from menvcfg
Yong-Xuan Wang
yongxuan.wang at sifive.com
Wed Sep 27 03:37:45 PDT 2023
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?
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