[PATCH v3 0/2] cmd/sbi: add missing SBI information

Let the sbi command display:
* machine vendor ID * machine architecture ID * machine implementation ID
Heinrich Schuchardt (2): riscv: provide missing base extension functions cmd/sbi: add missing SBI information
arch/riscv/include/asm/sbi.h | 3 ++ arch/riscv/lib/sbi.c | 65 ++++++++++++++++++++++++++++++++++++ cmd/riscv/sbi.c | 13 +++++++- 3 files changed, 80 insertions(+), 1 deletion(-)

Provide library functions to read:
* machine vendor ID * machine architecture ID * machine implementation ID
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com --- arch/riscv/include/asm/sbi.h | 3 ++ arch/riscv/lib/sbi.c | 65 ++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+)
diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 76453121ea..81fcfe0b36 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -155,6 +155,9 @@ long sbi_get_spec_version(void); int sbi_get_impl_id(void); int sbi_get_impl_version(long *version); int sbi_probe_extension(int ext); +int sbi_get_mvendorid(long *mvendorid); +int sbi_get_marchid(long *marchid); +int sbi_get_mimpid(long *mimpid); void sbi_srst_reset(unsigned long type, unsigned long reason);
#endif diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c index d427d1b29e..8724e3a460 100644 --- a/arch/riscv/lib/sbi.c +++ b/arch/riscv/lib/sbi.c @@ -127,6 +127,71 @@ int sbi_probe_extension(int extid) return -ENOTSUPP; }
+/** + * sbi_get_mvendorid() - get machine vendor ID + * + * @mimpid: on return machine vendor ID + * Return: 0 on success + */ +int sbi_get_mvendorid(long *mvendorid) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MVENDORID, + 0, 0, 0, 0, 0, 0); + if (ret.error) + return -ENOTSUPP; + + if (mvendorid) + *mvendorid = ret.value; + + return 0; +} + +/** + * sbi_get_marchid() - get machine architecture ID + * + * @mimpid: on return machine architecture ID + * Return: 0 on success + */ +int sbi_get_marchid(long *marchid) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MARCHID, + 0, 0, 0, 0, 0, 0); + + if (ret.error) + return -ENOTSUPP; + + if (marchid) + *marchid = ret.value; + + return 0; +} + +/** + * sbi_get_mimpid() - get machine implementation ID + * + * @mimpid: on return machine implementation ID + * Return: 0 on success + */ +int sbi_get_mimpid(long *mimpid) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MIMPID, + 0, 0, 0, 0, 0, 0); + + if (ret.error) + return -ENOTSUPP; + + if (mimpid) + *mimpid = ret.value; + + return 0; +} + /** * sbi_srst_reset() - invoke system reset extension *

On 3/17/22 2:36 AM, Heinrich Schuchardt wrote:
Provide library functions to read:
- machine vendor ID
- machine architecture ID
- machine implementation ID
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com
arch/riscv/include/asm/sbi.h | 3 ++ arch/riscv/lib/sbi.c | 65 ++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+)
diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 76453121ea..81fcfe0b36 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -155,6 +155,9 @@ long sbi_get_spec_version(void); int sbi_get_impl_id(void); int sbi_get_impl_version(long *version); int sbi_probe_extension(int ext); +int sbi_get_mvendorid(long *mvendorid); +int sbi_get_marchid(long *marchid); +int sbi_get_mimpid(long *mimpid); void sbi_srst_reset(unsigned long type, unsigned long reason);
#endif diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c index d427d1b29e..8724e3a460 100644 --- a/arch/riscv/lib/sbi.c +++ b/arch/riscv/lib/sbi.c @@ -127,6 +127,71 @@ int sbi_probe_extension(int extid) return -ENOTSUPP; }
+/**
- sbi_get_mvendorid() - get machine vendor ID
- @mimpid: on return machine vendor ID
- Return: 0 on success
- */
+int sbi_get_mvendorid(long *mvendorid) +{
- struct sbiret ret;
- ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MVENDORID,
0, 0, 0, 0, 0, 0);
- if (ret.error)
return -ENOTSUPP;
- if (mvendorid)
*mvendorid = ret.value;
- return 0;
+}
+/**
- sbi_get_marchid() - get machine architecture ID
- @mimpid: on return machine architecture ID
- Return: 0 on success
- */
+int sbi_get_marchid(long *marchid) +{
- struct sbiret ret;
- ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MARCHID,
0, 0, 0, 0, 0, 0);
- if (ret.error)
return -ENOTSUPP;
- if (marchid)
*marchid = ret.value;
- return 0;
+}
+/**
- sbi_get_mimpid() - get machine implementation ID
- @mimpid: on return machine implementation ID
- Return: 0 on success
- */
+int sbi_get_mimpid(long *mimpid) +{
- struct sbiret ret;
- ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MIMPID,
0, 0, 0, 0, 0, 0);
- if (ret.error)
return -ENOTSUPP;
- if (mimpid)
*mimpid = ret.value;
- return 0;
+}
- /**
- sbi_srst_reset() - invoke system reset extension
Perhaps this could be rewritten like
int sbi_get_mimpid(long *mimpid) { return sbi_base_get_info(mimpid, SBI_EXT_BASE_GET_MIMPID); }
where sbi_base_get_info is common to all 6 of the generic "get info" functions.
The current implementation is fine as well.
Reviewed-by: Sean Anderson seanga2@gmail.com

Let the sbi command display:
* machine vendor ID * machine architecture ID * machine implementation ID
With this patch the output for the HiFive Unmatched looks like
=> sbi SBI 0.3 OpenSBI 0.9 Machine: Vendor ID 489 Architecture ID 8000000000000007 Implementation ID 20181004 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 System Reset Extension
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com --- cmd/riscv/sbi.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c index 8349123925..8fc8ab0ac5 100644 --- a/cmd/riscv/sbi.c +++ b/cmd/riscv/sbi.c @@ -52,6 +52,7 @@ static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, { int i, impl_id; long ret; + long mvendorid, marchid, mimpid;
ret = sbi_get_spec_version(); if (ret >= 0) @@ -77,7 +78,17 @@ static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, if (i == ARRAY_SIZE(implementations)) printf("Unknown implementation ID %ld", ret); } - printf("\nExtensions:\n"); + printf("\nMachine:\n"); + ret = sbi_get_mvendorid(&mvendorid); + if (!ret) + printf(" Vendor ID %lx\n", mvendorid); + ret = sbi_get_marchid(&marchid); + if (!ret) + printf(" Architecture ID %lx\n", marchid); + ret = sbi_get_mimpid(&mimpid); + if (!ret) + printf(" Implementation ID %lx\n", mimpid); + printf("Extensions:\n"); for (i = 0; i < ARRAY_SIZE(extensions); ++i) { ret = sbi_probe_extension(extensions[i].id); if (ret > 0)

On 3/17/22 2:36 AM, Heinrich Schuchardt wrote:
Let the sbi command display:
- machine vendor ID
- machine architecture ID
- machine implementation ID
With this patch the output for the HiFive Unmatched looks like
=> sbi SBI 0.3 OpenSBI 0.9 Machine: Vendor ID 489 Architecture ID 8000000000000007 Implementation ID 20181004 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 System Reset Extension
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com
cmd/riscv/sbi.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c index 8349123925..8fc8ab0ac5 100644 --- a/cmd/riscv/sbi.c +++ b/cmd/riscv/sbi.c @@ -52,6 +52,7 @@ static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, { int i, impl_id; long ret;
long mvendorid, marchid, mimpid;
ret = sbi_get_spec_version(); if (ret >= 0)
@@ -77,7 +78,17 @@ static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, if (i == ARRAY_SIZE(implementations)) printf("Unknown implementation ID %ld", ret); }
- printf("\nExtensions:\n");
- printf("\nMachine:\n");
- ret = sbi_get_mvendorid(&mvendorid);
- if (!ret)
printf(" Vendor ID %lx\n", mvendorid);
- ret = sbi_get_marchid(&marchid);
- if (!ret)
printf(" Architecture ID %lx\n", marchid);
- ret = sbi_get_mimpid(&mimpid);
- if (!ret)
printf(" Implementation ID %lx\n", mimpid);
- printf("Extensions:\n"); for (i = 0; i < ARRAY_SIZE(extensions); ++i) { ret = sbi_probe_extension(extensions[i].id); if (ret > 0)
Reviewed-by: Sean Anderson seanga2@gmail.com
participants (2)
-
Heinrich Schuchardt
-
Sean Anderson