summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-01-03 06:19:23 +0300
committerAnup Patel <anup.patel@wdc.com>2020-01-07 09:40:35 +0300
commitc3e406f1609af8f14e93419aa6722e646a8f4f56 (patch)
tree4eb54d27eac89ff77138dbba888181d1c182ef71
parente746673a796d7e176ceeb56d160779be8386ffd9 (diff)
downloadopensbi-c3e406f1609af8f14e93419aa6722e646a8f4f56.tar.xz
lib: Add initial sbi_exit() API
This patch adds initial implementation of sbi_exit() API which can be used to perform OpenSBI exit sequence for current HART. The sbi_exit() implementation will be further extended by subsequent patches. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
-rw-r--r--include/sbi/sbi_init.h2
-rw-r--r--lib/sbi/sbi_init.c22
2 files changed, 24 insertions, 0 deletions
diff --git a/include/sbi/sbi_init.h b/include/sbi/sbi_init.h
index 033286f..c976276 100644
--- a/include/sbi/sbi_init.h
+++ b/include/sbi/sbi_init.h
@@ -16,4 +16,6 @@ struct sbi_scratch;
void __noreturn sbi_init(struct sbi_scratch *scratch);
+void __noreturn sbi_exit(struct sbi_scratch *scratch);
+
#endif
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 80e4a19..b4c242f 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -183,3 +183,25 @@ void __noreturn sbi_init(struct sbi_scratch *scratch)
else
init_warmboot(scratch, hartid);
}
+
+/**
+ * Exit OpenSBI library for current HART and stop HART
+ *
+ * The function expects following:
+ * 1. The 'mscratch' CSR is pointing to sbi_scratch of current HART
+ * 2. Stack pointer (SP) is setup for current HART
+ *
+ * @param scratch pointer to sbi_scratch of current HART
+ */
+void __noreturn sbi_exit(struct sbi_scratch *scratch)
+{
+ u32 hartid = sbi_current_hartid();
+ const struct sbi_platform *plat = sbi_platform_ptr(scratch);
+
+ if (sbi_platform_hart_disabled(plat, hartid))
+ sbi_hart_hang();
+
+ sbi_hart_unmark_available(hartid);
+
+ sbi_hart_hang();
+}