summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <[email protected]>2026-07-27 09:55:04 +0530
committerAnup Patel <[email protected]>2026-08-02 15:17:12 +0530
commit337c23dd66b821ac04a0f7bea313e7e7b30ecc49 (patch)
treee4a839a849d9a650ef0d2393867981d04d8e4c5a
parent2636a9c2a827e07e29777bffd29ac05254f0bfeb (diff)
lib: sbi: Print list of all hart protection mechanisms at boot time
Instead of printing only the best hart memory protection name at boot time let's print a list of all hart projection mechanisms. Signed-off-by: Anup Patel <[email protected]> Reviewed-by: Rahul Pathak <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Anup Patel <[email protected]>
-rw-r--r--include/sbi/sbi_hart_protection.h7
-rw-r--r--lib/sbi/sbi_hart_protection.c34
-rw-r--r--lib/sbi/sbi_init.c6
3 files changed, 38 insertions, 9 deletions
diff --git a/include/sbi/sbi_hart_protection.h b/include/sbi/sbi_hart_protection.h
index de5f2f89..cafe6ee7 100644
--- a/include/sbi/sbi_hart_protection.h
+++ b/include/sbi/sbi_hart_protection.h
@@ -50,11 +50,14 @@ struct sbi_hart_protection {
};
/**
- * Get the best hart memory protection mechanism
+ * Get a string containing names of protection mechanisms
+ *
+ * @param out_str pointer to output string
+ * @param out_str_size maximum size of output string
*
* @return pointer to best hart memory protection mechanism
*/
-struct sbi_hart_protection *sbi_hart_memory_protection_best(void);
+void sbi_hart_protection_get_str(char *out_str, int out_str_size);
/**
* Register a hart protection mechanism
diff --git a/lib/sbi/sbi_hart_protection.c b/lib/sbi/sbi_hart_protection.c
index d607ed74..c4c149c8 100644
--- a/lib/sbi/sbi_hart_protection.c
+++ b/lib/sbi/sbi_hart_protection.c
@@ -4,13 +4,15 @@
* Copyright (c) 2025 Ventana Micro Systems Inc.
*/
+#include <sbi/sbi_console.h>
#include <sbi/sbi_error.h>
#include <sbi/sbi_hart_protection.h>
#include <sbi/sbi_scratch.h>
+#include <sbi/sbi_string.h>
static SBI_LIST_HEAD(hart_protection_list);
-struct sbi_hart_protection *sbi_hart_memory_protection_best(void)
+static struct sbi_hart_protection *__hart_memory_protection_best(void)
{
struct sbi_hart_protection *pos;
@@ -22,6 +24,32 @@ struct sbi_hart_protection *sbi_hart_memory_protection_best(void)
return NULL;
}
+void sbi_hart_protection_get_str(char *out_str, int out_str_size)
+{
+ bool memory_protect_done = false;
+ struct sbi_hart_protection *pos;
+ int offset = 0;
+
+ if (!out_str || out_str_size <= 0)
+ return;
+ sbi_memset(out_str, 0, out_str_size);
+
+ sbi_list_for_each_entry(pos, &hart_protection_list, head) {
+ if (pos->type == SBI_HART_PROTECTION_TYPE_MEMORY) {
+ if (memory_protect_done)
+ continue;
+ memory_protect_done = true;
+ }
+ sbi_snprintf(out_str + offset, out_str_size - offset, "%s,", pos->name);
+ offset = offset + sbi_strlen(pos->name) + 1;
+ }
+
+ if (offset)
+ out_str[offset - 1] = '\0';
+ else
+ sbi_strncpy(out_str, "none", out_str_size);
+}
+
int sbi_hart_protection_register(struct sbi_hart_protection *hprot)
{
struct sbi_hart_protection *pos = NULL;
@@ -170,7 +198,7 @@ int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch,
int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
{
- struct sbi_hart_protection *hprot = sbi_hart_memory_protection_best();
+ struct sbi_hart_protection *hprot = __hart_memory_protection_best();
if (!hprot || !hprot->map_range)
return 0;
@@ -180,7 +208,7 @@ int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
int sbi_hart_protection_unmap_range(unsigned long base, unsigned long size)
{
- struct sbi_hart_protection *hprot = sbi_hart_memory_protection_best();
+ struct sbi_hart_protection *hprot = __hart_memory_protection_best();
if (!hprot || !hprot->unmap_range)
return 0;
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 388f3ecb..acd2f8b6 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -76,7 +76,6 @@ static void sbi_boot_print_general(struct sbi_scratch *scratch)
const struct sbi_hsm_device *hdev;
const struct sbi_ipi_device *idev;
const struct sbi_timer_device *tdev;
- const struct sbi_hart_protection *hprot;
const struct sbi_console_device *cdev;
const struct sbi_system_reset_device *srdev;
const struct sbi_system_suspend_device *susp_dev;
@@ -93,9 +92,8 @@ static void sbi_boot_print_general(struct sbi_scratch *scratch)
sbi_printf("Platform Features : %s\n", str);
sbi_printf("Platform HART Count : %u\n",
sbi_platform_hart_count(plat));
- hprot = sbi_hart_memory_protection_best();
- sbi_printf("Platform HART Protection : %s\n",
- (hprot) ? hprot->name : "---");
+ sbi_hart_protection_get_str(str, sizeof(str));
+ sbi_printf("Platform HART Protection : %s\n", str);
idev = sbi_ipi_get_device();
sbi_printf("Platform IPI Device : %s\n",
(idev) ? idev->name : "---");