From 6704216732e528ac99109b8bad401e60c68d6c22 Mon Sep 17 00:00:00 2001 From: Atish Patra Date: Fri, 6 Mar 2020 11:44:44 -0800 Subject: [PATCH] lib: Check MSIP bit after returning from WFI As per the RISC-V privilege specification, WFI can be implemented as a NOP. Software should ensure that relevant interrupt pending bits are set. Otherwise, loop back to WFI. Signed-off-by: Atish Patra Reviewed-by: Anup Patel Reviewed-by: Bin Meng --- lib/sbi/sbi_hart.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index 3de46a2..535fe19 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -385,7 +385,7 @@ static unsigned long coldboot_wait_bitmap = 0; void sbi_hart_wait_for_coldboot(struct sbi_scratch *scratch, u32 hartid) { - unsigned long saved_mie; + unsigned long saved_mie, cmip; const struct sbi_platform *plat = sbi_platform_ptr(scratch); if ((sbi_platform_hart_count(plat) <= hartid) || @@ -407,7 +407,10 @@ void sbi_hart_wait_for_coldboot(struct sbi_scratch *scratch, u32 hartid) /* Wait for coldboot to finish using WFI */ while (!coldboot_done) { spin_unlock(&coldboot_lock); - wfi(); + do { + wfi(); + cmip = csr_read(CSR_MIP); + } while (!(cmip & MIP_MSIP)); spin_lock(&coldboot_lock); };