|
@@ -904,10 +904,8 @@ extern int es7000_plat;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static struct {
|
|
static struct {
|
|
- int apic_id;
|
|
|
|
int gsi_base;
|
|
int gsi_base;
|
|
int gsi_end;
|
|
int gsi_end;
|
|
- DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
|
|
|
|
} mp_ioapic_routing[MAX_IO_APICS];
|
|
} mp_ioapic_routing[MAX_IO_APICS];
|
|
|
|
|
|
int mp_find_ioapic(int gsi)
|
|
int mp_find_ioapic(int gsi)
|
|
@@ -996,7 +994,6 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
|
|
* Build basic GSI lookup table to facilitate gsi->io_apic lookups
|
|
* Build basic GSI lookup table to facilitate gsi->io_apic lookups
|
|
* and to prevent reprogramming of IOAPIC pins (PCI GSIs).
|
|
* and to prevent reprogramming of IOAPIC pins (PCI GSIs).
|
|
*/
|
|
*/
|
|
- mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].apicid;
|
|
|
|
mp_ioapic_routing[idx].gsi_base = gsi_base;
|
|
mp_ioapic_routing[idx].gsi_base = gsi_base;
|
|
mp_ioapic_routing[idx].gsi_end = gsi_base +
|
|
mp_ioapic_routing[idx].gsi_end = gsi_base +
|
|
io_apic_get_redir_entries(idx);
|
|
io_apic_get_redir_entries(idx);
|
|
@@ -1189,7 +1186,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int triggering,
|
|
mp_irq.srcbus = number;
|
|
mp_irq.srcbus = number;
|
|
mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
|
|
mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3);
|
|
ioapic = mp_find_ioapic(gsi);
|
|
ioapic = mp_find_ioapic(gsi);
|
|
- mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id;
|
|
|
|
|
|
+ mp_irq.dstapic = mp_ioapics[ioapic].apicid;
|
|
mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
|
|
mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi);
|
|
|
|
|
|
save_mp_irq(&mp_irq);
|
|
save_mp_irq(&mp_irq);
|
|
@@ -1224,23 +1221,12 @@ int mp_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity)
|
|
|
|
|
|
if (ioapic_pin > MP_MAX_IOAPIC_PIN) {
|
|
if (ioapic_pin > MP_MAX_IOAPIC_PIN) {
|
|
printk(KERN_ERR "Invalid reference to IOAPIC pin "
|
|
printk(KERN_ERR "Invalid reference to IOAPIC pin "
|
|
- "%d-%d\n", mp_ioapic_routing[ioapic].apic_id,
|
|
|
|
|
|
+ "%d-%d\n", mp_ioapics[ioapic].apicid,
|
|
ioapic_pin);
|
|
ioapic_pin);
|
|
return gsi;
|
|
return gsi;
|
|
}
|
|
}
|
|
mp_config_acpi_gsi(dev, gsi, triggering, polarity);
|
|
mp_config_acpi_gsi(dev, gsi, triggering, polarity);
|
|
|
|
|
|
- /*
|
|
|
|
- * Avoid pin reprogramming. PRTs typically include entries
|
|
|
|
- * with redundant pin->gsi mappings (but unique PCI devices);
|
|
|
|
- * we only program the IOAPIC on the first.
|
|
|
|
- */
|
|
|
|
- if (test_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed)) {
|
|
|
|
- pr_debug("Pin %d-%d already programmed\n",
|
|
|
|
- mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
|
|
|
|
- return gsi;
|
|
|
|
- }
|
|
|
|
- set_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed);
|
|
|
|
io_apic_set_pci_routing(dev, ioapic, ioapic_pin, gsi,
|
|
io_apic_set_pci_routing(dev, ioapic, ioapic_pin, gsi,
|
|
triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
|
|
triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
|
|
polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
|
|
polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
|