aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/acpi/boot.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 0a036dc6f9ff..3ee92f28a4b2 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -961,8 +961,6 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
961void __init mp_config_acpi_legacy_irqs(void) 961void __init mp_config_acpi_legacy_irqs(void)
962{ 962{
963 int i; 963 int i;
964 int ioapic;
965 unsigned int dstapic;
966 struct mpc_intsrc mp_irq; 964 struct mpc_intsrc mp_irq;
967 965
968#if defined (CONFIG_MCA) || defined (CONFIG_EISA) 966#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
@@ -983,19 +981,27 @@ void __init mp_config_acpi_legacy_irqs(void)
983#endif 981#endif
984 982
985 /* 983 /*
986 * Locate the IOAPIC that manages the ISA IRQs (0-15).
987 */
988 ioapic = mp_find_ioapic(0);
989 if (ioapic < 0)
990 return;
991 dstapic = mp_ioapics[ioapic].apicid;
992
993 /*
994 * Use the default configuration for the IRQs 0-15. Unless 984 * Use the default configuration for the IRQs 0-15. Unless
995 * overridden by (MADT) interrupt source override entries. 985 * overridden by (MADT) interrupt source override entries.
996 */ 986 */
997 for (i = 0; i < 16; i++) { 987 for (i = 0; i < 16; i++) {
988 int ioapic, pin;
989 unsigned int dstapic;
998 int idx; 990 int idx;
991 u32 gsi;
992
993 /* Locate the gsi that irq i maps to. */
994 if (acpi_isa_irq_to_gsi(i, &gsi))
995 continue;
996
997 /*
998 * Locate the IOAPIC that manages the ISA IRQ.
999 */
1000 ioapic = mp_find_ioapic(gsi);
1001 if (ioapic < 0)
1002 continue;
1003 pin = mp_find_ioapic_pin(ioapic, gsi);
1004 dstapic = mp_ioapics[ioapic].apicid;
999 1005
1000 for (idx = 0; idx < mp_irq_entries; idx++) { 1006 for (idx = 0; idx < mp_irq_entries; idx++) {
1001 struct mpc_intsrc *irq = mp_irqs + idx; 1007 struct mpc_intsrc *irq = mp_irqs + idx;
@@ -1005,7 +1011,7 @@ void __init mp_config_acpi_legacy_irqs(void)
1005 break; 1011 break;
1006 1012
1007 /* Do we already have a mapping for this IOAPIC pin */ 1013 /* Do we already have a mapping for this IOAPIC pin */
1008 if (irq->dstapic == dstapic && irq->dstirq == i) 1014 if (irq->dstapic == dstapic && irq->dstirq == pin)
1009 break; 1015 break;
1010 } 1016 }
1011 1017
@@ -1020,7 +1026,7 @@ void __init mp_config_acpi_legacy_irqs(void)
1020 mp_irq.dstapic = dstapic; 1026 mp_irq.dstapic = dstapic;
1021 mp_irq.irqtype = mp_INT; 1027 mp_irq.irqtype = mp_INT;
1022 mp_irq.srcbusirq = i; /* Identity mapped */ 1028 mp_irq.srcbusirq = i; /* Identity mapped */
1023 mp_irq.dstirq = i; 1029 mp_irq.dstirq = pin;
1024 1030
1025 save_mp_irq(&mp_irq); 1031 save_mp_irq(&mp_irq);
1026 } 1032 }