diff --git a/platform/common/include/plat/irqchip/plic.h b/platform/common/include/plat/irqchip/plic.h index d3094acc..79a8e544 100644 --- a/platform/common/include/plat/irqchip/plic.h +++ b/platform/common/include/plat/irqchip/plic.h @@ -12,7 +12,7 @@ #include -void plic_fdt_fixup(void *fdt, const char *compat, u32 cntx_id); +void plic_fdt_fixup(void *fdt, const char *compat); int plic_warm_irqchip_init(u32 target_hart, int m_cntx_id, int s_cntx_id); diff --git a/platform/common/irqchip/plic.c b/platform/common/irqchip/plic.c index 0a2a0367..59265cfc 100644 --- a/platform/common/irqchip/plic.c +++ b/platform/common/irqchip/plic.c @@ -8,6 +8,8 @@ */ #include +#include +#include #include #include #include @@ -50,7 +52,6 @@ static void plic_fdt_fixup_prop(const struct fdt_node *node, { u32 *cells; u32 i, cells_count; - u32 *cntx_id = priv; if (!prop) return; @@ -63,15 +64,15 @@ static void plic_fdt_fixup_prop(const struct fdt_node *node, if (!cells_count) return; - for (i = 0; i < cells_count; i++) { - if (((i % 2) == 1) && ((i / 2) == *cntx_id)) - cells[i] = fdt_rev32(0xffffffff); + for (i = 0; i < (cells_count/2); i++) { + if (fdt_rev32(cells[2*i+1]) == IRQ_M_EXT) + cells[2*i+1] = fdt_rev32(0xffffffff); } } -void plic_fdt_fixup(void *fdt, const char *compat, u32 cntx_id) +void plic_fdt_fixup(void *fdt, const char *compat) { - fdt_compat_node_prop(fdt, compat, plic_fdt_fixup_prop, &cntx_id); + fdt_compat_node_prop(fdt, compat, plic_fdt_fixup_prop, NULL); } int plic_warm_irqchip_init(u32 target_hart, diff --git a/platform/qemu/sifive_u/platform.c b/platform/qemu/sifive_u/platform.c index cf6efbda..91fa4a76 100644 --- a/platform/qemu/sifive_u/platform.c +++ b/platform/qemu/sifive_u/platform.c @@ -31,15 +31,13 @@ static int sifive_u_final_init(u32 hartid, bool cold_boot) { - u32 i; void *fdt; if (!cold_boot) return 0; fdt = sbi_scratch_thishart_arg1_ptr(); - for (i = 0; i < SIFIVE_U_HART_COUNT; i++) - plic_fdt_fixup(fdt, "riscv,plic0", 2 * i); + plic_fdt_fixup(fdt, "riscv,plic0"); return 0; } diff --git a/platform/qemu/virt/platform.c b/platform/qemu/virt/platform.c index 71ddc759..a28f9f1a 100644 --- a/platform/qemu/virt/platform.c +++ b/platform/qemu/virt/platform.c @@ -31,15 +31,13 @@ static int virt_final_init(u32 hartid, bool cold_boot) { - u32 i; void *fdt; if (!cold_boot) return 0; fdt = sbi_scratch_thishart_arg1_ptr(); - for (i = 0; i < VIRT_HART_COUNT; i++) - plic_fdt_fixup(fdt, "riscv,plic0", 2 * i); + plic_fdt_fixup(fdt, "riscv,plic0"); return 0; } diff --git a/platform/sifive/fu540/platform.c b/platform/sifive/fu540/platform.c index d8ea0b4b..47918036 100644 --- a/platform/sifive/fu540/platform.c +++ b/platform/sifive/fu540/platform.c @@ -69,10 +69,7 @@ static void fu540_modify_dt(void *fdt) fdt_setprop_string(fdt, chosen_offset, "stdout-path", "/soc/serial@10010000:115200"); - plic_fdt_fixup(fdt, "riscv,plic0", 0); - - for (i = 1; i < FU540_HART_COUNT; i++) - plic_fdt_fixup(fdt, "riscv,plic0", 2 * i - 1); + plic_fdt_fixup(fdt, "riscv,plic0"); } static int fu540_final_init(u32 hartid, bool cold_boot) {