summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <[email protected]>2020-01-03 09:39:10 +0530
committerAnup Patel <[email protected]>2020-01-07 12:11:02 +0530
commitb325f6baefeafcee169e5f8a529882fdc0f47dc5 (patch)
treee721c583dd4451c3152152ca1be8b59761dc2c5a
parent6469ed101cb3c036cce1ead0d64160a7315f72af (diff)
lib: Add ipi exit API
We add sbi_ipi_exit() API for exit path handling in sbi_exit() implementation. Signed-off-by: Anup Patel <[email protected]> Reviewed-by: Atish Patra <[email protected]>
-rw-r--r--include/sbi/sbi_ipi.h2
-rw-r--r--include/sbi/sbi_platform.h13
-rw-r--r--lib/sbi/sbi_init.c2
-rw-r--r--lib/sbi/sbi_ipi.c19
4 files changed, 35 insertions, 1 deletions
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);
@@ -500,6 +502,17 @@ static inline int sbi_platform_ipi_init(const struct sbi_platform *plat,
}
/**
+ * 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
*
* @param plat pointer to struct sbi_platform
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));
}