diff options
| author | Atish Patra <[email protected]> | 2024-02-16 16:06:08 -0800 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2024-03-04 10:20:41 +0530 |
| commit | 6bb6b61c27eb07da375213a7a1bb0f8e3fad663a (patch) | |
| tree | 08886944b5e851f2694702ef8081579442fdd525 /lib | |
| parent | 322b59847534cbbf484190b0957fb32bee36e2ec (diff) | |
lib: sbi: Add support for smcsrind and smcdeleg
Smcsrind allows generic indirect CSR access mechanism while
Smcdeleg allows delegating hpmcounters in Supervisor mode.
Enable both extensions and set the appropriate bits in mstateen
and menvcfg.
Co-developed-by: Kaiwen Xue <[email protected]>
Signed-off-by: Atish Patra <[email protected]>
Reviewed-by: Anup Patel <[email protected]>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sbi/sbi_hart.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index a0ab0c64..3d136944 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -95,11 +95,16 @@ static void mstatus_init(struct sbi_scratch *scratch) mstateen_val |= SMSTATEEN0_HSENVCFG; if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SMAIA)) - mstateen_val |= (SMSTATEEN0_AIA | SMSTATEEN0_SVSLCT | - SMSTATEEN0_IMSIC); + mstateen_val |= (SMSTATEEN0_AIA | SMSTATEEN0_IMSIC); else - mstateen_val &= ~(SMSTATEEN0_AIA | SMSTATEEN0_SVSLCT | - SMSTATEEN0_IMSIC); + mstateen_val &= ~(SMSTATEEN0_AIA | SMSTATEEN0_IMSIC); + + if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SMAIA) || + sbi_hart_has_extension(scratch, SBI_HART_EXT_SMCSRIND)) + mstateen_val |= (SMSTATEEN0_SVSLCT); + else + mstateen_val &= ~(SMSTATEEN0_SVSLCT); + csr_write(CSR_MSTATEEN0, mstateen_val); #if __riscv_xlen == 32 csr_write(CSR_MSTATEEN0H, mstateen_val >> 32); @@ -129,6 +134,7 @@ static void mstatus_init(struct sbi_scratch *scratch) __set_menvcfg_ext(SBI_HART_EXT_SVPBMT, ENVCFG_PBMTE) #endif __set_menvcfg_ext(SBI_HART_EXT_SSTC, ENVCFG_STCE) + __set_menvcfg_ext(SBI_HART_EXT_SMCDELEG, ENVCFG_CDE); #undef __set_menvcfg_ext @@ -658,6 +664,8 @@ const struct sbi_hart_ext_data sbi_hart_ext[] = { __SBI_HART_EXT_DATA(zicbom, SBI_HART_EXT_ZICBOM), __SBI_HART_EXT_DATA(svpbmt, SBI_HART_EXT_SVPBMT), __SBI_HART_EXT_DATA(sdtrig, SBI_HART_EXT_SDTRIG), + __SBI_HART_EXT_DATA(smcsrind, SBI_HART_EXT_SMCSRIND), + __SBI_HART_EXT_DATA(smcdeleg, SBI_HART_EXT_SMCDELEG), }; /** |
