Message ID | 20200816130509.15928-1-xypron.glpk@gmx.de |
---|---|
State | Superseded, archived |
Delegated to: | Andes |
Headers | show |
Series | [1/1] cmd: provide command sbi | expand |
On Sun, Aug 16, 2020 at 9:05 PM Heinrich Schuchardt <xypron.glpk@gmx.de> wrote: > > Provide a command to display information about the SBI implementation. > > The output might look like: > > => sbi > SBI 0.2 > OpenSBI > Extensions: > sbi_set_timer > sbi_console_putchar > sbi_console_getchar > sbi_clear_ipi > sbi_send_ipi > sbi_remote_fence_i > sbi_remote_sfence_vma > sbi_remote_sfence_vma_asid > sbi_shutdown > SBI Base Functionality > Timer Extension > IPI Extension > RFENCE Extension > Hart State Management Extension > > The command can be used to construct a unit test checking that the > communication with the SEE is working. > > Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> > --- > arch/riscv/include/asm/sbi.h | 2 + > arch/riscv/lib/sbi.c | 36 ++++++++++++++++ > cmd/Kconfig | 6 +++ > cmd/riscv/Makefile | 1 + > cmd/riscv/sbi.c | 80 ++++++++++++++++++++++++++++++++++++ > 5 files changed, 125 insertions(+) > create mode 100644 cmd/riscv/sbi.c > > diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h > index 08e1ac0c0e..53ca316180 100644 > --- a/arch/riscv/include/asm/sbi.h > +++ b/arch/riscv/include/asm/sbi.h > @@ -115,6 +115,8 @@ void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask, > unsigned long asid); > #endif > void sbi_set_timer(uint64_t stime_value); > +long sbi_get_spec_version(void); > +int sbi_get_impl_id(void); > int sbi_probe_extension(int ext); > > #endif > diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c > index 8fbc23839d..920889ed13 100644 > --- a/arch/riscv/lib/sbi.c > +++ b/arch/riscv/lib/sbi.c > @@ -53,6 +53,42 @@ void sbi_set_timer(uint64_t stime_value) > #endif > } > > +/** > + * sbi_get_spec_version() - get current SBI specification version > + * > + * Return: version id > + */ > +long sbi_get_spec_version(void) > +{ > + struct sbiret ret; > + > + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_SPEC_VERSION, > + 0, 0, 0, 0, 0, 0); > + if (!ret.error) > + if (ret.value) > + return ret.value; > + > + return -ENOTSUPP; > +} > + > +/** > + * sbi_get_impl_id() - get SBI implemenation ID > + * > + * Return: implementation ID > + */ > +int sbi_get_impl_id(void) > +{ > + struct sbiret ret; > + > + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_ID, > + 0, 0, 0, 0, 0, 0); > + if (!ret.error) > + if (ret.value) > + return ret.value; > + > + return -ENOTSUPP; > +} > + > /** > * sbi_probe_extension() - Check if an SBI extension ID is supported or not. > * @extid: The extension ID to be probed. > diff --git a/cmd/Kconfig b/cmd/Kconfig > index 23d7e27dc8..7a9fab51c5 100644 > --- a/cmd/Kconfig > +++ b/cmd/Kconfig > @@ -270,6 +270,12 @@ config SPL_CMD_TLV_EEPROM > help > Read system EEPROM data block in ONIE Tlvinfo format from SPL. > > +config CMD_SBI > + bool "SBI information" nits: keeping the prompt to be the command name seems to be the convention for other commands in U-Boot's Kconfig files, hence "sbi" > + depends on RISCV_SMODE This should depend on SBI_V02 as well. Legacy SBI does not support probing capabilities. > + help > + Display information about the SBI implementation. > + > endmenu > > menu "Boot commands" > diff --git a/cmd/riscv/Makefile b/cmd/riscv/Makefile > index 24df023ece..1e6ac364e3 100644 > --- a/cmd/riscv/Makefile > +++ b/cmd/riscv/Makefile > @@ -1,3 +1,4 @@ > # SPDX-License-Identifier: GPL-2.0+ > > obj-$(CONFIG_CMD_EXCEPTION) += exception.o > +obj-$(CONFIG_CMD_SBI) += sbi.o > diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c > new file mode 100644 > index 0000000000..559d950ffb > --- /dev/null > +++ b/cmd/riscv/sbi.c > @@ -0,0 +1,80 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * The 'sbi' command displays information about the SBI implementation. > + * > + * Copyright (c) 2020, Heinrich Schuchardt <xypron.glpk@gmx.de> > + */ > + > +#include <common.h> > +#include <command.h> > +#include <asm/sbi.h> > + > +struct sbi_ext { > + const u32 id; > + const char *name; > +}; > + > +static struct sbi_ext extensions[] = { > + { 0x00000000, "sbi_set_timer" }, > + { 0x00000001, "sbi_console_putchar" }, > + { 0x00000002, "sbi_console_getchar" }, > + { 0x00000003, "sbi_clear_ipi" }, > + { 0x00000004, "sbi_send_ipi" }, > + { 0x00000005, "sbi_remote_fence_i" }, > + { 0x00000006, "sbi_remote_sfence_vma" }, > + { 0x00000007, "sbi_remote_sfence_vma_asid" }, > + { 0x00000008, "sbi_shutdown" }, > + { 0x00000010, "SBI Base Functionality" }, > + { 0x54494D45, "Timer Extension" }, > + { 0x00735049, "IPI Extension" }, > + { 0x52464E43, "RFENCE Extension" }, > + { 0x0048534D, "Hart State Management Extension" }, > +}; > + > +static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, > + char *const argv[]) > +{ > + int i; > + long ret; > + > + ret = sbi_get_spec_version(); > + if (ret >= 0) > + printf("SBI %ld.%ld\n", ret >> 24, ret &0xffffff); > + ret = sbi_get_impl_id(); > + if (ret >= 0) { > + switch (ret) { > + case 0: > + printf("Berkeley Boot Loader (BBL)\n"); > + break; > + case 1: > + printf("OpenSBI\n"); > + break; > + case 2: > + printf("Xvisor\n"); > + break; > + case 3: > + printf("KVM\n"); > + break; > + default: > + printf("Unknown implementation\n"); > + break; > + } > + } > + printf("Extensions:\n"); > + for (i = 0; i < ARRAY_SIZE(extensions); ++i) { > + ret = sbi_probe_extension(extensions[i].id); > + if (ret > 0) > + printf(" %s\n", extensions[i].name); > + } > + return 0; > +} > + > +#ifdef CONFIG_SYS_LONGHELP > +static char sbi_help_text[] = ""; Nothing is displayed for LONGHELP? Or we just remove this? > +#endif > + > +U_BOOT_CMD_COMPLETE( > + sbi, 2, 0, do_sbi, > + "display SBI information", > + sbi_help_text, NULL > +); Regards, Bin
On 18.08.20 10:57, Bin Meng wrote: > On Sun, Aug 16, 2020 at 9:05 PM Heinrich Schuchardt <xypron.glpk@gmx.de> wrote: >> >> Provide a command to display information about the SBI implementation. >> >> The output might look like: >> >> => sbi >> SBI 0.2 >> OpenSBI >> Extensions: >> sbi_set_timer >> sbi_console_putchar >> sbi_console_getchar >> sbi_clear_ipi >> sbi_send_ipi >> sbi_remote_fence_i >> sbi_remote_sfence_vma >> sbi_remote_sfence_vma_asid >> sbi_shutdown >> SBI Base Functionality >> Timer Extension >> IPI Extension >> RFENCE Extension >> Hart State Management Extension >> >> The command can be used to construct a unit test checking that the >> communication with the SEE is working. >> >> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> >> --- >> arch/riscv/include/asm/sbi.h | 2 + >> arch/riscv/lib/sbi.c | 36 ++++++++++++++++ >> cmd/Kconfig | 6 +++ >> cmd/riscv/Makefile | 1 + >> cmd/riscv/sbi.c | 80 ++++++++++++++++++++++++++++++++++++ >> 5 files changed, 125 insertions(+) >> create mode 100644 cmd/riscv/sbi.c >> >> diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h >> index 08e1ac0c0e..53ca316180 100644 >> --- a/arch/riscv/include/asm/sbi.h >> +++ b/arch/riscv/include/asm/sbi.h >> @@ -115,6 +115,8 @@ void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask, >> unsigned long asid); >> #endif >> void sbi_set_timer(uint64_t stime_value); >> +long sbi_get_spec_version(void); >> +int sbi_get_impl_id(void); >> int sbi_probe_extension(int ext); >> >> #endif >> diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c >> index 8fbc23839d..920889ed13 100644 >> --- a/arch/riscv/lib/sbi.c >> +++ b/arch/riscv/lib/sbi.c >> @@ -53,6 +53,42 @@ void sbi_set_timer(uint64_t stime_value) >> #endif >> } >> >> +/** >> + * sbi_get_spec_version() - get current SBI specification version >> + * >> + * Return: version id >> + */ >> +long sbi_get_spec_version(void) >> +{ >> + struct sbiret ret; >> + >> + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_SPEC_VERSION, >> + 0, 0, 0, 0, 0, 0); >> + if (!ret.error) >> + if (ret.value) >> + return ret.value; >> + >> + return -ENOTSUPP; >> +} >> + >> +/** >> + * sbi_get_impl_id() - get SBI implemenation ID >> + * >> + * Return: implementation ID >> + */ >> +int sbi_get_impl_id(void) >> +{ >> + struct sbiret ret; >> + >> + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_ID, >> + 0, 0, 0, 0, 0, 0); >> + if (!ret.error) >> + if (ret.value) >> + return ret.value; >> + >> + return -ENOTSUPP; >> +} >> + >> /** >> * sbi_probe_extension() - Check if an SBI extension ID is supported or not. >> * @extid: The extension ID to be probed. >> diff --git a/cmd/Kconfig b/cmd/Kconfig >> index 23d7e27dc8..7a9fab51c5 100644 >> --- a/cmd/Kconfig >> +++ b/cmd/Kconfig >> @@ -270,6 +270,12 @@ config SPL_CMD_TLV_EEPROM >> help >> Read system EEPROM data block in ONIE Tlvinfo format from SPL. >> >> +config CMD_SBI >> + bool "SBI information" > > nits: keeping the prompt to be the command name seems to be the > convention for other commands in U-Boot's Kconfig files, hence "sbi" > >> + depends on RISCV_SMODE > > This should depend on SBI_V02 as well. Legacy SBI does not support > probing capabilities. > >> + help >> + Display information about the SBI implementation. >> + >> endmenu >> >> menu "Boot commands" >> diff --git a/cmd/riscv/Makefile b/cmd/riscv/Makefile >> index 24df023ece..1e6ac364e3 100644 >> --- a/cmd/riscv/Makefile >> +++ b/cmd/riscv/Makefile >> @@ -1,3 +1,4 @@ >> # SPDX-License-Identifier: GPL-2.0+ >> >> obj-$(CONFIG_CMD_EXCEPTION) += exception.o >> +obj-$(CONFIG_CMD_SBI) += sbi.o >> diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c >> new file mode 100644 >> index 0000000000..559d950ffb >> --- /dev/null >> +++ b/cmd/riscv/sbi.c >> @@ -0,0 +1,80 @@ >> +// SPDX-License-Identifier: GPL-2.0+ >> +/* >> + * The 'sbi' command displays information about the SBI implementation. >> + * >> + * Copyright (c) 2020, Heinrich Schuchardt <xypron.glpk@gmx.de> >> + */ >> + >> +#include <common.h> >> +#include <command.h> >> +#include <asm/sbi.h> >> + >> +struct sbi_ext { >> + const u32 id; >> + const char *name; >> +}; >> + >> +static struct sbi_ext extensions[] = { >> + { 0x00000000, "sbi_set_timer" }, >> + { 0x00000001, "sbi_console_putchar" }, >> + { 0x00000002, "sbi_console_getchar" }, >> + { 0x00000003, "sbi_clear_ipi" }, >> + { 0x00000004, "sbi_send_ipi" }, >> + { 0x00000005, "sbi_remote_fence_i" }, >> + { 0x00000006, "sbi_remote_sfence_vma" }, >> + { 0x00000007, "sbi_remote_sfence_vma_asid" }, >> + { 0x00000008, "sbi_shutdown" }, >> + { 0x00000010, "SBI Base Functionality" }, >> + { 0x54494D45, "Timer Extension" }, >> + { 0x00735049, "IPI Extension" }, >> + { 0x52464E43, "RFENCE Extension" }, >> + { 0x0048534D, "Hart State Management Extension" }, >> +}; >> + >> +static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, >> + char *const argv[]) >> +{ >> + int i; >> + long ret; >> + >> + ret = sbi_get_spec_version(); >> + if (ret >= 0) >> + printf("SBI %ld.%ld\n", ret >> 24, ret &0xffffff); >> + ret = sbi_get_impl_id(); >> + if (ret >= 0) { >> + switch (ret) { >> + case 0: >> + printf("Berkeley Boot Loader (BBL)\n"); >> + break; >> + case 1: >> + printf("OpenSBI\n"); >> + break; >> + case 2: >> + printf("Xvisor\n"); >> + break; >> + case 3: >> + printf("KVM\n"); >> + break; >> + default: >> + printf("Unknown implementation\n"); >> + break; >> + } >> + } >> + printf("Extensions:\n"); >> + for (i = 0; i < ARRAY_SIZE(extensions); ++i) { >> + ret = sbi_probe_extension(extensions[i].id); >> + if (ret > 0) >> + printf(" %s\n", extensions[i].name); >> + } >> + return 0; >> +} >> + >> +#ifdef CONFIG_SYS_LONGHELP >> +static char sbi_help_text[] = ""; > > Nothing is displayed for LONGHELP? Or we just remove this? With sbi_help_text = "": => help sbi sbi - display SBI information Usage: sbi With sbi_help_text = NULL: => help sbi sbi - display SBI information Usage: sbi - No additional help available. As there are no arguments foreseen for the sbi command I find this "No additional help available" irritating. This is why I am passing "" as help value. Best regards Heinrich > >> +#endif >> + >> +U_BOOT_CMD_COMPLETE( >> + sbi, 2, 0, do_sbi, >> + "display SBI information", >> + sbi_help_text, NULL >> +); > > Regards, > Bin >
On Tue, Aug 18, 2020 at 5:16 PM Heinrich Schuchardt <xypron.glpk@gmx.de> wrote: > > On 18.08.20 10:57, Bin Meng wrote: > > On Sun, Aug 16, 2020 at 9:05 PM Heinrich Schuchardt <xypron.glpk@gmx.de> wrote: > >> > >> Provide a command to display information about the SBI implementation. > >> > >> The output might look like: > >> > >> => sbi > >> SBI 0.2 > >> OpenSBI > >> Extensions: > >> sbi_set_timer > >> sbi_console_putchar > >> sbi_console_getchar > >> sbi_clear_ipi > >> sbi_send_ipi > >> sbi_remote_fence_i > >> sbi_remote_sfence_vma > >> sbi_remote_sfence_vma_asid > >> sbi_shutdown > >> SBI Base Functionality > >> Timer Extension > >> IPI Extension > >> RFENCE Extension > >> Hart State Management Extension > >> > >> The command can be used to construct a unit test checking that the > >> communication with the SEE is working. > >> > >> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> > >> --- > >> arch/riscv/include/asm/sbi.h | 2 + > >> arch/riscv/lib/sbi.c | 36 ++++++++++++++++ > >> cmd/Kconfig | 6 +++ > >> cmd/riscv/Makefile | 1 + > >> cmd/riscv/sbi.c | 80 ++++++++++++++++++++++++++++++++++++ > >> 5 files changed, 125 insertions(+) > >> create mode 100644 cmd/riscv/sbi.c > >> > >> diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h > >> index 08e1ac0c0e..53ca316180 100644 > >> --- a/arch/riscv/include/asm/sbi.h > >> +++ b/arch/riscv/include/asm/sbi.h > >> @@ -115,6 +115,8 @@ void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask, > >> unsigned long asid); > >> #endif > >> void sbi_set_timer(uint64_t stime_value); > >> +long sbi_get_spec_version(void); > >> +int sbi_get_impl_id(void); > >> int sbi_probe_extension(int ext); > >> > >> #endif > >> diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c > >> index 8fbc23839d..920889ed13 100644 > >> --- a/arch/riscv/lib/sbi.c > >> +++ b/arch/riscv/lib/sbi.c > >> @@ -53,6 +53,42 @@ void sbi_set_timer(uint64_t stime_value) > >> #endif > >> } > >> > >> +/** > >> + * sbi_get_spec_version() - get current SBI specification version > >> + * > >> + * Return: version id > >> + */ > >> +long sbi_get_spec_version(void) > >> +{ > >> + struct sbiret ret; > >> + > >> + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_SPEC_VERSION, > >> + 0, 0, 0, 0, 0, 0); > >> + if (!ret.error) > >> + if (ret.value) > >> + return ret.value; > >> + > >> + return -ENOTSUPP; > >> +} > >> + > >> +/** > >> + * sbi_get_impl_id() - get SBI implemenation ID > >> + * > >> + * Return: implementation ID > >> + */ > >> +int sbi_get_impl_id(void) > >> +{ > >> + struct sbiret ret; > >> + > >> + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_ID, > >> + 0, 0, 0, 0, 0, 0); > >> + if (!ret.error) > >> + if (ret.value) > >> + return ret.value; > >> + > >> + return -ENOTSUPP; > >> +} > >> + > >> /** > >> * sbi_probe_extension() - Check if an SBI extension ID is supported or not. > >> * @extid: The extension ID to be probed. > >> diff --git a/cmd/Kconfig b/cmd/Kconfig > >> index 23d7e27dc8..7a9fab51c5 100644 > >> --- a/cmd/Kconfig > >> +++ b/cmd/Kconfig > >> @@ -270,6 +270,12 @@ config SPL_CMD_TLV_EEPROM > >> help > >> Read system EEPROM data block in ONIE Tlvinfo format from SPL. > >> > >> +config CMD_SBI > >> + bool "SBI information" > > > > nits: keeping the prompt to be the command name seems to be the > > convention for other commands in U-Boot's Kconfig files, hence "sbi" > > > >> + depends on RISCV_SMODE > > > > This should depend on SBI_V02 as well. Legacy SBI does not support > > probing capabilities. > > > >> + help > >> + Display information about the SBI implementation. > >> + > >> endmenu > >> > >> menu "Boot commands" > >> diff --git a/cmd/riscv/Makefile b/cmd/riscv/Makefile > >> index 24df023ece..1e6ac364e3 100644 > >> --- a/cmd/riscv/Makefile > >> +++ b/cmd/riscv/Makefile > >> @@ -1,3 +1,4 @@ > >> # SPDX-License-Identifier: GPL-2.0+ > >> > >> obj-$(CONFIG_CMD_EXCEPTION) += exception.o > >> +obj-$(CONFIG_CMD_SBI) += sbi.o > >> diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c > >> new file mode 100644 > >> index 0000000000..559d950ffb > >> --- /dev/null > >> +++ b/cmd/riscv/sbi.c > >> @@ -0,0 +1,80 @@ > >> +// SPDX-License-Identifier: GPL-2.0+ > >> +/* > >> + * The 'sbi' command displays information about the SBI implementation. > >> + * > >> + * Copyright (c) 2020, Heinrich Schuchardt <xypron.glpk@gmx.de> > >> + */ > >> + > >> +#include <common.h> > >> +#include <command.h> > >> +#include <asm/sbi.h> > >> + > >> +struct sbi_ext { > >> + const u32 id; > >> + const char *name; > >> +}; > >> + > >> +static struct sbi_ext extensions[] = { > >> + { 0x00000000, "sbi_set_timer" }, > >> + { 0x00000001, "sbi_console_putchar" }, > >> + { 0x00000002, "sbi_console_getchar" }, > >> + { 0x00000003, "sbi_clear_ipi" }, > >> + { 0x00000004, "sbi_send_ipi" }, > >> + { 0x00000005, "sbi_remote_fence_i" }, > >> + { 0x00000006, "sbi_remote_sfence_vma" }, > >> + { 0x00000007, "sbi_remote_sfence_vma_asid" }, > >> + { 0x00000008, "sbi_shutdown" }, > >> + { 0x00000010, "SBI Base Functionality" }, > >> + { 0x54494D45, "Timer Extension" }, > >> + { 0x00735049, "IPI Extension" }, > >> + { 0x52464E43, "RFENCE Extension" }, > >> + { 0x0048534D, "Hart State Management Extension" }, > >> +}; > >> + > >> +static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, > >> + char *const argv[]) > >> +{ > >> + int i; > >> + long ret; > >> + > >> + ret = sbi_get_spec_version(); > >> + if (ret >= 0) > >> + printf("SBI %ld.%ld\n", ret >> 24, ret &0xffffff); > >> + ret = sbi_get_impl_id(); > >> + if (ret >= 0) { > >> + switch (ret) { > >> + case 0: > >> + printf("Berkeley Boot Loader (BBL)\n"); > >> + break; > >> + case 1: > >> + printf("OpenSBI\n"); > >> + break; > >> + case 2: > >> + printf("Xvisor\n"); > >> + break; > >> + case 3: > >> + printf("KVM\n"); > >> + break; > >> + default: > >> + printf("Unknown implementation\n"); > >> + break; > >> + } > >> + } > >> + printf("Extensions:\n"); > >> + for (i = 0; i < ARRAY_SIZE(extensions); ++i) { > >> + ret = sbi_probe_extension(extensions[i].id); > >> + if (ret > 0) > >> + printf(" %s\n", extensions[i].name); > >> + } > >> + return 0; > >> +} > >> + > >> +#ifdef CONFIG_SYS_LONGHELP > >> +static char sbi_help_text[] = ""; > > > > Nothing is displayed for LONGHELP? Or we just remove this? > > With sbi_help_text = "": > > => help sbi > sbi - display SBI information > > Usage: > sbi > > > > With sbi_help_text = NULL: > > => help sbi > sbi - display SBI information > > Usage: > sbi - No additional help available. > > > > As there are no arguments foreseen for the sbi command I find this "No > additional help available" irritating. Maybe we should put a more detailed help message on what this command is for, so that this LONGHELP can be really helpful. > > This is why I am passing "" as help value. > Regards, Bin
diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 08e1ac0c0e..53ca316180 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -115,6 +115,8 @@ void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask, unsigned long asid); #endif void sbi_set_timer(uint64_t stime_value); +long sbi_get_spec_version(void); +int sbi_get_impl_id(void); int sbi_probe_extension(int ext); #endif diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c index 8fbc23839d..920889ed13 100644 --- a/arch/riscv/lib/sbi.c +++ b/arch/riscv/lib/sbi.c @@ -53,6 +53,42 @@ void sbi_set_timer(uint64_t stime_value) #endif } +/** + * sbi_get_spec_version() - get current SBI specification version + * + * Return: version id + */ +long sbi_get_spec_version(void) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_SPEC_VERSION, + 0, 0, 0, 0, 0, 0); + if (!ret.error) + if (ret.value) + return ret.value; + + return -ENOTSUPP; +} + +/** + * sbi_get_impl_id() - get SBI implemenation ID + * + * Return: implementation ID + */ +int sbi_get_impl_id(void) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_IMP_ID, + 0, 0, 0, 0, 0, 0); + if (!ret.error) + if (ret.value) + return ret.value; + + return -ENOTSUPP; +} + /** * sbi_probe_extension() - Check if an SBI extension ID is supported or not. * @extid: The extension ID to be probed. diff --git a/cmd/Kconfig b/cmd/Kconfig index 23d7e27dc8..7a9fab51c5 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -270,6 +270,12 @@ config SPL_CMD_TLV_EEPROM help Read system EEPROM data block in ONIE Tlvinfo format from SPL. +config CMD_SBI + bool "SBI information" + depends on RISCV_SMODE + help + Display information about the SBI implementation. + endmenu menu "Boot commands" diff --git a/cmd/riscv/Makefile b/cmd/riscv/Makefile index 24df023ece..1e6ac364e3 100644 --- a/cmd/riscv/Makefile +++ b/cmd/riscv/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0+ obj-$(CONFIG_CMD_EXCEPTION) += exception.o +obj-$(CONFIG_CMD_SBI) += sbi.o diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c new file mode 100644 index 0000000000..559d950ffb --- /dev/null +++ b/cmd/riscv/sbi.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * The 'sbi' command displays information about the SBI implementation. + * + * Copyright (c) 2020, Heinrich Schuchardt <xypron.glpk@gmx.de> + */ + +#include <common.h> +#include <command.h> +#include <asm/sbi.h> + +struct sbi_ext { + const u32 id; + const char *name; +}; + +static struct sbi_ext extensions[] = { + { 0x00000000, "sbi_set_timer" }, + { 0x00000001, "sbi_console_putchar" }, + { 0x00000002, "sbi_console_getchar" }, + { 0x00000003, "sbi_clear_ipi" }, + { 0x00000004, "sbi_send_ipi" }, + { 0x00000005, "sbi_remote_fence_i" }, + { 0x00000006, "sbi_remote_sfence_vma" }, + { 0x00000007, "sbi_remote_sfence_vma_asid" }, + { 0x00000008, "sbi_shutdown" }, + { 0x00000010, "SBI Base Functionality" }, + { 0x54494D45, "Timer Extension" }, + { 0x00735049, "IPI Extension" }, + { 0x52464E43, "RFENCE Extension" }, + { 0x0048534D, "Hart State Management Extension" }, +}; + +static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + int i; + long ret; + + ret = sbi_get_spec_version(); + if (ret >= 0) + printf("SBI %ld.%ld\n", ret >> 24, ret &0xffffff); + ret = sbi_get_impl_id(); + if (ret >= 0) { + switch (ret) { + case 0: + printf("Berkeley Boot Loader (BBL)\n"); + break; + case 1: + printf("OpenSBI\n"); + break; + case 2: + printf("Xvisor\n"); + break; + case 3: + printf("KVM\n"); + break; + default: + printf("Unknown implementation\n"); + break; + } + } + printf("Extensions:\n"); + for (i = 0; i < ARRAY_SIZE(extensions); ++i) { + ret = sbi_probe_extension(extensions[i].id); + if (ret > 0) + printf(" %s\n", extensions[i].name); + } + return 0; +} + +#ifdef CONFIG_SYS_LONGHELP +static char sbi_help_text[] = ""; +#endif + +U_BOOT_CMD_COMPLETE( + sbi, 2, 0, do_sbi, + "display SBI information", + sbi_help_text, NULL +);
Provide a command to display information about the SBI implementation. The output might look like: => sbi SBI 0.2 OpenSBI Extensions: sbi_set_timer sbi_console_putchar sbi_console_getchar sbi_clear_ipi sbi_send_ipi sbi_remote_fence_i sbi_remote_sfence_vma sbi_remote_sfence_vma_asid sbi_shutdown SBI Base Functionality Timer Extension IPI Extension RFENCE Extension Hart State Management Extension The command can be used to construct a unit test checking that the communication with the SEE is working. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> --- arch/riscv/include/asm/sbi.h | 2 + arch/riscv/lib/sbi.c | 36 ++++++++++++++++ cmd/Kconfig | 6 +++ cmd/riscv/Makefile | 1 + cmd/riscv/sbi.c | 80 ++++++++++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 cmd/riscv/sbi.c -- 2.28.0