aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/mpparse_64.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/mpparse_64.c')
-rw-r--r--arch/x86/kernel/mpparse_64.c277
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 */
43DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); 43DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
44int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 }; 44int mp_bus_id_to_pci_bus[MAX_MP_BUSSES] = {[0 ... MAX_MP_BUSSES - 1] = -1 };
45 45
46static int mp_current_pci_id = 0; 46static int mp_current_pci_id = 0;
47/* I/O APIC entries */ 47/* I/O APIC entries */
@@ -56,8 +56,6 @@ int mp_irq_entries;
56int nr_ioapics; 56int nr_ioapics;
57unsigned long mp_lapic_addr = 0; 57unsigned 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 */
62unsigned int boot_cpu_physical_apicid = -1U; 60unsigned int boot_cpu_physical_apicid = -1U;
63EXPORT_SYMBOL(boot_cpu_physical_apicid); 61EXPORT_SYMBOL(boot_cpu_physical_apicid);
@@ -71,12 +69,11 @@ unsigned disabled_cpus __cpuinitdata;
71physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE; 69physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE;
72 70
73u16 x86_bios_cpu_apicid_init[NR_CPUS] __initdata 71u16 x86_bios_cpu_apicid_init[NR_CPUS] __initdata
74 = { [0 ... NR_CPUS-1] = BAD_APICID }; 72 = {[0 ... NR_CPUS - 1] = BAD_APICID };
75void *x86_bios_cpu_apicid_early_ptr; 73void *x86_bios_cpu_apicid_early_ptr;
76DEFINE_PER_CPU(u16, x86_bios_cpu_apicid) = BAD_APICID; 74DEFINE_PER_CPU(u16, x86_bios_cpu_apicid) = BAD_APICID;
77EXPORT_PER_CPU_SYMBOL(x86_bios_cpu_apicid); 75EXPORT_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
156static void __init MP_bus_info (struct mpc_config_bus *m) 153static 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
190static void __init MP_ioapic_info (struct mpc_config_ioapic *m) 187static 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
205static void __init MP_intsrc_info (struct mpc_config_intsrc *m) 202static 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
217static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m) 214static 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)
229static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) 226static 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)
573static int __init smp_scan_config(unsigned long base, unsigned long length, 578static 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
648void __init early_find_smp_config(void) 653void __init early_find_smp_config(void)
@@ -663,17 +668,17 @@ void __init find_smp_config(void)
663 668
664void __init mp_register_lapic_address(u64 address) 669void __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
672void __cpuinit mp_register_lapic (u8 id, u8 enabled) 677void __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
696static struct mp_ioapic_routing { 701static 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
703static int mp_find_ioapic(int gsi) 708static 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
767void __init 772void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
768mp_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 */