[PATCH] lib: utils/timer: mtimer: only use regname for aclint

Anup Patel anup at brainfault.org
Tue Dec 26 22:49:47 PST 2023


On Wed, Dec 27, 2023 at 6:16 AM Inochi Amaoto <inochiama at outlook.com> wrote:
>
> 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 at outlook.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  include/sbi_utils/fdt/fdt_helper.h | 3 ++-
>  lib/utils/fdt/fdt_helper.c         | 5 +++--
>  lib/utils/ipi/fdt_ipi_mswi.c       | 2 +-
>  lib/utils/timer/fdt_timer_mtimer.c | 5 +++--
>  4 files changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h
> index 430d818..ab4a80f 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 e50f4d8..a0e93b9 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 5432db6..a709abe 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 3ba6b8f..9e27e3a 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;
> --
> 2.43.0
>



More information about the opensbi mailing list