summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYu Chien Peter Lin <peterlin@andestech.com>2023-01-20 06:05:08 +0300
committerAnup Patel <anup@brainfault.org>2023-01-22 15:02:09 +0300
commit8ecbe6d3fba6a655b5b5d8e39381187826ac750f (patch)
tree87ca9efbec3276ee7ea1fe930e4e5b8445d5f72e /lib
parentce2a834c989043895d339df4d61221eca2b428e9 (diff)
downloadopensbi-8ecbe6d3fba6a655b5b5d8e39381187826ac750f.tar.xz
lib: sbi_hsm: handle failure when hart_stop returns SBI_ENOTSUPP
Make use of generic warm-boot path when platform hart_stop callback returns SBI_ENOTSUPP, in case certain hart can not turn off its power domain, or it detects some error occured in power management unit, it can fall through warm-boot flow and wait for interrupt in sbi_hsm_hart_wait(). Also improves comment in sbi_hsm_hart_wait(). Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Atish Patra <atishp@rivosinc.com> Reviewed-by: Anup Patel <anup@brainfault.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_hsm.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index c0a5505..d4cce4a 100644
--- a/lib/sbi/sbi_hsm.c
+++ b/lib/sbi/sbi_hsm.c
@@ -116,7 +116,7 @@ static void sbi_hsm_hart_wait(struct sbi_scratch *scratch, u32 hartid)
/* Set MSIE and MEIE bits to receive IPI */
csr_set(CSR_MIE, MIP_MSIP | MIP_MEIP);
- /* Wait for hart_add call*/
+ /* Wait for state transition requested by sbi_hsm_hart_start() */
while (atomic_read(&hdata->state) != SBI_HSM_STATE_START_PENDING) {
wfi();
};
@@ -228,9 +228,8 @@ void __noreturn sbi_hsm_exit(struct sbi_scratch *scratch)
goto fail_exit;
if (hsm_device_has_hart_hotplug()) {
- hsm_device_hart_stop();
- /* It should never reach here */
- goto fail_exit;
+ if (hsm_device_hart_stop() != SBI_ENOTSUPP)
+ goto fail_exit;
}
/**