diff --git a/include/sbi/riscv_encoding.h b/include/sbi/riscv_encoding.h index 61e4b635..b738e209 100644 --- a/include/sbi/riscv_encoding.h +++ b/include/sbi/riscv_encoding.h @@ -378,6 +378,9 @@ #define CSR_SSTATEEN2 0x10E #define CSR_SSTATEEN3 0x10F +/* Supervisor Resource Management Configuration CSRs */ +#define CSR_SRMCFG 0x181 + /* Machine-Level Control transfer records CSRs */ #define CSR_MCTRCTL 0x34e @@ -849,6 +852,8 @@ #define SMSTATEEN0_FCSR (_ULL(1) << SMSTATEEN0_FCSR_SHIFT) #define SMSTATEEN0_CTR_SHIFT 54 #define SMSTATEEN0_CTR (_ULL(1) << SMSTATEEN0_CTR_SHIFT) +#define SMSTATEEN0_SRMCFG_SHIFT 55 +#define SMSTATEEN0_SRMCFG (_ULL(1) << SMSTATEEN0_SRMCFG_SHIFT) #define SMSTATEEN0_CONTEXT_SHIFT 57 #define SMSTATEEN0_CONTEXT (_ULL(1) << SMSTATEEN0_CONTEXT_SHIFT) #define SMSTATEEN0_IMSIC_SHIFT 58 diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h index e66dd52f..c51b0689 100644 --- a/include/sbi/sbi_hart.h +++ b/include/sbi/sbi_hart.h @@ -79,6 +79,8 @@ enum sbi_hart_extensions { SBI_HART_EXT_SMCTR, /** HART has CTR S-mode CSRs */ SBI_HART_EXT_SSCTR, + /** Hart has Ssqosid extension */ + SBI_HART_EXT_SSQOSID, /** HART has Ssstateen extension **/ SBI_HART_EXT_SSSTATEEN, /** Hart has Xsfcflushdlone extension */ diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c index 74ad25e8..a66438e4 100644 --- a/lib/sbi/sbi_domain_context.c +++ b/lib/sbi/sbi_domain_context.c @@ -45,6 +45,8 @@ struct hart_context { unsigned long scounteren; /** Supervisor environment configuration register */ unsigned long senvcfg; + /** Supervisor resource management configuration register */ + unsigned long srmcfg; /** Reference to the owning domain */ struct sbi_domain *dom; @@ -145,6 +147,8 @@ static int switch_to_next_domain_context(struct hart_context *ctx, ctx->scounteren = csr_swap(CSR_SCOUNTEREN, dom_ctx->scounteren); if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) ctx->senvcfg = csr_swap(CSR_SENVCFG, dom_ctx->senvcfg); + if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSQOSID)) + ctx->srmcfg = csr_swap(CSR_SRMCFG, dom_ctx->srmcfg); /* Save current trap state and restore target domain's trap state */ trap_ctx = sbi_trap_get_context(scratch); diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index a91703b4..295a6783 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -112,6 +112,11 @@ static void mstatus_init(struct sbi_scratch *scratch) else mstateen_val &= ~SMSTATEEN0_CTR; + if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSQOSID)) + mstateen_val |= SMSTATEEN0_SRMCFG; + else + mstateen_val &= ~SMSTATEEN0_SRMCFG; + csr_write64(CSR_MSTATEEN0, mstateen_val); csr_write64(CSR_MSTATEEN1, SMSTATEEN_STATEN); csr_write64(CSR_MSTATEEN2, SMSTATEEN_STATEN); @@ -685,6 +690,7 @@ const struct sbi_hart_ext_data sbi_hart_ext[] = { __SBI_HART_EXT_DATA(ssdbltrp, SBI_HART_EXT_SSDBLTRP), __SBI_HART_EXT_DATA(smctr, SBI_HART_EXT_SMCTR), __SBI_HART_EXT_DATA(ssctr, SBI_HART_EXT_SSCTR), + __SBI_HART_EXT_DATA(ssqosid, SBI_HART_EXT_SSQOSID), __SBI_HART_EXT_DATA(ssstateen, SBI_HART_EXT_SSSTATEEN), __SBI_HART_EXT_DATA(xsfcflushdlone, SBI_HART_EXT_XSIFIVE_CFLUSH_D_L1), __SBI_HART_EXT_DATA(xsfcease, SBI_HART_EXT_XSIFIVE_CEASE),