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.c296
-rw-r--r--arch/x86/kernel/acpi/sleep.c2
2 files changed, 128 insertions, 170 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 036d28adf59d..60cc4058ed5f 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) ( \
@@ -60,7 +63,6 @@ EXPORT_SYMBOL(acpi_disabled);
60int acpi_noirq; /* skip ACPI IRQ initialization */ 63int acpi_noirq; /* skip ACPI IRQ initialization */
61int acpi_pci_disabled; /* skip ACPI PCI scan and IRQ initialization */ 64int acpi_pci_disabled; /* skip ACPI PCI scan and IRQ initialization */
62EXPORT_SYMBOL(acpi_pci_disabled); 65EXPORT_SYMBOL(acpi_pci_disabled);
63int acpi_ht __initdata = 1; /* enable HT */
64 66
65int acpi_lapic; 67int acpi_lapic;
66int acpi_ioapic; 68int acpi_ioapic;
@@ -91,6 +93,53 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC;
91 93
92 94
93/* 95/*
96 * ISA irqs by default are the first 16 gsis but can be
97 * any gsi as specified by an interrupt source override.
98 */
99static u32 isa_irq_to_gsi[NR_IRQS_LEGACY] __read_mostly = {
100 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
101};
102
103static unsigned int gsi_to_irq(unsigned int gsi)
104{
105 unsigned int irq = gsi + NR_IRQS_LEGACY;
106 unsigned int i;
107
108 for (i = 0; i < NR_IRQS_LEGACY; i++) {
109 if (isa_irq_to_gsi[i] == gsi) {
110 return i;
111 }
112 }
113
114 /* Provide an identity mapping of gsi == irq
115 * except on truly weird platforms that have
116 * non isa irqs in the first 16 gsis.
117 */
118 if (gsi >= NR_IRQS_LEGACY)
119 irq = gsi;
120 else
121 irq = gsi_end + 1 + gsi;
122
123 return irq;
124}
125
126static u32 irq_to_gsi(int irq)
127{
128 unsigned int gsi;
129
130 if (irq < NR_IRQS_LEGACY)
131 gsi = isa_irq_to_gsi[irq];
132 else if (irq <= gsi_end)
133 gsi = irq;
134 else if (irq <= (gsi_end + NR_IRQS_LEGACY))
135 gsi = irq - gsi_end;
136 else
137 gsi = 0xffffffff;
138
139 return gsi;
140}
141
142/*
94 * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END, 143 * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END,
95 * to map the target physical address. The problem is that set_fixmap() 144 * to map the target physical address. The problem is that set_fixmap()
96 * provides a single page, and it is possible that the page is not 145 * provides a single page, and it is possible that the page is not
@@ -310,7 +359,7 @@ acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
310/* 359/*
311 * Parse Interrupt Source Override for the ACPI SCI 360 * Parse Interrupt Source Override for the ACPI SCI
312 */ 361 */
313static void __init acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger) 362static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger, u32 gsi)
314{ 363{
315 if (trigger == 0) /* compatible SCI trigger is level */ 364 if (trigger == 0) /* compatible SCI trigger is level */
316 trigger = 3; 365 trigger = 3;
@@ -330,7 +379,7 @@ static void __init acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger)
330 * If GSI is < 16, this will update its flags, 379 * If GSI is < 16, this will update its flags,
331 * else it will create a new mp_irqs[] entry. 380 * else it will create a new mp_irqs[] entry.
332 */ 381 */
333 mp_override_legacy_irq(gsi, polarity, trigger, gsi); 382 mp_override_legacy_irq(bus_irq, polarity, trigger, gsi);
334 383
335 /* 384 /*
336 * stash over-ride to indicate we've been here 385 * stash over-ride to indicate we've been here
@@ -354,9 +403,10 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
354 acpi_table_print_madt_entry(header); 403 acpi_table_print_madt_entry(header);
355 404
356 if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) { 405 if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) {
357 acpi_sci_ioapic_setup(intsrc->global_irq, 406 acpi_sci_ioapic_setup(intsrc->source_irq,
358 intsrc->inti_flags & ACPI_MADT_POLARITY_MASK, 407 intsrc->inti_flags & ACPI_MADT_POLARITY_MASK,
359 (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2); 408 (intsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) >> 2,
409 intsrc->global_irq);
360 return 0; 410 return 0;
361 } 411 }
362 412
@@ -445,7 +495,21 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
445 495
446int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) 496int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
447{ 497{
448 *irq = gsi; 498 *irq = gsi_to_irq(gsi);
499
500#ifdef CONFIG_X86_IO_APIC
501 if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC)
502 setup_IO_APIC_irq_extra(gsi);
503#endif
504
505 return 0;
506}
507
508int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
509{
510 if (isa_irq >= 16)
511 return -1;
512 *gsi = irq_to_gsi(isa_irq);
449 return 0; 513 return 0;
450} 514}
451 515
@@ -473,7 +537,8 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
473 plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); 537 plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity);
474 } 538 }
475#endif 539#endif
476 acpi_gsi_to_irq(plat_gsi, &irq); 540 irq = gsi_to_irq(plat_gsi);
541
477 return irq; 542 return irq;
478} 543}
479 544
@@ -481,6 +546,26 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
481 * ACPI based hotplug support for CPU 546 * ACPI based hotplug support for CPU
482 */ 547 */
483#ifdef CONFIG_ACPI_HOTPLUG_CPU 548#ifdef CONFIG_ACPI_HOTPLUG_CPU
549#include <acpi/processor.h>
550
551static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
552{
553#ifdef CONFIG_ACPI_NUMA
554 int nid;
555
556 nid = acpi_get_node(handle);
557 if (nid == -1 || !node_online(nid))
558 return;
559#ifdef CONFIG_X86_64
560 apicid_to_node[physid] = nid;
561 numa_set_node(cpu, nid);
562#else /* CONFIG_X86_32 */
563 apicid_2_node[physid] = nid;
564 cpu_to_node_map[cpu] = nid;
565#endif
566
567#endif
568}
484 569
485static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) 570static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu)
486{ 571{
@@ -539,7 +624,10 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu)
539 goto free_new_map; 624 goto free_new_map;
540 } 625 }
541 626
627 acpi_processor_set_pdc(handle);
628
542 cpu = cpumask_first(new_map); 629 cpu = cpumask_first(new_map);
630 acpi_map_cpu2node(handle, cpu, physid);
543 631
544 *pcpu = cpu; 632 *pcpu = cpu;
545 retval = 0; 633 retval = 0;
@@ -834,29 +922,6 @@ static int __init acpi_parse_madt_lapic_entries(void)
834extern int es7000_plat; 922extern int es7000_plat;
835#endif 923#endif
836 924
837int __init acpi_probe_gsi(void)
838{
839 int idx;
840 int gsi;
841 int max_gsi = 0;
842
843 if (acpi_disabled)
844 return 0;
845
846 if (!acpi_ioapic)
847 return 0;
848
849 max_gsi = 0;
850 for (idx = 0; idx < nr_ioapics; idx++) {
851 gsi = mp_gsi_routing[idx].gsi_end;
852
853 if (gsi > max_gsi)
854 max_gsi = gsi;
855 }
856
857 return max_gsi + 1;
858}
859
860static void assign_to_mp_irq(struct mpc_intsrc *m, 925static void assign_to_mp_irq(struct mpc_intsrc *m,
861 struct mpc_intsrc *mp_irq) 926 struct mpc_intsrc *mp_irq)
862{ 927{
@@ -914,13 +979,13 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
914 mp_irq.dstirq = pin; /* INTIN# */ 979 mp_irq.dstirq = pin; /* INTIN# */
915 980
916 save_mp_irq(&mp_irq); 981 save_mp_irq(&mp_irq);
982
983 isa_irq_to_gsi[bus_irq] = gsi;
917} 984}
918 985
919void __init mp_config_acpi_legacy_irqs(void) 986void __init mp_config_acpi_legacy_irqs(void)
920{ 987{
921 int i; 988 int i;
922 int ioapic;
923 unsigned int dstapic;
924 struct mpc_intsrc mp_irq; 989 struct mpc_intsrc mp_irq;
925 990
926#if defined (CONFIG_MCA) || defined (CONFIG_EISA) 991#if defined (CONFIG_MCA) || defined (CONFIG_EISA)
@@ -941,19 +1006,27 @@ void __init mp_config_acpi_legacy_irqs(void)
941#endif 1006#endif
942 1007
943 /* 1008 /*
944 * Locate the IOAPIC that manages the ISA IRQs (0-15).
945 */
946 ioapic = mp_find_ioapic(0);
947 if (ioapic < 0)
948 return;
949 dstapic = mp_ioapics[ioapic].apicid;
950
951 /*
952 * Use the default configuration for the IRQs 0-15. Unless 1009 * Use the default configuration for the IRQs 0-15. Unless
953 * overridden by (MADT) interrupt source override entries. 1010 * overridden by (MADT) interrupt source override entries.
954 */ 1011 */
955 for (i = 0; i < 16; i++) { 1012 for (i = 0; i < 16; i++) {
1013 int ioapic, pin;
1014 unsigned int dstapic;
956 int idx; 1015 int idx;
1016 u32 gsi;
1017
1018 /* Locate the gsi that irq i maps to. */
1019 if (acpi_isa_irq_to_gsi(i, &gsi))
1020 continue;
1021
1022 /*
1023 * Locate the IOAPIC that manages the ISA IRQ.
1024 */
1025 ioapic = mp_find_ioapic(gsi);
1026 if (ioapic < 0)
1027 continue;
1028 pin = mp_find_ioapic_pin(ioapic, gsi);
1029 dstapic = mp_ioapics[ioapic].apicid;
957 1030
958 for (idx = 0; idx < mp_irq_entries; idx++) { 1031 for (idx = 0; idx < mp_irq_entries; idx++) {
959 struct mpc_intsrc *irq = mp_irqs + idx; 1032 struct mpc_intsrc *irq = mp_irqs + idx;
@@ -963,7 +1036,7 @@ void __init mp_config_acpi_legacy_irqs(void)
963 break; 1036 break;
964 1037
965 /* Do we already have a mapping for this IOAPIC pin */ 1038 /* Do we already have a mapping for this IOAPIC pin */
966 if (irq->dstapic == dstapic && irq->dstirq == i) 1039 if (irq->dstapic == dstapic && irq->dstirq == pin)
967 break; 1040 break;
968 } 1041 }
969 1042
@@ -978,7 +1051,7 @@ void __init mp_config_acpi_legacy_irqs(void)
978 mp_irq.dstapic = dstapic; 1051 mp_irq.dstapic = dstapic;
979 mp_irq.irqtype = mp_INT; 1052 mp_irq.irqtype = mp_INT;
980 mp_irq.srcbusirq = i; /* Identity mapped */ 1053 mp_irq.srcbusirq = i; /* Identity mapped */
981 mp_irq.dstirq = i; 1054 mp_irq.dstirq = pin;
982 1055
983 save_mp_irq(&mp_irq); 1056 save_mp_irq(&mp_irq);
984 } 1057 }
@@ -1043,11 +1116,6 @@ int mp_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
1043 1116
1044 ioapic_pin = mp_find_ioapic_pin(ioapic, gsi); 1117 ioapic_pin = mp_find_ioapic_pin(ioapic, gsi);
1045 1118
1046#ifdef CONFIG_X86_32
1047 if (ioapic_renumber_irq)
1048 gsi = ioapic_renumber_irq(ioapic, gsi);
1049#endif
1050
1051 if (ioapic_pin > MP_MAX_IOAPIC_PIN) { 1119 if (ioapic_pin > MP_MAX_IOAPIC_PIN) {
1052 printk(KERN_ERR "Invalid reference to IOAPIC pin " 1120 printk(KERN_ERR "Invalid reference to IOAPIC pin "
1053 "%d-%d\n", mp_ioapics[ioapic].apicid, 1121 "%d-%d\n", mp_ioapics[ioapic].apicid,
@@ -1061,7 +1129,7 @@ int mp_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
1061 set_io_apic_irq_attr(&irq_attr, ioapic, ioapic_pin, 1129 set_io_apic_irq_attr(&irq_attr, ioapic, ioapic_pin,
1062 trigger == ACPI_EDGE_SENSITIVE ? 0 : 1, 1130 trigger == ACPI_EDGE_SENSITIVE ? 0 : 1,
1063 polarity == ACPI_ACTIVE_HIGH ? 0 : 1); 1131 polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
1064 io_apic_set_pci_routing(dev, gsi, &irq_attr); 1132 io_apic_set_pci_routing(dev, gsi_to_irq(gsi), &irq_attr);
1065 1133
1066 return gsi; 1134 return gsi;
1067} 1135}
@@ -1121,7 +1189,8 @@ static int __init acpi_parse_madt_ioapic_entries(void)
1121 * pretend we got one so we can set the SCI flags. 1189 * pretend we got one so we can set the SCI flags.
1122 */ 1190 */
1123 if (!acpi_sci_override_gsi) 1191 if (!acpi_sci_override_gsi)
1124 acpi_sci_ioapic_setup(acpi_gbl_FADT.sci_interrupt, 0, 0); 1192 acpi_sci_ioapic_setup(acpi_gbl_FADT.sci_interrupt, 0, 0,
1193 acpi_gbl_FADT.sci_interrupt);
1125 1194
1126 /* Fill in identity legacy mappings where no override */ 1195 /* Fill in identity legacy mappings where no override */
1127 mp_config_acpi_legacy_irqs(); 1196 mp_config_acpi_legacy_irqs();
@@ -1185,9 +1254,6 @@ static void __init acpi_process_madt(void)
1185 if (!error) { 1254 if (!error) {
1186 acpi_lapic = 1; 1255 acpi_lapic = 1;
1187 1256
1188#ifdef CONFIG_X86_BIGSMP
1189 generic_bigsmp_probe();
1190#endif
1191 /* 1257 /*
1192 * Parse MADT IO-APIC entries 1258 * Parse MADT IO-APIC entries
1193 */ 1259 */
@@ -1197,8 +1263,6 @@ static void __init acpi_process_madt(void)
1197 acpi_ioapic = 1; 1263 acpi_ioapic = 1;
1198 1264
1199 smp_found_config = 1; 1265 smp_found_config = 1;
1200 if (apic->setup_apic_routing)
1201 apic->setup_apic_routing();
1202 } 1266 }
1203 } 1267 }
1204 if (error == -EINVAL) { 1268 if (error == -EINVAL) {
@@ -1269,23 +1333,6 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d)
1269} 1333}
1270 1334
1271/* 1335/*
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 1336 * Force ignoring BIOS IRQ0 pin2 override
1290 */ 1337 */
1291static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) 1338static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
@@ -1321,90 +1368,6 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
1321 }, 1368 },
1322 1369
1323 /* 1370 /*
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 1371 * Boxes that need ACPI PCI IRQ routing disabled
1409 */ 1372 */
1410 { 1373 {
@@ -1537,9 +1500,8 @@ void __init acpi_boot_table_init(void)
1537 1500
1538 /* 1501 /*
1539 * If acpi_disabled, bail out 1502 * If acpi_disabled, bail out
1540 * One exception: acpi=ht continues far enough to enumerate LAPICs
1541 */ 1503 */
1542 if (acpi_disabled && !acpi_ht) 1504 if (acpi_disabled)
1543 return; 1505 return;
1544 1506
1545 /* 1507 /*
@@ -1570,9 +1532,8 @@ int __init early_acpi_boot_init(void)
1570{ 1532{
1571 /* 1533 /*
1572 * If acpi_disabled, bail out 1534 * If acpi_disabled, bail out
1573 * One exception: acpi=ht continues far enough to enumerate LAPICs
1574 */ 1535 */
1575 if (acpi_disabled && !acpi_ht) 1536 if (acpi_disabled)
1576 return 1; 1537 return 1;
1577 1538
1578 /* 1539 /*
@@ -1590,9 +1551,8 @@ int __init acpi_boot_init(void)
1590 1551
1591 /* 1552 /*
1592 * If acpi_disabled, bail out 1553 * If acpi_disabled, bail out
1593 * One exception: acpi=ht continues far enough to enumerate LAPICs
1594 */ 1554 */
1595 if (acpi_disabled && !acpi_ht) 1555 if (acpi_disabled)
1596 return 1; 1556 return 1;
1597 1557
1598 acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf); 1558 acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);
@@ -1609,6 +1569,9 @@ int __init acpi_boot_init(void)
1609 1569
1610 acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet); 1570 acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet);
1611 1571
1572 if (!acpi_noirq)
1573 x86_init.pci.init = pci_acpi_init;
1574
1612 return 0; 1575 return 0;
1613} 1576}
1614 1577
@@ -1624,19 +1587,12 @@ static int __init parse_acpi(char *arg)
1624 /* acpi=force to over-ride black-list */ 1587 /* acpi=force to over-ride black-list */
1625 else if (strcmp(arg, "force") == 0) { 1588 else if (strcmp(arg, "force") == 0) {
1626 acpi_force = 1; 1589 acpi_force = 1;
1627 acpi_ht = 1;
1628 acpi_disabled = 0; 1590 acpi_disabled = 0;
1629 } 1591 }
1630 /* acpi=strict disables out-of-spec workarounds */ 1592 /* acpi=strict disables out-of-spec workarounds */
1631 else if (strcmp(arg, "strict") == 0) { 1593 else if (strcmp(arg, "strict") == 0) {
1632 acpi_strict = 1; 1594 acpi_strict = 1;
1633 } 1595 }
1634 /* Limit ACPI just to boot-time to enable HT */
1635 else if (strcmp(arg, "ht") == 0) {
1636 if (!acpi_force)
1637 disable_acpi();
1638 acpi_ht = 1;
1639 }
1640 /* acpi=rsdt use RSDT instead of XSDT */ 1596 /* acpi=rsdt use RSDT instead of XSDT */
1641 else if (strcmp(arg, "rsdt") == 0) { 1597 else if (strcmp(arg, "rsdt") == 0) {
1642 acpi_rsdt_forced = 1; 1598 acpi_rsdt_forced = 1;
@@ -1644,6 +1600,10 @@ static int __init parse_acpi(char *arg)
1644 /* "acpi=noirq" disables ACPI interrupt routing */ 1600 /* "acpi=noirq" disables ACPI interrupt routing */
1645 else if (strcmp(arg, "noirq") == 0) { 1601 else if (strcmp(arg, "noirq") == 0) {
1646 acpi_noirq_set(); 1602 acpi_noirq_set();
1603 }
1604 /* "acpi=copy_dsdt" copys DSDT */
1605 else if (strcmp(arg, "copy_dsdt") == 0) {
1606 acpi_gbl_copy_dsdt_locally = 1;
1647 } else { 1607 } else {
1648 /* Core will printk when we return error. */ 1608 /* Core will printk when we return error. */
1649 return -EINVAL; 1609 return -EINVAL;
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index f9961034e557..82e508677b91 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -162,8 +162,6 @@ static int __init acpi_sleep_setup(char *str)
162#endif 162#endif
163 if (strncmp(str, "old_ordering", 12) == 0) 163 if (strncmp(str, "old_ordering", 12) == 0)
164 acpi_old_suspend_ordering(); 164 acpi_old_suspend_ordering();
165 if (strncmp(str, "sci_force_enable", 16) == 0)
166 acpi_set_sci_en_on_resume();
167 str = strchr(str, ','); 165 str = strchr(str, ',');
168 if (str != NULL) 166 if (str != NULL)
169 str += strspn(str, ", \t"); 167 str += strspn(str, ", \t");