From: Alexander Polakov Date: Fri, 16 Oct 2009 19:26:23 +0000 (+0400) Subject: ACPI: Faking interrupt routing. X-Git-Tag: v2.7.1~380^2~13^2~5 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/53191b78aae051efc946a0d2e6b9db82acec8046 ACPI: Faking interrupt routing. pci_apic_irq() accepts pin number instead of irq number, so we pass it. Interrupt routing still depends on mptable, so we are *not* ACPI, just faking. --- diff --git a/sys/dev/acpica5/acpi_pcib.c b/sys/dev/acpica5/acpi_pcib.c index 03ffaf9f9f..425c6d5e41 100644 --- a/sys/dev/acpica5/acpi_pcib.c +++ b/sys/dev/acpica5/acpi_pcib.c @@ -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"); diff --git a/sys/platform/pc32/i386/nexus.c b/sys/platform/pc32/i386/nexus.c index 95c80f7f4b..a5abb7d879 100644 --- a/sys/platform/pc32/i386/nexus.c +++ b/sys/platform/pc32/i386/nexus.c @@ -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