diff options
author | Bin Meng <bmeng.cn@gmail.com> | 2020-03-17 07:59:42 -0700 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-03-18 09:40:14 +0530 |
commit | 6af55769eb8cd5b9c7fdcd959586e0bc0fce3994 (patch) | |
tree | e73e27ae65e4baab3c9b19e38155ecef29fce88b | |
parent | 666be6d62beffc380faf8700cc532142222826d8 (diff) |
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 <bmeng.cn@gmail.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
-rw-r--r-- | include/sbi_utils/fdt/fdt_helper.h | 13 | ||||
-rw-r--r-- | include/sbi_utils/irqchip/plic.h | 2 | ||||
-rw-r--r-- | lib/utils/fdt/fdt_helper.c | 25 | ||||
-rw-r--r-- | lib/utils/irqchip/plic.c | 27 | ||||
-rw-r--r-- | platform/andes/ae350/platform.c | 3 | ||||
-rw-r--r-- | platform/ariane-fpga/platform.c | 3 | ||||
-rw-r--r-- | platform/qemu/virt/platform.c | 3 | ||||
-rw-r--r-- | 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 @@ -10,6 +10,19 @@ #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 * * This routine inserts a child node of the reserved memory node in the device 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 <sbi/sbi_types.h> -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 <sbi/sbi_platform.h> #include <sbi/sbi_scratch.h> +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 <sbi/sbi_console.h> #include <sbi/sbi_string.h> #include <sbi_utils/irqchip/plic.h> -#include <libfdt.h> -#include <fdt.h> #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 <sbi/sbi_console.h> #include <sbi/sbi_const.h> #include <sbi/sbi_platform.h> +#include <sbi_utils/fdt/fdt_helper.h> #include <sbi_utils/irqchip/plic.h> #include <sbi_utils/serial/uart8250.h> #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 <sbi/sbi_const.h> #include <sbi/sbi_hart.h> #include <sbi/sbi_platform.h> +#include <sbi_utils/fdt/fdt_helper.h> #include <sbi_utils/irqchip/plic.h> #include <sbi_utils/serial/uart8250.h> #include <sbi_utils/sys/clint.h> @@ -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 <sbi/sbi_const.h> #include <sbi/sbi_hart.h> #include <sbi/sbi_platform.h> +#include <sbi_utils/fdt/fdt_helper.h> #include <sbi_utils/irqchip/plic.h> #include <sbi_utils/serial/uart8250.h> #include <sbi_utils/sys/clint.h> @@ -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 <sbi/sbi_console.h> #include <sbi/sbi_const.h> #include <sbi/sbi_platform.h> +#include <sbi_utils/fdt/fdt_helper.h> #include <sbi_utils/irqchip/plic.h> #include <sbi_utils/serial/sifive-uart.h> #include <sbi_utils/sys/clint.h> @@ -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) |