From 6af55769eb8cd5b9c7fdcd959586e0bc0fce3994 Mon Sep 17 00:00:00 2001 From: Bin Meng Date: Tue, 17 Mar 2020 07:59:42 -0700 Subject: lib: utils: Move PLIC DT fix up codes to fdt_helper.c Now that we have a dedicated fdt_helper.c file for DT releated helper routines, move plic_fdt_fixup() codes from plic.c to fdt_helper.c and rename it to fdt_plic_fixup() at the same time, to keep name consistency in the same file. Signed-off-by: Bin Meng Reviewed-by: Atish Patra --- include/sbi_utils/fdt/fdt_helper.h | 13 +++++++++++++ include/sbi_utils/irqchip/plic.h | 2 -- lib/utils/fdt/fdt_helper.c | 25 +++++++++++++++++++++++++ lib/utils/irqchip/plic.c | 27 --------------------------- platform/andes/ae350/platform.c | 3 ++- platform/ariane-fpga/platform.c | 3 ++- platform/qemu/virt/platform.c | 3 ++- platform/sifive/fu540/platform.c | 3 ++- 8 files changed, 46 insertions(+), 33 deletions(-) diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h index a6c3073..67251f8 100644 --- a/include/sbi_utils/fdt/fdt_helper.h +++ b/include/sbi_utils/fdt/fdt_helper.h @@ -9,6 +9,19 @@ #ifndef __FDT_HELPER_H__ #define __FDT_HELPER_H__ +/** + * Fix up the PLIC node in the device tree + * + * This routine updates the "interrupt-extended" property of the PLIC node in + * the device tree to hide the M-mode external interrupt from CPUs. + * + * It is recommended that platform codes call this helper in their final_init() + * + * @param fdt: device tree blob + * @param compat: PLIC node compatible string + */ +void fdt_plic_fixup(void *fdt, const char *compat); + /** * Fix up the reserved memory node in the device tree * diff --git a/include/sbi_utils/irqchip/plic.h b/include/sbi_utils/irqchip/plic.h index 8d6cefa..8e190ce 100644 --- a/include/sbi_utils/irqchip/plic.h +++ b/include/sbi_utils/irqchip/plic.h @@ -12,8 +12,6 @@ #include -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); int plic_cold_irqchip_init(unsigned long base, u32 num_sources, u32 hart_count); diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c index d95a056..fcae968 100644 --- a/lib/utils/fdt/fdt_helper.c +++ b/lib/utils/fdt/fdt_helper.c @@ -12,6 +12,31 @@ #include #include +void fdt_plic_fixup(void *fdt, const char *compat) +{ + u32 *cells; + int i, cells_count; + int plic_off; + + plic_off = fdt_node_offset_by_compatible(fdt, 0, compat); + if (plic_off < 0) + return; + + cells = (u32 *)fdt_getprop(fdt, plic_off, + "interrupts-extended", &cells_count); + if (!cells) + return; + + cells_count = cells_count / sizeof(u32); + if (!cells_count) + return; + + for (i = 0; i < (cells_count / 2); i++) { + if (fdt32_to_cpu(cells[2 * i + 1]) == IRQ_M_EXT) + cells[2 * i + 1] = cpu_to_fdt32(0xffffffff); + } +} + /** * We use PMP to protect OpenSBI firmware to safe-guard it from buggy S-mode * software, see pmp_init() in lib/sbi/sbi_hart.c. The protected memory region diff --git a/lib/utils/irqchip/plic.c b/lib/utils/irqchip/plic.c index 467938c..40c4170 100644 --- a/lib/utils/irqchip/plic.c +++ b/lib/utils/irqchip/plic.c @@ -12,8 +12,6 @@ #include #include #include -#include -#include #define PLIC_PRIORITY_BASE 0x0 #define PLIC_PENDING_BASE 0x1000 @@ -47,31 +45,6 @@ void plic_set_ie(u32 cntxid, u32 word_index, u32 val) writel(val, plic_ie + word_index * 4); } -void plic_fdt_fixup(void *fdt, const char *compat) -{ - u32 *cells; - int i, cells_count; - int plic_off; - - plic_off = fdt_node_offset_by_compatible(fdt, 0, compat); - if (plic_off < 0) - return; - - cells = (u32 *)fdt_getprop(fdt, plic_off, - "interrupts-extended", &cells_count); - if (!cells) - return; - - cells_count = cells_count / sizeof(u32); - if (!cells_count) - return; - - for (i = 0; i < (cells_count / 2); i++) { - if (fdt32_to_cpu(cells[2 * i + 1]) == IRQ_M_EXT) - cells[2 * i + 1] = cpu_to_fdt32(0xffffffff); - } -} - int plic_warm_irqchip_init(u32 target_hart, int m_cntx_id, int s_cntx_id) { size_t i, ie_words = plic_num_sources / 32 + 1; diff --git a/platform/andes/ae350/platform.c b/platform/andes/ae350/platform.c index 13c2b45..a42db9d 100644 --- a/platform/andes/ae350/platform.c +++ b/platform/andes/ae350/platform.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include "platform.h" @@ -47,7 +48,7 @@ static int ae350_final_init(bool cold_boot) return 0; fdt = sbi_scratch_thishart_arg1_ptr(); - plic_fdt_fixup(fdt, "riscv,plic0"); + fdt_plic_fixup(fdt, "riscv,plic0"); return 0; } diff --git a/platform/ariane-fpga/platform.c b/platform/ariane-fpga/platform.c index 84ffec6..742386b 100644 --- a/platform/ariane-fpga/platform.c +++ b/platform/ariane-fpga/platform.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -55,7 +56,7 @@ static int ariane_final_init(bool cold_boot) if (!cold_boot) return 0; fdt = sbi_scratch_thishart_arg1_ptr(); - plic_fdt_fixup(fdt, "riscv,plic0"); + fdt_plic_fixup(fdt, "riscv,plic0"); return 0; } diff --git a/platform/qemu/virt/platform.c b/platform/qemu/virt/platform.c index 92f34aa..c103e85 100644 --- a/platform/qemu/virt/platform.c +++ b/platform/qemu/virt/platform.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,7 @@ static int virt_final_init(bool cold_boot) return 0; fdt = sbi_scratch_thishart_arg1_ptr(); - plic_fdt_fixup(fdt, "riscv,plic0"); + fdt_plic_fixup(fdt, "riscv,plic0"); return 0; } diff --git a/platform/sifive/fu540/platform.c b/platform/sifive/fu540/platform.c index 2eb9fa1..a10f50b 100644 --- a/platform/sifive/fu540/platform.c +++ b/platform/sifive/fu540/platform.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -87,7 +88,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"); + fdt_plic_fixup(fdt, "riscv,plic0"); } static int fu540_final_init(bool cold_boot) -- cgit v1.2.3