Loading arch/x86/kernel/io_apic_32.c +20 −1 Original line number Original line Diff line number Diff line Loading @@ -962,7 +962,7 @@ static int EISA_ELCR(unsigned int irq) #define default_MCA_trigger(idx) (1) #define default_MCA_trigger(idx) (1) #define default_MCA_polarity(idx) (0) #define default_MCA_polarity(idx) (0) static int __init MPBIOS_polarity(int idx) static int MPBIOS_polarity(int idx) { { int bus = mp_irqs[idx].mpc_srcbus; int bus = mp_irqs[idx].mpc_srcbus; int polarity; int polarity; Loading Loading @@ -2830,6 +2830,25 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a return 0; return 0; } } int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) { int i; if (skip_ioapic_setup) return -1; for (i = 0; i < mp_irq_entries; i++) if (mp_irqs[i].mpc_irqtype == mp_INT && mp_irqs[i].mpc_srcbusirq == bus_irq) break; if (i >= mp_irq_entries) return -1; *trigger = irq_trigger(i); *polarity = irq_polarity(i); return 0; } #endif /* CONFIG_ACPI */ #endif /* CONFIG_ACPI */ static int __init parse_disable_timer_pin_1(char *arg) static int __init parse_disable_timer_pin_1(char *arg) Loading arch/x86/kernel/io_apic_64.c +22 −2 Original line number Original line Diff line number Diff line Loading @@ -546,7 +546,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) #define default_PCI_trigger(idx) (1) #define default_PCI_trigger(idx) (1) #define default_PCI_polarity(idx) (1) #define default_PCI_polarity(idx) (1) static int __init MPBIOS_polarity(int idx) static int MPBIOS_polarity(int idx) { { int bus = mp_irqs[idx].mpc_srcbus; int bus = mp_irqs[idx].mpc_srcbus; int polarity; int polarity; Loading Loading @@ -2222,8 +2222,27 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int p return 0; return 0; } } #endif /* CONFIG_ACPI */ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) { int i; if (skip_ioapic_setup) return -1; for (i = 0; i < mp_irq_entries; i++) if (mp_irqs[i].mpc_irqtype == mp_INT && mp_irqs[i].mpc_srcbusirq == bus_irq) break; if (i >= mp_irq_entries) return -1; *trigger = irq_trigger(i); *polarity = irq_polarity(i); return 0; } #endif /* CONFIG_ACPI */ /* /* * This function currently is only a helper for the i386 smp boot process where * This function currently is only a helper for the i386 smp boot process where Loading Loading @@ -2260,3 +2279,4 @@ void __init setup_ioapic_dest(void) } } } } #endif #endif drivers/pnp/pnpacpi/rsparser.c +16 −8 Original line number Original line Diff line number Diff line Loading @@ -75,6 +75,7 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, { { int i = 0; int i = 0; int irq; int irq; int p, t; if (!valid_IRQ(gsi)) if (!valid_IRQ(gsi)) return; return; Loading @@ -85,15 +86,22 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, if (i >= PNP_MAX_IRQ) if (i >= PNP_MAX_IRQ) return; return; #ifdef CONFIG_X86 /* if (gsi < 16 && (triggering != ACPI_EDGE_SENSITIVE || * in IO-APIC mode, use overrided attribute. Two reasons: polarity != ACPI_ACTIVE_HIGH)) { * 1. BIOS bug in DSDT pnp_warn("BIOS BUG: legacy PNP IRQ %d should be edge trigger, " * 2. BIOS uses IO-APIC mode Interrupt Source Override "active high", gsi); */ triggering = ACPI_EDGE_SENSITIVE; if (!acpi_get_override_irq(gsi, &t, &p)) { polarity = ACPI_ACTIVE_HIGH; t = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; p = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; if (triggering != t || polarity != p) { pnp_warn("IRQ %d override to %s, %s", gsi, t ? "edge":"level", p ? "low":"high"); triggering = t; polarity = p; } } } #endif res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag res->irq_resource[i].flags |= irq_flags(triggering, polarity); res->irq_resource[i].flags |= irq_flags(triggering, polarity); Loading include/linux/acpi.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -132,6 +132,11 @@ extern unsigned long acpi_realmode_flags; int acpi_register_gsi (u32 gsi, int triggering, int polarity); int acpi_register_gsi (u32 gsi, int triggering, int polarity); int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); #ifdef CONFIG_X86_IO_APIC extern int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity); #else #define acpi_get_override_irq(bus, trigger, polarity) (-1) #endif /* /* * This function undoes the effect of one call to acpi_register_gsi(). * This function undoes the effect of one call to acpi_register_gsi(). * If this matches the last registration, any IRQ resources for gsi * If this matches the last registration, any IRQ resources for gsi Loading Loading
arch/x86/kernel/io_apic_32.c +20 −1 Original line number Original line Diff line number Diff line Loading @@ -962,7 +962,7 @@ static int EISA_ELCR(unsigned int irq) #define default_MCA_trigger(idx) (1) #define default_MCA_trigger(idx) (1) #define default_MCA_polarity(idx) (0) #define default_MCA_polarity(idx) (0) static int __init MPBIOS_polarity(int idx) static int MPBIOS_polarity(int idx) { { int bus = mp_irqs[idx].mpc_srcbus; int bus = mp_irqs[idx].mpc_srcbus; int polarity; int polarity; Loading Loading @@ -2830,6 +2830,25 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a return 0; return 0; } } int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) { int i; if (skip_ioapic_setup) return -1; for (i = 0; i < mp_irq_entries; i++) if (mp_irqs[i].mpc_irqtype == mp_INT && mp_irqs[i].mpc_srcbusirq == bus_irq) break; if (i >= mp_irq_entries) return -1; *trigger = irq_trigger(i); *polarity = irq_polarity(i); return 0; } #endif /* CONFIG_ACPI */ #endif /* CONFIG_ACPI */ static int __init parse_disable_timer_pin_1(char *arg) static int __init parse_disable_timer_pin_1(char *arg) Loading
arch/x86/kernel/io_apic_64.c +22 −2 Original line number Original line Diff line number Diff line Loading @@ -546,7 +546,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) #define default_PCI_trigger(idx) (1) #define default_PCI_trigger(idx) (1) #define default_PCI_polarity(idx) (1) #define default_PCI_polarity(idx) (1) static int __init MPBIOS_polarity(int idx) static int MPBIOS_polarity(int idx) { { int bus = mp_irqs[idx].mpc_srcbus; int bus = mp_irqs[idx].mpc_srcbus; int polarity; int polarity; Loading Loading @@ -2222,8 +2222,27 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int p return 0; return 0; } } #endif /* CONFIG_ACPI */ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) { int i; if (skip_ioapic_setup) return -1; for (i = 0; i < mp_irq_entries; i++) if (mp_irqs[i].mpc_irqtype == mp_INT && mp_irqs[i].mpc_srcbusirq == bus_irq) break; if (i >= mp_irq_entries) return -1; *trigger = irq_trigger(i); *polarity = irq_polarity(i); return 0; } #endif /* CONFIG_ACPI */ /* /* * This function currently is only a helper for the i386 smp boot process where * This function currently is only a helper for the i386 smp boot process where Loading Loading @@ -2260,3 +2279,4 @@ void __init setup_ioapic_dest(void) } } } } #endif #endif
drivers/pnp/pnpacpi/rsparser.c +16 −8 Original line number Original line Diff line number Diff line Loading @@ -75,6 +75,7 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, { { int i = 0; int i = 0; int irq; int irq; int p, t; if (!valid_IRQ(gsi)) if (!valid_IRQ(gsi)) return; return; Loading @@ -85,15 +86,22 @@ static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, if (i >= PNP_MAX_IRQ) if (i >= PNP_MAX_IRQ) return; return; #ifdef CONFIG_X86 /* if (gsi < 16 && (triggering != ACPI_EDGE_SENSITIVE || * in IO-APIC mode, use overrided attribute. Two reasons: polarity != ACPI_ACTIVE_HIGH)) { * 1. BIOS bug in DSDT pnp_warn("BIOS BUG: legacy PNP IRQ %d should be edge trigger, " * 2. BIOS uses IO-APIC mode Interrupt Source Override "active high", gsi); */ triggering = ACPI_EDGE_SENSITIVE; if (!acpi_get_override_irq(gsi, &t, &p)) { polarity = ACPI_ACTIVE_HIGH; t = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; p = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; if (triggering != t || polarity != p) { pnp_warn("IRQ %d override to %s, %s", gsi, t ? "edge":"level", p ? "low":"high"); triggering = t; polarity = p; } } } #endif res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag res->irq_resource[i].flags |= irq_flags(triggering, polarity); res->irq_resource[i].flags |= irq_flags(triggering, polarity); Loading
include/linux/acpi.h +5 −0 Original line number Original line Diff line number Diff line Loading @@ -132,6 +132,11 @@ extern unsigned long acpi_realmode_flags; int acpi_register_gsi (u32 gsi, int triggering, int polarity); int acpi_register_gsi (u32 gsi, int triggering, int polarity); int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); #ifdef CONFIG_X86_IO_APIC extern int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity); #else #define acpi_get_override_irq(bus, trigger, polarity) (-1) #endif /* /* * This function undoes the effect of one call to acpi_register_gsi(). * This function undoes the effect of one call to acpi_register_gsi(). * If this matches the last registration, any IRQ resources for gsi * If this matches the last registration, any IRQ resources for gsi Loading