Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions include/sbi/riscv_encoding.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
9 changes: 9 additions & 0 deletions lib/sbi/sbi_hart.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}

Expand Down
Loading