lib: utils/timer: mtimer: only use regname for aclint
authorInochi Amaoto <inochiama@outlook.com>
Wed, 27 Dec 2023 00:46:11 +0000 (08:46 +0800)
committerAnup Patel <anup@brainfault.org>
Wed, 27 Dec 2023 06:27:33 +0000 (11:57 +0530)
The parser will fail if the timer is clint timer and has regname
property. As the regname is only meaningful for aclint, it is more
robust to only check regname for aclint timer.

Fixes: 6112d58 ("lib: utils/fdt: Allow to use reg-names when parsing ACLINT")
Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
include/sbi_utils/fdt/fdt_helper.h
lib/utils/fdt/fdt_helper.c
lib/utils/ipi/fdt_ipi_mswi.c
lib/utils/timer/fdt_timer_mtimer.c

index 430d8180a9be4bd6748168b997b7f1f8f7b5f35e..ab4a80fa6f49b9f81e215b1b8ccff6980b501e5a 100644 (file)
@@ -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);
index e50f4d849f6643ca2cf6953bb82d16ced5252ac2..a0e93b92266687e2c09aff67506fd02b386505d2 100644 (file)
@@ -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,
index 5432db6ef9275957afcdc47f7ab847944e0c1285..a709abe150db64450ac1be435d41c09a0818ba5d 100644 (file)
@@ -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) {
index 3ba6b8f9f98ee1cdd19febbe8919db7f450c2d90..9e27e3ab92aeba55fde6426a02b8c033936e4638 100644 (file)
@@ -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;