Message ID | 20200820105304.22955-1-xypron.glpk@gmx.de |
---|---|
State | Superseded, archived |
Delegated to: | Andes |
Headers | show |
Series | [v4,1/1] cmd: provide command sbi | expand |
>-----Original Message----- >From: Heinrich Schuchardt <xypron.glpk@gmx.de> >Sent: 20 August 2020 16:23 >To: Rick Chen <rick@andestech.com> >Cc: Bin Meng <bmeng.cn@gmail.com>; Pragnesh Patel ><pragnesh.patel@openfive.com>; Lukas Auer <lukas@auer.io>; Atish Patra ><atish.patra@wdc.com>; u-boot@lists.denx.de; Heinrich Schuchardt ><xypron.glpk@gmx.de>; Bin Meng <bin.meng@windriver.com> >Subject: [PATCH v4 1/1] cmd: provide command sbi > >[External Email] Do not click links or attachments unless you recognize the >sender and know the content is safe > >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> >Reviewed-by: Atish Patra <atish.patra@wdc.com> >Reviewed-by: Bin Meng <bin.meng@windriver.com> >Tested-by: Bin Meng <bin.meng@windriver.com> >--- >v4: > only show command name 'sbi' as short description in Kconfig menu > as suggested by Bin >v3: > add dependency on CONFIG_SBI_V02 > use lower case for sbi in Kconfig >v2: > provide a non-blank long help text >--- > arch/riscv/include/asm/sbi.h | 2 + > arch/riscv/lib/sbi.c | 36 ++++++++++++++++ > cmd/Kconfig | 6 +++ > cmd/riscv/Makefile | 1 + > cmd/riscv/sbi.c | 82 ++++++++++++++++++++++++++++++++++++ > 5 files changed, 127 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 implementation 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 9ad511aa17..8feeb0ddb0 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" >+ depends on RISCV_SMODE && SBI_V02 >+ 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..7c9151f436 >--- /dev/null >+++ b/cmd/riscv/sbi.c >@@ -0,0 +1,82 @@ >+// 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[] = >+ "- display SBI spec version, implementation, and available >+extensions"; >+ >+#endif >+ >+U_BOOT_CMD_COMPLETE( >+ sbi, 2, 0, do_sbi, Here 2 should be replaced by 1 because sbi command doesn't need any argument. Other than this, Reviewed-by: Pragnesh Patel <pragnesh.patel@openfive.com> Tested-by: Pragnesh Patel <pragnesh.patel@openfive.com> >+ "display SBI information", >+ sbi_help_text, NULL >+); >-- >2.28.0
Hi Heinrich, >-----Original Message----- >From: Heinrich Schuchardt <xypron.glpk@gmx.de> >Sent: 20 August 2020 16:23 >To: Rick Chen <rick@andestech.com> >Cc: Bin Meng <bmeng.cn@gmail.com>; Pragnesh Patel ><pragnesh.patel@openfive.com>; Lukas Auer <lukas@auer.io>; Atish Patra ><atish.patra@wdc.com>; u-boot@lists.denx.de; Heinrich Schuchardt ><xypron.glpk@gmx.de>; Bin Meng <bin.meng@windriver.com> >Subject: [PATCH v4 1/1] cmd: provide command sbi > >[External Email] Do not click links or attachments unless you recognize the >sender and know the content is safe > >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> >Reviewed-by: Atish Patra <atish.patra@wdc.com> >Reviewed-by: Bin Meng <bin.meng@windriver.com> >Tested-by: Bin Meng <bin.meng@windriver.com> >--- >v4: > only show command name 'sbi' as short description in Kconfig menu > as suggested by Bin >v3: > add dependency on CONFIG_SBI_V02 > use lower case for sbi in Kconfig >v2: > provide a non-blank long help text >--- > arch/riscv/include/asm/sbi.h | 2 + > arch/riscv/lib/sbi.c | 36 ++++++++++++++++ > cmd/Kconfig | 6 +++ > cmd/riscv/Makefile | 1 + > cmd/riscv/sbi.c | 82 ++++++++++++++++++++++++++++++++++++ > 5 files changed, 127 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 implementation 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 9ad511aa17..8feeb0ddb0 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" >+ depends on RISCV_SMODE && SBI_V02 >+ 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..7c9151f436 >--- /dev/null >+++ b/cmd/riscv/sbi.c >@@ -0,0 +1,82 @@ >+// 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; We should also check here like, if (argc > 1) return CMD_RET_USAGE; >+ >+ 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[] = >+ "- display SBI spec version, implementation, and available >+extensions"; >+ >+#endif >+ >+U_BOOT_CMD_COMPLETE( >+ sbi, 2, 0, do_sbi, >+ "display SBI information", >+ sbi_help_text, NULL >+); >-- >2.28.0
Hi Heinrich, >-----Original Message----- >From: Pragnesh Patel >Sent: 20 August 2020 17:00 >To: 'Heinrich Schuchardt' <xypron.glpk@gmx.de> >Cc: Bin Meng <bmeng.cn@gmail.com>; Lukas Auer <lukas@auer.io>; Atish Patra ><atish.patra@wdc.com>; u-boot@lists.denx.de; Bin Meng ><bin.meng@windriver.com>; Rick Chen <rick@andestech.com> >Subject: RE: [PATCH v4 1/1] cmd: provide command sbi > >Hi Heinrich, > >>-----Original Message----- >>From: Heinrich Schuchardt <xypron.glpk@gmx.de> >>Sent: 20 August 2020 16:23 >>To: Rick Chen <rick@andestech.com> >>Cc: Bin Meng <bmeng.cn@gmail.com>; Pragnesh Patel >><pragnesh.patel@openfive.com>; Lukas Auer <lukas@auer.io>; Atish Patra >><atish.patra@wdc.com>; u-boot@lists.denx.de; Heinrich Schuchardt >><xypron.glpk@gmx.de>; Bin Meng <bin.meng@windriver.com> >>Subject: [PATCH v4 1/1] cmd: provide command sbi >> >>[External Email] Do not click links or attachments unless you recognize >>the sender and know the content is safe >> >>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> >>Reviewed-by: Atish Patra <atish.patra@wdc.com> >>Reviewed-by: Bin Meng <bin.meng@windriver.com> >>Tested-by: Bin Meng <bin.meng@windriver.com> >>--- >>v4: >> only show command name 'sbi' as short description in Kconfig menu >> as suggested by Bin >>v3: >> add dependency on CONFIG_SBI_V02 >> use lower case for sbi in Kconfig >>v2: >> provide a non-blank long help text >>--- >> arch/riscv/include/asm/sbi.h | 2 + >> arch/riscv/lib/sbi.c | 36 ++++++++++++++++ >> cmd/Kconfig | 6 +++ >> cmd/riscv/Makefile | 1 + >> cmd/riscv/sbi.c | 82 ++++++++++++++++++++++++++++++++++++ >> 5 files changed, 127 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 implementation 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 9ad511aa17..8feeb0ddb0 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" >>+ depends on RISCV_SMODE && SBI_V02 >>+ 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..7c9151f436 >>--- /dev/null >>+++ b/cmd/riscv/sbi.c >>@@ -0,0 +1,82 @@ >>+// 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; > >We should also check here like, > > if (argc > 1) > return CMD_RET_USAGE; Sorry no need for this, if we change U_BOOT_CMD_COMPLETE with maxargs = 1 like below, U_BOOT_CMD_COMPLETE( sbi, 1, 0, do_sbi, .....) > >>+ >>+ 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[] = >>+ "- display SBI spec version, implementation, and available >>+extensions"; >>+ >>+#endif >>+ >>+U_BOOT_CMD_COMPLETE( >>+ sbi, 2, 0, do_sbi, >>+ "display SBI information", >>+ sbi_help_text, NULL >>+); >>-- >>2.28.0
On 20.08.20 13:30, Pragnesh Patel wrote: > Hi Heinrich, > >> -----Original Message----- >> From: Heinrich Schuchardt <xypron.glpk@gmx.de> >> Sent: 20 August 2020 16:23 >> To: Rick Chen <rick@andestech.com> >> Cc: Bin Meng <bmeng.cn@gmail.com>; Pragnesh Patel >> <pragnesh.patel@openfive.com>; Lukas Auer <lukas@auer.io>; Atish Patra >> <atish.patra@wdc.com>; u-boot@lists.denx.de; Heinrich Schuchardt >> <xypron.glpk@gmx.de>; Bin Meng <bin.meng@windriver.com> >> Subject: [PATCH v4 1/1] cmd: provide command sbi >> >> [External Email] Do not click links or attachments unless you recognize the >> sender and know the content is safe >> >> 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> >> Reviewed-by: Atish Patra <atish.patra@wdc.com> >> Reviewed-by: Bin Meng <bin.meng@windriver.com> >> Tested-by: Bin Meng <bin.meng@windriver.com> >> --- >> v4: >> only show command name 'sbi' as short description in Kconfig menu >> as suggested by Bin >> v3: >> add dependency on CONFIG_SBI_V02 >> use lower case for sbi in Kconfig >> v2: >> provide a non-blank long help text >> --- >> arch/riscv/include/asm/sbi.h | 2 + >> arch/riscv/lib/sbi.c | 36 ++++++++++++++++ >> cmd/Kconfig | 6 +++ >> cmd/riscv/Makefile | 1 + >> cmd/riscv/sbi.c | 82 ++++++++++++++++++++++++++++++++++++ >> 5 files changed, 127 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 implementation 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 9ad511aa17..8feeb0ddb0 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" >> + depends on RISCV_SMODE && SBI_V02 >> + 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..7c9151f436 >> --- /dev/null >> +++ b/cmd/riscv/sbi.c >> @@ -0,0 +1,82 @@ >> +// 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; > > We should also check here like, > > if (argc > 1) > return CMD_RET_USAGE; In the command definition I should change maxargs to 1 (including the command itself). A separate test here is superfluous. Best regards Heinrich > >> + >> + 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[] = >> + "- display SBI spec version, implementation, and available >> +extensions"; >> + >> +#endif >> + >> +U_BOOT_CMD_COMPLETE( >> + sbi, 2, 0, do_sbi, >> + "display SBI information", >> + sbi_help_text, NULL >> +); >> -- >> 2.28.0 >
Hi Heinrich, >-----Original Message----- >From: Heinrich Schuchardt <xypron.glpk@gmx.de> >Sent: 20 August 2020 17:25 >To: Pragnesh Patel <pragnesh.patel@openfive.com> >Cc: Bin Meng <bmeng.cn@gmail.com>; Lukas Auer <lukas@auer.io>; Atish Patra ><atish.patra@wdc.com>; u-boot@lists.denx.de; Bin Meng ><bin.meng@windriver.com>; Rick Chen <rick@andestech.com> >Subject: Re: [PATCH v4 1/1] cmd: provide command sbi > >[External Email] Do not click links or attachments unless you recognize the >sender and know the content is safe > >On 20.08.20 13:30, Pragnesh Patel wrote: >> Hi Heinrich, >> >>> -----Original Message----- >>> From: Heinrich Schuchardt <xypron.glpk@gmx.de> >>> Sent: 20 August 2020 16:23 >>> To: Rick Chen <rick@andestech.com> >>> Cc: Bin Meng <bmeng.cn@gmail.com>; Pragnesh Patel >>> <pragnesh.patel@openfive.com>; Lukas Auer <lukas@auer.io>; Atish >>> Patra <atish.patra@wdc.com>; u-boot@lists.denx.de; Heinrich >>> Schuchardt <xypron.glpk@gmx.de>; Bin Meng <bin.meng@windriver.com> >>> Subject: [PATCH v4 1/1] cmd: provide command sbi >>> >>> [External Email] Do not click links or attachments unless you >>> recognize the sender and know the content is safe >>> >>> 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> >>> Reviewed-by: Atish Patra <atish.patra@wdc.com> >>> Reviewed-by: Bin Meng <bin.meng@windriver.com> >>> Tested-by: Bin Meng <bin.meng@windriver.com> >>> --- >>> v4: >>> only show command name 'sbi' as short description in Kconfig menu >>> as suggested by Bin >>> v3: >>> add dependency on CONFIG_SBI_V02 >>> use lower case for sbi in Kconfig >>> v2: >>> provide a non-blank long help text >>> --- >>> arch/riscv/include/asm/sbi.h | 2 + >>> arch/riscv/lib/sbi.c | 36 ++++++++++++++++ >>> cmd/Kconfig | 6 +++ >>> cmd/riscv/Makefile | 1 + >>> cmd/riscv/sbi.c | 82 ++++++++++++++++++++++++++++++++++++ >>> 5 files changed, 127 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 implementation 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 9ad511aa17..8feeb0ddb0 >>> 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" >>> + depends on RISCV_SMODE && SBI_V02 >>> + 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..7c9151f436 >>> --- /dev/null >>> +++ b/cmd/riscv/sbi.c >>> @@ -0,0 +1,82 @@ >>> +// 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; >> >> We should also check here like, >> >> if (argc > 1) >> return CMD_RET_USAGE; > >In the command definition I should change maxargs to 1 (including the command >itself). > >A separate test here is superfluous. Agreed no need for this checking, just changing g the maxargs to 1 is enough. > >Best regards > >Heinrich > >> >>> + >>> + 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[] = >>> + "- display SBI spec version, implementation, and available >>> +extensions"; >>> + >>> +#endif >>> + >>> +U_BOOT_CMD_COMPLETE( >>> + sbi, 2, 0, do_sbi, >>> + "display SBI information", >>> + sbi_help_text, NULL >>> +); >>> -- >>> 2.28.0 >>
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 implementation 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 9ad511aa17..8feeb0ddb0 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" + depends on RISCV_SMODE && SBI_V02 + 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..7c9151f436 --- /dev/null +++ b/cmd/riscv/sbi.c @@ -0,0 +1,82 @@ +// 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[] = + "- display SBI spec version, implementation, and available extensions"; + +#endif + +U_BOOT_CMD_COMPLETE( + sbi, 2, 0, do_sbi, + "display SBI information", + sbi_help_text, NULL +);