From 2aa43a13cdd32f11c2dac30265272c9af8c6e42b Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Fri, 3 Jan 2020 10:20:12 +0530 Subject: [PATCH] lib: save/restore MIE CSR in sbi_hart_wait_for_coldboot() Currently, sbi_hart_wait_for_coldboot() leaves MIE.MSIP bit set when it returns which is not correct because MIE.MSIP should be left enabled only by sbi_ipi_init(). This patch does save/restore of MIE CSR to ensure that MIE CSR is in original state after sbi_hart_wait_for_coldboot() returns. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- lib/sbi/sbi_hart.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index a704c60c..dd2f99e8 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -354,12 +354,16 @@ static unsigned long coldboot_wait_bitmap = 0; void sbi_hart_wait_for_coldboot(struct sbi_scratch *scratch, u32 hartid) { + unsigned long saved_mie; const struct sbi_platform *plat = sbi_platform_ptr(scratch); if ((sbi_platform_hart_count(plat) <= hartid) || (COLDBOOT_WAIT_BITMAP_SIZE <= hartid)) sbi_hart_hang(); + /* Save MIE CSR */ + saved_mie = csr_read(CSR_MIE); + /* Set MSIE bit to receive IPI */ csr_set(CSR_MIE, MIP_MSIP); @@ -382,6 +386,9 @@ void sbi_hart_wait_for_coldboot(struct sbi_scratch *scratch, u32 hartid) /* Release coldboot lock */ spin_unlock(&coldboot_lock); + /* Restore MIE CSR */ + csr_write(CSR_MIE, saved_mie); + /* Clear current HART IPI */ sbi_platform_ipi_clear(plat, hartid); }