diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
| commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
| tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /arch/x86/kernel/acpi | |
| parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) | |
Patched in Tegra support.
Diffstat (limited to 'arch/x86/kernel/acpi')
| -rw-r--r-- | arch/x86/kernel/acpi/Makefile | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 58 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/cstate.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 48 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/sleep.h | 4 |
5 files changed, 59 insertions, 61 deletions
diff --git a/arch/x86/kernel/acpi/Makefile b/arch/x86/kernel/acpi/Makefile index 163b2258147..6f35260bb3e 100644 --- a/arch/x86/kernel/acpi/Makefile +++ b/arch/x86/kernel/acpi/Makefile | |||
| @@ -1,7 +1,14 @@ | |||
| 1 | subdir- := realmode | ||
| 2 | |||
| 1 | obj-$(CONFIG_ACPI) += boot.o | 3 | obj-$(CONFIG_ACPI) += boot.o |
| 2 | obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup_$(BITS).o | 4 | obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup_rm.o wakeup_$(BITS).o |
| 3 | 5 | ||
| 4 | ifneq ($(CONFIG_ACPI_PROCESSOR),) | 6 | ifneq ($(CONFIG_ACPI_PROCESSOR),) |
| 5 | obj-y += cstate.o | 7 | obj-y += cstate.o |
| 6 | endif | 8 | endif |
| 7 | 9 | ||
| 10 | $(obj)/wakeup_rm.o: $(obj)/realmode/wakeup.bin | ||
| 11 | |||
| 12 | $(obj)/realmode/wakeup.bin: FORCE | ||
| 13 | $(Q)$(MAKE) $(build)=$(obj)/realmode | ||
| 14 | |||
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index bacf4b0d91f..4558f0d0822 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -219,8 +219,6 @@ static int __init | |||
| 219 | acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) | 219 | acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) |
| 220 | { | 220 | { |
| 221 | struct acpi_madt_local_x2apic *processor = NULL; | 221 | struct acpi_madt_local_x2apic *processor = NULL; |
| 222 | int apic_id; | ||
| 223 | u8 enabled; | ||
| 224 | 222 | ||
| 225 | processor = (struct acpi_madt_local_x2apic *)header; | 223 | processor = (struct acpi_madt_local_x2apic *)header; |
| 226 | 224 | ||
| @@ -229,8 +227,6 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) | |||
| 229 | 227 | ||
| 230 | acpi_table_print_madt_entry(header); | 228 | acpi_table_print_madt_entry(header); |
| 231 | 229 | ||
| 232 | apic_id = processor->local_apic_id; | ||
| 233 | enabled = processor->lapic_flags & ACPI_MADT_ENABLED; | ||
| 234 | #ifdef CONFIG_X86_X2APIC | 230 | #ifdef CONFIG_X86_X2APIC |
| 235 | /* | 231 | /* |
| 236 | * We need to register disabled CPU as well to permit | 232 | * We need to register disabled CPU as well to permit |
| @@ -239,10 +235,8 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) | |||
| 239 | * to not preallocating memory for all NR_CPUS | 235 | * to not preallocating memory for all NR_CPUS |
| 240 | * when we use CPU hotplug. | 236 | * when we use CPU hotplug. |
| 241 | */ | 237 | */ |
| 242 | if (!apic->apic_id_valid(apic_id) && enabled) | 238 | acpi_register_lapic(processor->local_apic_id, /* APIC ID */ |
| 243 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); | 239 | processor->lapic_flags & ACPI_MADT_ENABLED); |
| 244 | else | ||
| 245 | acpi_register_lapic(apic_id, enabled); | ||
| 246 | #else | 240 | #else |
| 247 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); | 241 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); |
| 248 | #endif | 242 | #endif |
| @@ -422,14 +416,12 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header, | |||
| 422 | return 0; | 416 | return 0; |
| 423 | } | 417 | } |
| 424 | 418 | ||
| 425 | if (intsrc->source_irq == 0) { | 419 | if (intsrc->source_irq == 0 && intsrc->global_irq == 2) { |
| 426 | if (acpi_skip_timer_override) { | 420 | if (acpi_skip_timer_override) { |
| 427 | printk(PREFIX "BIOS IRQ0 override ignored.\n"); | 421 | printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n"); |
| 428 | return 0; | 422 | return 0; |
| 429 | } | 423 | } |
| 430 | 424 | if (acpi_fix_pin2_polarity && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) { | |
| 431 | if ((intsrc->global_irq == 2) && acpi_fix_pin2_polarity | ||
| 432 | && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) { | ||
| 433 | intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK; | 425 | intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK; |
| 434 | printk(PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n"); | 426 | printk(PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n"); |
| 435 | } | 427 | } |
| @@ -574,12 +566,6 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) | |||
| 574 | 566 | ||
| 575 | return irq; | 567 | return irq; |
| 576 | } | 568 | } |
| 577 | EXPORT_SYMBOL_GPL(acpi_register_gsi); | ||
| 578 | |||
| 579 | void acpi_unregister_gsi(u32 gsi) | ||
| 580 | { | ||
| 581 | } | ||
| 582 | EXPORT_SYMBOL_GPL(acpi_unregister_gsi); | ||
| 583 | 569 | ||
| 584 | void __init acpi_set_irq_model_pic(void) | 570 | void __init acpi_set_irq_model_pic(void) |
| 585 | { | 571 | { |
| @@ -601,7 +587,7 @@ void __init acpi_set_irq_model_ioapic(void) | |||
| 601 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | 587 | #ifdef CONFIG_ACPI_HOTPLUG_CPU |
| 602 | #include <acpi/processor.h> | 588 | #include <acpi/processor.h> |
| 603 | 589 | ||
| 604 | static void __cpuinit acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) | 590 | static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) |
| 605 | { | 591 | { |
| 606 | #ifdef CONFIG_ACPI_NUMA | 592 | #ifdef CONFIG_ACPI_NUMA |
| 607 | int nid; | 593 | int nid; |
| @@ -650,7 +636,6 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) | |||
| 650 | kfree(buffer.pointer); | 636 | kfree(buffer.pointer); |
| 651 | buffer.length = ACPI_ALLOCATE_BUFFER; | 637 | buffer.length = ACPI_ALLOCATE_BUFFER; |
| 652 | buffer.pointer = NULL; | 638 | buffer.pointer = NULL; |
| 653 | lapic = NULL; | ||
| 654 | 639 | ||
| 655 | if (!alloc_cpumask_var(&tmp_map, GFP_KERNEL)) | 640 | if (!alloc_cpumask_var(&tmp_map, GFP_KERNEL)) |
| 656 | goto out; | 641 | goto out; |
| @@ -659,10 +644,10 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) | |||
| 659 | goto free_tmp_map; | 644 | goto free_tmp_map; |
| 660 | 645 | ||
| 661 | cpumask_copy(tmp_map, cpu_present_mask); | 646 | cpumask_copy(tmp_map, cpu_present_mask); |
| 662 | acpi_register_lapic(physid, ACPI_MADT_ENABLED); | 647 | acpi_register_lapic(physid, lapic->lapic_flags & ACPI_MADT_ENABLED); |
| 663 | 648 | ||
| 664 | /* | 649 | /* |
| 665 | * If acpi_register_lapic successfully generates a new logical cpu | 650 | * If mp_register_lapic successfully generates a new logical cpu |
| 666 | * number, then the following will get us exactly what was mapped | 651 | * number, then the following will get us exactly what was mapped |
| 667 | */ | 652 | */ |
| 668 | cpumask_andnot(new_map, cpu_present_mask, tmp_map); | 653 | cpumask_andnot(new_map, cpu_present_mask, tmp_map); |
| @@ -998,7 +983,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 998 | int i; | 983 | int i; |
| 999 | struct mpc_intsrc mp_irq; | 984 | struct mpc_intsrc mp_irq; |
| 1000 | 985 | ||
| 1001 | #ifdef CONFIG_EISA | 986 | #if defined (CONFIG_MCA) || defined (CONFIG_EISA) |
| 1002 | /* | 987 | /* |
| 1003 | * Fabricate the legacy ISA bus (bus #31). | 988 | * Fabricate the legacy ISA bus (bus #31). |
| 1004 | */ | 989 | */ |
| @@ -1342,12 +1327,17 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d) | |||
| 1342 | } | 1327 | } |
| 1343 | 1328 | ||
| 1344 | /* | 1329 | /* |
| 1345 | * Force ignoring BIOS IRQ0 override | 1330 | * Force ignoring BIOS IRQ0 pin2 override |
| 1346 | */ | 1331 | */ |
| 1347 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) | 1332 | static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) |
| 1348 | { | 1333 | { |
| 1334 | /* | ||
| 1335 | * The ati_ixp4x0_rev() early PCI quirk should have set | ||
| 1336 | * the acpi_skip_timer_override flag already: | ||
| 1337 | */ | ||
| 1349 | if (!acpi_skip_timer_override) { | 1338 | if (!acpi_skip_timer_override) { |
| 1350 | pr_notice("%s detected: Ignoring BIOS IRQ0 override\n", | 1339 | WARN(1, KERN_ERR "ati_ixp4x0 quirk not complete.\n"); |
| 1340 | pr_notice("%s detected: Ignoring BIOS IRQ0 pin2 override\n", | ||
| 1351 | d->ident); | 1341 | d->ident); |
| 1352 | acpi_skip_timer_override = 1; | 1342 | acpi_skip_timer_override = 1; |
| 1353 | } | 1343 | } |
| @@ -1441,7 +1431,7 @@ static struct dmi_system_id __initdata acpi_dmi_table_late[] = { | |||
| 1441 | * is enabled. This input is incorrectly designated the | 1431 | * is enabled. This input is incorrectly designated the |
| 1442 | * ISA IRQ 0 via an interrupt source override even though | 1432 | * ISA IRQ 0 via an interrupt source override even though |
| 1443 | * it is wired to the output of the master 8259A and INTIN0 | 1433 | * it is wired to the output of the master 8259A and INTIN0 |
| 1444 | * is not connected at all. Force ignoring BIOS IRQ0 | 1434 | * is not connected at all. Force ignoring BIOS IRQ0 pin2 |
| 1445 | * override in that cases. | 1435 | * override in that cases. |
| 1446 | */ | 1436 | */ |
| 1447 | { | 1437 | { |
| @@ -1476,14 +1466,6 @@ static struct dmi_system_id __initdata acpi_dmi_table_late[] = { | |||
| 1476 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"), | 1466 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"), |
| 1477 | }, | 1467 | }, |
| 1478 | }, | 1468 | }, |
| 1479 | { | ||
| 1480 | .callback = dmi_ignore_irq0_timer_override, | ||
| 1481 | .ident = "FUJITSU SIEMENS", | ||
| 1482 | .matches = { | ||
| 1483 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
| 1484 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), | ||
| 1485 | }, | ||
| 1486 | }, | ||
| 1487 | {} | 1469 | {} |
| 1488 | }; | 1470 | }; |
| 1489 | 1471 | ||
| @@ -1706,9 +1688,3 @@ int __acpi_release_global_lock(unsigned int *lock) | |||
| 1706 | } while (unlikely (val != old)); | 1688 | } while (unlikely (val != old)); |
| 1707 | return old & 0x1; | 1689 | return old & 0x1; |
| 1708 | } | 1690 | } |
| 1709 | |||
| 1710 | void __init arch_reserve_mem_area(acpi_physical_address addr, size_t size) | ||
| 1711 | { | ||
| 1712 | e820_add_region(addr, size, E820_ACPI); | ||
| 1713 | update_e820(); | ||
| 1714 | } | ||
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c index d2b7f27781b..f50e7fb2a20 100644 --- a/arch/x86/kernel/acpi/cstate.c +++ b/arch/x86/kernel/acpi/cstate.c | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | #include <acpi/processor.h> | 14 | #include <acpi/processor.h> |
| 15 | #include <asm/acpi.h> | 15 | #include <asm/acpi.h> |
| 16 | #include <asm/mwait.h> | 16 | #include <asm/mwait.h> |
| 17 | #include <asm/special_insns.h> | ||
| 18 | 17 | ||
| 19 | /* | 18 | /* |
| 20 | * Initialize bm_flags based on the CPU cache properties | 19 | * Initialize bm_flags based on the CPU cache properties |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index d5e0d717005..103b6ab368d 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -14,9 +14,8 @@ | |||
| 14 | #include <asm/desc.h> | 14 | #include <asm/desc.h> |
| 15 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable.h> |
| 16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
| 17 | #include <asm/realmode.h> | ||
| 18 | 17 | ||
| 19 | #include "../../realmode/rm/wakeup.h" | 18 | #include "realmode/wakeup.h" |
| 20 | #include "sleep.h" | 19 | #include "sleep.h" |
| 21 | 20 | ||
| 22 | unsigned long acpi_realmode_flags; | 21 | unsigned long acpi_realmode_flags; |
| @@ -33,9 +32,13 @@ static char temp_stack[4096]; | |||
| 33 | */ | 32 | */ |
| 34 | int acpi_suspend_lowlevel(void) | 33 | int acpi_suspend_lowlevel(void) |
| 35 | { | 34 | { |
| 36 | struct wakeup_header *header = | 35 | struct wakeup_header *header; |
| 37 | (struct wakeup_header *) __va(real_mode_header->wakeup_header); | 36 | /* address in low memory of the wakeup routine. */ |
| 37 | char *acpi_realmode; | ||
| 38 | 38 | ||
| 39 | acpi_realmode = TRAMPOLINE_SYM(acpi_wakeup_code); | ||
| 40 | |||
| 41 | header = (struct wakeup_header *)(acpi_realmode + WAKEUP_HEADER_OFFSET); | ||
| 39 | if (header->signature != WAKEUP_HEADER_SIGNATURE) { | 42 | if (header->signature != WAKEUP_HEADER_SIGNATURE) { |
| 40 | printk(KERN_ERR "wakeup header does not match\n"); | 43 | printk(KERN_ERR "wakeup header does not match\n"); |
| 41 | return -EINVAL; | 44 | return -EINVAL; |
| @@ -43,22 +46,38 @@ int acpi_suspend_lowlevel(void) | |||
| 43 | 46 | ||
| 44 | header->video_mode = saved_video_mode; | 47 | header->video_mode = saved_video_mode; |
| 45 | 48 | ||
| 46 | header->pmode_behavior = 0; | 49 | header->wakeup_jmp_seg = acpi_wakeup_address >> 4; |
| 50 | |||
| 51 | /* | ||
| 52 | * Set up the wakeup GDT. We set these up as Big Real Mode, | ||
| 53 | * that is, with limits set to 4 GB. At least the Lenovo | ||
| 54 | * Thinkpad X61 is known to need this for the video BIOS | ||
| 55 | * initialization quirk to work; this is likely to also | ||
| 56 | * be the case for other laptops or integrated video devices. | ||
| 57 | */ | ||
| 58 | |||
| 59 | /* GDT[0]: GDT self-pointer */ | ||
| 60 | header->wakeup_gdt[0] = | ||
| 61 | (u64)(sizeof(header->wakeup_gdt) - 1) + | ||
| 62 | ((u64)__pa(&header->wakeup_gdt) << 16); | ||
| 63 | /* GDT[1]: big real mode-like code segment */ | ||
| 64 | header->wakeup_gdt[1] = | ||
| 65 | GDT_ENTRY(0x809b, acpi_wakeup_address, 0xfffff); | ||
| 66 | /* GDT[2]: big real mode-like data segment */ | ||
| 67 | header->wakeup_gdt[2] = | ||
| 68 | GDT_ENTRY(0x8093, acpi_wakeup_address, 0xfffff); | ||
| 47 | 69 | ||
| 48 | #ifndef CONFIG_64BIT | 70 | #ifndef CONFIG_64BIT |
| 49 | store_gdt((struct desc_ptr *)&header->pmode_gdt); | 71 | store_gdt((struct desc_ptr *)&header->pmode_gdt); |
| 50 | 72 | ||
| 51 | if (!rdmsr_safe(MSR_EFER, | 73 | if (rdmsr_safe(MSR_EFER, &header->pmode_efer_low, |
| 52 | &header->pmode_efer_low, | 74 | &header->pmode_efer_high)) |
| 53 | &header->pmode_efer_high)) | 75 | header->pmode_efer_low = header->pmode_efer_high = 0; |
| 54 | header->pmode_behavior |= (1 << WAKEUP_BEHAVIOR_RESTORE_EFER); | ||
| 55 | #endif /* !CONFIG_64BIT */ | 76 | #endif /* !CONFIG_64BIT */ |
| 56 | 77 | ||
| 57 | header->pmode_cr0 = read_cr0(); | 78 | header->pmode_cr0 = read_cr0(); |
| 58 | if (__this_cpu_read(cpu_info.cpuid_level) >= 0) { | 79 | header->pmode_cr4 = read_cr4_safe(); |
| 59 | header->pmode_cr4 = read_cr4(); | 80 | header->pmode_behavior = 0; |
| 60 | header->pmode_behavior |= (1 << WAKEUP_BEHAVIOR_RESTORE_CR4); | ||
| 61 | } | ||
| 62 | if (!rdmsr_safe(MSR_IA32_MISC_ENABLE, | 81 | if (!rdmsr_safe(MSR_IA32_MISC_ENABLE, |
| 63 | &header->pmode_misc_en_low, | 82 | &header->pmode_misc_en_low, |
| 64 | &header->pmode_misc_en_high)) | 83 | &header->pmode_misc_en_high)) |
| @@ -72,6 +91,7 @@ int acpi_suspend_lowlevel(void) | |||
| 72 | header->pmode_cr3 = (u32)__pa(&initial_page_table); | 91 | header->pmode_cr3 = (u32)__pa(&initial_page_table); |
| 73 | saved_magic = 0x12345678; | 92 | saved_magic = 0x12345678; |
| 74 | #else /* CONFIG_64BIT */ | 93 | #else /* CONFIG_64BIT */ |
| 94 | header->trampoline_segment = trampoline_address() >> 4; | ||
| 75 | #ifdef CONFIG_SMP | 95 | #ifdef CONFIG_SMP |
| 76 | stack_start = (unsigned long)temp_stack + sizeof(temp_stack); | 96 | stack_start = (unsigned long)temp_stack + sizeof(temp_stack); |
| 77 | early_gdt_descr.address = | 97 | early_gdt_descr.address = |
| @@ -101,8 +121,6 @@ static int __init acpi_sleep_setup(char *str) | |||
| 101 | #endif | 121 | #endif |
| 102 | if (strncmp(str, "nonvs", 5) == 0) | 122 | if (strncmp(str, "nonvs", 5) == 0) |
| 103 | acpi_nvs_nosave(); | 123 | acpi_nvs_nosave(); |
| 104 | if (strncmp(str, "nonvs_s3", 8) == 0) | ||
| 105 | acpi_nvs_nosave_s3(); | ||
| 106 | if (strncmp(str, "old_ordering", 12) == 0) | 124 | if (strncmp(str, "old_ordering", 12) == 0) |
| 107 | acpi_old_suspend_ordering(); | 125 | acpi_old_suspend_ordering(); |
| 108 | str = strchr(str, ','); | 126 | str = strchr(str, ','); |
diff --git a/arch/x86/kernel/acpi/sleep.h b/arch/x86/kernel/acpi/sleep.h index 67f59f8c695..416d4be13fe 100644 --- a/arch/x86/kernel/acpi/sleep.h +++ b/arch/x86/kernel/acpi/sleep.h | |||
| @@ -2,15 +2,13 @@ | |||
| 2 | * Variables and functions used by the code in sleep.c | 2 | * Variables and functions used by the code in sleep.c |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | #include <asm/realmode.h> | 5 | #include <asm/trampoline.h> |
| 6 | 6 | ||
| 7 | extern unsigned long saved_video_mode; | 7 | extern unsigned long saved_video_mode; |
| 8 | extern long saved_magic; | 8 | extern long saved_magic; |
| 9 | 9 | ||
| 10 | extern int wakeup_pmode_return; | 10 | extern int wakeup_pmode_return; |
| 11 | 11 | ||
| 12 | extern u8 wake_sleep_flags; | ||
| 13 | |||
| 14 | extern unsigned long acpi_copy_wakeup_routine(unsigned long); | 12 | extern unsigned long acpi_copy_wakeup_routine(unsigned long); |
| 15 | extern void wakeup_long64(void); | 13 | extern void wakeup_long64(void); |
| 16 | 14 | ||
