diff options
Diffstat (limited to 'arch/x86/kernel/mpparse_64.c')
-rw-r--r-- | arch/x86/kernel/mpparse_64.c | 277 |
1 files changed, 141 insertions, 136 deletions
diff --git a/arch/x86/kernel/mpparse_64.c b/arch/x86/kernel/mpparse_64.c index 20a345dd425b..269fd46df42c 100644 --- a/arch/x86/kernel/mpparse_64.c +++ b/arch/x86/kernel/mpparse_64.c | |||
@@ -41,7 +41,7 @@ unsigned int __cpuinitdata maxcpus = NR_CPUS; | |||
41 | * MP-table. | 41 | * MP-table. |
42 | */ | 42 | */ |
43 | DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); | 43 | DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); |
44 | int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; | 44 | int mp_bus_id_to_pci_bus[MAX_MP_BUSSES] = {[0 ... MAX_MP_BUSSES - 1] = -1 }; |
45 | 45 | ||
46 | static int mp_current_pci_id = 0; | 46 | static int mp_current_pci_id = 0; |
47 | /* I/O APIC entries */ | 47 | /* I/O APIC entries */ |
@@ -56,8 +56,6 @@ int mp_irq_entries; | |||
56 | int nr_ioapics; | 56 | int nr_ioapics; |
57 | unsigned long mp_lapic_addr = 0; | 57 | unsigned long mp_lapic_addr = 0; |
58 | 58 | ||
59 | |||
60 | |||
61 | /* Processor that is doing the boot up */ | 59 | /* Processor that is doing the boot up */ |
62 | unsigned int boot_cpu_physical_apicid = -1U; | 60 | unsigned int boot_cpu_physical_apicid = -1U; |
63 | EXPORT_SYMBOL(boot_cpu_physical_apicid); | 61 | EXPORT_SYMBOL(boot_cpu_physical_apicid); |
@@ -71,12 +69,11 @@ unsigned disabled_cpus __cpuinitdata; | |||
71 | physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE; | 69 | physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE; |
72 | 70 | ||
73 | u16 x86_bios_cpu_apicid_init[NR_CPUS] __initdata | 71 | u16 x86_bios_cpu_apicid_init[NR_CPUS] __initdata |
74 | = { [0 ... NR_CPUS-1] = BAD_APICID }; | 72 | = {[0 ... NR_CPUS - 1] = BAD_APICID }; |
75 | void *x86_bios_cpu_apicid_early_ptr; | 73 | void *x86_bios_cpu_apicid_early_ptr; |
76 | DEFINE_PER_CPU(u16, x86_bios_cpu_apicid) = BAD_APICID; | 74 | DEFINE_PER_CPU(u16, x86_bios_cpu_apicid) = BAD_APICID; |
77 | EXPORT_PER_CPU_SYMBOL(x86_bios_cpu_apicid); | 75 | EXPORT_PER_CPU_SYMBOL(x86_bios_cpu_apicid); |
78 | 76 | ||
79 | |||
80 | /* | 77 | /* |
81 | * Intel MP BIOS table parsing routines: | 78 | * Intel MP BIOS table parsing routines: |
82 | */ | 79 | */ |
@@ -114,13 +111,13 @@ static void __cpuinit MP_processor_info(struct mpc_config_processor *m) | |||
114 | 111 | ||
115 | if (num_processors >= NR_CPUS) { | 112 | if (num_processors >= NR_CPUS) { |
116 | printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached." | 113 | printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached." |
117 | " Processor ignored.\n", NR_CPUS); | 114 | " Processor ignored.\n", NR_CPUS); |
118 | return; | 115 | return; |
119 | } | 116 | } |
120 | 117 | ||
121 | if (num_processors >= maxcpus) { | 118 | if (num_processors >= maxcpus) { |
122 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." | 119 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." |
123 | " Processor ignored.\n", maxcpus); | 120 | " Processor ignored.\n", maxcpus); |
124 | return; | 121 | return; |
125 | } | 122 | } |
126 | 123 | ||
@@ -129,14 +126,14 @@ static void __cpuinit MP_processor_info(struct mpc_config_processor *m) | |||
129 | cpu = first_cpu(tmp_map); | 126 | cpu = first_cpu(tmp_map); |
130 | 127 | ||
131 | physid_set(m->mpc_apicid, phys_cpu_present_map); | 128 | physid_set(m->mpc_apicid, phys_cpu_present_map); |
132 | if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { | 129 | if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { |
133 | /* | 130 | /* |
134 | * x86_bios_cpu_apicid is required to have processors listed | 131 | * x86_bios_cpu_apicid is required to have processors listed |
135 | * in same order as logical cpu numbers. Hence the first | 132 | * in same order as logical cpu numbers. Hence the first |
136 | * entry is BSP, and so on. | 133 | * entry is BSP, and so on. |
137 | */ | 134 | */ |
138 | cpu = 0; | 135 | cpu = 0; |
139 | } | 136 | } |
140 | /* are we being called early in kernel startup? */ | 137 | /* are we being called early in kernel startup? */ |
141 | if (x86_cpu_to_apicid_early_ptr) { | 138 | if (x86_cpu_to_apicid_early_ptr) { |
142 | u16 *cpu_to_apicid = x86_cpu_to_apicid_early_ptr; | 139 | u16 *cpu_to_apicid = x86_cpu_to_apicid_early_ptr; |
@@ -153,7 +150,7 @@ static void __cpuinit MP_processor_info(struct mpc_config_processor *m) | |||
153 | cpu_set(cpu, cpu_present_map); | 150 | cpu_set(cpu, cpu_present_map); |
154 | } | 151 | } |
155 | 152 | ||
156 | static void __init MP_bus_info (struct mpc_config_bus *m) | 153 | static void __init MP_bus_info(struct mpc_config_bus *m) |
157 | { | 154 | { |
158 | char str[7]; | 155 | char str[7]; |
159 | 156 | ||
@@ -176,24 +173,24 @@ static int bad_ioapic(unsigned long address) | |||
176 | { | 173 | { |
177 | if (nr_ioapics >= MAX_IO_APICS) { | 174 | if (nr_ioapics >= MAX_IO_APICS) { |
178 | printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded " | 175 | printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded " |
179 | "(found %d)\n", MAX_IO_APICS, nr_ioapics); | 176 | "(found %d)\n", MAX_IO_APICS, nr_ioapics); |
180 | panic("Recompile kernel with bigger MAX_IO_APICS!\n"); | 177 | panic("Recompile kernel with bigger MAX_IO_APICS!\n"); |
181 | } | 178 | } |
182 | if (!address) { | 179 | if (!address) { |
183 | printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address" | 180 | printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address" |
184 | " found in table, skipping!\n"); | 181 | " found in table, skipping!\n"); |
185 | return 1; | 182 | return 1; |
186 | } | 183 | } |
187 | return 0; | 184 | return 0; |
188 | } | 185 | } |
189 | 186 | ||
190 | static void __init MP_ioapic_info (struct mpc_config_ioapic *m) | 187 | static void __init MP_ioapic_info(struct mpc_config_ioapic *m) |
191 | { | 188 | { |
192 | if (!(m->mpc_flags & MPC_APIC_USABLE)) | 189 | if (!(m->mpc_flags & MPC_APIC_USABLE)) |
193 | return; | 190 | return; |
194 | 191 | ||
195 | printk("I/O APIC #%d at 0x%X.\n", | 192 | printk(KERN_INFO "I/O APIC #%d at 0x%X.\n", m->mpc_apicid, |
196 | m->mpc_apicid, m->mpc_apicaddr); | 193 | m->mpc_apicaddr); |
197 | 194 | ||
198 | if (bad_ioapic(m->mpc_apicaddr)) | 195 | if (bad_ioapic(m->mpc_apicaddr)) |
199 | return; | 196 | return; |
@@ -202,25 +199,25 @@ static void __init MP_ioapic_info (struct mpc_config_ioapic *m) | |||
202 | nr_ioapics++; | 199 | nr_ioapics++; |
203 | } | 200 | } |
204 | 201 | ||
205 | static void __init MP_intsrc_info (struct mpc_config_intsrc *m) | 202 | static void __init MP_intsrc_info(struct mpc_config_intsrc *m) |
206 | { | 203 | { |
207 | mp_irqs [mp_irq_entries] = *m; | 204 | mp_irqs[mp_irq_entries] = *m; |
208 | Dprintk("Int: type %d, pol %d, trig %d, bus %d," | 205 | Dprintk("Int: type %d, pol %d, trig %d, bus %d," |
209 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", | 206 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", |
210 | m->mpc_irqtype, m->mpc_irqflag & 3, | 207 | m->mpc_irqtype, m->mpc_irqflag & 3, |
211 | (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus, | 208 | (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus, |
212 | m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq); | 209 | m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq); |
213 | if (++mp_irq_entries >= MAX_IRQ_SOURCES) | 210 | if (++mp_irq_entries >= MAX_IRQ_SOURCES) |
214 | panic("Max # of irq sources exceeded!!\n"); | 211 | panic("Max # of irq sources exceeded!!\n"); |
215 | } | 212 | } |
216 | 213 | ||
217 | static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m) | 214 | static void __init MP_lintsrc_info(struct mpc_config_lintsrc *m) |
218 | { | 215 | { |
219 | Dprintk("Lint: type %d, pol %d, trig %d, bus %d," | 216 | Dprintk("Lint: type %d, pol %d, trig %d, bus %d," |
220 | " IRQ %02x, APIC ID %x, APIC LINT %02x\n", | 217 | " IRQ %02x, APIC ID %x, APIC LINT %02x\n", |
221 | m->mpc_irqtype, m->mpc_irqflag & 3, | 218 | m->mpc_irqtype, m->mpc_irqflag & 3, |
222 | (m->mpc_irqflag >> 2) &3, m->mpc_srcbusid, | 219 | (m->mpc_irqflag >> 2) & 3, m->mpc_srcbusid, |
223 | m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint); | 220 | m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint); |
224 | } | 221 | } |
225 | 222 | ||
226 | /* | 223 | /* |
@@ -229,39 +226,38 @@ static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m) | |||
229 | static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | 226 | static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) |
230 | { | 227 | { |
231 | char str[16]; | 228 | char str[16]; |
232 | int count=sizeof(*mpc); | 229 | int count = sizeof(*mpc); |
233 | unsigned char *mpt=((unsigned char *)mpc)+count; | 230 | unsigned char *mpt = ((unsigned char *)mpc) + count; |
234 | 231 | ||
235 | if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) { | 232 | if (memcmp(mpc->mpc_signature, MPC_SIGNATURE, 4)) { |
236 | printk("MPTABLE: bad signature [%c%c%c%c]!\n", | 233 | printk(KERN_ERR "MPTABLE: bad signature [%c%c%c%c]!\n", |
237 | mpc->mpc_signature[0], | 234 | mpc->mpc_signature[0], |
238 | mpc->mpc_signature[1], | 235 | mpc->mpc_signature[1], |
239 | mpc->mpc_signature[2], | 236 | mpc->mpc_signature[2], mpc->mpc_signature[3]); |
240 | mpc->mpc_signature[3]); | ||
241 | return 0; | 237 | return 0; |
242 | } | 238 | } |
243 | if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) { | 239 | if (mpf_checksum((unsigned char *)mpc, mpc->mpc_length)) { |
244 | printk("MPTABLE: checksum error!\n"); | 240 | printk(KERN_ERR "MPTABLE: checksum error!\n"); |
245 | return 0; | 241 | return 0; |
246 | } | 242 | } |
247 | if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) { | 243 | if (mpc->mpc_spec != 0x01 && mpc->mpc_spec != 0x04) { |
248 | printk(KERN_ERR "MPTABLE: bad table version (%d)!!\n", | 244 | printk(KERN_ERR "MPTABLE: bad table version (%d)!!\n", |
249 | mpc->mpc_spec); | 245 | mpc->mpc_spec); |
250 | return 0; | 246 | return 0; |
251 | } | 247 | } |
252 | if (!mpc->mpc_lapic) { | 248 | if (!mpc->mpc_lapic) { |
253 | printk(KERN_ERR "MPTABLE: null local APIC address!\n"); | 249 | printk(KERN_ERR "MPTABLE: null local APIC address!\n"); |
254 | return 0; | 250 | return 0; |
255 | } | 251 | } |
256 | memcpy(str,mpc->mpc_oem,8); | 252 | memcpy(str, mpc->mpc_oem, 8); |
257 | str[8] = 0; | 253 | str[8] = 0; |
258 | printk(KERN_INFO "MPTABLE: OEM ID: %s ",str); | 254 | printk(KERN_INFO "MPTABLE: OEM ID: %s ", str); |
259 | 255 | ||
260 | memcpy(str,mpc->mpc_productid,12); | 256 | memcpy(str, mpc->mpc_productid, 12); |
261 | str[12] = 0; | 257 | str[12] = 0; |
262 | printk("MPTABLE: Product ID: %s ",str); | 258 | printk(KERN_INFO "MPTABLE: Product ID: %s ", str); |
263 | 259 | ||
264 | printk("MPTABLE: APIC at: 0x%X\n",mpc->mpc_lapic); | 260 | printk(KERN_INFO "MPTABLE: APIC at: 0x%X\n", mpc->mpc_lapic); |
265 | 261 | ||
266 | /* save the local APIC address, it might be non-default */ | 262 | /* save the local APIC address, it might be non-default */ |
267 | if (!acpi_lapic) | 263 | if (!acpi_lapic) |
@@ -271,52 +267,52 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) | |||
271 | return 1; | 267 | return 1; |
272 | 268 | ||
273 | /* | 269 | /* |
274 | * Now process the configuration blocks. | 270 | * Now process the configuration blocks. |
275 | */ | 271 | */ |
276 | while (count < mpc->mpc_length) { | 272 | while (count < mpc->mpc_length) { |
277 | switch(*mpt) { | 273 | switch (*mpt) { |
278 | case MP_PROCESSOR: | 274 | case MP_PROCESSOR: |
279 | { | 275 | { |
280 | struct mpc_config_processor *m= | 276 | struct mpc_config_processor *m = |
281 | (struct mpc_config_processor *)mpt; | 277 | (struct mpc_config_processor *)mpt; |
282 | if (!acpi_lapic) | 278 | if (!acpi_lapic) |
283 | MP_processor_info(m); | 279 | MP_processor_info(m); |
284 | mpt += sizeof(*m); | 280 | mpt += sizeof(*m); |
285 | count += sizeof(*m); | 281 | count += sizeof(*m); |
286 | break; | 282 | break; |
287 | } | 283 | } |
288 | case MP_BUS: | 284 | case MP_BUS: |
289 | { | 285 | { |
290 | struct mpc_config_bus *m= | 286 | struct mpc_config_bus *m = |
291 | (struct mpc_config_bus *)mpt; | 287 | (struct mpc_config_bus *)mpt; |
292 | MP_bus_info(m); | 288 | MP_bus_info(m); |
293 | mpt += sizeof(*m); | 289 | mpt += sizeof(*m); |
294 | count += sizeof(*m); | 290 | count += sizeof(*m); |
295 | break; | 291 | break; |
296 | } | 292 | } |
297 | case MP_IOAPIC: | 293 | case MP_IOAPIC: |
298 | { | 294 | { |
299 | struct mpc_config_ioapic *m= | 295 | struct mpc_config_ioapic *m = |
300 | (struct mpc_config_ioapic *)mpt; | 296 | (struct mpc_config_ioapic *)mpt; |
301 | MP_ioapic_info(m); | 297 | MP_ioapic_info(m); |
302 | mpt += sizeof(*m); | 298 | mpt += sizeof(*m); |
303 | count += sizeof(*m); | 299 | count += sizeof(*m); |
304 | break; | 300 | break; |
305 | } | 301 | } |
306 | case MP_INTSRC: | 302 | case MP_INTSRC: |
307 | { | 303 | { |
308 | struct mpc_config_intsrc *m= | 304 | struct mpc_config_intsrc *m = |
309 | (struct mpc_config_intsrc *)mpt; | 305 | (struct mpc_config_intsrc *)mpt; |
310 | 306 | ||
311 | MP_intsrc_info(m); | 307 | MP_intsrc_info(m); |
312 | mpt += sizeof(*m); | 308 | mpt += sizeof(*m); |
313 | count += sizeof(*m); | 309 | count += sizeof(*m); |
314 | break; | 310 | break; |
315 | } | 311 | } |
316 | case MP_LINTSRC: | 312 | case MP_LINTSRC: |
317 | { | 313 | { |
318 | struct mpc_config_lintsrc *m= | 314 | struct mpc_config_lintsrc *m = |
319 | (struct mpc_config_lintsrc *)mpt; | 315 | (struct mpc_config_lintsrc *)mpt; |
320 | MP_lintsrc_info(m); | 316 | MP_lintsrc_info(m); |
321 | mpt += sizeof(*m); | 317 | mpt += sizeof(*m); |
322 | count += sizeof(*m); | 318 | count += sizeof(*m); |
@@ -345,7 +341,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
345 | int ELCR_fallback = 0; | 341 | int ELCR_fallback = 0; |
346 | 342 | ||
347 | intsrc.mpc_type = MP_INTSRC; | 343 | intsrc.mpc_type = MP_INTSRC; |
348 | intsrc.mpc_irqflag = 0; /* conforming */ | 344 | intsrc.mpc_irqflag = 0; /* conforming */ |
349 | intsrc.mpc_srcbus = 0; | 345 | intsrc.mpc_srcbus = 0; |
350 | intsrc.mpc_dstapic = mp_ioapics[0].mpc_apicid; | 346 | intsrc.mpc_dstapic = mp_ioapics[0].mpc_apicid; |
351 | 347 | ||
@@ -360,12 +356,16 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
360 | * If it does, we assume it's valid. | 356 | * If it does, we assume it's valid. |
361 | */ | 357 | */ |
362 | if (mpc_default_type == 5) { | 358 | if (mpc_default_type == 5) { |
363 | printk(KERN_INFO "ISA/PCI bus type with no IRQ information... falling back to ELCR\n"); | 359 | printk(KERN_INFO "ISA/PCI bus type with no IRQ information... " |
360 | "falling back to ELCR\n"); | ||
364 | 361 | ||
365 | if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) || ELCR_trigger(13)) | 362 | if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) || |
366 | printk(KERN_ERR "ELCR contains invalid data... not using ELCR\n"); | 363 | ELCR_trigger(13)) |
364 | printk(KERN_ERR "ELCR contains invalid data... " | ||
365 | "not using ELCR\n"); | ||
367 | else { | 366 | else { |
368 | printk(KERN_INFO "Using ELCR to identify PCI interrupts\n"); | 367 | printk(KERN_INFO |
368 | "Using ELCR to identify PCI interrupts\n"); | ||
369 | ELCR_fallback = 1; | 369 | ELCR_fallback = 1; |
370 | } | 370 | } |
371 | } | 371 | } |
@@ -394,13 +394,13 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
394 | } | 394 | } |
395 | 395 | ||
396 | intsrc.mpc_srcbusirq = i; | 396 | intsrc.mpc_srcbusirq = i; |
397 | intsrc.mpc_dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ | 397 | intsrc.mpc_dstirq = i ? i : 2; /* IRQ0 to INTIN2 */ |
398 | MP_intsrc_info(&intsrc); | 398 | MP_intsrc_info(&intsrc); |
399 | } | 399 | } |
400 | 400 | ||
401 | intsrc.mpc_irqtype = mp_ExtINT; | 401 | intsrc.mpc_irqtype = mp_ExtINT; |
402 | intsrc.mpc_srcbusirq = 0; | 402 | intsrc.mpc_srcbusirq = 0; |
403 | intsrc.mpc_dstirq = 0; /* 8259A to INTIN0 */ | 403 | intsrc.mpc_dstirq = 0; /* 8259A to INTIN0 */ |
404 | MP_intsrc_info(&intsrc); | 404 | MP_intsrc_info(&intsrc); |
405 | } | 405 | } |
406 | 406 | ||
@@ -436,14 +436,14 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
436 | bus.mpc_type = MP_BUS; | 436 | bus.mpc_type = MP_BUS; |
437 | bus.mpc_busid = 0; | 437 | bus.mpc_busid = 0; |
438 | switch (mpc_default_type) { | 438 | switch (mpc_default_type) { |
439 | default: | 439 | default: |
440 | printk(KERN_ERR "???\nUnknown standard configuration %d\n", | 440 | printk(KERN_ERR "???\nUnknown standard configuration %d\n", |
441 | mpc_default_type); | 441 | mpc_default_type); |
442 | /* fall through */ | 442 | /* fall through */ |
443 | case 1: | 443 | case 1: |
444 | case 5: | 444 | case 5: |
445 | memcpy(bus.mpc_bustype, "ISA ", 6); | 445 | memcpy(bus.mpc_bustype, "ISA ", 6); |
446 | break; | 446 | break; |
447 | } | 447 | } |
448 | MP_bus_info(&bus); | 448 | MP_bus_info(&bus); |
449 | if (mpc_default_type > 4) { | 449 | if (mpc_default_type > 4) { |
@@ -465,7 +465,7 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
465 | construct_default_ioirq_mptable(mpc_default_type); | 465 | construct_default_ioirq_mptable(mpc_default_type); |
466 | 466 | ||
467 | lintsrc.mpc_type = MP_LINTSRC; | 467 | lintsrc.mpc_type = MP_LINTSRC; |
468 | lintsrc.mpc_irqflag = 0; /* conforming */ | 468 | lintsrc.mpc_irqflag = 0; /* conforming */ |
469 | lintsrc.mpc_srcbusid = 0; | 469 | lintsrc.mpc_srcbusid = 0; |
470 | lintsrc.mpc_srcbusirq = 0; | 470 | lintsrc.mpc_srcbusirq = 0; |
471 | lintsrc.mpc_destapic = MP_APIC_ALL; | 471 | lintsrc.mpc_destapic = MP_APIC_ALL; |
@@ -493,14 +493,14 @@ static void __init __get_smp_config(unsigned early) | |||
493 | */ | 493 | */ |
494 | if (acpi_lapic && acpi_ioapic) { | 494 | if (acpi_lapic && acpi_ioapic) { |
495 | printk(KERN_INFO "Using ACPI (MADT) for SMP configuration " | 495 | printk(KERN_INFO "Using ACPI (MADT) for SMP configuration " |
496 | "information\n"); | 496 | "information\n"); |
497 | return; | 497 | return; |
498 | } else if (acpi_lapic) | 498 | } else if (acpi_lapic) |
499 | printk(KERN_INFO "Using ACPI for processor (LAPIC) " | 499 | printk(KERN_INFO "Using ACPI for processor (LAPIC) " |
500 | "configuration information\n"); | 500 | "configuration information\n"); |
501 | 501 | ||
502 | printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", | 502 | printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", |
503 | mpf->mpf_specification); | 503 | mpf->mpf_specification); |
504 | 504 | ||
505 | /* | 505 | /* |
506 | * Now see if we need to read further. | 506 | * Now see if we need to read further. |
@@ -514,7 +514,8 @@ static void __init __get_smp_config(unsigned early) | |||
514 | return; | 514 | return; |
515 | } | 515 | } |
516 | 516 | ||
517 | printk(KERN_INFO "Default MP configuration #%d\n", mpf->mpf_feature1); | 517 | printk(KERN_INFO "Default MP configuration #%d\n", |
518 | mpf->mpf_feature1); | ||
518 | construct_default_ISA_mptable(mpf->mpf_feature1); | 519 | construct_default_ISA_mptable(mpf->mpf_feature1); |
519 | 520 | ||
520 | } else if (mpf->mpf_physptr) { | 521 | } else if (mpf->mpf_physptr) { |
@@ -525,8 +526,10 @@ static void __init __get_smp_config(unsigned early) | |||
525 | */ | 526 | */ |
526 | if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr), early)) { | 527 | if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr), early)) { |
527 | smp_found_config = 0; | 528 | smp_found_config = 0; |
528 | printk(KERN_ERR "BIOS bug, MP table errors detected!...\n"); | 529 | printk(KERN_ERR |
529 | printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n"); | 530 | "BIOS bug, MP table errors detected!...\n"); |
531 | printk(KERN_ERR "... disabling SMP support. " | ||
532 | "(tell your hw vendor)\n"); | ||
530 | return; | 533 | return; |
531 | } | 534 | } |
532 | 535 | ||
@@ -540,7 +543,9 @@ static void __init __get_smp_config(unsigned early) | |||
540 | if (!mp_irq_entries) { | 543 | if (!mp_irq_entries) { |
541 | struct mpc_config_bus bus; | 544 | struct mpc_config_bus bus; |
542 | 545 | ||
543 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)\n"); | 546 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " |
547 | "using default mptable. " | ||
548 | "(tell your hw vendor)\n"); | ||
544 | 549 | ||
545 | bus.mpc_type = MP_BUS; | 550 | bus.mpc_type = MP_BUS; |
546 | bus.mpc_busid = 0; | 551 | bus.mpc_busid = 0; |
@@ -573,21 +578,21 @@ void __init get_smp_config(void) | |||
573 | static int __init smp_scan_config(unsigned long base, unsigned long length, | 578 | static int __init smp_scan_config(unsigned long base, unsigned long length, |
574 | unsigned reserve) | 579 | unsigned reserve) |
575 | { | 580 | { |
576 | extern void __bad_mpf_size(void); | 581 | extern void __bad_mpf_size(void); |
577 | unsigned int *bp = phys_to_virt(base); | 582 | unsigned int *bp = phys_to_virt(base); |
578 | struct intel_mp_floating *mpf; | 583 | struct intel_mp_floating *mpf; |
579 | 584 | ||
580 | Dprintk("Scan SMP from %p for %ld bytes.\n", bp,length); | 585 | Dprintk("Scan SMP from %p for %ld bytes.\n", bp, length); |
581 | if (sizeof(*mpf) != 16) | 586 | if (sizeof(*mpf) != 16) |
582 | __bad_mpf_size(); | 587 | __bad_mpf_size(); |
583 | 588 | ||
584 | while (length > 0) { | 589 | while (length > 0) { |
585 | mpf = (struct intel_mp_floating *)bp; | 590 | mpf = (struct intel_mp_floating *)bp; |
586 | if ((*bp == SMP_MAGIC_IDENT) && | 591 | if ((*bp == SMP_MAGIC_IDENT) && |
587 | (mpf->mpf_length == 1) && | 592 | (mpf->mpf_length == 1) && |
588 | !mpf_checksum((unsigned char *)bp, 16) && | 593 | !mpf_checksum((unsigned char *)bp, 16) && |
589 | ((mpf->mpf_specification == 1) | 594 | ((mpf->mpf_specification == 1) |
590 | || (mpf->mpf_specification == 4)) ) { | 595 | || (mpf->mpf_specification == 4))) { |
591 | 596 | ||
592 | smp_found_config = 1; | 597 | smp_found_config = 1; |
593 | mpf_found = mpf; | 598 | mpf_found = mpf; |
@@ -620,8 +625,8 @@ static void __init __find_smp_config(unsigned reserve) | |||
620 | * 3) Scan the 64K of bios | 625 | * 3) Scan the 64K of bios |
621 | */ | 626 | */ |
622 | if (smp_scan_config(0x0, 0x400, reserve) || | 627 | if (smp_scan_config(0x0, 0x400, reserve) || |
623 | smp_scan_config(639*0x400, 0x400, reserve) || | 628 | smp_scan_config(639 * 0x400, 0x400, reserve) || |
624 | smp_scan_config(0xF0000, 0x10000, reserve)) | 629 | smp_scan_config(0xF0000, 0x10000, reserve)) |
625 | return; | 630 | return; |
626 | /* | 631 | /* |
627 | * If it is an SMP machine we should know now. | 632 | * If it is an SMP machine we should know now. |
@@ -642,7 +647,7 @@ static void __init __find_smp_config(unsigned reserve) | |||
642 | return; | 647 | return; |
643 | 648 | ||
644 | /* If we have come this far, we did not find an MP table */ | 649 | /* If we have come this far, we did not find an MP table */ |
645 | printk(KERN_INFO "No mptable found.\n"); | 650 | printk(KERN_INFO "No mptable found.\n"); |
646 | } | 651 | } |
647 | 652 | ||
648 | void __init early_find_smp_config(void) | 653 | void __init early_find_smp_config(void) |
@@ -663,17 +668,17 @@ void __init find_smp_config(void) | |||
663 | 668 | ||
664 | void __init mp_register_lapic_address(u64 address) | 669 | void __init mp_register_lapic_address(u64 address) |
665 | { | 670 | { |
666 | mp_lapic_addr = (unsigned long) address; | 671 | mp_lapic_addr = (unsigned long)address; |
667 | set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr); | 672 | set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr); |
668 | if (boot_cpu_physical_apicid == -1U) | 673 | if (boot_cpu_physical_apicid == -1U) |
669 | boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID)); | 674 | boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID)); |
670 | } | 675 | } |
671 | 676 | ||
672 | void __cpuinit mp_register_lapic (u8 id, u8 enabled) | 677 | void __cpuinit mp_register_lapic(u8 id, u8 enabled) |
673 | { | 678 | { |
674 | struct mpc_config_processor processor; | 679 | struct mpc_config_processor processor; |
675 | int boot_cpu = 0; | 680 | int boot_cpu = 0; |
676 | 681 | ||
677 | if (id == boot_cpu_physical_apicid) | 682 | if (id == boot_cpu_physical_apicid) |
678 | boot_cpu = 1; | 683 | boot_cpu = 1; |
679 | 684 | ||
@@ -694,10 +699,10 @@ void __cpuinit mp_register_lapic (u8 id, u8 enabled) | |||
694 | #define MP_MAX_IOAPIC_PIN 127 | 699 | #define MP_MAX_IOAPIC_PIN 127 |
695 | 700 | ||
696 | static struct mp_ioapic_routing { | 701 | static struct mp_ioapic_routing { |
697 | int apic_id; | 702 | int apic_id; |
698 | int gsi_start; | 703 | int gsi_start; |
699 | int gsi_end; | 704 | int gsi_end; |
700 | u32 pin_programmed[4]; | 705 | u32 pin_programmed[4]; |
701 | } mp_ioapic_routing[MAX_IO_APICS]; | 706 | } mp_ioapic_routing[MAX_IO_APICS]; |
702 | 707 | ||
703 | static int mp_find_ioapic(int gsi) | 708 | static int mp_find_ioapic(int gsi) |
@@ -707,7 +712,7 @@ static int mp_find_ioapic(int gsi) | |||
707 | /* Find the IOAPIC that manages this GSI. */ | 712 | /* Find the IOAPIC that manages this GSI. */ |
708 | for (i = 0; i < nr_ioapics; i++) { | 713 | for (i = 0; i < nr_ioapics; i++) { |
709 | if ((gsi >= mp_ioapic_routing[i].gsi_start) | 714 | if ((gsi >= mp_ioapic_routing[i].gsi_start) |
710 | && (gsi <= mp_ioapic_routing[i].gsi_end)) | 715 | && (gsi <= mp_ioapic_routing[i].gsi_end)) |
711 | return i; | 716 | return i; |
712 | } | 717 | } |
713 | 718 | ||
@@ -745,31 +750,30 @@ void __init mp_register_ioapic(u8 id, u32 address, u32 gsi_base) | |||
745 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | 750 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); |
746 | mp_ioapics[idx].mpc_apicid = uniq_ioapic_id(id); | 751 | mp_ioapics[idx].mpc_apicid = uniq_ioapic_id(id); |
747 | mp_ioapics[idx].mpc_apicver = 0; | 752 | mp_ioapics[idx].mpc_apicver = 0; |
748 | 753 | ||
749 | /* | 754 | /* |
750 | * Build basic IRQ lookup table to facilitate gsi->io_apic lookups | 755 | * Build basic IRQ lookup table to facilitate gsi->io_apic lookups |
751 | * and to prevent reprogramming of IOAPIC pins (PCI IRQs). | 756 | * and to prevent reprogramming of IOAPIC pins (PCI IRQs). |
752 | */ | 757 | */ |
753 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid; | 758 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid; |
754 | mp_ioapic_routing[idx].gsi_start = gsi_base; | 759 | mp_ioapic_routing[idx].gsi_start = gsi_base; |
755 | mp_ioapic_routing[idx].gsi_end = gsi_base + | 760 | mp_ioapic_routing[idx].gsi_end = gsi_base + |
756 | io_apic_get_redir_entries(idx); | 761 | io_apic_get_redir_entries(idx); |
757 | 762 | ||
758 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, address 0x%x, " | 763 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, address 0x%x, " |
759 | "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, | 764 | "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, |
760 | mp_ioapics[idx].mpc_apicaddr, | 765 | mp_ioapics[idx].mpc_apicaddr, |
761 | mp_ioapic_routing[idx].gsi_start, | 766 | mp_ioapic_routing[idx].gsi_start, |
762 | mp_ioapic_routing[idx].gsi_end); | 767 | mp_ioapic_routing[idx].gsi_end); |
763 | 768 | ||
764 | nr_ioapics++; | 769 | nr_ioapics++; |
765 | } | 770 | } |
766 | 771 | ||
767 | void __init | 772 | void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) |
768 | mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | ||
769 | { | 773 | { |
770 | struct mpc_config_intsrc intsrc; | 774 | struct mpc_config_intsrc intsrc; |
771 | int ioapic = -1; | 775 | int ioapic = -1; |
772 | int pin = -1; | 776 | int pin = -1; |
773 | 777 | ||
774 | /* | 778 | /* |
775 | * Convert 'gsi' to 'ioapic.pin'. | 779 | * Convert 'gsi' to 'ioapic.pin'. |
@@ -791,13 +795,13 @@ mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
791 | intsrc.mpc_irqtype = mp_INT; | 795 | intsrc.mpc_irqtype = mp_INT; |
792 | intsrc.mpc_irqflag = (trigger << 2) | polarity; | 796 | intsrc.mpc_irqflag = (trigger << 2) | polarity; |
793 | intsrc.mpc_srcbus = MP_ISA_BUS; | 797 | intsrc.mpc_srcbus = MP_ISA_BUS; |
794 | intsrc.mpc_srcbusirq = bus_irq; /* IRQ */ | 798 | intsrc.mpc_srcbusirq = bus_irq; /* IRQ */ |
795 | intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; /* APIC ID */ | 799 | intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; /* APIC ID */ |
796 | intsrc.mpc_dstirq = pin; /* INTIN# */ | 800 | intsrc.mpc_dstirq = pin; /* INTIN# */ |
797 | 801 | ||
798 | Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, %d-%d\n", | 802 | Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, %d-%d\n", |
799 | intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, | 803 | intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, |
800 | (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, | 804 | (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, |
801 | intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq); | 805 | intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq); |
802 | 806 | ||
803 | mp_irqs[mp_irq_entries] = intsrc; | 807 | mp_irqs[mp_irq_entries] = intsrc; |
@@ -824,7 +828,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
824 | return; | 828 | return; |
825 | 829 | ||
826 | intsrc.mpc_type = MP_INTSRC; | 830 | intsrc.mpc_type = MP_INTSRC; |
827 | intsrc.mpc_irqflag = 0; /* Conforming */ | 831 | intsrc.mpc_irqflag = 0; /* Conforming */ |
828 | intsrc.mpc_srcbus = MP_ISA_BUS; | 832 | intsrc.mpc_srcbus = MP_ISA_BUS; |
829 | intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; | 833 | intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid; |
830 | 834 | ||
@@ -839,28 +843,29 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
839 | struct mpc_config_intsrc *irq = mp_irqs + idx; | 843 | struct mpc_config_intsrc *irq = mp_irqs + idx; |
840 | 844 | ||
841 | /* Do we already have a mapping for this ISA IRQ? */ | 845 | /* Do we already have a mapping for this ISA IRQ? */ |
842 | if (irq->mpc_srcbus == MP_ISA_BUS && irq->mpc_srcbusirq == i) | 846 | if (irq->mpc_srcbus == MP_ISA_BUS |
847 | && irq->mpc_srcbusirq == i) | ||
843 | break; | 848 | break; |
844 | 849 | ||
845 | /* Do we already have a mapping for this IOAPIC pin */ | 850 | /* Do we already have a mapping for this IOAPIC pin */ |
846 | if ((irq->mpc_dstapic == intsrc.mpc_dstapic) && | 851 | if ((irq->mpc_dstapic == intsrc.mpc_dstapic) && |
847 | (irq->mpc_dstirq == i)) | 852 | (irq->mpc_dstirq == i)) |
848 | break; | 853 | break; |
849 | } | 854 | } |
850 | 855 | ||
851 | if (idx != mp_irq_entries) { | 856 | if (idx != mp_irq_entries) { |
852 | printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i); | 857 | printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i); |
853 | continue; /* IRQ already used */ | 858 | continue; /* IRQ already used */ |
854 | } | 859 | } |
855 | 860 | ||
856 | intsrc.mpc_irqtype = mp_INT; | 861 | intsrc.mpc_irqtype = mp_INT; |
857 | intsrc.mpc_srcbusirq = i; /* Identity mapped */ | 862 | intsrc.mpc_srcbusirq = i; /* Identity mapped */ |
858 | intsrc.mpc_dstirq = i; | 863 | intsrc.mpc_dstirq = i; |
859 | 864 | ||
860 | Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, " | 865 | Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, " |
861 | "%d-%d\n", intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, | 866 | "%d-%d\n", intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, |
862 | (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, | 867 | (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, |
863 | intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, | 868 | intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, |
864 | intsrc.mpc_dstirq); | 869 | intsrc.mpc_dstirq); |
865 | 870 | ||
866 | mp_irqs[mp_irq_entries] = intsrc; | 871 | mp_irqs[mp_irq_entries] = intsrc; |
@@ -899,21 +904,21 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity) | |||
899 | idx = (ioapic_pin < 32) ? 0 : (ioapic_pin / 32); | 904 | idx = (ioapic_pin < 32) ? 0 : (ioapic_pin / 32); |
900 | if (idx > 3) { | 905 | if (idx > 3) { |
901 | printk(KERN_ERR "Invalid reference to IOAPIC pin " | 906 | printk(KERN_ERR "Invalid reference to IOAPIC pin " |
902 | "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, | 907 | "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, |
903 | ioapic_pin); | 908 | ioapic_pin); |
904 | return gsi; | 909 | return gsi; |
905 | } | 910 | } |
906 | if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) { | 911 | if ((1 << bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) { |
907 | Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n", | 912 | Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n", |
908 | mp_ioapic_routing[ioapic].apic_id, ioapic_pin); | 913 | mp_ioapic_routing[ioapic].apic_id, ioapic_pin); |
909 | return gsi; | 914 | return gsi; |
910 | } | 915 | } |
911 | 916 | ||
912 | mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit); | 917 | mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1 << bit); |
913 | 918 | ||
914 | io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, | 919 | io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, |
915 | triggering == ACPI_EDGE_SENSITIVE ? 0 : 1, | 920 | triggering == ACPI_EDGE_SENSITIVE ? 0 : 1, |
916 | polarity == ACPI_ACTIVE_HIGH ? 0 : 1); | 921 | polarity == ACPI_ACTIVE_HIGH ? 0 : 1); |
917 | return gsi; | 922 | return gsi; |
918 | } | 923 | } |
919 | #endif /*CONFIG_ACPI*/ | 924 | #endif /* CONFIG_ACPI */ |