diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-12-09 17:45:12 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-12-09 17:45:12 -0500 |
| commit | a776878d6cf8a81fa65b29aa9bd6a10a5131e71c (patch) | |
| tree | a57cbd9605b86ff168f2bf3c2895461432a7e5c2 | |
| parent | e2f4e0bc2aaf41a2b487ef7d2afb76e5c87d466c (diff) | |
| parent | e8c7106280a305e1ff2a3a8a4dfce141469fb039 (diff) | |
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86, efi: Calling __pa() with an ioremap()ed address is invalid
x86, hpet: Immediately disable HPET timer 1 if rtc irq is masked
x86/intel_mid: Kconfig select fix
x86/intel_mid: Fix the Kconfig for MID selection
| -rw-r--r-- | arch/x86/Kconfig | 8 | ||||
| -rw-r--r-- | arch/x86/include/asm/e820.h | 8 | ||||
| -rw-r--r-- | arch/x86/include/asm/efi.h | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/e820.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/hpet.c | 21 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 21 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi.c | 29 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi_64.c | 17 |
8 files changed, 68 insertions, 44 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index cb9a1044a771..efb42949cc09 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -390,7 +390,7 @@ config X86_INTEL_CE | |||
| 390 | This option compiles in support for the CE4100 SOC for settop | 390 | This option compiles in support for the CE4100 SOC for settop |
| 391 | boxes and media devices. | 391 | boxes and media devices. |
| 392 | 392 | ||
| 393 | config X86_INTEL_MID | 393 | config X86_WANT_INTEL_MID |
| 394 | bool "Intel MID platform support" | 394 | bool "Intel MID platform support" |
| 395 | depends on X86_32 | 395 | depends on X86_32 |
| 396 | depends on X86_EXTENDED_PLATFORM | 396 | depends on X86_EXTENDED_PLATFORM |
| @@ -399,7 +399,10 @@ config X86_INTEL_MID | |||
| 399 | systems which do not have the PCI legacy interfaces (Moorestown, | 399 | systems which do not have the PCI legacy interfaces (Moorestown, |
| 400 | Medfield). If you are building for a PC class system say N here. | 400 | Medfield). If you are building for a PC class system say N here. |
| 401 | 401 | ||
| 402 | if X86_INTEL_MID | 402 | if X86_WANT_INTEL_MID |
| 403 | |||
| 404 | config X86_INTEL_MID | ||
| 405 | bool | ||
| 403 | 406 | ||
| 404 | config X86_MRST | 407 | config X86_MRST |
| 405 | bool "Moorestown MID platform" | 408 | bool "Moorestown MID platform" |
| @@ -411,6 +414,7 @@ config X86_MRST | |||
| 411 | select SPI | 414 | select SPI |
| 412 | select INTEL_SCU_IPC | 415 | select INTEL_SCU_IPC |
| 413 | select X86_PLATFORM_DEVICES | 416 | select X86_PLATFORM_DEVICES |
| 417 | select X86_INTEL_MID | ||
| 414 | ---help--- | 418 | ---help--- |
| 415 | Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin | 419 | Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin |
| 416 | Internet Device(MID) platform. Moorestown consists of two chips: | 420 | Internet Device(MID) platform. Moorestown consists of two chips: |
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h index 908b96957d88..c9547033e38e 100644 --- a/arch/x86/include/asm/e820.h +++ b/arch/x86/include/asm/e820.h | |||
| @@ -53,6 +53,13 @@ | |||
| 53 | */ | 53 | */ |
| 54 | #define E820_RESERVED_KERN 128 | 54 | #define E820_RESERVED_KERN 128 |
| 55 | 55 | ||
| 56 | /* | ||
| 57 | * Address ranges that need to be mapped by the kernel direct | ||
| 58 | * mapping. This is used to make sure regions such as | ||
| 59 | * EFI_RUNTIME_SERVICES_DATA are directly mapped. See setup_arch(). | ||
| 60 | */ | ||
| 61 | #define E820_RESERVED_EFI 129 | ||
| 62 | |||
| 56 | #ifndef __ASSEMBLY__ | 63 | #ifndef __ASSEMBLY__ |
| 57 | #include <linux/types.h> | 64 | #include <linux/types.h> |
| 58 | struct e820entry { | 65 | struct e820entry { |
| @@ -115,6 +122,7 @@ static inline void early_memtest(unsigned long start, unsigned long end) | |||
| 115 | } | 122 | } |
| 116 | #endif | 123 | #endif |
| 117 | 124 | ||
| 125 | extern unsigned long e820_end_pfn(unsigned long limit_pfn, unsigned type); | ||
| 118 | extern unsigned long e820_end_of_ram_pfn(void); | 126 | extern unsigned long e820_end_of_ram_pfn(void); |
| 119 | extern unsigned long e820_end_of_low_ram_pfn(void); | 127 | extern unsigned long e820_end_of_low_ram_pfn(void); |
| 120 | extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align); | 128 | extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align); |
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 7093e4a6a0bc..b8d8bfcd44a9 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
| @@ -33,8 +33,6 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...); | |||
| 33 | #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ | 33 | #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ |
| 34 | efi_call_virt(f, a1, a2, a3, a4, a5, a6) | 34 | efi_call_virt(f, a1, a2, a3, a4, a5, a6) |
| 35 | 35 | ||
| 36 | #define efi_ioremap(addr, size, type) ioremap_cache(addr, size) | ||
| 37 | |||
| 38 | #else /* !CONFIG_X86_32 */ | 36 | #else /* !CONFIG_X86_32 */ |
| 39 | 37 | ||
| 40 | extern u64 efi_call0(void *fp); | 38 | extern u64 efi_call0(void *fp); |
| @@ -84,9 +82,6 @@ extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3, | |||
| 84 | efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ | 82 | efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ |
| 85 | (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) | 83 | (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) |
| 86 | 84 | ||
| 87 | extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, | ||
| 88 | u32 type); | ||
| 89 | |||
| 90 | #endif /* CONFIG_X86_32 */ | 85 | #endif /* CONFIG_X86_32 */ |
| 91 | 86 | ||
| 92 | extern int add_efi_memmap; | 87 | extern int add_efi_memmap; |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 303a0e48f076..65ffd110a81b 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
| @@ -135,6 +135,7 @@ static void __init e820_print_type(u32 type) | |||
| 135 | printk(KERN_CONT "(usable)"); | 135 | printk(KERN_CONT "(usable)"); |
| 136 | break; | 136 | break; |
| 137 | case E820_RESERVED: | 137 | case E820_RESERVED: |
| 138 | case E820_RESERVED_EFI: | ||
| 138 | printk(KERN_CONT "(reserved)"); | 139 | printk(KERN_CONT "(reserved)"); |
| 139 | break; | 140 | break; |
| 140 | case E820_ACPI: | 141 | case E820_ACPI: |
| @@ -783,7 +784,7 @@ u64 __init early_reserve_e820(u64 startt, u64 sizet, u64 align) | |||
| 783 | /* | 784 | /* |
| 784 | * Find the highest page frame number we have available | 785 | * Find the highest page frame number we have available |
| 785 | */ | 786 | */ |
| 786 | static unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type) | 787 | unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type) |
| 787 | { | 788 | { |
| 788 | int i; | 789 | int i; |
| 789 | unsigned long last_pfn = 0; | 790 | unsigned long last_pfn = 0; |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index b946a9eac7d9..1bb0bf4d92cd 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
| @@ -1049,6 +1049,14 @@ int hpet_rtc_timer_init(void) | |||
| 1049 | } | 1049 | } |
| 1050 | EXPORT_SYMBOL_GPL(hpet_rtc_timer_init); | 1050 | EXPORT_SYMBOL_GPL(hpet_rtc_timer_init); |
| 1051 | 1051 | ||
| 1052 | static void hpet_disable_rtc_channel(void) | ||
| 1053 | { | ||
| 1054 | unsigned long cfg; | ||
| 1055 | cfg = hpet_readl(HPET_T1_CFG); | ||
| 1056 | cfg &= ~HPET_TN_ENABLE; | ||
| 1057 | hpet_writel(cfg, HPET_T1_CFG); | ||
| 1058 | } | ||
| 1059 | |||
| 1052 | /* | 1060 | /* |
| 1053 | * The functions below are called from rtc driver. | 1061 | * The functions below are called from rtc driver. |
| 1054 | * Return 0 if HPET is not being used. | 1062 | * Return 0 if HPET is not being used. |
| @@ -1060,6 +1068,9 @@ int hpet_mask_rtc_irq_bit(unsigned long bit_mask) | |||
| 1060 | return 0; | 1068 | return 0; |
| 1061 | 1069 | ||
| 1062 | hpet_rtc_flags &= ~bit_mask; | 1070 | hpet_rtc_flags &= ~bit_mask; |
| 1071 | if (unlikely(!hpet_rtc_flags)) | ||
| 1072 | hpet_disable_rtc_channel(); | ||
| 1073 | |||
| 1063 | return 1; | 1074 | return 1; |
| 1064 | } | 1075 | } |
| 1065 | EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit); | 1076 | EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit); |
| @@ -1125,15 +1136,11 @@ EXPORT_SYMBOL_GPL(hpet_rtc_dropped_irq); | |||
| 1125 | 1136 | ||
| 1126 | static void hpet_rtc_timer_reinit(void) | 1137 | static void hpet_rtc_timer_reinit(void) |
| 1127 | { | 1138 | { |
| 1128 | unsigned int cfg, delta; | 1139 | unsigned int delta; |
| 1129 | int lost_ints = -1; | 1140 | int lost_ints = -1; |
| 1130 | 1141 | ||
| 1131 | if (unlikely(!hpet_rtc_flags)) { | 1142 | if (unlikely(!hpet_rtc_flags)) |
| 1132 | cfg = hpet_readl(HPET_T1_CFG); | 1143 | hpet_disable_rtc_channel(); |
| 1133 | cfg &= ~HPET_TN_ENABLE; | ||
| 1134 | hpet_writel(cfg, HPET_T1_CFG); | ||
| 1135 | return; | ||
| 1136 | } | ||
| 1137 | 1144 | ||
| 1138 | if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit) | 1145 | if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit) |
| 1139 | delta = hpet_default_delta; | 1146 | delta = hpet_default_delta; |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index cf0ef986cb6d..9a9e40fb091c 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -691,6 +691,8 @@ early_param("reservelow", parse_reservelow); | |||
| 691 | 691 | ||
| 692 | void __init setup_arch(char **cmdline_p) | 692 | void __init setup_arch(char **cmdline_p) |
| 693 | { | 693 | { |
| 694 | unsigned long end_pfn; | ||
| 695 | |||
| 694 | #ifdef CONFIG_X86_32 | 696 | #ifdef CONFIG_X86_32 |
| 695 | memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); | 697 | memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); |
| 696 | visws_early_detect(); | 698 | visws_early_detect(); |
| @@ -932,7 +934,24 @@ void __init setup_arch(char **cmdline_p) | |||
| 932 | init_gbpages(); | 934 | init_gbpages(); |
| 933 | 935 | ||
| 934 | /* max_pfn_mapped is updated here */ | 936 | /* max_pfn_mapped is updated here */ |
| 935 | max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT); | 937 | end_pfn = max_low_pfn; |
| 938 | |||
| 939 | #ifdef CONFIG_X86_64 | ||
| 940 | /* | ||
| 941 | * There may be regions after the last E820_RAM region that we | ||
| 942 | * want to include in the kernel direct mapping, such as | ||
| 943 | * EFI_RUNTIME_SERVICES_DATA. | ||
| 944 | */ | ||
| 945 | if (efi_enabled) { | ||
| 946 | unsigned long efi_end; | ||
| 947 | |||
| 948 | efi_end = e820_end_pfn(MAXMEM>>PAGE_SHIFT, E820_RESERVED_EFI); | ||
| 949 | if (efi_end > max_low_pfn) | ||
| 950 | end_pfn = efi_end; | ||
| 951 | } | ||
| 952 | #endif | ||
| 953 | |||
| 954 | max_low_pfn_mapped = init_memory_mapping(0, end_pfn << PAGE_SHIFT); | ||
| 936 | max_pfn_mapped = max_low_pfn_mapped; | 955 | max_pfn_mapped = max_low_pfn_mapped; |
| 937 | 956 | ||
| 938 | #ifdef CONFIG_X86_64 | 957 | #ifdef CONFIG_X86_64 |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 37718f0f053d..c9718a16be15 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -323,10 +323,13 @@ static void __init do_add_efi_memmap(void) | |||
| 323 | case EFI_UNUSABLE_MEMORY: | 323 | case EFI_UNUSABLE_MEMORY: |
| 324 | e820_type = E820_UNUSABLE; | 324 | e820_type = E820_UNUSABLE; |
| 325 | break; | 325 | break; |
| 326 | case EFI_RUNTIME_SERVICES_DATA: | ||
| 327 | e820_type = E820_RESERVED_EFI; | ||
| 328 | break; | ||
| 326 | default: | 329 | default: |
| 327 | /* | 330 | /* |
| 328 | * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE | 331 | * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE |
| 329 | * EFI_RUNTIME_SERVICES_DATA EFI_MEMORY_MAPPED_IO | 332 | * EFI_MEMORY_MAPPED_IO |
| 330 | * EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE | 333 | * EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE |
| 331 | */ | 334 | */ |
| 332 | e820_type = E820_RESERVED; | 335 | e820_type = E820_RESERVED; |
| @@ -671,10 +674,21 @@ void __init efi_enter_virtual_mode(void) | |||
| 671 | end_pfn = PFN_UP(end); | 674 | end_pfn = PFN_UP(end); |
| 672 | if (end_pfn <= max_low_pfn_mapped | 675 | if (end_pfn <= max_low_pfn_mapped |
| 673 | || (end_pfn > (1UL << (32 - PAGE_SHIFT)) | 676 | || (end_pfn > (1UL << (32 - PAGE_SHIFT)) |
| 674 | && end_pfn <= max_pfn_mapped)) | 677 | && end_pfn <= max_pfn_mapped)) { |
| 675 | va = __va(md->phys_addr); | 678 | va = __va(md->phys_addr); |
| 676 | else | 679 | |
| 677 | va = efi_ioremap(md->phys_addr, size, md->type); | 680 | if (!(md->attribute & EFI_MEMORY_WB)) { |
| 681 | addr = (u64) (unsigned long)va; | ||
| 682 | npages = md->num_pages; | ||
| 683 | memrange_efi_to_native(&addr, &npages); | ||
| 684 | set_memory_uc(addr, npages); | ||
| 685 | } | ||
| 686 | } else { | ||
| 687 | if (!(md->attribute & EFI_MEMORY_WB)) | ||
| 688 | va = ioremap_nocache(md->phys_addr, size); | ||
| 689 | else | ||
| 690 | va = ioremap_cache(md->phys_addr, size); | ||
| 691 | } | ||
| 678 | 692 | ||
| 679 | md->virt_addr = (u64) (unsigned long) va; | 693 | md->virt_addr = (u64) (unsigned long) va; |
| 680 | 694 | ||
| @@ -684,13 +698,6 @@ void __init efi_enter_virtual_mode(void) | |||
| 684 | continue; | 698 | continue; |
| 685 | } | 699 | } |
| 686 | 700 | ||
| 687 | if (!(md->attribute & EFI_MEMORY_WB)) { | ||
| 688 | addr = md->virt_addr; | ||
| 689 | npages = md->num_pages; | ||
| 690 | memrange_efi_to_native(&addr, &npages); | ||
| 691 | set_memory_uc(addr, npages); | ||
| 692 | } | ||
| 693 | |||
| 694 | systab = (u64) (unsigned long) efi_phys.systab; | 701 | systab = (u64) (unsigned long) efi_phys.systab; |
| 695 | if (md->phys_addr <= systab && systab < end) { | 702 | if (md->phys_addr <= systab && systab < end) { |
| 696 | systab += md->virt_addr - md->phys_addr; | 703 | systab += md->virt_addr - md->phys_addr; |
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index ac3aa54e2654..312250c6b2de 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
| @@ -80,20 +80,3 @@ void __init efi_call_phys_epilog(void) | |||
| 80 | local_irq_restore(efi_flags); | 80 | local_irq_restore(efi_flags); |
| 81 | early_code_mapping_set_exec(0); | 81 | early_code_mapping_set_exec(0); |
| 82 | } | 82 | } |
| 83 | |||
| 84 | void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, | ||
| 85 | u32 type) | ||
| 86 | { | ||
| 87 | unsigned long last_map_pfn; | ||
| 88 | |||
| 89 | if (type == EFI_MEMORY_MAPPED_IO) | ||
| 90 | return ioremap(phys_addr, size); | ||
| 91 | |||
| 92 | last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size); | ||
| 93 | if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size) { | ||
| 94 | unsigned long top = last_map_pfn << PAGE_SHIFT; | ||
| 95 | efi_ioremap(top, size - (top - phys_addr), type); | ||
| 96 | } | ||
| 97 | |||
| 98 | return (void __iomem *)__va(phys_addr); | ||
| 99 | } | ||
