[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