diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h index 430d8180..ab4a80fa 100644 --- a/include/sbi_utils/fdt/fdt_helper.h +++ b/include/sbi_utils/fdt/fdt_helper.h @@ -99,7 +99,8 @@ int fdt_parse_plic_node(void *fdt, int nodeoffset, struct plic_data *plic); int fdt_parse_plic(void *fdt, struct plic_data *plic, const char *compat); -int fdt_parse_aclint_node(void *fdt, int nodeoffset, bool for_timer, +int fdt_parse_aclint_node(void *fdt, int nodeoffset, + bool for_timer, bool allow_regname, unsigned long *out_addr1, unsigned long *out_size1, unsigned long *out_addr2, unsigned long *out_size2, u32 *out_first_hartid, u32 *out_hart_count); diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c index e50f4d84..a0e93b92 100644 --- a/lib/utils/fdt/fdt_helper.c +++ b/lib/utils/fdt/fdt_helper.c @@ -957,7 +957,8 @@ static int fdt_get_aclint_addr_size(void *fdt, int nodeoffset, return 0; } -int fdt_parse_aclint_node(void *fdt, int nodeoffset, bool for_timer, +int fdt_parse_aclint_node(void *fdt, int nodeoffset, + bool for_timer, bool allow_regname, unsigned long *out_addr1, unsigned long *out_size1, unsigned long *out_addr2, unsigned long *out_size2, u32 *out_first_hartid, u32 *out_hart_count) @@ -972,7 +973,7 @@ int fdt_parse_aclint_node(void *fdt, int nodeoffset, bool for_timer, !out_first_hartid || !out_hart_count) return SBI_EINVAL; - if (for_timer && out_addr2 && out_size2 && + if (for_timer && allow_regname && out_addr2 && out_size2 && fdt_getprop(fdt, nodeoffset, "reg-names", NULL)) rc = fdt_get_aclint_addr_size_by_name(fdt, nodeoffset, out_addr1, out_size1, diff --git a/lib/utils/ipi/fdt_ipi_mswi.c b/lib/utils/ipi/fdt_ipi_mswi.c index 5432db6e..a709abe1 100644 --- a/lib/utils/ipi/fdt_ipi_mswi.c +++ b/lib/utils/ipi/fdt_ipi_mswi.c @@ -24,7 +24,7 @@ static int ipi_mswi_cold_init(void *fdt, int nodeoff, if (!ms) return SBI_ENOMEM; - rc = fdt_parse_aclint_node(fdt, nodeoff, false, + rc = fdt_parse_aclint_node(fdt, nodeoff, false, false, &ms->addr, &ms->size, NULL, NULL, &ms->first_hartid, &ms->hart_count); if (rc) { diff --git a/lib/utils/timer/fdt_timer_mtimer.c b/lib/utils/timer/fdt_timer_mtimer.c index 3ba6b8f9..9e27e3ab 100644 --- a/lib/utils/timer/fdt_timer_mtimer.c +++ b/lib/utils/timer/fdt_timer_mtimer.c @@ -38,13 +38,14 @@ static int timer_mtimer_cold_init(void *fdt, int nodeoff, struct timer_mtimer_node *mtn, *n; struct aclint_mtimer_data *mt; const struct timer_mtimer_quirks *quirks = match->data; + bool is_clint = quirks && quirks->is_clint; mtn = sbi_zalloc(sizeof(*mtn)); if (!mtn) return SBI_ENOMEM; mt = &mtn->data; - rc = fdt_parse_aclint_node(fdt, nodeoff, true, + rc = fdt_parse_aclint_node(fdt, nodeoff, true, !is_clint, &addr[0], &size[0], &addr[1], &size[1], &mt->first_hartid, &mt->hart_count); if (rc) { @@ -60,7 +61,7 @@ static int timer_mtimer_cold_init(void *fdt, int nodeoff, return rc; } - if (quirks && quirks->is_clint) { /* SiFive CLINT */ + if (is_clint) { /* SiFive CLINT */ /* Set CLINT addresses */ mt->mtimecmp_addr = addr[0] + ACLINT_DEFAULT_MTIMECMP_OFFSET; mt->mtimecmp_size = ACLINT_DEFAULT_MTIMECMP_SIZE;