|
|
@@ -997,7 +997,7 @@ static int pin_2_irq(int idx, int apic, int pin)
|
|
|
int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
|
|
|
struct io_apic_irq_attr *irq_attr)
|
|
|
{
|
|
|
- int ioapic_idx, i, best_guess = -1;
|
|
|
+ int irq, i, best_guess = -1;
|
|
|
|
|
|
apic_printk(APIC_DEBUG,
|
|
|
"querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n",
|
|
|
@@ -1007,41 +1007,46 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
|
|
|
"PCI BIOS passed nonexistent PCI bus %d!\n", bus);
|
|
|
return -1;
|
|
|
}
|
|
|
+
|
|
|
for (i = 0; i < mp_irq_entries; i++) {
|
|
|
int lbus = mp_irqs[i].srcbus;
|
|
|
+ int ioapic_idx, found = 0;
|
|
|
+
|
|
|
+ if (bus != lbus || mp_irqs[i].irqtype != mp_INT ||
|
|
|
+ slot != ((mp_irqs[i].srcbusirq >> 2) & 0x1f))
|
|
|
+ continue;
|
|
|
|
|
|
for_each_ioapic(ioapic_idx)
|
|
|
if (mpc_ioapic_id(ioapic_idx) == mp_irqs[i].dstapic ||
|
|
|
- mp_irqs[i].dstapic == MP_APIC_ALL)
|
|
|
+ mp_irqs[i].dstapic == MP_APIC_ALL) {
|
|
|
+ found = 1;
|
|
|
break;
|
|
|
+ }
|
|
|
+ if (!found)
|
|
|
+ continue;
|
|
|
|
|
|
- if (!test_bit(lbus, mp_bus_not_pci) &&
|
|
|
- mp_irqs[i].irqtype == mp_INT &&
|
|
|
- (bus == lbus) &&
|
|
|
- (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) {
|
|
|
- int irq = pin_2_irq(i, ioapic_idx, mp_irqs[i].dstirq);
|
|
|
-
|
|
|
- if (!(ioapic_idx || IO_APIC_IRQ(irq)))
|
|
|
- continue;
|
|
|
+ /* Skip ISA IRQs */
|
|
|
+ irq = pin_2_irq(i, ioapic_idx, mp_irqs[i].dstirq);
|
|
|
+ if (ioapic_idx == 0 && !IO_APIC_IRQ(irq))
|
|
|
+ continue;
|
|
|
|
|
|
- if (pin == (mp_irqs[i].srcbusirq & 3)) {
|
|
|
- set_io_apic_irq_attr(irq_attr, ioapic_idx,
|
|
|
- mp_irqs[i].dstirq,
|
|
|
- irq_trigger(i),
|
|
|
- irq_polarity(i));
|
|
|
- return irq;
|
|
|
- }
|
|
|
- /*
|
|
|
- * Use the first all-but-pin matching entry as a
|
|
|
- * best-guess fuzzy result for broken mptables.
|
|
|
- */
|
|
|
- if (best_guess < 0) {
|
|
|
- set_io_apic_irq_attr(irq_attr, ioapic_idx,
|
|
|
- mp_irqs[i].dstirq,
|
|
|
- irq_trigger(i),
|
|
|
- irq_polarity(i));
|
|
|
- best_guess = irq;
|
|
|
- }
|
|
|
+ if (pin == (mp_irqs[i].srcbusirq & 3)) {
|
|
|
+ set_io_apic_irq_attr(irq_attr, ioapic_idx,
|
|
|
+ mp_irqs[i].dstirq,
|
|
|
+ irq_trigger(i),
|
|
|
+ irq_polarity(i));
|
|
|
+ return irq;
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ * Use the first all-but-pin matching entry as a
|
|
|
+ * best-guess fuzzy result for broken mptables.
|
|
|
+ */
|
|
|
+ if (best_guess < 0) {
|
|
|
+ set_io_apic_irq_attr(irq_attr, ioapic_idx,
|
|
|
+ mp_irqs[i].dstirq,
|
|
|
+ irq_trigger(i),
|
|
|
+ irq_polarity(i));
|
|
|
+ best_guess = irq;
|
|
|
}
|
|
|
}
|
|
|
return best_guess;
|