diff options
Diffstat (limited to 'arch/x86/kernel/acpi')
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 296 | ||||
-rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 2 |
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); | |||
60 | int acpi_noirq; /* skip ACPI IRQ initialization */ | 63 | int acpi_noirq; /* skip ACPI IRQ initialization */ |
61 | int acpi_pci_disabled; /* skip ACPI PCI scan and IRQ initialization */ | 64 | int acpi_pci_disabled; /* skip ACPI PCI scan and IRQ initialization */ |
62 | EXPORT_SYMBOL(acpi_pci_disabled); | 65 | EXPORT_SYMBOL(acpi_pci_disabled); |
63 | int acpi_ht __initdata = 1; /* enable HT */ | ||
64 | 66 | ||
65 | int acpi_lapic; | 67 | int acpi_lapic; |
66 | int acpi_ioapic; | 68 | int 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 | */ | ||
99 | static 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 | |||
103 | static 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 | |||
126 | static 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 | */ |
313 | static void __init acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger) | 362 | static 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 | ||
446 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) | 496 | int 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 | |||
508 | int 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 | |||
551 | static 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 | ||
485 | static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) | 570 | static 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) | |||
834 | extern int es7000_plat; | 922 | extern int es7000_plat; |
835 | #endif | 923 | #endif |
836 | 924 | ||
837 | int __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 | |||
860 | static void assign_to_mp_irq(struct mpc_intsrc *m, | 925 | static 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 | ||
919 | void __init mp_config_acpi_legacy_irqs(void) | 986 | void __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 | */ | ||
1274 | static 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 | */ |
1291 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) | 1338 | static 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"); |