summaryrefslogtreecommitdiffstats
path: root/arch/x86/cpu/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/cpu/irq.c')
-rw-r--r--arch/x86/cpu/irq.c58
1 files changed, 24 insertions, 34 deletions
diff --git a/arch/x86/cpu/irq.c b/arch/x86/cpu/irq.c
index 97dd000039..35b29f69d8 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;
@@ -240,17 +225,22 @@ static int create_pirq_routing_table(void)
return 0;
}
-void pirq_init(void)
+int pirq_init(void)
{
+ int ret;
+
cpu_irq_init();
- if (create_pirq_routing_table()) {
+ ret = create_pirq_routing_table();
+ if (ret) {
debug("Failed to create pirq routing table\n");
- } else {
- /* Route PIRQ */
- pirq_route_irqs(pirq_routing_table->slots,
- get_irq_slot_count(pirq_routing_table));
+ return ret;
}
+ /* Route PIRQ */
+ pirq_route_irqs(pirq_routing_table->slots,
+ get_irq_slot_count(pirq_routing_table));
+
+ return 0;
}
u32 write_pirq_routing_table(u32 addr)
OpenPOWER on IntegriCloud