diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sbi/sbi_init.c | 2 | ||||
| -rw-r--r-- | lib/sbi/sbi_ipi.c | 19 |
2 files changed, 20 insertions, 1 deletions
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c index 2247324c..c491bd86 100644 --- a/lib/sbi/sbi_init.c +++ b/lib/sbi/sbi_init.c @@ -207,6 +207,8 @@ void __noreturn sbi_exit(struct sbi_scratch *scratch) sbi_timer_exit(scratch); + sbi_ipi_exit(scratch); + sbi_platform_final_exit(plat); sbi_hart_hang(); diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c index c2359274..f58349e7 100644 --- a/lib/sbi/sbi_ipi.c +++ b/lib/sbi/sbi_ipi.c @@ -160,8 +160,25 @@ int sbi_ipi_init(struct sbi_scratch *scratch, bool cold_boot) if (ret) return ret; + /* Platform init */ + ret = sbi_platform_ipi_init(sbi_platform_ptr(scratch), cold_boot); + if (ret) + return ret; + /* Enable software interrupts */ csr_set(CSR_MIE, MIP_MSIP); - return sbi_platform_ipi_init(sbi_platform_ptr(scratch), cold_boot); + return 0; +} + +void sbi_ipi_exit(struct sbi_scratch *scratch) +{ + /* Disable software interrupts */ + csr_clear(CSR_MIE, MIP_MSIP); + + /* Process pending IPIs */ + sbi_ipi_process(scratch); + + /* Platform exit */ + sbi_platform_ipi_exit(sbi_platform_ptr(scratch)); } |
