author: Evgenii Shatokhin <e.shatokhin@yadro.com> 2023-03-06 00:22:47 +0300
committer: Anup Patel <anup@brainfault.org> 2023-03-10 14:13:40 +0530
commit: c6a092cd80112529cb2e92e180767ff5341b22a3
parent: e8e9ed3790feac05ec6fd5c279ec80b05293d67b
Commit Summary:
Diffstat:
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;