diff --git a/include/sbi/riscv_encoding.h b/include/sbi/riscv_encoding.h index d414a2fb..1786fcb2 100644 --- a/include/sbi/riscv_encoding.h +++ b/include/sbi/riscv_encoding.h @@ -736,6 +736,15 @@ #define MSECCFG_SSEED_SHIFT (9) #define MSECCFG_SSEED (_UL(1) << MSECCFG_SSEED_SHIFT) +/* msdcfg */ +#define CSR_MSDCFG 0xbd0 +#define MSDCFG_SSM_SHIFT (19) +#define MSDCFG_SRL_SHIFT (20) +#define MSDCFG_SML_SHIFT (24) +#define MSDCFG_SSM (_UL(1) << MSDCFG_SSM_SHIFT) +#define MSDCFG_SRL_MASK GENMASK_ULL(23, 20) +#define MSDCFG_SML_MASK GENMASK_ULL(27, 24) + /* Counter Overflow CSR */ #define CSR_SCOUNTOVF 0xda0 diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index 68c89b8d..0c5f30ee 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -1063,6 +1063,7 @@ int sbi_hart_reinit(struct sbi_scratch *scratch) int sbi_hart_init(struct sbi_scratch *scratch, bool cold_boot) { int rc; + struct sbi_trap_info trap = {0}; /* * Clear mip CSR before proceeding with init to avoid any spurious @@ -1084,6 +1085,14 @@ int sbi_hart_init(struct sbi_scratch *scratch, bool cold_boot) if (rc) return rc; + // TODO: check smmtt available + csr_read_allowed(CSR_MSDCFG, &trap); + if (!trap.cause) { + // SSM=0; SRL=SML=5 + csr_clear(CSR_MSDCFG, MSDCFG_SSM); + csr_set(CSR_MSDCFG, (5 << MSDCFG_SRL_SHIFT) | (5 << MSDCFG_SML_SHIFT)); + } + return sbi_hart_reinit(scratch); }