On Sat, Aug 8, 2015 at 10:26 PM, Simon Glass <s...@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 <s...@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...@gmail.com> Tested-by: Bin Meng <bmeng...@gmail.com> _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot