[U-Boot] [PATCH v2 4/9] x86: Tidy up the PIRQ routing code a little

Bin Meng bmeng.cn at gmail.com
Mon Aug 10 08:19:01 CEST 2015


On Sat, Aug 8, 2015 at 10:26 PM, Simon Glass <sjg at chromium.org> wrote:
> This code could use a little tightening up. There is some repetition and
> an odd use of fdtdec_get_int_array().
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2:
> - Fix handling of duplicate entries
>
>  arch/x86/cpu/irq.c | 41 +++++++++++++----------------------------
>  1 file changed, 13 insertions(+), 28 deletions(-)
>
> diff --git a/arch/x86/cpu/irq.c b/arch/x86/cpu/irq.c
> index 97dd000..6be2f81 100644
> --- a/arch/x86/cpu/irq.c
> +++ b/arch/x86/cpu/irq.c
> @@ -125,10 +125,10 @@ static int create_pirq_routing_table(void)
>                         return -EINVAL;
>         }
>
> -       ret = fdtdec_get_int_array(blob, node, "intel,pirq-link",
> -                                  &irq_router.link_base, 1);
> -       if (ret)
> +       ret = fdtdec_get_int(blob, node, "intel,pirq-link", -1);
> +       if (ret == -1)
>                 return ret;
> +       irq_router.link_base = ret;
>
>         irq_router.irq_mask = fdtdec_get_int(blob, node,
>                                              "intel,pirq-mask", PIRQ_BITMAP);
> @@ -156,18 +156,13 @@ static int create_pirq_routing_table(void)
>         }
>
>         cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
> -       if (!cell)
> -               return -EINVAL;
> -
> -       if ((len % sizeof(struct pirq_routing)) == 0)
> -               count = len / sizeof(struct pirq_routing);
> -       else
> +       if (!cell || len % sizeof(struct pirq_routing))
>                 return -EINVAL;
> +       count = len / sizeof(struct pirq_routing);
>
> -       rt = malloc(sizeof(struct irq_routing_table));
> +       rt = calloc(1, sizeof(struct irq_routing_table));
>         if (!rt)
>                 return -ENOMEM;
> -       memset((char *)rt, 0, sizeof(struct irq_routing_table));
>
>         /* Populate the PIRQ table fields */
>         rt->signature = PIRQ_SIGNATURE;
> @@ -181,7 +176,8 @@ static int create_pirq_routing_table(void)
>         slot_base = rt->slots;
>
>         /* Now fill in the irq_info entries in the PIRQ table */
> -       for (i = 0; i < count; i++) {
> +       for (i = 0; i < count;
> +            i++, cell += sizeof(struct pirq_routing) / sizeof(u32)) {
>                 struct pirq_routing pr;
>
>                 pr.bdf = fdt_addr_to_cpu(cell[0]);
> @@ -212,25 +208,14 @@ static int create_pirq_routing_table(void)
>                                 if (slot->irq[pr.pin - 1].link !=
>                                         LINK_N2V(pr.pirq, irq_router.link_base))
>                                         debug("WARNING: Inconsistent PIRQ routing information\n");
> -
> -                               cell += sizeof(struct pirq_routing) /
> -                                       sizeof(u32);
> -                               continue;
> -                       } else {
> -                               debug("writing INT%c\n", 'A' + pr.pin - 1);
> -                               fill_irq_info(slot, PCI_BUS(pr.bdf),
> -                                             PCI_DEV(pr.bdf), pr.pin, pr.pirq);
> -                               cell += sizeof(struct pirq_routing) /
> -                                       sizeof(u32);
>                                 continue;
>                         }
> +               } else {
> +                       slot = slot_base + irq_entries++;
>                 }
> -
> -               slot = slot_base + irq_entries;
> -               fill_irq_info(slot, PCI_BUS(pr.bdf), PCI_DEV(pr.bdf),
> -                             pr.pin, pr.pirq);
> -               irq_entries++;
> -               cell += sizeof(struct pirq_routing) / sizeof(u32);
> +               debug("writing INT%c\n", 'A' + pr.pin - 1);
> +               fill_irq_info(slot, PCI_BUS(pr.bdf), PCI_DEV(pr.bdf), pr.pin,
> +                             pr.pirq);
>         }
>
>         rt->size = irq_entries * sizeof(struct irq_info) + 32;
> --

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
Tested-by: Bin Meng <bmeng.cn at gmail.com>


More information about the U-Boot mailing list