forked from Mirrors/opensbi
lib: sbi: Detect extensions from the ISA string in DT
Enable access to some extensions through menvcfg and show them in "Boot HART ISA Extensions" if they are present in the device tree. Signed-off-by: Yong-Xuan Wang <yongxuan.wang@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:

committed by
Anup Patel

parent
776770d2ad
commit
3daac8fb87
@@ -47,6 +47,12 @@ enum sbi_hart_extensions {
|
|||||||
SBI_HART_EXT_SMCNTRPMF,
|
SBI_HART_EXT_SMCNTRPMF,
|
||||||
/** Hart has Xandespmu extension */
|
/** Hart has Xandespmu extension */
|
||||||
SBI_HART_EXT_XANDESPMU,
|
SBI_HART_EXT_XANDESPMU,
|
||||||
|
/** Hart has Zicboz extension */
|
||||||
|
SBI_HART_EXT_ZICBOZ,
|
||||||
|
/** Hart has Zicbom extension */
|
||||||
|
SBI_HART_EXT_ZICBOM,
|
||||||
|
/** Hart has Svpbmt extension */
|
||||||
|
SBI_HART_EXT_SVPBMT,
|
||||||
|
|
||||||
/** Maximum index of Hart extension */
|
/** Maximum index of Hart extension */
|
||||||
SBI_HART_EXT_MAX,
|
SBI_HART_EXT_MAX,
|
||||||
|
@@ -112,47 +112,25 @@ static void mstatus_init(struct sbi_scratch *scratch)
|
|||||||
menvcfg_val |= ((uint64_t)csr_read(CSR_MENVCFGH)) << 32;
|
menvcfg_val |= ((uint64_t)csr_read(CSR_MENVCFGH)) << 32;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#define __set_menvcfg_ext(__ext, __bits) \
|
||||||
* Set menvcfg.CBZE == 1
|
if (sbi_hart_has_extension(scratch, __ext)) \
|
||||||
*
|
menvcfg_val |= __bits;
|
||||||
* If Zicboz extension is not available then writes to
|
|
||||||
* menvcfg.CBZE will be ignored because it is a WARL field.
|
|
||||||
*/
|
|
||||||
menvcfg_val |= ENVCFG_CBZE;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set menvcfg.CBCFE == 1
|
* Enable access to extensions if they are present in the
|
||||||
*
|
* hardware or in the device tree.
|
||||||
* If Zicbom extension is not available then writes to
|
|
||||||
* menvcfg.CBCFE will be ignored because it is a WARL field.
|
|
||||||
*/
|
*/
|
||||||
menvcfg_val |= ENVCFG_CBCFE;
|
|
||||||
|
|
||||||
/*
|
__set_menvcfg_ext(SBI_HART_EXT_ZICBOZ, ENVCFG_CBZE)
|
||||||
* Set menvcfg.CBIE == 3
|
__set_menvcfg_ext(SBI_HART_EXT_ZICBOM, ENVCFG_CBCFE)
|
||||||
*
|
__set_menvcfg_ext(SBI_HART_EXT_ZICBOM,
|
||||||
* If Zicbom extension is not available then writes to
|
ENVCFG_CBIE_INV << ENVCFG_CBIE_SHIFT)
|
||||||
* menvcfg.CBIE will be ignored because it is a WARL field.
|
|
||||||
*/
|
|
||||||
menvcfg_val |= ENVCFG_CBIE_INV << ENVCFG_CBIE_SHIFT;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set menvcfg.PBMTE == 1 for RV64 or RV128
|
|
||||||
*
|
|
||||||
* If Svpbmt extension is not available then menvcfg.PBMTE
|
|
||||||
* will be read-only zero.
|
|
||||||
*/
|
|
||||||
#if __riscv_xlen > 32
|
#if __riscv_xlen > 32
|
||||||
menvcfg_val |= ENVCFG_PBMTE;
|
__set_menvcfg_ext(SBI_HART_EXT_SVPBMT, ENVCFG_PBMTE)
|
||||||
#endif
|
#endif
|
||||||
|
__set_menvcfg_ext(SBI_HART_EXT_SSTC, ENVCFG_STCE)
|
||||||
|
|
||||||
/*
|
#undef __set_menvcfg_ext
|
||||||
* The spec doesn't explicitly describe the reset value of menvcfg.
|
|
||||||
* Enable access to stimecmp if sstc extension is present in the
|
|
||||||
* hardware.
|
|
||||||
*/
|
|
||||||
if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSTC))
|
|
||||||
menvcfg_val |= ENVCFG_STCE;
|
|
||||||
|
|
||||||
csr_write(CSR_MENVCFG, menvcfg_val);
|
csr_write(CSR_MENVCFG, menvcfg_val);
|
||||||
#if __riscv_xlen == 32
|
#if __riscv_xlen == 32
|
||||||
@@ -676,6 +654,9 @@ const struct sbi_hart_ext_data sbi_hart_ext[] = {
|
|||||||
__SBI_HART_EXT_DATA(zkr, SBI_HART_EXT_ZKR),
|
__SBI_HART_EXT_DATA(zkr, SBI_HART_EXT_ZKR),
|
||||||
__SBI_HART_EXT_DATA(smcntrpmf, SBI_HART_EXT_SMCNTRPMF),
|
__SBI_HART_EXT_DATA(smcntrpmf, SBI_HART_EXT_SMCNTRPMF),
|
||||||
__SBI_HART_EXT_DATA(xandespmu, SBI_HART_EXT_XANDESPMU),
|
__SBI_HART_EXT_DATA(xandespmu, SBI_HART_EXT_XANDESPMU),
|
||||||
|
__SBI_HART_EXT_DATA(zicboz, SBI_HART_EXT_ZICBOZ),
|
||||||
|
__SBI_HART_EXT_DATA(zicbom, SBI_HART_EXT_ZICBOM),
|
||||||
|
__SBI_HART_EXT_DATA(svpbmt, SBI_HART_EXT_SVPBMT),
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user