diff options
Diffstat (limited to 'arch/x86/kernel/io_apic.c')
-rw-r--r-- | arch/x86/kernel/io_apic.c | 163 |
1 files changed, 92 insertions, 71 deletions
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 1c4a1302536c..f79660390724 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <asm/idle.h> | 46 | #include <asm/idle.h> |
47 | #include <asm/io.h> | 47 | #include <asm/io.h> |
48 | #include <asm/smp.h> | 48 | #include <asm/smp.h> |
49 | #include <asm/cpu.h> | ||
49 | #include <asm/desc.h> | 50 | #include <asm/desc.h> |
50 | #include <asm/proto.h> | 51 | #include <asm/proto.h> |
51 | #include <asm/acpi.h> | 52 | #include <asm/acpi.h> |
@@ -82,11 +83,11 @@ static DEFINE_SPINLOCK(vector_lock); | |||
82 | int nr_ioapic_registers[MAX_IO_APICS]; | 83 | int nr_ioapic_registers[MAX_IO_APICS]; |
83 | 84 | ||
84 | /* I/O APIC entries */ | 85 | /* I/O APIC entries */ |
85 | struct mp_config_ioapic mp_ioapics[MAX_IO_APICS]; | 86 | struct mpc_ioapic mp_ioapics[MAX_IO_APICS]; |
86 | int nr_ioapics; | 87 | int nr_ioapics; |
87 | 88 | ||
88 | /* MP IRQ source entries */ | 89 | /* MP IRQ source entries */ |
89 | struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 90 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
90 | 91 | ||
91 | /* # of MP IRQ source entries */ | 92 | /* # of MP IRQ source entries */ |
92 | int mp_irq_entries; | 93 | int mp_irq_entries; |
@@ -356,7 +357,7 @@ set_extra_move_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
356 | 357 | ||
357 | if (!cfg->move_in_progress) { | 358 | if (!cfg->move_in_progress) { |
358 | /* it means that domain is not changed */ | 359 | /* it means that domain is not changed */ |
359 | if (!cpumask_intersects(&desc->affinity, mask)) | 360 | if (!cpumask_intersects(desc->affinity, mask)) |
360 | cfg->move_desc_pending = 1; | 361 | cfg->move_desc_pending = 1; |
361 | } | 362 | } |
362 | } | 363 | } |
@@ -386,7 +387,7 @@ struct io_apic { | |||
386 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) | 387 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) |
387 | { | 388 | { |
388 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) | 389 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) |
389 | + (mp_ioapics[idx].mp_apicaddr & ~PAGE_MASK); | 390 | + (mp_ioapics[idx].apicaddr & ~PAGE_MASK); |
390 | } | 391 | } |
391 | 392 | ||
392 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | 393 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) |
@@ -579,9 +580,9 @@ set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) | |||
579 | if (assign_irq_vector(irq, cfg, mask)) | 580 | if (assign_irq_vector(irq, cfg, mask)) |
580 | return BAD_APICID; | 581 | return BAD_APICID; |
581 | 582 | ||
582 | cpumask_and(&desc->affinity, cfg->domain, mask); | 583 | cpumask_and(desc->affinity, cfg->domain, mask); |
583 | set_extra_move_desc(desc, mask); | 584 | set_extra_move_desc(desc, mask); |
584 | return cpu_mask_to_apicid_and(&desc->affinity, cpu_online_mask); | 585 | return cpu_mask_to_apicid_and(desc->affinity, cpu_online_mask); |
585 | } | 586 | } |
586 | 587 | ||
587 | static void | 588 | static void |
@@ -944,10 +945,10 @@ static int find_irq_entry(int apic, int pin, int type) | |||
944 | int i; | 945 | int i; |
945 | 946 | ||
946 | for (i = 0; i < mp_irq_entries; i++) | 947 | for (i = 0; i < mp_irq_entries; i++) |
947 | if (mp_irqs[i].mp_irqtype == type && | 948 | if (mp_irqs[i].irqtype == type && |
948 | (mp_irqs[i].mp_dstapic == mp_ioapics[apic].mp_apicid || | 949 | (mp_irqs[i].dstapic == mp_ioapics[apic].apicid || |
949 | mp_irqs[i].mp_dstapic == MP_APIC_ALL) && | 950 | mp_irqs[i].dstapic == MP_APIC_ALL) && |
950 | mp_irqs[i].mp_dstirq == pin) | 951 | mp_irqs[i].dstirq == pin) |
951 | return i; | 952 | return i; |
952 | 953 | ||
953 | return -1; | 954 | return -1; |
@@ -961,13 +962,13 @@ static int __init find_isa_irq_pin(int irq, int type) | |||
961 | int i; | 962 | int i; |
962 | 963 | ||
963 | for (i = 0; i < mp_irq_entries; i++) { | 964 | for (i = 0; i < mp_irq_entries; i++) { |
964 | int lbus = mp_irqs[i].mp_srcbus; | 965 | int lbus = mp_irqs[i].srcbus; |
965 | 966 | ||
966 | if (test_bit(lbus, mp_bus_not_pci) && | 967 | if (test_bit(lbus, mp_bus_not_pci) && |
967 | (mp_irqs[i].mp_irqtype == type) && | 968 | (mp_irqs[i].irqtype == type) && |
968 | (mp_irqs[i].mp_srcbusirq == irq)) | 969 | (mp_irqs[i].srcbusirq == irq)) |
969 | 970 | ||
970 | return mp_irqs[i].mp_dstirq; | 971 | return mp_irqs[i].dstirq; |
971 | } | 972 | } |
972 | return -1; | 973 | return -1; |
973 | } | 974 | } |
@@ -977,17 +978,17 @@ static int __init find_isa_irq_apic(int irq, int type) | |||
977 | int i; | 978 | int i; |
978 | 979 | ||
979 | for (i = 0; i < mp_irq_entries; i++) { | 980 | for (i = 0; i < mp_irq_entries; i++) { |
980 | int lbus = mp_irqs[i].mp_srcbus; | 981 | int lbus = mp_irqs[i].srcbus; |
981 | 982 | ||
982 | if (test_bit(lbus, mp_bus_not_pci) && | 983 | if (test_bit(lbus, mp_bus_not_pci) && |
983 | (mp_irqs[i].mp_irqtype == type) && | 984 | (mp_irqs[i].irqtype == type) && |
984 | (mp_irqs[i].mp_srcbusirq == irq)) | 985 | (mp_irqs[i].srcbusirq == irq)) |
985 | break; | 986 | break; |
986 | } | 987 | } |
987 | if (i < mp_irq_entries) { | 988 | if (i < mp_irq_entries) { |
988 | int apic; | 989 | int apic; |
989 | for(apic = 0; apic < nr_ioapics; apic++) { | 990 | for(apic = 0; apic < nr_ioapics; apic++) { |
990 | if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic) | 991 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic) |
991 | return apic; | 992 | return apic; |
992 | } | 993 | } |
993 | } | 994 | } |
@@ -1012,23 +1013,23 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) | |||
1012 | return -1; | 1013 | return -1; |
1013 | } | 1014 | } |
1014 | for (i = 0; i < mp_irq_entries; i++) { | 1015 | for (i = 0; i < mp_irq_entries; i++) { |
1015 | int lbus = mp_irqs[i].mp_srcbus; | 1016 | int lbus = mp_irqs[i].srcbus; |
1016 | 1017 | ||
1017 | for (apic = 0; apic < nr_ioapics; apic++) | 1018 | for (apic = 0; apic < nr_ioapics; apic++) |
1018 | if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic || | 1019 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic || |
1019 | mp_irqs[i].mp_dstapic == MP_APIC_ALL) | 1020 | mp_irqs[i].dstapic == MP_APIC_ALL) |
1020 | break; | 1021 | break; |
1021 | 1022 | ||
1022 | if (!test_bit(lbus, mp_bus_not_pci) && | 1023 | if (!test_bit(lbus, mp_bus_not_pci) && |
1023 | !mp_irqs[i].mp_irqtype && | 1024 | !mp_irqs[i].irqtype && |
1024 | (bus == lbus) && | 1025 | (bus == lbus) && |
1025 | (slot == ((mp_irqs[i].mp_srcbusirq >> 2) & 0x1f))) { | 1026 | (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) { |
1026 | int irq = pin_2_irq(i,apic,mp_irqs[i].mp_dstirq); | 1027 | int irq = pin_2_irq(i, apic, mp_irqs[i].dstirq); |
1027 | 1028 | ||
1028 | if (!(apic || IO_APIC_IRQ(irq))) | 1029 | if (!(apic || IO_APIC_IRQ(irq))) |
1029 | continue; | 1030 | continue; |
1030 | 1031 | ||
1031 | if (pin == (mp_irqs[i].mp_srcbusirq & 3)) | 1032 | if (pin == (mp_irqs[i].srcbusirq & 3)) |
1032 | return irq; | 1033 | return irq; |
1033 | /* | 1034 | /* |
1034 | * Use the first all-but-pin matching entry as a | 1035 | * Use the first all-but-pin matching entry as a |
@@ -1071,7 +1072,7 @@ static int EISA_ELCR(unsigned int irq) | |||
1071 | * EISA conforming in the MP table, that means its trigger type must | 1072 | * EISA conforming in the MP table, that means its trigger type must |
1072 | * be read in from the ELCR */ | 1073 | * be read in from the ELCR */ |
1073 | 1074 | ||
1074 | #define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].mp_srcbusirq)) | 1075 | #define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].srcbusirq)) |
1075 | #define default_EISA_polarity(idx) default_ISA_polarity(idx) | 1076 | #define default_EISA_polarity(idx) default_ISA_polarity(idx) |
1076 | 1077 | ||
1077 | /* PCI interrupts are always polarity one level triggered, | 1078 | /* PCI interrupts are always polarity one level triggered, |
@@ -1088,13 +1089,13 @@ static int EISA_ELCR(unsigned int irq) | |||
1088 | 1089 | ||
1089 | static int MPBIOS_polarity(int idx) | 1090 | static int MPBIOS_polarity(int idx) |
1090 | { | 1091 | { |
1091 | int bus = mp_irqs[idx].mp_srcbus; | 1092 | int bus = mp_irqs[idx].srcbus; |
1092 | int polarity; | 1093 | int polarity; |
1093 | 1094 | ||
1094 | /* | 1095 | /* |
1095 | * Determine IRQ line polarity (high active or low active): | 1096 | * Determine IRQ line polarity (high active or low active): |
1096 | */ | 1097 | */ |
1097 | switch (mp_irqs[idx].mp_irqflag & 3) | 1098 | switch (mp_irqs[idx].irqflag & 3) |
1098 | { | 1099 | { |
1099 | case 0: /* conforms, ie. bus-type dependent polarity */ | 1100 | case 0: /* conforms, ie. bus-type dependent polarity */ |
1100 | if (test_bit(bus, mp_bus_not_pci)) | 1101 | if (test_bit(bus, mp_bus_not_pci)) |
@@ -1130,13 +1131,13 @@ static int MPBIOS_polarity(int idx) | |||
1130 | 1131 | ||
1131 | static int MPBIOS_trigger(int idx) | 1132 | static int MPBIOS_trigger(int idx) |
1132 | { | 1133 | { |
1133 | int bus = mp_irqs[idx].mp_srcbus; | 1134 | int bus = mp_irqs[idx].srcbus; |
1134 | int trigger; | 1135 | int trigger; |
1135 | 1136 | ||
1136 | /* | 1137 | /* |
1137 | * Determine IRQ trigger mode (edge or level sensitive): | 1138 | * Determine IRQ trigger mode (edge or level sensitive): |
1138 | */ | 1139 | */ |
1139 | switch ((mp_irqs[idx].mp_irqflag>>2) & 3) | 1140 | switch ((mp_irqs[idx].irqflag>>2) & 3) |
1140 | { | 1141 | { |
1141 | case 0: /* conforms, ie. bus-type dependent */ | 1142 | case 0: /* conforms, ie. bus-type dependent */ |
1142 | if (test_bit(bus, mp_bus_not_pci)) | 1143 | if (test_bit(bus, mp_bus_not_pci)) |
@@ -1214,16 +1215,16 @@ int (*ioapic_renumber_irq)(int ioapic, int irq); | |||
1214 | static int pin_2_irq(int idx, int apic, int pin) | 1215 | static int pin_2_irq(int idx, int apic, int pin) |
1215 | { | 1216 | { |
1216 | int irq, i; | 1217 | int irq, i; |
1217 | int bus = mp_irqs[idx].mp_srcbus; | 1218 | int bus = mp_irqs[idx].srcbus; |
1218 | 1219 | ||
1219 | /* | 1220 | /* |
1220 | * Debugging check, we are in big trouble if this message pops up! | 1221 | * Debugging check, we are in big trouble if this message pops up! |
1221 | */ | 1222 | */ |
1222 | if (mp_irqs[idx].mp_dstirq != pin) | 1223 | if (mp_irqs[idx].dstirq != pin) |
1223 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); | 1224 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); |
1224 | 1225 | ||
1225 | if (test_bit(bus, mp_bus_not_pci)) { | 1226 | if (test_bit(bus, mp_bus_not_pci)) { |
1226 | irq = mp_irqs[idx].mp_srcbusirq; | 1227 | irq = mp_irqs[idx].srcbusirq; |
1227 | } else { | 1228 | } else { |
1228 | /* | 1229 | /* |
1229 | * PCI IRQs are mapped in order | 1230 | * PCI IRQs are mapped in order |
@@ -1566,14 +1567,14 @@ static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_de | |||
1566 | apic_printk(APIC_VERBOSE,KERN_DEBUG | 1567 | apic_printk(APIC_VERBOSE,KERN_DEBUG |
1567 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " | 1568 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " |
1568 | "IRQ %d Mode:%i Active:%i)\n", | 1569 | "IRQ %d Mode:%i Active:%i)\n", |
1569 | apic, mp_ioapics[apic].mp_apicid, pin, cfg->vector, | 1570 | apic, mp_ioapics[apic].apicid, pin, cfg->vector, |
1570 | irq, trigger, polarity); | 1571 | irq, trigger, polarity); |
1571 | 1572 | ||
1572 | 1573 | ||
1573 | if (setup_ioapic_entry(mp_ioapics[apic].mp_apicid, irq, &entry, | 1574 | if (setup_ioapic_entry(mp_ioapics[apic].apicid, irq, &entry, |
1574 | dest, trigger, polarity, cfg->vector)) { | 1575 | dest, trigger, polarity, cfg->vector)) { |
1575 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", | 1576 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", |
1576 | mp_ioapics[apic].mp_apicid, pin); | 1577 | mp_ioapics[apic].apicid, pin); |
1577 | __clear_irq_vector(irq, cfg); | 1578 | __clear_irq_vector(irq, cfg); |
1578 | return; | 1579 | return; |
1579 | } | 1580 | } |
@@ -1604,12 +1605,10 @@ static void __init setup_IO_APIC_irqs(void) | |||
1604 | notcon = 1; | 1605 | notcon = 1; |
1605 | apic_printk(APIC_VERBOSE, | 1606 | apic_printk(APIC_VERBOSE, |
1606 | KERN_DEBUG " %d-%d", | 1607 | KERN_DEBUG " %d-%d", |
1607 | mp_ioapics[apic].mp_apicid, | 1608 | mp_ioapics[apic].apicid, pin); |
1608 | pin); | ||
1609 | } else | 1609 | } else |
1610 | apic_printk(APIC_VERBOSE, " %d-%d", | 1610 | apic_printk(APIC_VERBOSE, " %d-%d", |
1611 | mp_ioapics[apic].mp_apicid, | 1611 | mp_ioapics[apic].apicid, pin); |
1612 | pin); | ||
1613 | continue; | 1612 | continue; |
1614 | } | 1613 | } |
1615 | if (notcon) { | 1614 | if (notcon) { |
@@ -1699,7 +1698,7 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1699 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); | 1698 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); |
1700 | for (i = 0; i < nr_ioapics; i++) | 1699 | for (i = 0; i < nr_ioapics; i++) |
1701 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", | 1700 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", |
1702 | mp_ioapics[i].mp_apicid, nr_ioapic_registers[i]); | 1701 | mp_ioapics[i].apicid, nr_ioapic_registers[i]); |
1703 | 1702 | ||
1704 | /* | 1703 | /* |
1705 | * We are a bit conservative about what we expect. We have to | 1704 | * We are a bit conservative about what we expect. We have to |
@@ -1719,7 +1718,7 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
1719 | spin_unlock_irqrestore(&ioapic_lock, flags); | 1718 | spin_unlock_irqrestore(&ioapic_lock, flags); |
1720 | 1719 | ||
1721 | printk("\n"); | 1720 | printk("\n"); |
1722 | printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mp_apicid); | 1721 | printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].apicid); |
1723 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); | 1722 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); |
1724 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); | 1723 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); |
1725 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); | 1724 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); |
@@ -2121,14 +2120,14 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2121 | reg_00.raw = io_apic_read(apic, 0); | 2120 | reg_00.raw = io_apic_read(apic, 0); |
2122 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2121 | spin_unlock_irqrestore(&ioapic_lock, flags); |
2123 | 2122 | ||
2124 | old_id = mp_ioapics[apic].mp_apicid; | 2123 | old_id = mp_ioapics[apic].apicid; |
2125 | 2124 | ||
2126 | if (mp_ioapics[apic].mp_apicid >= get_physical_broadcast()) { | 2125 | if (mp_ioapics[apic].apicid >= get_physical_broadcast()) { |
2127 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", | 2126 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", |
2128 | apic, mp_ioapics[apic].mp_apicid); | 2127 | apic, mp_ioapics[apic].apicid); |
2129 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 2128 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
2130 | reg_00.bits.ID); | 2129 | reg_00.bits.ID); |
2131 | mp_ioapics[apic].mp_apicid = reg_00.bits.ID; | 2130 | mp_ioapics[apic].apicid = reg_00.bits.ID; |
2132 | } | 2131 | } |
2133 | 2132 | ||
2134 | /* | 2133 | /* |
@@ -2137,9 +2136,9 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2137 | * 'stuck on smp_invalidate_needed IPI wait' messages. | 2136 | * 'stuck on smp_invalidate_needed IPI wait' messages. |
2138 | */ | 2137 | */ |
2139 | if (check_apicid_used(phys_id_present_map, | 2138 | if (check_apicid_used(phys_id_present_map, |
2140 | mp_ioapics[apic].mp_apicid)) { | 2139 | mp_ioapics[apic].apicid)) { |
2141 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", | 2140 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", |
2142 | apic, mp_ioapics[apic].mp_apicid); | 2141 | apic, mp_ioapics[apic].apicid); |
2143 | for (i = 0; i < get_physical_broadcast(); i++) | 2142 | for (i = 0; i < get_physical_broadcast(); i++) |
2144 | if (!physid_isset(i, phys_id_present_map)) | 2143 | if (!physid_isset(i, phys_id_present_map)) |
2145 | break; | 2144 | break; |
@@ -2148,13 +2147,13 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2148 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 2147 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
2149 | i); | 2148 | i); |
2150 | physid_set(i, phys_id_present_map); | 2149 | physid_set(i, phys_id_present_map); |
2151 | mp_ioapics[apic].mp_apicid = i; | 2150 | mp_ioapics[apic].apicid = i; |
2152 | } else { | 2151 | } else { |
2153 | physid_mask_t tmp; | 2152 | physid_mask_t tmp; |
2154 | tmp = apicid_to_cpu_present(mp_ioapics[apic].mp_apicid); | 2153 | tmp = apicid_to_cpu_present(mp_ioapics[apic].apicid); |
2155 | apic_printk(APIC_VERBOSE, "Setting %d in the " | 2154 | apic_printk(APIC_VERBOSE, "Setting %d in the " |
2156 | "phys_id_present_map\n", | 2155 | "phys_id_present_map\n", |
2157 | mp_ioapics[apic].mp_apicid); | 2156 | mp_ioapics[apic].apicid); |
2158 | physids_or(phys_id_present_map, phys_id_present_map, tmp); | 2157 | physids_or(phys_id_present_map, phys_id_present_map, tmp); |
2159 | } | 2158 | } |
2160 | 2159 | ||
@@ -2163,11 +2162,11 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2163 | * We need to adjust the IRQ routing table | 2162 | * We need to adjust the IRQ routing table |
2164 | * if the ID changed. | 2163 | * if the ID changed. |
2165 | */ | 2164 | */ |
2166 | if (old_id != mp_ioapics[apic].mp_apicid) | 2165 | if (old_id != mp_ioapics[apic].apicid) |
2167 | for (i = 0; i < mp_irq_entries; i++) | 2166 | for (i = 0; i < mp_irq_entries; i++) |
2168 | if (mp_irqs[i].mp_dstapic == old_id) | 2167 | if (mp_irqs[i].dstapic == old_id) |
2169 | mp_irqs[i].mp_dstapic | 2168 | mp_irqs[i].dstapic |
2170 | = mp_ioapics[apic].mp_apicid; | 2169 | = mp_ioapics[apic].apicid; |
2171 | 2170 | ||
2172 | /* | 2171 | /* |
2173 | * Read the right value from the MPC table and | 2172 | * Read the right value from the MPC table and |
@@ -2175,9 +2174,9 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2175 | */ | 2174 | */ |
2176 | apic_printk(APIC_VERBOSE, KERN_INFO | 2175 | apic_printk(APIC_VERBOSE, KERN_INFO |
2177 | "...changing IO-APIC physical APIC ID to %d ...", | 2176 | "...changing IO-APIC physical APIC ID to %d ...", |
2178 | mp_ioapics[apic].mp_apicid); | 2177 | mp_ioapics[apic].apicid); |
2179 | 2178 | ||
2180 | reg_00.bits.ID = mp_ioapics[apic].mp_apicid; | 2179 | reg_00.bits.ID = mp_ioapics[apic].apicid; |
2181 | spin_lock_irqsave(&ioapic_lock, flags); | 2180 | spin_lock_irqsave(&ioapic_lock, flags); |
2182 | io_apic_write(apic, 0, reg_00.raw); | 2181 | io_apic_write(apic, 0, reg_00.raw); |
2183 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2182 | spin_unlock_irqrestore(&ioapic_lock, flags); |
@@ -2188,7 +2187,7 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
2188 | spin_lock_irqsave(&ioapic_lock, flags); | 2187 | spin_lock_irqsave(&ioapic_lock, flags); |
2189 | reg_00.raw = io_apic_read(apic, 0); | 2188 | reg_00.raw = io_apic_read(apic, 0); |
2190 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2189 | spin_unlock_irqrestore(&ioapic_lock, flags); |
2191 | if (reg_00.bits.ID != mp_ioapics[apic].mp_apicid) | 2190 | if (reg_00.bits.ID != mp_ioapics[apic].apicid) |
2192 | printk("could not set ID!\n"); | 2191 | printk("could not set ID!\n"); |
2193 | else | 2192 | else |
2194 | apic_printk(APIC_VERBOSE, " ok.\n"); | 2193 | apic_printk(APIC_VERBOSE, " ok.\n"); |
@@ -2383,7 +2382,7 @@ migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
2383 | if (cfg->move_in_progress) | 2382 | if (cfg->move_in_progress) |
2384 | send_cleanup_vector(cfg); | 2383 | send_cleanup_vector(cfg); |
2385 | 2384 | ||
2386 | cpumask_copy(&desc->affinity, mask); | 2385 | cpumask_copy(desc->affinity, mask); |
2387 | } | 2386 | } |
2388 | 2387 | ||
2389 | static int migrate_irq_remapped_level_desc(struct irq_desc *desc) | 2388 | static int migrate_irq_remapped_level_desc(struct irq_desc *desc) |
@@ -2405,11 +2404,11 @@ static int migrate_irq_remapped_level_desc(struct irq_desc *desc) | |||
2405 | } | 2404 | } |
2406 | 2405 | ||
2407 | /* everthing is clear. we have right of way */ | 2406 | /* everthing is clear. we have right of way */ |
2408 | migrate_ioapic_irq_desc(desc, &desc->pending_mask); | 2407 | migrate_ioapic_irq_desc(desc, desc->pending_mask); |
2409 | 2408 | ||
2410 | ret = 0; | 2409 | ret = 0; |
2411 | desc->status &= ~IRQ_MOVE_PENDING; | 2410 | desc->status &= ~IRQ_MOVE_PENDING; |
2412 | cpumask_clear(&desc->pending_mask); | 2411 | cpumask_clear(desc->pending_mask); |
2413 | 2412 | ||
2414 | unmask: | 2413 | unmask: |
2415 | unmask_IO_APIC_irq_desc(desc); | 2414 | unmask_IO_APIC_irq_desc(desc); |
@@ -2434,7 +2433,7 @@ static void ir_irq_migration(struct work_struct *work) | |||
2434 | continue; | 2433 | continue; |
2435 | } | 2434 | } |
2436 | 2435 | ||
2437 | desc->chip->set_affinity(irq, &desc->pending_mask); | 2436 | desc->chip->set_affinity(irq, desc->pending_mask); |
2438 | spin_unlock_irqrestore(&desc->lock, flags); | 2437 | spin_unlock_irqrestore(&desc->lock, flags); |
2439 | } | 2438 | } |
2440 | } | 2439 | } |
@@ -2448,7 +2447,7 @@ static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, | |||
2448 | { | 2447 | { |
2449 | if (desc->status & IRQ_LEVEL) { | 2448 | if (desc->status & IRQ_LEVEL) { |
2450 | desc->status |= IRQ_MOVE_PENDING; | 2449 | desc->status |= IRQ_MOVE_PENDING; |
2451 | cpumask_copy(&desc->pending_mask, mask); | 2450 | cpumask_copy(desc->pending_mask, mask); |
2452 | migrate_irq_remapped_level_desc(desc); | 2451 | migrate_irq_remapped_level_desc(desc); |
2453 | return; | 2452 | return; |
2454 | } | 2453 | } |
@@ -2516,7 +2515,7 @@ static void irq_complete_move(struct irq_desc **descp) | |||
2516 | 2515 | ||
2517 | /* domain has not changed, but affinity did */ | 2516 | /* domain has not changed, but affinity did */ |
2518 | me = smp_processor_id(); | 2517 | me = smp_processor_id(); |
2519 | if (cpu_isset(me, desc->affinity)) { | 2518 | if (cpumask_test_cpu(me, desc->affinity)) { |
2520 | *descp = desc = move_irq_desc(desc, me); | 2519 | *descp = desc = move_irq_desc(desc, me); |
2521 | /* get the new one */ | 2520 | /* get the new one */ |
2522 | cfg = desc->chip_data; | 2521 | cfg = desc->chip_data; |
@@ -3117,8 +3116,8 @@ static int ioapic_resume(struct sys_device *dev) | |||
3117 | 3116 | ||
3118 | spin_lock_irqsave(&ioapic_lock, flags); | 3117 | spin_lock_irqsave(&ioapic_lock, flags); |
3119 | reg_00.raw = io_apic_read(dev->id, 0); | 3118 | reg_00.raw = io_apic_read(dev->id, 0); |
3120 | if (reg_00.bits.ID != mp_ioapics[dev->id].mp_apicid) { | 3119 | if (reg_00.bits.ID != mp_ioapics[dev->id].apicid) { |
3121 | reg_00.bits.ID = mp_ioapics[dev->id].mp_apicid; | 3120 | reg_00.bits.ID = mp_ioapics[dev->id].apicid; |
3122 | io_apic_write(dev->id, 0, reg_00.raw); | 3121 | io_apic_write(dev->id, 0, reg_00.raw); |
3123 | } | 3122 | } |
3124 | spin_unlock_irqrestore(&ioapic_lock, flags); | 3123 | spin_unlock_irqrestore(&ioapic_lock, flags); |
@@ -3183,7 +3182,7 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
3183 | 3182 | ||
3184 | irq = 0; | 3183 | irq = 0; |
3185 | spin_lock_irqsave(&vector_lock, flags); | 3184 | spin_lock_irqsave(&vector_lock, flags); |
3186 | for (new = irq_want; new < NR_IRQS; new++) { | 3185 | for (new = irq_want; new < nr_irqs; new++) { |
3187 | if (platform_legacy_irq(new)) | 3186 | if (platform_legacy_irq(new)) |
3188 | continue; | 3187 | continue; |
3189 | 3188 | ||
@@ -3258,6 +3257,9 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms | |||
3258 | int err; | 3257 | int err; |
3259 | unsigned dest; | 3258 | unsigned dest; |
3260 | 3259 | ||
3260 | if (disable_apic) | ||
3261 | return -ENXIO; | ||
3262 | |||
3261 | cfg = irq_cfg(irq); | 3263 | cfg = irq_cfg(irq); |
3262 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); | 3264 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); |
3263 | if (err) | 3265 | if (err) |
@@ -3726,6 +3728,9 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
3726 | struct irq_cfg *cfg; | 3728 | struct irq_cfg *cfg; |
3727 | int err; | 3729 | int err; |
3728 | 3730 | ||
3731 | if (disable_apic) | ||
3732 | return -ENXIO; | ||
3733 | |||
3729 | cfg = irq_cfg(irq); | 3734 | cfg = irq_cfg(irq); |
3730 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); | 3735 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); |
3731 | if (!err) { | 3736 | if (!err) { |
@@ -3850,6 +3855,22 @@ void __init probe_nr_irqs_gsi(void) | |||
3850 | nr_irqs_gsi = nr; | 3855 | nr_irqs_gsi = nr; |
3851 | } | 3856 | } |
3852 | 3857 | ||
3858 | #ifdef CONFIG_SPARSE_IRQ | ||
3859 | int __init arch_probe_nr_irqs(void) | ||
3860 | { | ||
3861 | int nr; | ||
3862 | |||
3863 | nr = ((8 * nr_cpu_ids) > (32 * nr_ioapics) ? | ||
3864 | (NR_VECTORS + (8 * nr_cpu_ids)) : | ||
3865 | (NR_VECTORS + (32 * nr_ioapics))); | ||
3866 | |||
3867 | if (nr < nr_irqs && nr > nr_irqs_gsi) | ||
3868 | nr_irqs = nr; | ||
3869 | |||
3870 | return 0; | ||
3871 | } | ||
3872 | #endif | ||
3873 | |||
3853 | /* -------------------------------------------------------------------------- | 3874 | /* -------------------------------------------------------------------------- |
3854 | ACPI-based IOAPIC Configuration | 3875 | ACPI-based IOAPIC Configuration |
3855 | -------------------------------------------------------------------------- */ | 3876 | -------------------------------------------------------------------------- */ |
@@ -3984,8 +4005,8 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | |||
3984 | return -1; | 4005 | return -1; |
3985 | 4006 | ||
3986 | for (i = 0; i < mp_irq_entries; i++) | 4007 | for (i = 0; i < mp_irq_entries; i++) |
3987 | if (mp_irqs[i].mp_irqtype == mp_INT && | 4008 | if (mp_irqs[i].irqtype == mp_INT && |
3988 | mp_irqs[i].mp_srcbusirq == bus_irq) | 4009 | mp_irqs[i].srcbusirq == bus_irq) |
3989 | break; | 4010 | break; |
3990 | if (i >= mp_irq_entries) | 4011 | if (i >= mp_irq_entries) |
3991 | return -1; | 4012 | return -1; |
@@ -4039,7 +4060,7 @@ void __init setup_ioapic_dest(void) | |||
4039 | */ | 4060 | */ |
4040 | if (desc->status & | 4061 | if (desc->status & |
4041 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) | 4062 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) |
4042 | mask = &desc->affinity; | 4063 | mask = desc->affinity; |
4043 | else | 4064 | else |
4044 | mask = TARGET_CPUS; | 4065 | mask = TARGET_CPUS; |
4045 | 4066 | ||
@@ -4100,7 +4121,7 @@ void __init ioapic_init_mappings(void) | |||
4100 | ioapic_res = ioapic_setup_resources(); | 4121 | ioapic_res = ioapic_setup_resources(); |
4101 | for (i = 0; i < nr_ioapics; i++) { | 4122 | for (i = 0; i < nr_ioapics; i++) { |
4102 | if (smp_found_config) { | 4123 | if (smp_found_config) { |
4103 | ioapic_phys = mp_ioapics[i].mp_apicaddr; | 4124 | ioapic_phys = mp_ioapics[i].apicaddr; |
4104 | #ifdef CONFIG_X86_32 | 4125 | #ifdef CONFIG_X86_32 |
4105 | if (!ioapic_phys) { | 4126 | if (!ioapic_phys) { |
4106 | printk(KERN_ERR | 4127 | printk(KERN_ERR |