From b325f6baefeafcee169e5f8a529882fdc0f47dc5 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Fri, 3 Jan 2020 09:39:10 +0530 Subject: [PATCH] lib: Add ipi exit API We add sbi_ipi_exit() API for exit path handling in sbi_exit() implementation. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi/sbi_ipi.h | 2 ++ include/sbi/sbi_platform.h | 13 +++++++++++++ lib/sbi/sbi_init.c | 2 ++ lib/sbi/sbi_ipi.c | 19 ++++++++++++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/sbi/sbi_ipi.h b/include/sbi/sbi_ipi.h index 109e9af7..2dbc096e 100644 --- a/include/sbi/sbi_ipi.h +++ b/include/sbi/sbi_ipi.h @@ -36,4 +36,6 @@ void sbi_ipi_process(struct sbi_scratch *scratch); int sbi_ipi_init(struct sbi_scratch *scratch, bool cold_boot); +void sbi_ipi_exit(struct sbi_scratch *scratch); + #endif diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h index 02007af5..21082fce 100644 --- a/include/sbi/sbi_platform.h +++ b/include/sbi/sbi_platform.h @@ -116,6 +116,8 @@ struct sbi_platform_operations { void (*ipi_clear)(u32 target_hart); /** Initialize IPI for current HART */ int (*ipi_init)(bool cold_boot); + /** Exit IPI for current HART */ + void (*ipi_exit)(void); /** Get platform timer value */ u64 (*timer_value)(void); @@ -499,6 +501,17 @@ static inline int sbi_platform_ipi_init(const struct sbi_platform *plat, return 0; } +/** + * Exit the platform IPI support for current HART + * + * @param plat pointer to struct sbi_platform + */ +static inline void sbi_platform_ipi_exit(const struct sbi_platform *plat) +{ + if (plat && sbi_platform_ops(plat)->ipi_exit) + sbi_platform_ops(plat)->ipi_exit(); +} + /** * Get platform timer value * 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)); }