[PATCH 5/5] lib: sbi: Print list of all hart protection mechanisms at boot time

Anup Patel anup.patel at oss.qualcomm.com
Fri Jul 17 00:44:13 PDT 2026


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 <anup.patel at oss.qualcomm.com>
---
 include/sbi/sbi_hart_protection.h |  7 +++++--
 lib/sbi/sbi_hart_protection.c     | 34 ++++++++++++++++++++++++++++---
 lib/sbi/sbi_init.c                |  6 ++----
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/include/sbi/sbi_hart_protection.h b/include/sbi/sbi_hart_protection.h
index 1358b5be..dbe8eae1 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 d31e9938..a5f19639 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;
@@ -168,7 +196,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;
@@ -178,7 +206,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 3f1f136a..c3f09c52 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 : "---");
-- 
2.43.0




More information about the opensbi mailing list