[PATCH 07/12] lib: sbi: Initialize as much as possible before sbi_hsm_init

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


Separate sbi_hsm_hart_wait from sbi_hsm_init to allow the secondary
Hart to perform more initialization.

Signed-off-by: Xiang W <wxjstz at 126.com>
---
 include/sbi/sbi_hsm.h |  3 +++
 lib/sbi/sbi_hsm.c     | 13 +++++--------
 lib/sbi/sbi_init.c    |  2 ++
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/include/sbi/sbi_hsm.h b/include/sbi/sbi_hsm.h
index 38f90516..f7a6497c 100644
--- a/include/sbi/sbi_hsm.h
+++ b/include/sbi/sbi_hsm.h
@@ -64,6 +64,9 @@ const struct sbi_hsm_device *sbi_hsm_get_device(void);
 void sbi_hsm_set_device(const struct sbi_hsm_device *dev);
 
 int sbi_hsm_init(struct sbi_scratch *scratch, bool cold_boot);
+
+void sbi_hsm_hart_wait(struct sbi_scratch *scratch, bool cold_boot);
+
 void __noreturn sbi_hsm_exit(struct sbi_scratch *scratch);
 
 int sbi_hsm_hart_start(struct sbi_scratch *scratch,
diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index e8128a39..b5f3194e 100644
--- a/lib/sbi/sbi_hsm.c
+++ b/lib/sbi/sbi_hsm.c
@@ -159,11 +159,14 @@ void __noreturn sbi_hsm_hart_start_finish(struct sbi_scratch *scratch,
 	sbi_hart_switch_mode(hartid, next_arg1, next_addr, next_mode, false);
 }
 
-static void sbi_hsm_hart_wait(struct sbi_scratch *scratch)
+void sbi_hsm_hart_wait(struct sbi_scratch *scratch, bool cold_boot)
 {
 	unsigned long saved_mie;
 	struct sbi_hsm_data *hdata = sbi_scratch_offset_ptr(scratch,
 							    hart_data_offset);
+	if (cold_boot)
+		return;
+
 	/* Save MIE CSR */
 	saved_mie = csr_read(CSR_MIE);
 
@@ -180,15 +183,11 @@ static void sbi_hsm_hart_wait(struct sbi_scratch *scratch)
 			hsm_device_hart_stop();
 
 		wfi();
+		sbi_ipi_raw_clear();
 	}
 
 	/* Restore MIE CSR */
 	csr_write(CSR_MIE, saved_mie);
-
-	/*
-	 * No need to clear IPI here because the sbi_ipi_init() will
-	 * clear it for current HART.
-	 */
 }
 
 const struct sbi_hsm_device *sbi_hsm_get_device(void)
@@ -269,8 +268,6 @@ int sbi_hsm_init(struct sbi_scratch *scratch, bool cold_boot)
 				    SBI_HSM_STATE_STOPPED);
 			ATOMIC_INIT(&hdata->start_ticket, 0);
 		}
-	} else {
-		sbi_hsm_hart_wait(scratch);
 	}
 
 	return 0;
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 8405fcf3..47802d54 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -409,6 +409,8 @@ static void __noreturn init_startup(struct sbi_scratch *scratch, u32 hartid, boo
 		sbi_hart_hang();
 	}
 
+	sbi_hsm_hart_wait(scratch, cold_boot);
+
 	count = sbi_scratch_offset_ptr(scratch, init_count_offset);
 	(*count)++;
 
-- 
2.47.2




More information about the opensbi mailing list