diff options
Diffstat (limited to 'arch/x86/kernel/acpi/boot.c')
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 114 |
1 files changed, 19 insertions, 95 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index f95703098f8d..cd40aba6aa95 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -31,10 +31,12 @@ | |||
| 31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
| 32 | #include <linux/dmi.h> | 32 | #include <linux/dmi.h> |
| 33 | #include <linux/irq.h> | 33 | #include <linux/irq.h> |
| 34 | #include <linux/slab.h> | ||
| 34 | #include <linux/bootmem.h> | 35 | #include <linux/bootmem.h> |
| 35 | #include <linux/ioport.h> | 36 | #include <linux/ioport.h> |
| 36 | #include <linux/pci.h> | 37 | #include <linux/pci.h> |
| 37 | 38 | ||
| 39 | #include <asm/pci_x86.h> | ||
| 38 | #include <asm/pgtable.h> | 40 | #include <asm/pgtable.h> |
| 39 | #include <asm/io_apic.h> | 41 | #include <asm/io_apic.h> |
| 40 | #include <asm/apic.h> | 42 | #include <asm/apic.h> |
| @@ -447,6 +449,12 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger) | |||
| 447 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) | 449 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) |
| 448 | { | 450 | { |
| 449 | *irq = gsi; | 451 | *irq = gsi; |
| 452 | |||
| 453 | #ifdef CONFIG_X86_IO_APIC | ||
| 454 | if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) | ||
| 455 | setup_IO_APIC_irq_extra(gsi); | ||
| 456 | #endif | ||
| 457 | |||
| 450 | return 0; | 458 | return 0; |
| 451 | } | 459 | } |
| 452 | 460 | ||
| @@ -474,7 +482,8 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) | |||
| 474 | plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); | 482 | plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); |
| 475 | } | 483 | } |
| 476 | #endif | 484 | #endif |
| 477 | acpi_gsi_to_irq(plat_gsi, &irq); | 485 | irq = plat_gsi; |
| 486 | |||
| 478 | return irq; | 487 | return irq; |
| 479 | } | 488 | } |
| 480 | 489 | ||
| @@ -482,6 +491,7 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) | |||
| 482 | * ACPI based hotplug support for CPU | 491 | * ACPI based hotplug support for CPU |
| 483 | */ | 492 | */ |
| 484 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | 493 | #ifdef CONFIG_ACPI_HOTPLUG_CPU |
| 494 | #include <acpi/processor.h> | ||
| 485 | 495 | ||
| 486 | static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) | 496 | static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) |
| 487 | { | 497 | { |
| @@ -559,6 +569,8 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) | |||
| 559 | goto free_new_map; | 569 | goto free_new_map; |
| 560 | } | 570 | } |
| 561 | 571 | ||
| 572 | acpi_processor_set_pdc(handle); | ||
| 573 | |||
| 562 | cpu = cpumask_first(new_map); | 574 | cpu = cpumask_first(new_map); |
| 563 | acpi_map_cpu2node(handle, cpu, physid); | 575 | acpi_map_cpu2node(handle, cpu, physid); |
| 564 | 576 | ||
| @@ -1285,23 +1297,6 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d) | |||
| 1285 | } | 1297 | } |
| 1286 | 1298 | ||
| 1287 | /* | 1299 | /* |
| 1288 | * Limit ACPI to CPU enumeration for HT | ||
| 1289 | */ | ||
| 1290 | static int __init force_acpi_ht(const struct dmi_system_id *d) | ||
| 1291 | { | ||
| 1292 | if (!acpi_force) { | ||
| 1293 | printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", | ||
| 1294 | d->ident); | ||
| 1295 | disable_acpi(); | ||
| 1296 | acpi_ht = 1; | ||
| 1297 | } else { | ||
| 1298 | printk(KERN_NOTICE | ||
| 1299 | "Warning: acpi=force overrules DMI blacklist: acpi=ht\n"); | ||
| 1300 | } | ||
| 1301 | return 0; | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | /* | ||
| 1305 | * Force ignoring BIOS IRQ0 pin2 override | 1300 | * Force ignoring BIOS IRQ0 pin2 override |
| 1306 | */ | 1301 | */ |
| 1307 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) | 1302 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) |
| @@ -1337,82 +1332,6 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { | |||
| 1337 | }, | 1332 | }, |
| 1338 | 1333 | ||
| 1339 | /* | 1334 | /* |
| 1340 | * Boxes that need acpi=ht | ||
| 1341 | */ | ||
| 1342 | { | ||
| 1343 | .callback = force_acpi_ht, | ||
| 1344 | .ident = "FSC Primergy T850", | ||
| 1345 | .matches = { | ||
| 1346 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
| 1347 | DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"), | ||
| 1348 | }, | ||
| 1349 | }, | ||
| 1350 | { | ||
| 1351 | .callback = force_acpi_ht, | ||
| 1352 | .ident = "HP VISUALIZE NT Workstation", | ||
| 1353 | .matches = { | ||
| 1354 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 1355 | DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"), | ||
| 1356 | }, | ||
| 1357 | }, | ||
| 1358 | { | ||
| 1359 | .callback = force_acpi_ht, | ||
| 1360 | .ident = "Compaq Workstation W8000", | ||
| 1361 | .matches = { | ||
| 1362 | DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), | ||
| 1363 | DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"), | ||
| 1364 | }, | ||
| 1365 | }, | ||
| 1366 | { | ||
| 1367 | .callback = force_acpi_ht, | ||
| 1368 | .ident = "ASUS CUR-DLS", | ||
| 1369 | .matches = { | ||
| 1370 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
| 1371 | DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"), | ||
| 1372 | }, | ||
| 1373 | }, | ||
| 1374 | { | ||
| 1375 | .callback = force_acpi_ht, | ||
| 1376 | .ident = "ABIT i440BX-W83977", | ||
| 1377 | .matches = { | ||
| 1378 | DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"), | ||
| 1379 | DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), | ||
| 1380 | }, | ||
| 1381 | }, | ||
| 1382 | { | ||
| 1383 | .callback = force_acpi_ht, | ||
| 1384 | .ident = "IBM Bladecenter", | ||
| 1385 | .matches = { | ||
| 1386 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
| 1387 | DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"), | ||
| 1388 | }, | ||
| 1389 | }, | ||
| 1390 | { | ||
| 1391 | .callback = force_acpi_ht, | ||
| 1392 | .ident = "IBM eServer xSeries 360", | ||
| 1393 | .matches = { | ||
| 1394 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
| 1395 | DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"), | ||
| 1396 | }, | ||
| 1397 | }, | ||
| 1398 | { | ||
| 1399 | .callback = force_acpi_ht, | ||
| 1400 | .ident = "IBM eserver xSeries 330", | ||
| 1401 | .matches = { | ||
| 1402 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
| 1403 | DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"), | ||
| 1404 | }, | ||
| 1405 | }, | ||
| 1406 | { | ||
| 1407 | .callback = force_acpi_ht, | ||
| 1408 | .ident = "IBM eserver xSeries 440", | ||
| 1409 | .matches = { | ||
| 1410 | DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), | ||
| 1411 | DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), | ||
| 1412 | }, | ||
| 1413 | }, | ||
| 1414 | |||
| 1415 | /* | ||
| 1416 | * Boxes that need ACPI PCI IRQ routing disabled | 1335 | * Boxes that need ACPI PCI IRQ routing disabled |
| 1417 | */ | 1336 | */ |
| 1418 | { | 1337 | { |
| @@ -1617,6 +1536,9 @@ int __init acpi_boot_init(void) | |||
| 1617 | 1536 | ||
| 1618 | acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet); | 1537 | acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet); |
| 1619 | 1538 | ||
| 1539 | if (!acpi_noirq) | ||
| 1540 | x86_init.pci.init = pci_acpi_init; | ||
| 1541 | |||
| 1620 | return 0; | 1542 | return 0; |
| 1621 | } | 1543 | } |
| 1622 | 1544 | ||
| @@ -1641,8 +1563,10 @@ static int __init parse_acpi(char *arg) | |||
| 1641 | } | 1563 | } |
| 1642 | /* Limit ACPI just to boot-time to enable HT */ | 1564 | /* Limit ACPI just to boot-time to enable HT */ |
| 1643 | else if (strcmp(arg, "ht") == 0) { | 1565 | else if (strcmp(arg, "ht") == 0) { |
| 1644 | if (!acpi_force) | 1566 | if (!acpi_force) { |
| 1567 | printk(KERN_WARNING "acpi=ht will be removed in Linux-2.6.35\n"); | ||
| 1645 | disable_acpi(); | 1568 | disable_acpi(); |
| 1569 | } | ||
| 1646 | acpi_ht = 1; | 1570 | acpi_ht = 1; |
| 1647 | } | 1571 | } |
| 1648 | /* acpi=rsdt use RSDT instead of XSDT */ | 1572 | /* acpi=rsdt use RSDT instead of XSDT */ |
