diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h index 5a0a719e..6be942a1 100644 --- a/include/sbi_utils/fdt/fdt_helper.h +++ b/include/sbi_utils/fdt/fdt_helper.h @@ -52,6 +52,9 @@ int fdt_parse_uart8250_node(void *fdt, int nodeoffset, int fdt_parse_uart8250(void *fdt, struct platform_uart_data *uart, const char *compatible); +int fdt_parse_plic_node(void *fdt, int nodeoffset, + struct platform_plic_data *plic); + int fdt_parse_plic(void *fdt, struct platform_plic_data *plic, const char *compatible); diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c index 2d79f759..ee733e79 100644 --- a/lib/utils/fdt/fdt_helper.c +++ b/lib/utils/fdt/fdt_helper.c @@ -259,16 +259,15 @@ int fdt_parse_uart8250(void *fdt, struct platform_uart_data *uart, return fdt_parse_uart8250_node(fdt, nodeoffset, uart); } -int fdt_parse_plic(void *fdt, struct platform_plic_data *plic, - const char *compatible) +int fdt_parse_plic_node(void *fdt, int nodeoffset, + struct platform_plic_data *plic) { - int nodeoffset, len, rc; + int len, rc; const fdt32_t *val; unsigned long reg_addr, reg_size; - nodeoffset = fdt_node_offset_by_compatible(fdt, -1, compatible); - if (nodeoffset < 0) - return nodeoffset; + if (nodeoffset < 0 || !plic || !fdt) + return SBI_ENODEV; rc = fdt_get_node_addr_size(fdt, nodeoffset, ®_addr, ®_size); if (rc < 0 || !reg_addr || !reg_size) @@ -282,6 +281,21 @@ int fdt_parse_plic(void *fdt, struct platform_plic_data *plic, return 0; } +int fdt_parse_plic(void *fdt, struct platform_plic_data *plic, + const char *compatible) +{ + int nodeoffset; + + if (!compatible || !plic || !fdt) + return SBI_ENODEV; + + nodeoffset = fdt_node_offset_by_compatible(fdt, -1, compatible); + if (nodeoffset < 0) + return nodeoffset; + + return fdt_parse_plic_node(fdt, nodeoffset, plic); +} + int fdt_parse_compat_addr(void *fdt, unsigned long *addr, const char *compatible) {