forked from Mirrors/opensbi
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>
This commit is contained in:
@@ -30,6 +30,8 @@ struct sbi_ecall_return {
|
|||||||
struct sbi_ecall_extension {
|
struct sbi_ecall_extension {
|
||||||
/* head is used by the extension list */
|
/* head is used by the extension list */
|
||||||
struct sbi_dlist head;
|
struct sbi_dlist head;
|
||||||
|
/* short name of the extension */
|
||||||
|
char name[8];
|
||||||
/*
|
/*
|
||||||
* extid_start and extid_end specify the range for this extension. As
|
* extid_start and extid_end specify the range for this extension. As
|
||||||
* the initial range may be wider than the valid runtime range, the
|
* 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_start;
|
||||||
unsigned long extid_end;
|
unsigned long extid_end;
|
||||||
|
/* flag showing whether given extension is experimental or not */
|
||||||
|
bool experimental;
|
||||||
/*
|
/*
|
||||||
* register_extensions
|
* 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);
|
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);
|
int sbi_ecall_register_extension(struct sbi_ecall_extension *ext);
|
||||||
|
|
||||||
void sbi_ecall_unregister_extension(struct sbi_ecall_extension *ext);
|
void sbi_ecall_unregister_extension(struct sbi_ecall_extension *ext);
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <sbi/sbi_ecall.h>
|
#include <sbi/sbi_ecall.h>
|
||||||
#include <sbi/sbi_ecall_interface.h>
|
#include <sbi/sbi_ecall_interface.h>
|
||||||
#include <sbi/sbi_error.h>
|
#include <sbi/sbi_error.h>
|
||||||
|
#include <sbi/sbi_string.h>
|
||||||
#include <sbi/sbi_trap.h>
|
#include <sbi/sbi_trap.h>
|
||||||
|
|
||||||
extern struct sbi_ecall_extension *const sbi_ecall_exts[];
|
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;
|
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)
|
int sbi_ecall_register_extension(struct sbi_ecall_extension *ext)
|
||||||
{
|
{
|
||||||
struct sbi_ecall_extension *t;
|
struct sbi_ecall_extension *t;
|
||||||
|
@@ -79,6 +79,7 @@ static int sbi_ecall_base_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_base = {
|
struct sbi_ecall_extension ecall_base = {
|
||||||
|
.name = "base",
|
||||||
.extid_start = SBI_EXT_BASE,
|
.extid_start = SBI_EXT_BASE,
|
||||||
.extid_end = SBI_EXT_BASE,
|
.extid_end = SBI_EXT_BASE,
|
||||||
.register_extensions = sbi_ecall_base_register_extensions,
|
.register_extensions = sbi_ecall_base_register_extensions,
|
||||||
|
@@ -65,6 +65,7 @@ static int sbi_ecall_cppc_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_cppc = {
|
struct sbi_ecall_extension ecall_cppc = {
|
||||||
|
.name = "cppc",
|
||||||
.extid_start = SBI_EXT_CPPC,
|
.extid_start = SBI_EXT_CPPC,
|
||||||
.extid_end = SBI_EXT_CPPC,
|
.extid_end = SBI_EXT_CPPC,
|
||||||
.register_extensions = sbi_ecall_cppc_register_extensions,
|
.register_extensions = sbi_ecall_cppc_register_extensions,
|
||||||
|
@@ -74,6 +74,7 @@ static int sbi_ecall_dbcn_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_dbcn = {
|
struct sbi_ecall_extension ecall_dbcn = {
|
||||||
|
.name = "dbcn",
|
||||||
.extid_start = SBI_EXT_DBCN,
|
.extid_start = SBI_EXT_DBCN,
|
||||||
.extid_end = SBI_EXT_DBCN,
|
.extid_end = SBI_EXT_DBCN,
|
||||||
.register_extensions = sbi_ecall_dbcn_register_extensions,
|
.register_extensions = sbi_ecall_dbcn_register_extensions,
|
||||||
|
@@ -66,8 +66,10 @@ static int sbi_ecall_dbtr_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_dbtr = {
|
struct sbi_ecall_extension ecall_dbtr = {
|
||||||
.extid_start = SBI_EXT_DBTR,
|
.name = "dbtr",
|
||||||
.extid_end = SBI_EXT_DBTR,
|
.extid_start = SBI_EXT_DBTR,
|
||||||
.handle = sbi_ecall_dbtr_handler,
|
.extid_end = SBI_EXT_DBTR,
|
||||||
.register_extensions = sbi_ecall_dbtr_register_extensions,
|
.experimental = true,
|
||||||
|
.handle = sbi_ecall_dbtr_handler,
|
||||||
|
.register_extensions = sbi_ecall_dbtr_register_extensions,
|
||||||
};
|
};
|
||||||
|
@@ -42,8 +42,10 @@ static int sbi_ecall_fwft_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_fwft = {
|
struct sbi_ecall_extension ecall_fwft = {
|
||||||
.extid_start = SBI_EXT_FWFT,
|
.name = "fwft",
|
||||||
.extid_end = SBI_EXT_FWFT,
|
.extid_start = SBI_EXT_FWFT,
|
||||||
.register_extensions = sbi_ecall_fwft_register_extensions,
|
.extid_end = SBI_EXT_FWFT,
|
||||||
.handle = sbi_ecall_fwft_handler,
|
.experimental = true,
|
||||||
|
.register_extensions = sbi_ecall_fwft_register_extensions,
|
||||||
|
.handle = sbi_ecall_fwft_handler,
|
||||||
};
|
};
|
||||||
|
@@ -61,6 +61,7 @@ static int sbi_ecall_hsm_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_hsm = {
|
struct sbi_ecall_extension ecall_hsm = {
|
||||||
|
.name = "hsm",
|
||||||
.extid_start = SBI_EXT_HSM,
|
.extid_start = SBI_EXT_HSM,
|
||||||
.extid_end = SBI_EXT_HSM,
|
.extid_end = SBI_EXT_HSM,
|
||||||
.register_extensions = sbi_ecall_hsm_register_extensions,
|
.register_extensions = sbi_ecall_hsm_register_extensions,
|
||||||
|
@@ -36,6 +36,7 @@ static int sbi_ecall_ipi_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_ipi = {
|
struct sbi_ecall_extension ecall_ipi = {
|
||||||
|
.name = "ipi",
|
||||||
.extid_start = SBI_EXT_IPI,
|
.extid_start = SBI_EXT_IPI,
|
||||||
.extid_end = SBI_EXT_IPI,
|
.extid_end = SBI_EXT_IPI,
|
||||||
.register_extensions = sbi_ecall_ipi_register_extensions,
|
.register_extensions = sbi_ecall_ipi_register_extensions,
|
||||||
|
@@ -131,6 +131,7 @@ static int sbi_ecall_legacy_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_legacy = {
|
struct sbi_ecall_extension ecall_legacy = {
|
||||||
|
.name = "legacy",
|
||||||
.extid_start = SBI_EXT_0_1_SET_TIMER,
|
.extid_start = SBI_EXT_0_1_SET_TIMER,
|
||||||
.extid_end = SBI_EXT_0_1_SHUTDOWN,
|
.extid_end = SBI_EXT_0_1_SHUTDOWN,
|
||||||
.register_extensions = sbi_ecall_legacy_register_extensions,
|
.register_extensions = sbi_ecall_legacy_register_extensions,
|
||||||
|
@@ -61,8 +61,10 @@ static int sbi_ecall_mpxy_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_mpxy = {
|
struct sbi_ecall_extension ecall_mpxy = {
|
||||||
|
.name = "mpxy",
|
||||||
.extid_start = SBI_EXT_MPXY,
|
.extid_start = SBI_EXT_MPXY,
|
||||||
.extid_end = SBI_EXT_MPXY,
|
.extid_end = SBI_EXT_MPXY,
|
||||||
|
.experimental = true,
|
||||||
.register_extensions = sbi_ecall_mpxy_register_extensions,
|
.register_extensions = sbi_ecall_mpxy_register_extensions,
|
||||||
.handle = sbi_ecall_mpxy_handler,
|
.handle = sbi_ecall_mpxy_handler,
|
||||||
};
|
};
|
||||||
|
@@ -93,6 +93,7 @@ static int sbi_ecall_pmu_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_pmu = {
|
struct sbi_ecall_extension ecall_pmu = {
|
||||||
|
.name = "pmu",
|
||||||
.extid_start = SBI_EXT_PMU,
|
.extid_start = SBI_EXT_PMU,
|
||||||
.extid_end = SBI_EXT_PMU,
|
.extid_end = SBI_EXT_PMU,
|
||||||
.register_extensions = sbi_ecall_pmu_register_extensions,
|
.register_extensions = sbi_ecall_pmu_register_extensions,
|
||||||
|
@@ -84,6 +84,7 @@ static int sbi_ecall_rfence_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_rfence = {
|
struct sbi_ecall_extension ecall_rfence = {
|
||||||
|
.name = "rfnc",
|
||||||
.extid_start = SBI_EXT_RFENCE,
|
.extid_start = SBI_EXT_RFENCE,
|
||||||
.extid_end = SBI_EXT_RFENCE,
|
.extid_end = SBI_EXT_RFENCE,
|
||||||
.register_extensions = sbi_ecall_rfence_register_extensions,
|
.register_extensions = sbi_ecall_rfence_register_extensions,
|
||||||
|
@@ -75,6 +75,7 @@ static int sbi_ecall_srst_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_srst = {
|
struct sbi_ecall_extension ecall_srst = {
|
||||||
|
.name = "srst",
|
||||||
.extid_start = SBI_EXT_SRST,
|
.extid_start = SBI_EXT_SRST,
|
||||||
.extid_end = SBI_EXT_SRST,
|
.extid_end = SBI_EXT_SRST,
|
||||||
.register_extensions = sbi_ecall_srst_register_extensions,
|
.register_extensions = sbi_ecall_srst_register_extensions,
|
||||||
|
@@ -56,8 +56,10 @@ static int sbi_ecall_sse_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_sse = {
|
struct sbi_ecall_extension ecall_sse = {
|
||||||
|
.name = "sse",
|
||||||
.extid_start = SBI_EXT_SSE,
|
.extid_start = SBI_EXT_SSE,
|
||||||
.extid_end = SBI_EXT_SSE,
|
.extid_end = SBI_EXT_SSE,
|
||||||
|
.experimental = true,
|
||||||
.register_extensions = sbi_ecall_sse_register_extensions,
|
.register_extensions = sbi_ecall_sse_register_extensions,
|
||||||
.handle = sbi_ecall_sse_handler,
|
.handle = sbi_ecall_sse_handler,
|
||||||
};
|
};
|
||||||
|
@@ -49,6 +49,7 @@ static int sbi_ecall_susp_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_susp = {
|
struct sbi_ecall_extension ecall_susp = {
|
||||||
|
.name = "susp",
|
||||||
.extid_start = SBI_EXT_SUSP,
|
.extid_start = SBI_EXT_SUSP,
|
||||||
.extid_end = SBI_EXT_SUSP,
|
.extid_end = SBI_EXT_SUSP,
|
||||||
.register_extensions = sbi_ecall_susp_register_extensions,
|
.register_extensions = sbi_ecall_susp_register_extensions,
|
||||||
|
@@ -40,6 +40,7 @@ static int sbi_ecall_time_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_time = {
|
struct sbi_ecall_extension ecall_time = {
|
||||||
|
.name = "time",
|
||||||
.extid_start = SBI_EXT_TIME,
|
.extid_start = SBI_EXT_TIME,
|
||||||
.extid_end = SBI_EXT_TIME,
|
.extid_end = SBI_EXT_TIME,
|
||||||
.register_extensions = sbi_ecall_time_register_extensions,
|
.register_extensions = sbi_ecall_time_register_extensions,
|
||||||
|
@@ -46,6 +46,7 @@ static int sbi_ecall_vendor_register_extensions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct sbi_ecall_extension ecall_vendor = {
|
struct sbi_ecall_extension ecall_vendor = {
|
||||||
|
.name = "vendor",
|
||||||
.extid_start = SBI_EXT_VENDOR_START,
|
.extid_start = SBI_EXT_VENDOR_START,
|
||||||
.extid_end = SBI_EXT_VENDOR_END,
|
.extid_end = SBI_EXT_VENDOR_END,
|
||||||
.register_extensions = sbi_ecall_vendor_register_extensions,
|
.register_extensions = sbi_ecall_vendor_register_extensions,
|
||||||
|
@@ -139,8 +139,12 @@ static void sbi_boot_print_general(struct sbi_scratch *scratch)
|
|||||||
(u32)(SBI_SCRATCH_SIZE - sbi_scratch_used_space()));
|
(u32)(SBI_SCRATCH_SIZE - sbi_scratch_used_space()));
|
||||||
|
|
||||||
/* SBI details */
|
/* 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_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");
|
sbi_printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user