[PATCH 01/12] lib: sbi: Add coldboot parameters to some initialization functions

Xiang W wxjstz at 126.com
Wed Jun 11 05:12:18 PDT 2025


To reduce the difference between init_coldboot/init_warm_startup,
add cold_boot parameters to some initialization functions.

Signed-off-by: Xiang W <wxjstz at 126.com>
---
 include/sbi/sbi_domain.h      | 2 +-
 include/sbi/sbi_double_trap.h | 2 +-
 include/sbi/sbi_mpxy.h        | 2 +-
 lib/sbi/sbi_domain.c          | 9 +++++++--
 lib/sbi/sbi_double_trap.c     | 6 ++++--
 lib/sbi/sbi_init.c            | 6 +++---
 lib/sbi/sbi_mpxy.c            | 4 +++-
 7 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
index e9cff0b1..af25196b 100644
--- a/include/sbi/sbi_domain.h
+++ b/include/sbi/sbi_domain.h
@@ -311,7 +311,7 @@ int sbi_domain_root_add_memrange(unsigned long addr, unsigned long size,
 int sbi_domain_startup(struct sbi_scratch *scratch, u32 cold_hartid);
 
 /** Finalize domain tables */
-int sbi_domain_finalize(struct sbi_scratch *scratch);
+int sbi_domain_finalize(struct sbi_scratch *scratch, bool cold_boot);
 
 /** Initialize domains */
 int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid);
diff --git a/include/sbi/sbi_double_trap.h b/include/sbi/sbi_double_trap.h
index c3d64dfd..1c9f6472 100644
--- a/include/sbi/sbi_double_trap.h
+++ b/include/sbi/sbi_double_trap.h
@@ -15,6 +15,6 @@
 
 int sbi_double_trap_handler(struct sbi_trap_context *tcntx);
 
-void sbi_double_trap_init(struct sbi_scratch *scratch);
+void sbi_double_trap_init(struct sbi_scratch *scratch, bool cold_boot);
 
 #endif
diff --git a/include/sbi/sbi_mpxy.h b/include/sbi/sbi_mpxy.h
index 9da2791e..9145816c 100644
--- a/include/sbi/sbi_mpxy.h
+++ b/include/sbi/sbi_mpxy.h
@@ -148,7 +148,7 @@ struct sbi_mpxy_channel {
 int sbi_mpxy_register_channel(struct sbi_mpxy_channel *channel);
 
 /** Initialize Message proxy subsystem */
-int sbi_mpxy_init(struct sbi_scratch *scratch);
+int sbi_mpxy_init(struct sbi_scratch *scratch, bool cold_boot);
 
 /** Check if some Message proxy channel is available */
 bool sbi_mpxy_channel_available(void);
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index 461c7e53..c4d16f1b 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -742,15 +742,20 @@ int sbi_domain_startup(struct sbi_scratch *scratch, u32 cold_hartid)
 	return 0;
 }
 
-int sbi_domain_finalize(struct sbi_scratch *scratch)
+int sbi_domain_finalize(struct sbi_scratch *scratch, bool cold_boot)
 {
 	int rc;
-	const struct sbi_platform *plat = sbi_platform_ptr(scratch);
+	const struct sbi_platform *plat;
+
+	if (!cold_boot)
+		return 0;
 
 	/* Sanity checks */
 	if (domain_finalized)
 		return SBI_EINVAL;
 
+	plat = sbi_platform_ptr(scratch);
+
 	/* Initialize and populate domains for the platform */
 	rc = sbi_platform_domains_init(plat);
 	if (rc) {
diff --git a/lib/sbi/sbi_double_trap.c b/lib/sbi/sbi_double_trap.c
index d0ddb493..0e3951b8 100644
--- a/lib/sbi/sbi_double_trap.c
+++ b/lib/sbi/sbi_double_trap.c
@@ -30,8 +30,10 @@ int sbi_double_trap_handler(struct sbi_trap_context *tcntx)
 	return sbi_sse_inject_event(SBI_SSE_EVENT_LOCAL_DOUBLE_TRAP);
 }
 
-void sbi_double_trap_init(struct sbi_scratch *scratch)
+void sbi_double_trap_init(struct sbi_scratch *scratch, bool cold_boot)
 {
+	if (!cold_boot)
+		return;
 	if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSDBLTRP))
 		sbi_sse_add_event(SBI_SSE_EVENT_LOCAL_DOUBLE_TRAP, NULL);
-}
\ No newline at end of file
+}
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 62c32682..a227cb53 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -280,7 +280,7 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
 
 	sbi_boot_print_banner(scratch);
 
-	sbi_double_trap_init(scratch);
+	sbi_double_trap_init(scratch, true);
 
 	rc = sbi_irqchip_init(scratch, true);
 	if (rc) {
@@ -313,7 +313,7 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
 		sbi_hart_hang();
 	}
 
-	rc = sbi_mpxy_init(scratch);
+	rc = sbi_mpxy_init(scratch, true);
 	if (rc) {
 		sbi_printf("%s: mpxy init failed (error %d)\n", __func__, rc);
 		sbi_hart_hang();
@@ -324,7 +324,7 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
 	 * Note: Finalize domains before HART PMP configuration so
 	 * that we use correct domain for configuring PMP.
 	 */
-	rc = sbi_domain_finalize(scratch);
+	rc = sbi_domain_finalize(scratch, true);
 	if (rc) {
 		sbi_printf("%s: domain finalize failed (error %d)\n",
 			   __func__, rc);
diff --git a/lib/sbi/sbi_mpxy.c b/lib/sbi/sbi_mpxy.c
index 681cfbe9..761d81e0 100644
--- a/lib/sbi/sbi_mpxy.c
+++ b/lib/sbi/sbi_mpxy.c
@@ -306,9 +306,11 @@ static struct mpxy_state *sbi_domain_get_mpxy_state(struct sbi_domain *dom,
 	return dom_hartindex_to_mpxy_state_table[hartindex];
 }
 
-int sbi_mpxy_init(struct sbi_scratch *scratch)
+int sbi_mpxy_init(struct sbi_scratch *scratch, bool cold_boot)
 {
 	int ret;
+	if (!cold_boot)
+		return 0;
 
 	/**
 	 * Allocate per-domain and per-hart MPXY state data.
-- 
2.47.2




More information about the opensbi mailing list