diff options
| -rw-r--r-- | arch/x86/include/asm/io_apic.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 32 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 54 | ||||
| -rw-r--r-- | arch/x86/kernel/mpparse.c | 56 | ||||
| -rw-r--r-- | arch/x86/platform/mrst/mrst.c | 30 |
5 files changed, 64 insertions, 110 deletions
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 107f2d8c6570..f327d386d6cc 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
| @@ -184,6 +184,8 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi); | |||
| 184 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); | 184 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); |
| 185 | extern void __init pre_init_apic_IRQ0(void); | 185 | extern void __init pre_init_apic_IRQ0(void); |
| 186 | 186 | ||
| 187 | extern void mp_save_irq(struct mpc_intsrc *m); | ||
| 188 | |||
| 187 | #else /* !CONFIG_X86_IO_APIC */ | 189 | #else /* !CONFIG_X86_IO_APIC */ |
| 188 | 190 | ||
| 189 | #define io_apic_assign_pci_irqs 0 | 191 | #define io_apic_assign_pci_irqs 0 |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index b3cf01ab0630..1a5b9a8e6c4f 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -937,32 +937,6 @@ static int __init acpi_parse_madt_lapic_entries(void) | |||
| 937 | extern int es7000_plat; | 937 | extern int es7000_plat; |
| 938 | #endif | 938 | #endif |
| 939 | 939 | ||
| 940 | static void assign_to_mp_irq(struct mpc_intsrc *m, | ||
| 941 | struct mpc_intsrc *mp_irq) | ||
| 942 | { | ||
| 943 | memcpy(mp_irq, m, sizeof(struct mpc_intsrc)); | ||
| 944 | } | ||
| 945 | |||
| 946 | static int mp_irq_cmp(struct mpc_intsrc *mp_irq, | ||
| 947 | struct mpc_intsrc *m) | ||
| 948 | { | ||
| 949 | return memcmp(mp_irq, m, sizeof(struct mpc_intsrc)); | ||
| 950 | } | ||
| 951 | |||
| 952 | static void save_mp_irq(struct mpc_intsrc *m) | ||
| 953 | { | ||
| 954 | int i; | ||
| 955 | |||
| 956 | for (i = 0; i < mp_irq_entries; i++) { | ||
| 957 | if (!mp_irq_cmp(&mp_irqs[i], m)) | ||
| 958 | return; | ||
| 959 | } | ||
| 960 | |||
| 961 | assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); | ||
| 962 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
| 963 | panic("Max # of irq sources exceeded!!\n"); | ||
| 964 | } | ||
| 965 | |||
| 966 | void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | 940 | void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) |
| 967 | { | 941 | { |
| 968 | int ioapic; | 942 | int ioapic; |
| @@ -993,7 +967,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
| 993 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ | 967 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ |
| 994 | mp_irq.dstirq = pin; /* INTIN# */ | 968 | mp_irq.dstirq = pin; /* INTIN# */ |
| 995 | 969 | ||
| 996 | save_mp_irq(&mp_irq); | 970 | mp_save_irq(&mp_irq); |
| 997 | 971 | ||
| 998 | isa_irq_to_gsi[bus_irq] = gsi; | 972 | isa_irq_to_gsi[bus_irq] = gsi; |
| 999 | } | 973 | } |
| @@ -1068,7 +1042,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1068 | mp_irq.srcbusirq = i; /* Identity mapped */ | 1042 | mp_irq.srcbusirq = i; /* Identity mapped */ |
| 1069 | mp_irq.dstirq = pin; | 1043 | mp_irq.dstirq = pin; |
| 1070 | 1044 | ||
| 1071 | save_mp_irq(&mp_irq); | 1045 | mp_save_irq(&mp_irq); |
| 1072 | } | 1046 | } |
| 1073 | } | 1047 | } |
| 1074 | 1048 | ||
| @@ -1105,7 +1079,7 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger, | |||
| 1105 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; | 1079 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; |
| 1106 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); | 1080 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); |
| 1107 | 1081 | ||
| 1108 | save_mp_irq(&mp_irq); | 1082 | mp_save_irq(&mp_irq); |
| 1109 | #endif | 1083 | #endif |
| 1110 | return 0; | 1084 | return 0; |
| 1111 | } | 1085 | } |
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 8a0215042a5f..c6b44f78ac14 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -126,6 +126,59 @@ static int __init parse_noapic(char *str) | |||
| 126 | } | 126 | } |
| 127 | early_param("noapic", parse_noapic); | 127 | early_param("noapic", parse_noapic); |
| 128 | 128 | ||
| 129 | static void assign_to_mp_irq(struct mpc_intsrc *m, | ||
| 130 | struct mpc_intsrc *mp_irq) | ||
| 131 | { | ||
| 132 | mp_irq->dstapic = m->dstapic; | ||
| 133 | mp_irq->type = m->type; | ||
| 134 | mp_irq->irqtype = m->irqtype; | ||
| 135 | mp_irq->irqflag = m->irqflag; | ||
| 136 | mp_irq->srcbus = m->srcbus; | ||
| 137 | mp_irq->srcbusirq = m->srcbusirq; | ||
| 138 | mp_irq->dstirq = m->dstirq; | ||
| 139 | } | ||
| 140 | |||
| 141 | static int mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, | ||
| 142 | struct mpc_intsrc *m) | ||
| 143 | { | ||
| 144 | if (mp_irq->dstapic != m->dstapic) | ||
| 145 | return 1; | ||
| 146 | if (mp_irq->type != m->type) | ||
| 147 | return 2; | ||
| 148 | if (mp_irq->irqtype != m->irqtype) | ||
| 149 | return 3; | ||
| 150 | if (mp_irq->irqflag != m->irqflag) | ||
| 151 | return 4; | ||
| 152 | if (mp_irq->srcbus != m->srcbus) | ||
| 153 | return 5; | ||
| 154 | if (mp_irq->srcbusirq != m->srcbusirq) | ||
| 155 | return 6; | ||
| 156 | if (mp_irq->dstirq != m->dstirq) | ||
| 157 | return 7; | ||
| 158 | |||
| 159 | return 0; | ||
| 160 | } | ||
| 161 | |||
| 162 | /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */ | ||
| 163 | void mp_save_irq(struct mpc_intsrc *m) | ||
| 164 | { | ||
| 165 | int i; | ||
| 166 | |||
| 167 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," | ||
| 168 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", | ||
| 169 | m->irqtype, m->irqflag & 3, (m->irqflag >> 2) & 3, m->srcbus, | ||
| 170 | m->srcbusirq, m->dstapic, m->dstirq); | ||
| 171 | |||
| 172 | for (i = 0; i < mp_irq_entries; i++) { | ||
| 173 | if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m)) | ||
| 174 | return; | ||
| 175 | } | ||
| 176 | |||
| 177 | assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); | ||
| 178 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
| 179 | panic("Max # of irq sources exceeded!!\n"); | ||
| 180 | } | ||
| 181 | |||
| 129 | struct irq_pin_list { | 182 | struct irq_pin_list { |
| 130 | int apic, pin; | 183 | int apic, pin; |
| 131 | struct irq_pin_list *next; | 184 | struct irq_pin_list *next; |
| @@ -136,6 +189,7 @@ static struct irq_pin_list *alloc_irq_pin_list(int node) | |||
| 136 | return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node); | 189 | return kzalloc_node(sizeof(struct irq_pin_list), GFP_KERNEL, node); |
| 137 | } | 190 | } |
| 138 | 191 | ||
| 192 | |||
| 139 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ | 193 | /* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */ |
| 140 | #ifdef CONFIG_SPARSE_IRQ | 194 | #ifdef CONFIG_SPARSE_IRQ |
| 141 | static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; | 195 | static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY]; |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 27ccb7075342..4318687b1c35 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -144,18 +144,6 @@ static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq) | |||
| 144 | mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq); | 144 | mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq); |
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | static void __init assign_to_mp_irq(struct mpc_intsrc *m, | ||
| 148 | struct mpc_intsrc *mp_irq) | ||
| 149 | { | ||
| 150 | mp_irq->dstapic = m->dstapic; | ||
| 151 | mp_irq->type = m->type; | ||
| 152 | mp_irq->irqtype = m->irqtype; | ||
| 153 | mp_irq->irqflag = m->irqflag; | ||
| 154 | mp_irq->srcbus = m->srcbus; | ||
| 155 | mp_irq->srcbusirq = m->srcbusirq; | ||
| 156 | mp_irq->dstirq = m->dstirq; | ||
| 157 | } | ||
| 158 | |||
| 159 | static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, | 147 | static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, |
| 160 | struct mpc_intsrc *m) | 148 | struct mpc_intsrc *m) |
| 161 | { | 149 | { |
| @@ -167,47 +155,9 @@ static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, | |||
| 167 | m->srcbusirq = mp_irq->srcbusirq; | 155 | m->srcbusirq = mp_irq->srcbusirq; |
| 168 | m->dstirq = mp_irq->dstirq; | 156 | m->dstirq = mp_irq->dstirq; |
| 169 | } | 157 | } |
| 170 | |||
| 171 | static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, | ||
| 172 | struct mpc_intsrc *m) | ||
| 173 | { | ||
| 174 | if (mp_irq->dstapic != m->dstapic) | ||
| 175 | return 1; | ||
| 176 | if (mp_irq->type != m->type) | ||
| 177 | return 2; | ||
| 178 | if (mp_irq->irqtype != m->irqtype) | ||
| 179 | return 3; | ||
| 180 | if (mp_irq->irqflag != m->irqflag) | ||
| 181 | return 4; | ||
| 182 | if (mp_irq->srcbus != m->srcbus) | ||
| 183 | return 5; | ||
| 184 | if (mp_irq->srcbusirq != m->srcbusirq) | ||
| 185 | return 6; | ||
| 186 | if (mp_irq->dstirq != m->dstirq) | ||
| 187 | return 7; | ||
| 188 | |||
| 189 | return 0; | ||
| 190 | } | ||
| 191 | |||
| 192 | static void __init MP_intsrc_info(struct mpc_intsrc *m) | ||
| 193 | { | ||
| 194 | int i; | ||
| 195 | |||
| 196 | print_MP_intsrc_info(m); | ||
| 197 | |||
| 198 | for (i = 0; i < mp_irq_entries; i++) { | ||
| 199 | if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m)) | ||
| 200 | return; | ||
| 201 | } | ||
| 202 | |||
| 203 | assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); | ||
| 204 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
| 205 | panic("Max # of irq sources exceeded!!\n"); | ||
| 206 | } | ||
| 207 | #else /* CONFIG_X86_IO_APIC */ | 158 | #else /* CONFIG_X86_IO_APIC */ |
| 208 | static inline void __init MP_bus_info(struct mpc_bus *m) {} | 159 | static inline void __init MP_bus_info(struct mpc_bus *m) {} |
| 209 | static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} | 160 | static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} |
| 210 | static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {} | ||
| 211 | #endif /* CONFIG_X86_IO_APIC */ | 161 | #endif /* CONFIG_X86_IO_APIC */ |
| 212 | 162 | ||
| 213 | 163 | ||
| @@ -321,7 +271,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | |||
| 321 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); | 271 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); |
| 322 | break; | 272 | break; |
| 323 | case MP_INTSRC: | 273 | case MP_INTSRC: |
| 324 | MP_intsrc_info((struct mpc_intsrc *)mpt); | 274 | mp_save_irq((struct mpc_intsrc *)mpt); |
| 325 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); | 275 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); |
| 326 | break; | 276 | break; |
| 327 | case MP_LINTSRC: | 277 | case MP_LINTSRC: |
| @@ -413,13 +363,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
| 413 | 363 | ||
| 414 | intsrc.srcbusirq = i; | 364 | intsrc.srcbusirq = i; |
| 415 | intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ | 365 | intsrc.dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ |
| 416 | MP_intsrc_info(&intsrc); | 366 | mp_save_irq(&intsrc); |
| 417 | } | 367 | } |
| 418 | 368 | ||
| 419 | intsrc.irqtype = mp_ExtINT; | 369 | intsrc.irqtype = mp_ExtINT; |
| 420 | intsrc.srcbusirq = 0; | 370 | intsrc.srcbusirq = 0; |
| 421 | intsrc.dstirq = 0; /* 8259A to INTIN0 */ | 371 | intsrc.dstirq = 0; /* 8259A to INTIN0 */ |
| 422 | MP_intsrc_info(&intsrc); | 372 | mp_save_irq(&intsrc); |
| 423 | } | 373 | } |
| 424 | 374 | ||
| 425 | 375 | ||
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c index fee0b4914e07..ea6529e93c6f 100644 --- a/arch/x86/platform/mrst/mrst.c +++ b/arch/x86/platform/mrst/mrst.c | |||
| @@ -71,32 +71,6 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX]; | |||
| 71 | EXPORT_SYMBOL_GPL(sfi_mrtc_array); | 71 | EXPORT_SYMBOL_GPL(sfi_mrtc_array); |
| 72 | int sfi_mrtc_num; | 72 | int sfi_mrtc_num; |
| 73 | 73 | ||
| 74 | static inline void assign_to_mp_irq(struct mpc_intsrc *m, | ||
| 75 | struct mpc_intsrc *mp_irq) | ||
| 76 | { | ||
| 77 | memcpy(mp_irq, m, sizeof(struct mpc_intsrc)); | ||
| 78 | } | ||
| 79 | |||
| 80 | static inline int mp_irq_cmp(struct mpc_intsrc *mp_irq, | ||
| 81 | struct mpc_intsrc *m) | ||
| 82 | { | ||
| 83 | return memcmp(mp_irq, m, sizeof(struct mpc_intsrc)); | ||
| 84 | } | ||
| 85 | |||
| 86 | static void save_mp_irq(struct mpc_intsrc *m) | ||
| 87 | { | ||
| 88 | int i; | ||
| 89 | |||
| 90 | for (i = 0; i < mp_irq_entries; i++) { | ||
| 91 | if (!mp_irq_cmp(&mp_irqs[i], m)) | ||
| 92 | return; | ||
| 93 | } | ||
| 94 | |||
| 95 | assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]); | ||
| 96 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | ||
| 97 | panic("Max # of irq sources exceeded!!\n"); | ||
| 98 | } | ||
| 99 | |||
| 100 | /* parse all the mtimer info to a static mtimer array */ | 74 | /* parse all the mtimer info to a static mtimer array */ |
| 101 | static int __init sfi_parse_mtmr(struct sfi_table_header *table) | 75 | static int __init sfi_parse_mtmr(struct sfi_table_header *table) |
| 102 | { | 76 | { |
| @@ -130,7 +104,7 @@ static int __init sfi_parse_mtmr(struct sfi_table_header *table) | |||
| 130 | mp_irq.srcbusirq = pentry->irq; /* IRQ */ | 104 | mp_irq.srcbusirq = pentry->irq; /* IRQ */ |
| 131 | mp_irq.dstapic = MP_APIC_ALL; | 105 | mp_irq.dstapic = MP_APIC_ALL; |
| 132 | mp_irq.dstirq = pentry->irq; | 106 | mp_irq.dstirq = pentry->irq; |
| 133 | save_mp_irq(&mp_irq); | 107 | mp_save_irq(&mp_irq); |
| 134 | } | 108 | } |
| 135 | 109 | ||
| 136 | return 0; | 110 | return 0; |
| @@ -200,7 +174,7 @@ int __init sfi_parse_mrtc(struct sfi_table_header *table) | |||
| 200 | mp_irq.srcbusirq = pentry->irq; /* IRQ */ | 174 | mp_irq.srcbusirq = pentry->irq; /* IRQ */ |
| 201 | mp_irq.dstapic = MP_APIC_ALL; | 175 | mp_irq.dstapic = MP_APIC_ALL; |
| 202 | mp_irq.dstirq = pentry->irq; | 176 | mp_irq.dstirq = pentry->irq; |
| 203 | save_mp_irq(&mp_irq); | 177 | mp_save_irq(&mp_irq); |
| 204 | } | 178 | } |
| 205 | return 0; | 179 | return 0; |
| 206 | } | 180 | } |
