diff --git a/include/sbi/sbi_ipi.h b/include/sbi/sbi_ipi.h index f6ac807..f384e74 100644 --- a/include/sbi/sbi_ipi.h +++ b/include/sbi/sbi_ipi.h @@ -77,6 +77,8 @@ void sbi_ipi_process(void); int sbi_ipi_raw_send(u32 target_hart); +void sbi_ipi_raw_clear(u32 target_hart); + const struct sbi_ipi_device *sbi_ipi_get_device(void); void sbi_ipi_set_device(const struct sbi_ipi_device *dev); diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c index dcca2c8..ffa214c 100644 --- a/lib/sbi/sbi_init.c +++ b/lib/sbi/sbi_init.c @@ -442,10 +442,12 @@ static void __noreturn init_warmboot(struct sbi_scratch *scratch, u32 hartid) if (hstate < 0) sbi_hart_hang(); - if (hstate == SBI_HSM_STATE_SUSPENDED) + if (hstate == SBI_HSM_STATE_SUSPENDED) { init_warm_resume(scratch, hartid); - else + } else { + sbi_ipi_raw_clear(hartid); init_warm_startup(scratch, hartid); + } } static atomic_t coldboot_lottery = ATOMIC_INITIALIZER(0); diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c index 1bcc2e4..b9f6205 100644 --- a/lib/sbi/sbi_ipi.c +++ b/lib/sbi/sbi_ipi.c @@ -217,6 +217,12 @@ int sbi_ipi_raw_send(u32 target_hart) return 0; } +void sbi_ipi_raw_clear(u32 target_hart) +{ + if (ipi_dev && ipi_dev->ipi_clear) + ipi_dev->ipi_clear(target_hart); +} + const struct sbi_ipi_device *sbi_ipi_get_device(void) { return ipi_dev;