summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAtish Patra <[email protected]>2024-02-16 16:06:08 -0800
committerAnup Patel <[email protected]>2024-03-04 10:20:41 +0530
commit6bb6b61c27eb07da375213a7a1bb0f8e3fad663a (patch)
tree08886944b5e851f2694702ef8081579442fdd525 /lib
parent322b59847534cbbf484190b0957fb32bee36e2ec (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.c16
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),
};
/**