diff --git a/include/sbi/sbi_ipi.h b/include/sbi/sbi_ipi.h index 40581946..d7c05765 100644 --- a/include/sbi/sbi_ipi.h +++ b/include/sbi/sbi_ipi.h @@ -26,8 +26,6 @@ void sbi_ipi_clear_smode(struct sbi_scratch *scratch, u32 hartid); void sbi_ipi_process(struct sbi_scratch *scratch, u32 hartid); -int sbi_ipi_warm_init(struct sbi_scratch *scratch, u32 hartid); - -int sbi_ipi_cold_init(struct sbi_scratch *scratch); +int sbi_ipi_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot); #endif diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h index 503669b3..13c9ffc7 100644 --- a/include/sbi/sbi_platform.h +++ b/include/sbi/sbi_platform.h @@ -46,8 +46,7 @@ struct sbi_platform { void (*ipi_inject)(u32 target_hart, u32 source_hart); void (*ipi_sync)(u32 target_hart, u32 source_hart); void (*ipi_clear)(u32 target_hart); - int (*cold_ipi_init)(void); - int (*warm_ipi_init)(u32 target_hart); + int (*ipi_init)(u32 hartid, bool cold_boot); u64 (*timer_value)(void); void (*timer_event_stop)(u32 target_hart); void (*timer_event_start)(u32 target_hart, u64 next_event); @@ -187,18 +186,11 @@ static inline void sbi_platform_ipi_clear(struct sbi_platform *plat, plat->ipi_clear(target_hart); } -static inline int sbi_platform_warm_ipi_init(struct sbi_platform *plat, - u32 target_hart) +static inline int sbi_platform_ipi_init(struct sbi_platform *plat, + u32 hartid, bool cold_boot) { - if (plat && plat->warm_ipi_init) - return plat->warm_ipi_init(target_hart); - return 0; -} - -static inline int sbi_platform_cold_ipi_init(struct sbi_platform *plat) -{ - if (plat && plat->cold_ipi_init) - return plat->cold_ipi_init(); + if (plat && plat->ipi_init) + return plat->ipi_init(hartid, cold_boot); return 0; } diff --git a/lib/sbi_init.c b/lib/sbi_init.c index 448102e5..989cb7d7 100644 --- a/lib/sbi_init.c +++ b/lib/sbi_init.c @@ -50,11 +50,7 @@ static void __attribute__((noreturn)) init_coldboot(struct sbi_scratch *scratch, if (rc) sbi_hart_hang(); - rc = sbi_ipi_cold_init(scratch); - if (rc) - sbi_hart_hang(); - - rc = sbi_ipi_warm_init(scratch, hartid); + rc = sbi_ipi_init(scratch, hartid, TRUE); if (rc) sbi_hart_hang(); @@ -125,7 +121,7 @@ static void __attribute__((noreturn)) init_warmboot(struct sbi_scratch *scratch, if (rc) sbi_hart_hang(); - rc = sbi_ipi_warm_init(scratch, hartid); + rc = sbi_ipi_init(scratch, hartid, FALSE); if (rc) sbi_hart_hang(); diff --git a/lib/sbi_ipi.c b/lib/sbi_ipi.c index d21ea4a2..423a9a09 100644 --- a/lib/sbi_ipi.c +++ b/lib/sbi_ipi.c @@ -68,15 +68,11 @@ void sbi_ipi_process(struct sbi_scratch *scratch, u32 hartid) scratch->ipi_type = 0; } -int sbi_ipi_warm_init(struct sbi_scratch *scratch, u32 hartid) +int sbi_ipi_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot) { /* Enable software interrupts */ csr_set(mie, MIP_MSIP); - return sbi_platform_warm_ipi_init(sbi_platform_ptr(scratch), hartid); -} - -int sbi_ipi_cold_init(struct sbi_scratch *scratch) -{ - return sbi_platform_cold_ipi_init(sbi_platform_ptr(scratch)); + return sbi_platform_ipi_init(sbi_platform_ptr(scratch), + hartid, cold_boot); } diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c index 43c32440..d11dd66e 100644 --- a/platform/kendryte/k210/platform.c +++ b/platform/kendryte/k210/platform.c @@ -52,9 +52,18 @@ static int k210_irqchip_init(u32 hartid, bool cold_boot) (2 * hartid + 1)); } -static int k210_cold_ipi_init(void) +static int k210_ipi_init(u32 hartid, bool cold_boot) { - return clint_cold_ipi_init(CLINT_BASE_ADDR, K210_HART_COUNT); + int rc; + + if (cold_boot) { + rc = clint_cold_ipi_init(CLINT_BASE_ADDR, + K210_HART_COUNT); + if (rc) + return rc; + } + + return clint_warm_ipi_init(hartid); } static int k210_cold_timer_init(void) @@ -93,8 +102,7 @@ struct sbi_platform platform = { .irqchip_init = k210_irqchip_init, - .cold_ipi_init = k210_cold_ipi_init, - .warm_ipi_init = clint_warm_ipi_init, + .ipi_init = k210_ipi_init, .ipi_inject = clint_ipi_inject, .ipi_sync = clint_ipi_sync, .ipi_clear = clint_ipi_clear, diff --git a/platform/qemu/sifive_u/platform.c b/platform/qemu/sifive_u/platform.c index db6dccd5..4e6ac483 100644 --- a/platform/qemu/sifive_u/platform.c +++ b/platform/qemu/sifive_u/platform.c @@ -91,10 +91,18 @@ static int sifive_u_irqchip_init(u32 hartid, bool cold_boot) (2 * hartid + 1)); } -static int sifive_u_cold_ipi_init(void) +static int sifive_u_ipi_init(u32 hartid, bool cold_boot) { - return clint_cold_ipi_init(SIFIVE_U_CLINT_ADDR, - SIFIVE_U_HART_COUNT); + int rc; + + if (cold_boot) { + rc = clint_cold_ipi_init(SIFIVE_U_CLINT_ADDR, + SIFIVE_U_HART_COUNT); + if (rc) + return rc; + } + + return clint_warm_ipi_init(hartid); } static int sifive_u_cold_timer_init(void) @@ -125,8 +133,7 @@ struct sbi_platform platform = { .ipi_inject = clint_ipi_inject, .ipi_sync = clint_ipi_sync, .ipi_clear = clint_ipi_clear, - .warm_ipi_init = clint_warm_ipi_init, - .cold_ipi_init = sifive_u_cold_ipi_init, + .ipi_init = sifive_u_ipi_init, .timer_value = clint_timer_value, .timer_event_stop = clint_timer_event_stop, .timer_event_start = clint_timer_event_start, diff --git a/platform/qemu/virt/platform.c b/platform/qemu/virt/platform.c index 986dfc57..f9dce4a7 100644 --- a/platform/qemu/virt/platform.c +++ b/platform/qemu/virt/platform.c @@ -92,10 +92,18 @@ static int virt_irqchip_init(u32 hartid, bool cold_boot) (2 * hartid + 1)); } -static int virt_cold_ipi_init(void) +static int virt_ipi_init(u32 hartid, bool cold_boot) { - return clint_cold_ipi_init(VIRT_CLINT_ADDR, - VIRT_HART_COUNT); + int rc; + + if (cold_boot) { + rc = clint_cold_ipi_init(VIRT_CLINT_ADDR, + VIRT_HART_COUNT); + if (rc) + return rc; + } + + return clint_warm_ipi_init(hartid); } static int virt_cold_timer_init(void) @@ -126,8 +134,7 @@ struct sbi_platform platform = { .ipi_inject = clint_ipi_inject, .ipi_sync = clint_ipi_sync, .ipi_clear = clint_ipi_clear, - .warm_ipi_init = clint_warm_ipi_init, - .cold_ipi_init = virt_cold_ipi_init, + .ipi_init = virt_ipi_init, .timer_value = clint_timer_value, .timer_event_stop = clint_timer_event_stop, .timer_event_start = clint_timer_event_start, diff --git a/platform/sifive/hifive_u540/platform.c b/platform/sifive/hifive_u540/platform.c index 6d6ac182..fabb73e8 100644 --- a/platform/sifive/hifive_u540/platform.c +++ b/platform/sifive/hifive_u540/platform.c @@ -111,10 +111,19 @@ static int sifive_u_irqchip_init(u32 hartid, bool cold_boot) (hartid) ? (2 * hartid) : -1); } -static int sifive_u_cold_ipi_init(void) +static int sifive_u_ipi_init(u32 hartid, bool cold_boot) { - return clint_cold_ipi_init(SIFIVE_U_CLINT_ADDR, - SIFIVE_U_HART_COUNT); + int rc; + + if (cold_boot) { + rc = clint_cold_ipi_init(SIFIVE_U_CLINT_ADDR, + SIFIVE_U_HART_COUNT); + if (rc) + return rc; + + } + + return clint_warm_ipi_init(hartid); } static int sifive_u_cold_timer_init(void) @@ -145,8 +154,7 @@ struct sbi_platform platform = { .ipi_inject = clint_ipi_inject, .ipi_sync = clint_ipi_sync, .ipi_clear = clint_ipi_clear, - .warm_ipi_init = clint_warm_ipi_init, - .cold_ipi_init = sifive_u_cold_ipi_init, + .ipi_init = sifive_u_ipi_init, .timer_value = clint_timer_value, .timer_event_stop = clint_timer_event_stop, .timer_event_start = clint_timer_event_start,