[PATCH v2] lib: sbi: Enable Ssqosid Ext using mstateen0
Anup Patel
anup at brainfault.org
Thu Nov 6 05:09:01 PST 2025
On Thu, Nov 6, 2025 at 5:44 PM <cp0613 at linux.alibaba.com> wrote:
>
> From: Chen Pei <cp0613 at linux.alibaba.com>
>
> The QoS Identifiers extension (Ssqosid) introduces the srmcfg register,
> which configures a hart with two identifiers: a Resource Control ID
> (RCID) and a Monitoring Counter ID (MCID). These identifiers accompany
> each request issued by the hart to shared resource controllers.
>
> If extension Smstateen is implemented together with Ssqosid, then
> Ssqosid also requires the SRMCFG bit in mstateen0 to be implemented. If
> mstateen0.SRMCFG is 0, attempts to access srmcfg in privilege modes less
> privileged than M-mode raise an illegal-instruction exception. If
> mstateen0.SRMCFG is 1 or if extension Smstateen is not implemented,
> attempts to access srmcfg when V=1 raise a virtual-instruction exception.
>
> This extension can be found in the RISC-V Instruction Set Manual:
> https://github.com/riscv/riscv-isa-manual
>
> Signed-off-by: Chen Pei <cp0613 at linux.alibaba.com>
> ---
> include/sbi/riscv_encoding.h | 5 +++++
> include/sbi/sbi_hart.h | 2 ++
> lib/sbi/sbi_domain_context.c | 6 +++++-
> lib/sbi/sbi_hart.c | 6 ++++++
> 4 files changed, 18 insertions(+), 1 deletion(-)
>
> 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..b1b1c258 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;
> @@ -143,8 +145,10 @@ static int switch_to_next_domain_context(struct hart_context *ctx,
> ctx->satp = csr_swap(CSR_SATP, dom_ctx->satp);
> if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_10)
> ctx->scounteren = csr_swap(CSR_SCOUNTEREN, dom_ctx->scounteren);
> - if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12)
> + if (sbi_hart_priv_version(scratch) >= SBI_HART_PRIV_VER_1_12) {
> ctx->senvcfg = csr_swap(CSR_SENVCFG, dom_ctx->senvcfg);
There needs to be an "if (sbi_hart_has_extension(scratch,
SBI_HART_EXT_SSQOSID))"
over here before swapping SRMCFG so that csr is accessed only when
extension is present.
> + 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..549906f6 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),
> --
> 2.50.1
>
Regards,
Anup
More information about the opensbi
mailing list