aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/acpi
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/acpi')
-rw-r--r--arch/x86/kernel/acpi/boot.c148
1 files changed, 40 insertions, 108 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 036d28adf59d..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>
@@ -49,6 +51,7 @@ EXPORT_SYMBOL(acpi_disabled);
49 51
50#ifdef CONFIG_X86_64 52#ifdef CONFIG_X86_64
51# include <asm/proto.h> 53# include <asm/proto.h>
54# include <asm/numa_64.h>
52#endif /* X86 */ 55#endif /* X86 */
53 56
54#define BAD_MADT_ENTRY(entry, end) ( \ 57#define BAD_MADT_ENTRY(entry, end) ( \
@@ -446,6 +449,12 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
446int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) 449int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
447{ 450{
448 *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
449 return 0; 458 return 0;
450} 459}
451 460
@@ -473,7 +482,8 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
473 plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); 482 plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity);
474 } 483 }
475#endif 484#endif
476 acpi_gsi_to_irq(plat_gsi, &irq); 485 irq = plat_gsi;
486
477 return irq; 487 return irq;
478} 488}
479 489
@@ -481,6 +491,26 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
481 * ACPI based hotplug support for CPU 491 * ACPI based hotplug support for CPU
482 */ 492 */
483#ifdef CONFIG_ACPI_HOTPLUG_CPU 493#ifdef CONFIG_ACPI_HOTPLUG_CPU
494#include <acpi/processor.h>
495
496static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
497{
498#ifdef CONFIG_ACPI_NUMA
499 int nid;
500
501 nid = acpi_get_node(handle);
502 if (nid == -1 || !node_online(nid))
503 return;
504#ifdef CONFIG_X86_64
505 apicid_to_node[physid] = nid;
506 numa_set_node(cpu, nid);
507#else /* CONFIG_X86_32 */
508 apicid_2_node[physid] = nid;
509 cpu_to_node_map[cpu] = nid;
510#endif
511
512#endif
513}
484 514
485static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) 515static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu)
486{ 516{
@@ -539,7 +569,10 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu)
539 goto free_new_map; 569 goto free_new_map;
540 } 570 }
541 571
572 acpi_processor_set_pdc(handle);
573
542 cpu = cpumask_first(new_map); 574 cpu = cpumask_first(new_map);
575 acpi_map_cpu2node(handle, cpu, physid);
543 576
544 *pcpu = cpu; 577 *pcpu = cpu;
545 retval = 0; 578 retval = 0;
@@ -1185,9 +1218,6 @@ static void __init acpi_process_madt(void)
1185 if (!error) { 1218 if (!error) {
1186 acpi_lapic = 1; 1219 acpi_lapic = 1;
1187 1220
1188#ifdef CONFIG_X86_BIGSMP
1189 generic_bigsmp_probe();
1190#endif
1191 /* 1221 /*
1192 * Parse MADT IO-APIC entries 1222 * Parse MADT IO-APIC entries
1193 */ 1223 */
@@ -1197,8 +1227,6 @@ static void __init acpi_process_madt(void)
1197 acpi_ioapic = 1; 1227 acpi_ioapic = 1;
1198 1228
1199 smp_found_config = 1; 1229 smp_found_config = 1;
1200 if (apic->setup_apic_routing)
1201 apic->setup_apic_routing();
1202 } 1230 }
1203 } 1231 }
1204 if (error == -EINVAL) { 1232 if (error == -EINVAL) {
@@ -1269,23 +1297,6 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d)
1269} 1297}
1270 1298
1271/* 1299/*
1272 * Limit ACPI to CPU enumeration for HT
1273 */
1274static int __init force_acpi_ht(const struct dmi_system_id *d)
1275{
1276 if (!acpi_force) {
1277 printk(KERN_NOTICE "%s detected: force use of acpi=ht\n",
1278 d->ident);
1279 disable_acpi();
1280 acpi_ht = 1;
1281 } else {
1282 printk(KERN_NOTICE
1283 "Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
1284 }
1285 return 0;
1286}
1287
1288/*
1289 * Force ignoring BIOS IRQ0 pin2 override 1300 * Force ignoring BIOS IRQ0 pin2 override
1290 */ 1301 */
1291static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) 1302static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
@@ -1321,90 +1332,6 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
1321 }, 1332 },
1322 1333
1323 /* 1334 /*
1324 * Boxes that need acpi=ht
1325 */
1326 {
1327 .callback = force_acpi_ht,
1328 .ident = "FSC Primergy T850",
1329 .matches = {
1330 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
1331 DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
1332 },
1333 },
1334 {
1335 .callback = force_acpi_ht,
1336 .ident = "HP VISUALIZE NT Workstation",
1337 .matches = {
1338 DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
1339 DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
1340 },
1341 },
1342 {
1343 .callback = force_acpi_ht,
1344 .ident = "Compaq Workstation W8000",
1345 .matches = {
1346 DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
1347 DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
1348 },
1349 },
1350 {
1351 .callback = force_acpi_ht,
1352 .ident = "ASUS P2B-DS",
1353 .matches = {
1354 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1355 DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"),
1356 },
1357 },
1358 {
1359 .callback = force_acpi_ht,
1360 .ident = "ASUS CUR-DLS",
1361 .matches = {
1362 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1363 DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"),
1364 },
1365 },
1366 {
1367 .callback = force_acpi_ht,
1368 .ident = "ABIT i440BX-W83977",
1369 .matches = {
1370 DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
1371 DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
1372 },
1373 },
1374 {
1375 .callback = force_acpi_ht,
1376 .ident = "IBM Bladecenter",
1377 .matches = {
1378 DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1379 DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
1380 },
1381 },
1382 {
1383 .callback = force_acpi_ht,
1384 .ident = "IBM eServer xSeries 360",
1385 .matches = {
1386 DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1387 DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
1388 },
1389 },
1390 {
1391 .callback = force_acpi_ht,
1392 .ident = "IBM eserver xSeries 330",
1393 .matches = {
1394 DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1395 DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
1396 },
1397 },
1398 {
1399 .callback = force_acpi_ht,
1400 .ident = "IBM eserver xSeries 440",
1401 .matches = {
1402 DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
1403 DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
1404 },
1405 },
1406
1407 /*
1408 * Boxes that need ACPI PCI IRQ routing disabled 1335 * Boxes that need ACPI PCI IRQ routing disabled
1409 */ 1336 */
1410 { 1337 {
@@ -1609,6 +1536,9 @@ int __init acpi_boot_init(void)
1609 1536
1610 acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet); 1537 acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet);
1611 1538
1539 if (!acpi_noirq)
1540 x86_init.pci.init = pci_acpi_init;
1541
1612 return 0; 1542 return 0;
1613} 1543}
1614 1544
@@ -1633,8 +1563,10 @@ static int __init parse_acpi(char *arg)
1633 } 1563 }
1634 /* Limit ACPI just to boot-time to enable HT */ 1564 /* Limit ACPI just to boot-time to enable HT */
1635 else if (strcmp(arg, "ht") == 0) { 1565 else if (strcmp(arg, "ht") == 0) {
1636 if (!acpi_force) 1566 if (!acpi_force) {
1567 printk(KERN_WARNING "acpi=ht will be removed in Linux-2.6.35\n");
1637 disable_acpi(); 1568 disable_acpi();
1569 }
1638 acpi_ht = 1; 1570 acpi_ht = 1;
1639 } 1571 }
1640 /* acpi=rsdt use RSDT instead of XSDT */ 1572 /* acpi=rsdt use RSDT instead of XSDT */