x86: Tidy up the PIRQ routing code a little
authorSimon Glass <sjg@chromium.org>
Mon, 10 Aug 2015 13:05:06 +0000 (07:05 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 14 Aug 2015 09:24:21 +0000 (03:24 -0600)
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@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/irq.c

index 97dd000039694d362110d15424d56b9bdce1f404..6be2f81734670fe77bb274bf1d71243138bbd79a 100644 (file)
@@ -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;