summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sbi/sbi_ipi.h2
-rw-r--r--lib/sbi/sbi_init.c6
-rw-r--r--lib/sbi/sbi_ipi.c6
3 files changed, 12 insertions, 2 deletions
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;