summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMayuresh Chitale <[email protected]>2023-03-25 22:20:47 +0530
committerAnup Patel <[email protected]>2023-04-06 18:52:03 +0530
commit8e90259da8b4b5bc6c934506cc4302578d44dbc2 (patch)
tree6a38a05e971bf6d0ffcce5da92a83b738f258a6f
parent30b9e7ee14498e5db805f471dbb23ea67c7a3b32 (diff)
lib: sbi_hart: clear mip csr during hart init
If mip.SEIP bit is not cleared then on HiFive Unmatched board it causes spurious external interrupts. This breaks the boot up of HiFive Unmatched board. Hence it is required to bring the mip CSR to a known state during hart init and avoid spurious interrupts. Fixes: d9e7368 ("firmware: Not to clear all the MIP") Signed-off-by: Mayuresh Chitale <[email protected]> Reviewed-by: Anup Patel <[email protected]>
-rw-r--r--firmware/fw_base.S7
-rw-r--r--lib/sbi/sbi_hart.c6
2 files changed, 6 insertions, 7 deletions
diff --git a/firmware/fw_base.S b/firmware/fw_base.S
index ceef44f2..5a3e8948 100644
--- a/firmware/fw_base.S
+++ b/firmware/fw_base.S
@@ -430,13 +430,6 @@ _start_warm:
/* Disable all interrupts */
csrw CSR_MIE, zero
- /*
- * Only clear the MIP_SSIP and MIP_STIP. For the platform like QEMU,
- * If we clear other interrupts like MIP_SEIP and the pendings of
- * PLIC still exist, the QEMU may not set it back immediately.
- */
- li t0, (MIP_SSIP | MIP_STIP)
- csrc CSR_MIP, t0
/* Find HART count and HART stack size */
lla a4, platform
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index 5e06918c..6e52cbd7 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -733,6 +733,12 @@ int sbi_hart_init(struct sbi_scratch *scratch, bool cold_boot)
{
int rc;
+ /*
+ * Clear mip CSR before proceeding with init to avoid any spurious
+ * external interrupts in S-mode.
+ */
+ csr_write(CSR_MIP, 0);
+
if (cold_boot) {
if (misa_extension('H'))
sbi_hart_expected_trap = &__sbi_expected_trap_hext;