aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <apatel@ventanamicro.com>2024-12-22 11:16:13 +0530
committerAnup Patel <anup@brainfault.org>2024-12-22 11:16:13 +0530
commit06754612f3617b8a162a42e37175d7e04b71246f (patch)
tree6a7f95dc8ef80551140cc5b9bb66376b6505f75c
parentd539d64a23bbd64ba324eed595449bcc9c7be0cb (diff)
downloadopensbi-06754612f3617b8a162a42e37175d7e04b71246f.zip
opensbi-06754612f3617b8a162a42e37175d7e04b71246f.tar.gz
opensbi-06754612f3617b8a162a42e37175d7e04b71246f.tar.bz2
lib: sbi: Print list of available SBI extensions at boot-time
Add boot-time prints for list of available standard and experimental SBI extensions. Signed-off-by: Anup Patel <apatel@ventanamicro.com>
-rw-r--r--include/sbi/sbi_ecall.h6
-rw-r--r--lib/sbi/sbi_ecall.c24
-rw-r--r--lib/sbi/sbi_ecall_base.c1
-rw-r--r--lib/sbi/sbi_ecall_cppc.c1
-rw-r--r--lib/sbi/sbi_ecall_dbcn.c1
-rw-r--r--lib/sbi/sbi_ecall_dbtr.c10
-rw-r--r--lib/sbi/sbi_ecall_fwft.c10
-rw-r--r--lib/sbi/sbi_ecall_hsm.c1
-rw-r--r--lib/sbi/sbi_ecall_ipi.c1
-rw-r--r--lib/sbi/sbi_ecall_legacy.c1
-rw-r--r--lib/sbi/sbi_ecall_mpxy.c2
-rw-r--r--lib/sbi/sbi_ecall_pmu.c1
-rw-r--r--lib/sbi/sbi_ecall_rfence.c1
-rw-r--r--lib/sbi/sbi_ecall_srst.c1
-rw-r--r--lib/sbi/sbi_ecall_sse.c2
-rw-r--r--lib/sbi/sbi_ecall_susp.c1
-rw-r--r--lib/sbi/sbi_ecall_time.c1
-rw-r--r--lib/sbi/sbi_ecall_vendor.c1
-rw-r--r--lib/sbi/sbi_init.c6
19 files changed, 63 insertions, 9 deletions
diff --git a/include/sbi/sbi_ecall.h b/include/sbi/sbi_ecall.h
index 0b35eff..88a69bb 100644
--- a/include/sbi/sbi_ecall.h
+++ b/include/sbi/sbi_ecall.h
@@ -30,6 +30,8 @@ struct sbi_ecall_return {
struct sbi_ecall_extension {
/* head is used by the extension list */
struct sbi_dlist head;
+ /* short name of the extension */
+ char name[8];
/*
* extid_start and extid_end specify the range for this extension. As
* the initial range may be wider than the valid runtime range, the
@@ -38,6 +40,8 @@ struct sbi_ecall_extension {
*/
unsigned long extid_start;
unsigned long extid_end;
+ /* flag showing whether given extension is experimental or not */
+ bool experimental;
/*
* register_extensions
*
@@ -83,6 +87,8 @@ void sbi_ecall_set_impid(unsigned long impid);
struct sbi_ecall_extension *sbi_ecall_find_extension(unsigned long extid);
+void sbi_ecall_get_extensions_str(char *exts_str, int exts_str_size, bool experimental);
+
int sbi_ecall_register_extension(struct sbi_ecall_extension *ext);
void sbi_ecall_unregister_extension(struct sbi_ecall_extension *ext);
diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c
index be0b67e..3fa3a9e 100644
--- a/lib/sbi/sbi_ecall.c
+++ b/lib/sbi/sbi_ecall.c
@@ -11,6 +11,7 @@
#include <sbi/sbi_ecall.h>
#include <sbi/sbi_ecall_interface.h>
#include <sbi/sbi_error.h>
+#include <sbi/sbi_string.h>
#include <sbi/sbi_trap.h>
extern struct sbi_ecall_extension *const sbi_ecall_exts[];
@@ -53,6 +54,29 @@ struct sbi_ecall_extension *sbi_ecall_find_extension(unsigned long extid)
return ret;
}
+void sbi_ecall_get_extensions_str(char *exts_str, int exts_str_size, bool experimental)
+{
+ struct sbi_ecall_extension *t;
+ int offset = 0;
+
+ if (!exts_str || exts_str_size <= 0)
+ return;
+ sbi_memset(exts_str, 0, exts_str_size);
+
+ sbi_list_for_each_entry(t, &ecall_exts_list, head) {
+ if (experimental != t->experimental)
+ continue;
+ sbi_snprintf(exts_str + offset, exts_str_size - offset,
+ "%s,", t->name);
+ offset = offset + sbi_strlen(t->name) + 1;
+ }
+
+ if (offset)
+ exts_str[offset - 1] = '\0';
+ else
+ sbi_strncpy(exts_str, "none", exts_str_size);
+}
+
int sbi_ecall_register_extension(struct sbi_ecall_extension *ext)
{
struct sbi_ecall_extension *t;
diff --git a/lib/sbi/sbi_ecall_base.c b/lib/sbi/sbi_ecall_base.c
index b7178ea..d125ced 100644
--- a/lib/sbi/sbi_ecall_base.c
+++ b/lib/sbi/sbi_ecall_base.c
@@ -79,6 +79,7 @@ static int sbi_ecall_base_register_extensions(void)
}
struct sbi_ecall_extension ecall_base = {
+ .name = "base",
.extid_start = SBI_EXT_BASE,
.extid_end = SBI_EXT_BASE,
.register_extensions = sbi_ecall_base_register_extensions,
diff --git a/lib/sbi/sbi_ecall_cppc.c b/lib/sbi/sbi_ecall_cppc.c
index dab7829..4840c90 100644
--- a/lib/sbi/sbi_ecall_cppc.c
+++ b/lib/sbi/sbi_ecall_cppc.c
@@ -65,6 +65,7 @@ static int sbi_ecall_cppc_register_extensions(void)
}
struct sbi_ecall_extension ecall_cppc = {
+ .name = "cppc",
.extid_start = SBI_EXT_CPPC,
.extid_end = SBI_EXT_CPPC,
.register_extensions = sbi_ecall_cppc_register_extensions,
diff --git a/lib/sbi/sbi_ecall_dbcn.c b/lib/sbi/sbi_ecall_dbcn.c
index 49a7713..1b0aebd 100644
--- a/lib/sbi/sbi_ecall_dbcn.c
+++ b/lib/sbi/sbi_ecall_dbcn.c
@@ -74,6 +74,7 @@ static int sbi_ecall_dbcn_register_extensions(void)
}
struct sbi_ecall_extension ecall_dbcn = {
+ .name = "dbcn",
.extid_start = SBI_EXT_DBCN,
.extid_end = SBI_EXT_DBCN,
.register_extensions = sbi_ecall_dbcn_register_extensions,
diff --git a/lib/sbi/sbi_ecall_dbtr.c b/lib/sbi/sbi_ecall_dbtr.c
index 6a7dfe6..d28fd39 100644
--- a/lib/sbi/sbi_ecall_dbtr.c
+++ b/lib/sbi/sbi_ecall_dbtr.c
@@ -66,8 +66,10 @@ static int sbi_ecall_dbtr_register_extensions(void)
}
struct sbi_ecall_extension ecall_dbtr = {
- .extid_start = SBI_EXT_DBTR,
- .extid_end = SBI_EXT_DBTR,
- .handle = sbi_ecall_dbtr_handler,
- .register_extensions = sbi_ecall_dbtr_register_extensions,
+ .name = "dbtr",
+ .extid_start = SBI_EXT_DBTR,
+ .extid_end = SBI_EXT_DBTR,
+ .experimental = true,
+ .handle = sbi_ecall_dbtr_handler,
+ .register_extensions = sbi_ecall_dbtr_register_extensions,
};
diff --git a/lib/sbi/sbi_ecall_fwft.c b/lib/sbi/sbi_ecall_fwft.c
index 267cbab..3519285 100644
--- a/lib/sbi/sbi_ecall_fwft.c
+++ b/lib/sbi/sbi_ecall_fwft.c
@@ -42,8 +42,10 @@ static int sbi_ecall_fwft_register_extensions(void)
}
struct sbi_ecall_extension ecall_fwft = {
- .extid_start = SBI_EXT_FWFT,
- .extid_end = SBI_EXT_FWFT,
- .register_extensions = sbi_ecall_fwft_register_extensions,
- .handle = sbi_ecall_fwft_handler,
+ .name = "fwft",
+ .extid_start = SBI_EXT_FWFT,
+ .extid_end = SBI_EXT_FWFT,
+ .experimental = true,
+ .register_extensions = sbi_ecall_fwft_register_extensions,
+ .handle = sbi_ecall_fwft_handler,
};
diff --git a/lib/sbi/sbi_ecall_hsm.c b/lib/sbi/sbi_ecall_hsm.c
index 93170b0..a6e83b0 100644
--- a/lib/sbi/sbi_ecall_hsm.c
+++ b/lib/sbi/sbi_ecall_hsm.c
@@ -61,6 +61,7 @@ static int sbi_ecall_hsm_register_extensions(void)
}
struct sbi_ecall_extension ecall_hsm = {
+ .name = "hsm",
.extid_start = SBI_EXT_HSM,
.extid_end = SBI_EXT_HSM,
.register_extensions = sbi_ecall_hsm_register_extensions,
diff --git a/lib/sbi/sbi_ecall_ipi.c b/lib/sbi/sbi_ecall_ipi.c
index 50ef41d..ec579ce 100644
--- a/lib/sbi/sbi_ecall_ipi.c
+++ b/lib/sbi/sbi_ecall_ipi.c
@@ -36,6 +36,7 @@ static int sbi_ecall_ipi_register_extensions(void)
}
struct sbi_ecall_extension ecall_ipi = {
+ .name = "ipi",
.extid_start = SBI_EXT_IPI,
.extid_end = SBI_EXT_IPI,
.register_extensions = sbi_ecall_ipi_register_extensions,
diff --git a/lib/sbi/sbi_ecall_legacy.c b/lib/sbi/sbi_ecall_legacy.c
index 25e9a1e..50a7660 100644
--- a/lib/sbi/sbi_ecall_legacy.c
+++ b/lib/sbi/sbi_ecall_legacy.c
@@ -131,6 +131,7 @@ static int sbi_ecall_legacy_register_extensions(void)
}
struct sbi_ecall_extension ecall_legacy = {
+ .name = "legacy",
.extid_start = SBI_EXT_0_1_SET_TIMER,
.extid_end = SBI_EXT_0_1_SHUTDOWN,
.register_extensions = sbi_ecall_legacy_register_extensions,
diff --git a/lib/sbi/sbi_ecall_mpxy.c b/lib/sbi/sbi_ecall_mpxy.c
index 5f717b7..09705cc 100644
--- a/lib/sbi/sbi_ecall_mpxy.c
+++ b/lib/sbi/sbi_ecall_mpxy.c
@@ -61,8 +61,10 @@ static int sbi_ecall_mpxy_register_extensions(void)
}
struct sbi_ecall_extension ecall_mpxy = {
+ .name = "mpxy",
.extid_start = SBI_EXT_MPXY,
.extid_end = SBI_EXT_MPXY,
+ .experimental = true,
.register_extensions = sbi_ecall_mpxy_register_extensions,
.handle = sbi_ecall_mpxy_handler,
};
diff --git a/lib/sbi/sbi_ecall_pmu.c b/lib/sbi/sbi_ecall_pmu.c
index ae7aeca..868e866 100644
--- a/lib/sbi/sbi_ecall_pmu.c
+++ b/lib/sbi/sbi_ecall_pmu.c
@@ -93,6 +93,7 @@ static int sbi_ecall_pmu_register_extensions(void)
}
struct sbi_ecall_extension ecall_pmu = {
+ .name = "pmu",
.extid_start = SBI_EXT_PMU,
.extid_end = SBI_EXT_PMU,
.register_extensions = sbi_ecall_pmu_register_extensions,
diff --git a/lib/sbi/sbi_ecall_rfence.c b/lib/sbi/sbi_ecall_rfence.c
index ded16c2..903adfb 100644
--- a/lib/sbi/sbi_ecall_rfence.c
+++ b/lib/sbi/sbi_ecall_rfence.c
@@ -84,6 +84,7 @@ static int sbi_ecall_rfence_register_extensions(void)
}
struct sbi_ecall_extension ecall_rfence = {
+ .name = "rfnc",
.extid_start = SBI_EXT_RFENCE,
.extid_end = SBI_EXT_RFENCE,
.register_extensions = sbi_ecall_rfence_register_extensions,
diff --git a/lib/sbi/sbi_ecall_srst.c b/lib/sbi/sbi_ecall_srst.c
index 46cfaca..721d721 100644
--- a/lib/sbi/sbi_ecall_srst.c
+++ b/lib/sbi/sbi_ecall_srst.c
@@ -75,6 +75,7 @@ static int sbi_ecall_srst_register_extensions(void)
}
struct sbi_ecall_extension ecall_srst = {
+ .name = "srst",
.extid_start = SBI_EXT_SRST,
.extid_end = SBI_EXT_SRST,
.register_extensions = sbi_ecall_srst_register_extensions,
diff --git a/lib/sbi/sbi_ecall_sse.c b/lib/sbi/sbi_ecall_sse.c
index beddc2c..303c0f2 100644
--- a/lib/sbi/sbi_ecall_sse.c
+++ b/lib/sbi/sbi_ecall_sse.c
@@ -56,8 +56,10 @@ static int sbi_ecall_sse_register_extensions(void)
}
struct sbi_ecall_extension ecall_sse = {
+ .name = "sse",
.extid_start = SBI_EXT_SSE,
.extid_end = SBI_EXT_SSE,
+ .experimental = true,
.register_extensions = sbi_ecall_sse_register_extensions,
.handle = sbi_ecall_sse_handler,
};
diff --git a/lib/sbi/sbi_ecall_susp.c b/lib/sbi/sbi_ecall_susp.c
index 7b66bfc..5afbf3f 100644
--- a/lib/sbi/sbi_ecall_susp.c
+++ b/lib/sbi/sbi_ecall_susp.c
@@ -49,6 +49,7 @@ static int sbi_ecall_susp_register_extensions(void)
}
struct sbi_ecall_extension ecall_susp = {
+ .name = "susp",
.extid_start = SBI_EXT_SUSP,
.extid_end = SBI_EXT_SUSP,
.register_extensions = sbi_ecall_susp_register_extensions,
diff --git a/lib/sbi/sbi_ecall_time.c b/lib/sbi/sbi_ecall_time.c
index 5a2316e..6ea6f05 100644
--- a/lib/sbi/sbi_ecall_time.c
+++ b/lib/sbi/sbi_ecall_time.c
@@ -40,6 +40,7 @@ static int sbi_ecall_time_register_extensions(void)
}
struct sbi_ecall_extension ecall_time = {
+ .name = "time",
.extid_start = SBI_EXT_TIME,
.extid_end = SBI_EXT_TIME,
.register_extensions = sbi_ecall_time_register_extensions,
diff --git a/lib/sbi/sbi_ecall_vendor.c b/lib/sbi/sbi_ecall_vendor.c
index ebebc58..5fdfb31 100644
--- a/lib/sbi/sbi_ecall_vendor.c
+++ b/lib/sbi/sbi_ecall_vendor.c
@@ -46,6 +46,7 @@ static int sbi_ecall_vendor_register_extensions(void)
}
struct sbi_ecall_extension ecall_vendor = {
+ .name = "vendor",
.extid_start = SBI_EXT_VENDOR_START,
.extid_end = SBI_EXT_VENDOR_END,
.register_extensions = sbi_ecall_vendor_register_extensions,
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 0736345..cef658a 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -139,8 +139,12 @@ static void sbi_boot_print_general(struct sbi_scratch *scratch)
(u32)(SBI_SCRATCH_SIZE - sbi_scratch_used_space()));
/* SBI details */
- sbi_printf("Runtime SBI Version : %d.%d\n",
+ sbi_printf("Runtime SBI Version : %d.%d\n",
sbi_ecall_version_major(), sbi_ecall_version_minor());
+ sbi_ecall_get_extensions_str(str, sizeof(str), false);
+ sbi_printf("Standard SBI Extensions : %s\n", str);
+ sbi_ecall_get_extensions_str(str, sizeof(str), true);
+ sbi_printf("Experimental SBI Extensions : %s\n", str);
sbi_printf("\n");
}