From 6704216732e528ac99109b8bad401e60c68d6c22 Mon Sep 17 00:00:00 2001
From: Atish Patra <atish.patra@wdc.com>
Date: Fri, 6 Mar 2020 11:44:44 -0800
Subject: 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 <atish.patra@wdc.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
---
 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);
 	};
 
-- 
cgit v1.2.3