On Mon, Mar 17, 2025 at 05:46:50PM +0100, Clément Léger wrote: > These functions will be used by SSE tests to check for a specific OpenSBI > version. > > Signed-off-by: Clément Léger <cleger@xxxxxxxxxxxx> > --- > lib/riscv/asm/sbi.h | 20 ++++++++++++++++++++ > lib/riscv/sbi.c | 20 ++++++++++++++++++++ > 2 files changed, 40 insertions(+) > > diff --git a/lib/riscv/asm/sbi.h b/lib/riscv/asm/sbi.h > index ee9d6e50..90111628 100644 > --- a/lib/riscv/asm/sbi.h > +++ b/lib/riscv/asm/sbi.h > @@ -18,6 +18,19 @@ > #define SBI_ERR_IO -13 > #define SBI_ERR_DENIED_LOCKED -14 > > +#define SBI_IMPL_BBL 0 > +#define SBI_IMPL_OPENSBI 1 > +#define SBI_IMPL_XVISOR 2 > +#define SBI_IMPL_KVM 3 > +#define SBI_IMPL_RUSTSBI 4 > +#define SBI_IMPL_DIOSIX 5 > +#define SBI_IMPL_COFFER 6 > +#define SBI_IMPL_XEN 7 > +#define SBI_IMPL_POLARFIRE_HSS 8 > +#define SBI_IMPL_COREBOOT 9 > +#define SBI_IMPL_OREBOOT 10 > +#define SBI_IMPL_BHYVE 11 > + > /* SBI spec version fields */ > #define SBI_SPEC_VERSION_MAJOR_SHIFT 24 > #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f > @@ -124,6 +137,11 @@ static inline unsigned long sbi_mk_version(unsigned long major, unsigned long mi > | (minor & SBI_SPEC_VERSION_MINOR_MASK); > } > > +static inline unsigned long sbi_impl_opensbi_mk_version(unsigned long major, unsigned long minor) > +{ > + return (((major & 0xffff) << 16) | (minor & 0xffff)); > +} > + > struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, > unsigned long arg1, unsigned long arg2, > unsigned long arg3, unsigned long arg4, > @@ -139,6 +157,8 @@ struct sbiret sbi_send_ipi_cpumask(const cpumask_t *mask); > struct sbiret sbi_send_ipi_broadcast(void); > struct sbiret sbi_set_timer(unsigned long stime_value); > struct sbiret sbi_get_spec_version(void); > +unsigned long sbi_get_imp_version(void); > +unsigned long sbi_get_imp_id(void); > long sbi_probe(int ext); > > #endif /* !__ASSEMBLER__ */ > diff --git a/lib/riscv/sbi.c b/lib/riscv/sbi.c > index 9d4eb541..ab032e3e 100644 > --- a/lib/riscv/sbi.c > +++ b/lib/riscv/sbi.c > @@ -107,6 +107,26 @@ struct sbiret sbi_set_timer(unsigned long stime_value) > return sbi_ecall(SBI_EXT_TIME, SBI_EXT_TIME_SET_TIMER, stime_value, 0, 0, 0, 0, 0); > } > > +unsigned long sbi_get_imp_version(void) > +{ > + struct sbiret ret; > + > + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_VERSION, 0, 0, 0, 0, 0, 0); > + assert(!ret.error); > + > + return ret.value; > +} > + > +unsigned long sbi_get_imp_id(void) > +{ > + struct sbiret ret; > + > + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_ID, 0, 0, 0, 0, 0, 0); > + assert(!ret.error); > + > + return ret.value; > +} > + > struct sbiret sbi_get_spec_version(void) > { > return sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_SPEC_VERSION, 0, 0, 0, 0, 0, 0); > -- > 2.47.2 > LGTM Thanks, drew