[PATCH v2 4/5] lib: utils: Use fdt_cpu_intc_phandle_to_hartindex()

Anup Patel anup at brainfault.org
Sun Apr 20 21:24:00 PDT 2025


On Mon, Mar 24, 2025 at 9:20 PM Samuel Holland
<samuel.holland at sifive.com> wrote:
>
> Use the cached information to look up the hart index from an interrupt
> reference instead of parsing the DT each time.
>
> The logic should otherwise be equivalent.
>
> Signed-off-by: Samuel Holland <samuel.holland at sifive.com>

LGTM.

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

Regards,
Anup


> ---
>
> (no changes since v1)
>
>  include/sbi_utils/irqchip/imsic.h     |  2 +-
>  lib/utils/fdt/fdt_helper.c            | 59 +++++----------------------
>  lib/utils/irqchip/fdt_irqchip_imsic.c | 19 +++------
>  lib/utils/irqchip/fdt_irqchip_plic.c  | 21 +++-------
>  lib/utils/irqchip/imsic.c             |  6 +--
>  5 files changed, 25 insertions(+), 82 deletions(-)
>
> diff --git a/include/sbi_utils/irqchip/imsic.h b/include/sbi_utils/irqchip/imsic.h
> index 353cefec..e4e750b0 100644
> --- a/include/sbi_utils/irqchip/imsic.h
> +++ b/include/sbi_utils/irqchip/imsic.h
> @@ -35,7 +35,7 @@ struct imsic_data {
>
>  #ifdef CONFIG_IRQCHIP_IMSIC
>
> -int imsic_map_hartid_to_data(u32 hartid, struct imsic_data *imsic, int file);
> +int imsic_map_hartindex_to_data(u32 hartindex, struct imsic_data *imsic, int file);
>
>  struct imsic_data *imsic_get_data(u32 hartindex);
>
> diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c
> index 937ad83a..13f38510 100644
> --- a/lib/utils/fdt/fdt_helper.c
> +++ b/lib/utils/fdt/fdt_helper.c
> @@ -920,8 +920,8 @@ int fdt_parse_aclint_node(const void *fdt, int nodeoffset,
>                           u32 *out_first_hartid, u32 *out_hart_count)
>  {
>         const fdt32_t *val;
> -       int i, rc, count, cpu_offset, cpu_intc_offset;
> -       u32 phandle, hwirq, hartid, first_hartid, last_hartid, hart_count;
> +       int i, rc, count;
> +       u32 phandle, hwirq, hartindex, hartid, first_hartid, last_hartid, hart_count;
>         u32 match_hwirq = (for_timer) ? IRQ_M_TIMER : IRQ_M_SOFT;
>
>         if (nodeoffset < 0 || !fdt ||
> @@ -955,20 +955,11 @@ int fdt_parse_aclint_node(const void *fdt, int nodeoffset,
>                 phandle = fdt32_to_cpu(val[2 * i]);
>                 hwirq = fdt32_to_cpu(val[(2 * i) + 1]);
>
> -               cpu_intc_offset = fdt_node_offset_by_phandle(fdt, phandle);
> -               if (cpu_intc_offset < 0)
> +               hartindex = fdt_cpu_intc_phandle_to_hartindex(phandle);
> +               if (!sbi_hartindex_valid(hartindex))
>                         continue;
>
> -               cpu_offset = fdt_parent_offset(fdt, cpu_intc_offset);
> -               if (cpu_offset < 0)
> -                       continue;
> -
> -               rc = fdt_parse_hart_id(fdt, cpu_offset, &hartid);
> -               if (rc)
> -                       continue;
> -
> -               if (SBI_HARTMASK_MAX_BITS <= sbi_hartid_to_hartindex(hartid))
> -                       continue;
> +               hartid = sbi_hartindex_to_hartid(hartindex);
>
>                 if (match_hwirq == hwirq) {
>                         if (hartid < first_hartid)
> @@ -994,7 +985,7 @@ int fdt_parse_plmt_node(const void *fdt, int nodeoffset, unsigned long *plmt_bas
>         const fdt32_t *val;
>         int rc, i, count;
>         uint64_t reg_addr, reg_size;
> -       u32 phandle, hwirq, hartid, hcount;
> +       u32 phandle, hwirq, hartindex, hcount;
>
>         if (nodeoffset < 0 || !fdt || !plmt_base ||
>             !hart_count || !plmt_size)
> @@ -1014,25 +1005,11 @@ int fdt_parse_plmt_node(const void *fdt, int nodeoffset, unsigned long *plmt_bas
>
>         hcount = 0;
>         for (i = 0; i < (count / 2); i++) {
> -               int cpu_offset, cpu_intc_offset;
> -
>                 phandle = fdt32_to_cpu(val[2 * i]);
>                 hwirq = fdt32_to_cpu(val[2 * i + 1]);
>
> -               cpu_intc_offset = fdt_node_offset_by_phandle(fdt, phandle);
> -               if (cpu_intc_offset < 0)
> -                       continue;
> -
> -               cpu_offset = fdt_parent_offset(fdt, cpu_intc_offset);
> -               if (cpu_offset < 0)
> -                       continue;
> -
> -               rc = fdt_parse_hart_id(fdt, cpu_offset, &hartid);
> -
> -               if (rc)
> -                       continue;
> -
> -               if (SBI_HARTMASK_MAX_BITS <= sbi_hartid_to_hartindex(hartid))
> +               hartindex = fdt_cpu_intc_phandle_to_hartindex(phandle);
> +               if (!sbi_hartindex_valid(hartindex))
>                         continue;
>
>                 if (hwirq == IRQ_M_TIMER)
> @@ -1050,7 +1027,7 @@ int fdt_parse_plicsw_node(const void *fdt, int nodeoffset, unsigned long *plicsw
>         const fdt32_t *val;
>         int rc, i, count;
>         uint64_t reg_addr, reg_size;
> -       u32 phandle, hwirq, hartid, hcount;
> +       u32 phandle, hwirq, hartindex, hcount;
>
>         if (nodeoffset < 0 || !fdt || !plicsw_base ||
>             !hart_count || !size)
> @@ -1070,25 +1047,11 @@ int fdt_parse_plicsw_node(const void *fdt, int nodeoffset, unsigned long *plicsw
>
>         hcount = 0;
>         for (i = 0; i < (count / 2); i++) {
> -               int cpu_offset, cpu_intc_offset;
> -
>                 phandle = fdt32_to_cpu(val[2 * i]);
>                 hwirq = fdt32_to_cpu(val[2 * i + 1]);
>
> -               cpu_intc_offset = fdt_node_offset_by_phandle(fdt, phandle);
> -               if (cpu_intc_offset < 0)
> -                       continue;
> -
> -               cpu_offset = fdt_parent_offset(fdt, cpu_intc_offset);
> -               if (cpu_offset < 0)
> -                       continue;
> -
> -               rc = fdt_parse_hart_id(fdt, cpu_offset, &hartid);
> -
> -               if (rc)
> -                       continue;
> -
> -               if (SBI_HARTMASK_MAX_BITS <= sbi_hartid_to_hartindex(hartid))
> +               hartindex = fdt_cpu_intc_phandle_to_hartindex(phandle);
> +               if (!sbi_hartindex_valid(hartindex))
>                         continue;
>
>                 if (hwirq == IRQ_M_SOFT)
> diff --git a/lib/utils/irqchip/fdt_irqchip_imsic.c b/lib/utils/irqchip/fdt_irqchip_imsic.c
> index 2e47cc81..153c4785 100644
> --- a/lib/utils/irqchip/fdt_irqchip_imsic.c
> +++ b/lib/utils/irqchip/fdt_irqchip_imsic.c
> @@ -12,6 +12,7 @@
>  #include <sbi/riscv_asm.h>
>  #include <sbi/sbi_error.h>
>  #include <sbi/sbi_heap.h>
> +#include <sbi_utils/fdt/fdt_cpu.h>
>  #include <sbi_utils/fdt/fdt_helper.h>
>  #include <sbi_utils/irqchip/fdt_irqchip.h>
>  #include <sbi_utils/irqchip/imsic.h>
> @@ -20,8 +21,8 @@ static int irqchip_imsic_update_hartid_table(const void *fdt, int nodeoff,
>                                              struct imsic_data *id)
>  {
>         const fdt32_t *val;
> -       u32 phandle, hwirq, hartid;
> -       int i, err, count, cpu_offset, cpu_intc_offset;
> +       u32 phandle, hwirq, hartindex;
> +       int i, err, count;
>
>         val = fdt_getprop(fdt, nodeoff, "interrupts-extended", &count);
>         if (!val || count < sizeof(fdt32_t))
> @@ -32,21 +33,11 @@ static int irqchip_imsic_update_hartid_table(const void *fdt, int nodeoff,
>                 phandle = fdt32_to_cpu(val[i]);
>                 hwirq = fdt32_to_cpu(val[i + 1]);
>
> -               cpu_intc_offset = fdt_node_offset_by_phandle(fdt, phandle);
> -               if (cpu_intc_offset < 0)
> -                       continue;
> -
> -               cpu_offset = fdt_parent_offset(fdt, cpu_intc_offset);
> -               if (cpu_offset < 0)
> -                       continue;
> -
> -               err = fdt_parse_hart_id(fdt, cpu_offset, &hartid);
> -               if (err)
> -                       return SBI_EINVAL;
> +               hartindex = fdt_cpu_intc_phandle_to_hartindex(phandle);
>
>                 switch (hwirq) {
>                 case IRQ_M_EXT:
> -                       err = imsic_map_hartid_to_data(hartid, id, i / 2);
> +                       err = imsic_map_hartindex_to_data(hartindex, id, i / 2);
>                         if (err)
>                                 return err;
>                         break;
> diff --git a/lib/utils/irqchip/fdt_irqchip_plic.c b/lib/utils/irqchip/fdt_irqchip_plic.c
> index 65a9de15..98ff02c0 100644
> --- a/lib/utils/irqchip/fdt_irqchip_plic.c
> +++ b/lib/utils/irqchip/fdt_irqchip_plic.c
> @@ -13,6 +13,7 @@
>  #include <sbi/sbi_error.h>
>  #include <sbi/sbi_heap.h>
>  #include <sbi/sbi_scratch.h>
> +#include <sbi_utils/fdt/fdt_cpu.h>
>  #include <sbi_utils/fdt/fdt_helper.h>
>  #include <sbi_utils/irqchip/fdt_irqchip.h>
>  #include <sbi_utils/irqchip/plic.h>
> @@ -21,8 +22,8 @@ static int irqchip_plic_update_context_map(const void *fdt, int nodeoff,
>                                            struct plic_data *pd)
>  {
>         const fdt32_t *val;
> -       u32 phandle, hwirq, hartid, hartindex;
> -       int i, err, count, cpu_offset, cpu_intc_offset;
> +       u32 phandle, hwirq, hartindex;
> +       int i, count;
>
>         val = fdt_getprop(fdt, nodeoff, "interrupts-extended", &count);
>         if (!val || count < sizeof(fdt32_t))
> @@ -33,20 +34,8 @@ static int irqchip_plic_update_context_map(const void *fdt, int nodeoff,
>                 phandle = fdt32_to_cpu(val[i]);
>                 hwirq = fdt32_to_cpu(val[i + 1]);
>
> -               cpu_intc_offset = fdt_node_offset_by_phandle(fdt, phandle);
> -               if (cpu_intc_offset < 0)
> -                       continue;
> -
> -               cpu_offset = fdt_parent_offset(fdt, cpu_intc_offset);
> -               if (cpu_offset < 0)
> -                       continue;
> -
> -               err = fdt_parse_hart_id(fdt, cpu_offset, &hartid);
> -               if (err)
> -                       continue;
> -
> -               hartindex = sbi_hartid_to_hartindex(hartid);
> -               if (hartindex == -1U)
> +               hartindex = fdt_cpu_intc_phandle_to_hartindex(phandle);
> +               if (!sbi_hartindex_valid(hartindex))
>                         continue;
>
>                 switch (hwirq) {
> diff --git a/lib/utils/irqchip/imsic.c b/lib/utils/irqchip/imsic.c
> index 057b9fa7..bcf1aa55 100644
> --- a/lib/utils/irqchip/imsic.c
> +++ b/lib/utils/irqchip/imsic.c
> @@ -96,7 +96,7 @@ static unsigned long imsic_file_offset;
>  #define imsic_set_hart_file(__scratch, __file)                         \
>         sbi_scratch_write_type((__scratch), long, imsic_file_offset, (__file))
>
> -int imsic_map_hartid_to_data(u32 hartid, struct imsic_data *imsic, int file)
> +int imsic_map_hartindex_to_data(u32 hartindex, struct imsic_data *imsic, int file)
>  {
>         struct sbi_scratch *scratch;
>
> @@ -105,12 +105,12 @@ int imsic_map_hartid_to_data(u32 hartid, struct imsic_data *imsic, int file)
>
>         /*
>          * We don't need to fail if scratch pointer is not available
> -        * because we might be dealing with hartid of a HART disabled
> +        * because we might be dealing with hartindex of a HART disabled
>          * in device tree. For HARTs disabled in device tree, the
>          * imsic_get_data() and imsic_get_target_file() will anyway
>          * fail.
>          */
> -       scratch = sbi_hartid_to_scratch(hartid);
> +       scratch = sbi_hartindex_to_scratch(hartindex);
>         if (!scratch)
>                 return 0;
>
> --
> 2.47.2
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list