Faking ACPI interrupt routing.
authorAlexander Polakov <polachok@gmail.com>
Fri, 16 Oct 2009 19:26:23 +0000 (23:26 +0400)
committerAlexander Polakov <polachok@gmail.com>
Fri, 16 Oct 2009 19:26:23 +0000 (23:26 +0400)
pci_apic_irq() accepts pin number (WHY?) instead of irq number, so we pass it.
Interrupt routing still depends on mptable, so we are *not* ACPI, just
faking.

sys/dev/acpica5/acpi_pcib.c
sys/platform/pc32/i386/nexus.c

index 03ffaf9..425c6d5 100644 (file)
@@ -259,8 +259,13 @@ acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
                pci_get_slot(dev), 'A' + pin, prt->SourceIndex);
        if (prt->SourceIndex) {
            interrupt = prt->SourceIndex;
-       pci_write_config(dev, PCIR_INTLINE, interrupt, 1);
-       BUS_CONFIG_INTR(device_get_parent(dev), dev, interrupt, INTR_TRIGGER_LEVEL,
+/*     interrupt = BUS_CONFIG_INTR(device_get_parent(dev), dev, interrupt, INTR_TRIGGER_LEVEL,
+               INTR_POLARITY_LOW);
+*/
+        /* pci_apic_irq() accepts pin number (WHY?) instead of irq number, so we pass it.
+        * Interrupt routing still depends on mptable and is not of any use then.
+        */
+       interrupt = BUS_CONFIG_INTR(device_get_parent(dev), dev, pin, INTR_TRIGGER_LEVEL,
                INTR_POLARITY_LOW);
        } else
            device_printf(pcib, "error: invalid hard-wired IRQ of 0\n");
index 95c80f7..a5abb7d 100644 (file)
@@ -478,13 +478,23 @@ nexus_config_intr(device_t dev, device_t child, int irq, enum intr_trigger trig,
 {
 #ifdef APIC_IO
        int line;
-       kprintf("%s(%s): irq: %d, trigger: %d, polarity: %d\n", __FUNCTION__, device_get_nameunit(dev), irq, trig, pol);
-       line = pci_apic_irq(pci_get_bus(child), pci_get_slot(child), irq);
+       int slot = pci_get_slot(child);
+       int bus = pci_get_bus(child);
+       int pin = irq + 1;
+       kprintf("%s(%s): irq: %d, trigger: %d, polarity: %d bus: %d slot: %d\n",
+                __FUNCTION__, device_get_nameunit(child), irq, trig, pol,
+                                bus, slot);
+       line = pci_apic_irq(bus, slot, pin);
        if(line >= 0)
                return line;
        line = isa_apic_irq(pci_get_irq(child));
+       if(line >= 0)
+               return line;
+
+        kprintf("MPTable: Unable to route for bus %d slot %d INT%c\n",
+                pci_get_bus(child), pci_get_slot(child), 'A' + pin - 1);
 
-       return(line);
+       return PCI_INVALID_IRQ;
 #else
        return irq;
 #endif