Pull x86 fixes from Peter Anvin: "This is a collection of miscellaneous fixes, the most important one is the fix for the Samsung laptop bricking issue (auto-blacklisting the samsung-laptop driver); the efi_enabled() changes you see below are prerequisites for that fix. The other issues fixed are booting on OLPC XO-1.5, an UV fix, NMI debugging, and requiring CAP_SYS_RAWIO for MSR references, just as with I/O port references." * 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: samsung-laptop: Disable on EFI hardware efi: Make 'efi_enabled' a function to query EFI facilities smp: Fix SMP function call empty cpu mask race x86/msr: Add capabilities check x86/dma-debug: Bump PREALLOC_DMA_DEBUG_ENTRIES x86/olpc: Fix olpc-xo1-sci.c build errors arch/x86/platform/uv: Fix incorrect tlb flush all issue x86-64: Fix unwind annotations in recent NMI changes x86-32: Start out cr0 clean, disable paging before modifying cr3/4
Unified · Split
| @@ -2138,6 +2138,7 @@ config OLPC_XO1_RTC · 2137 unmodified lines | ||
| 2138 | 2138 | config OLPC_XO1_SCI |
| 2139 | 2139 | bool "OLPC XO-1 SCI extras" |
| 2140 | 2140 | depends on OLPC && OLPC_XO1_PM |
| 2141 | + depends on INPUT=y | |
| 2141 | 2142 | select POWER_SUPPLY |
| 2142 | 2143 | select GPIO_CS5535 |
| 2143 | 2144 | select MFD_CORE |
| @@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, · 93 unmodified lines | ||
| 94 | 94 | #endif /* CONFIG_X86_32 */ |
| 95 | 95 | |
| 96 | 96 | extern int add_efi_memmap; |
| 97 | +extern unsigned long x86_efi_facility; | |
| 97 | 98 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); |
| 98 | 99 | extern int efi_memblock_x86_reserve_range(void); |
| 99 | 100 | extern void efi_call_phys_prelog(void); |
| @@ -16,7 +16,7 @@ extern void uv_system_init(void); · 15 unmodified lines | ||
| 16 | 16 | extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, |
| 17 | 17 | struct mm_struct *mm, |
| 18 | 18 | unsigned long start, |
| 19 | − unsigned end, | |
| 19 | + unsigned long end, | |
| 20 | 20 | unsigned int cpu); |
| 21 | 21 | |
| 22 | 22 | #else /* X86_UV */ |
| @@ -1781,6 +1781,7 @@ first_nmi: · 1780 unmodified lines | ||
| 1781 | 1781 | * Leave room for the "copied" frame |
| 1782 | 1782 | */ |
| 1783 | 1783 | subq $(5*8), %rsp |
| 1784 | + CFI_ADJUST_CFA_OFFSET 5*8 | |
| 1784 | 1785 | |
| 1785 | 1786 | /* Copy the stack frame to the Saved frame */ |
| 1786 | 1787 | .rept 5 |
| @@ -1863,10 +1864,8 @@ end_repeat_nmi: · 76 unmodified lines | ||
| 1863 | 1864 | nmi_swapgs: |
| 1864 | 1865 | SWAPGS_UNSAFE_STACK |
| 1865 | 1866 | nmi_restore: |
| 1866 | − RESTORE_ALL 8 | |
| 1867 | − | |
| 1868 | − /* Pop the extra iret frame */ | |
| 1869 | − addq $(5*8), %rsp | |
| 1867 | + /* Pop the extra iret frame at once */ | |
| 1868 | + RESTORE_ALL 6*8 | |
| 1870 | 1869 | |
| 1871 | 1870 | /* Clear the NMI executing stack variable */ |
| 1872 | 1871 | movq $0, 5*8(%rsp) |
| @@ -300,6 +300,12 @@ ENTRY(startup_32_smp) · 299 unmodified lines | ||
| 300 | 300 | leal -__PAGE_OFFSET(%ecx),%esp |
| 301 | 301 | |
| 302 | 302 | default_entry: |
| 303 | +#define CR0_STATE (X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \ | |
| 304 | + X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \ | |
| 305 | + X86_CR0_PG) | |
| 306 | + movl $(CR0_STATE & ~X86_CR0_PG),%eax | |
| 307 | + movl %eax,%cr0 | |
| 308 | + | |
| 303 | 309 | /* |
| 304 | 310 | * New page tables may be in 4Mbyte page mode and may |
| 305 | 311 | * be using the global pages. |
| @@ -364,8 +370,7 @@ default_entry: · 58 unmodified lines | ||
| 364 | 370 | */ |
| 365 | 371 | movl $pa(initial_page_table), %eax |
| 366 | 372 | movl %eax,%cr3 /* set the page table pointer.. */ |
| 367 | − movl %cr0,%eax | |
| 368 | − orl $X86_CR0_PG,%eax | |
| 373 | + movl $CR0_STATE,%eax | |
| 369 | 374 | movl %eax,%cr0 /* ..and set paging (PG) bit */ |
| 370 | 375 | ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */ |
| 371 | 376 | 1: |
| @@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file) · 173 unmodified lines | ||
| 174 | 174 | unsigned int cpu; |
| 175 | 175 | struct cpuinfo_x86 *c; |
| 176 | 176 | |
| 177 | + if (!capable(CAP_SYS_RAWIO)) | |
| 178 | + return -EPERM; | |
| 179 | + | |
| 177 | 180 | cpu = iminor(file->f_path.dentry->d_inode); |
| 178 | 181 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) |
| 179 | 182 | return -ENXIO; /* No such CPU */ |
| @@ -56,7 +56,7 @@ struct device x86_dma_fallback_dev = { · 55 unmodified lines | ||
| 56 | 56 | EXPORT_SYMBOL(x86_dma_fallback_dev); |
| 57 | 57 | |
| 58 | 58 | /* Number of entries preallocated for DMA-API debugging */ |
| 59 | −#define PREALLOC_DMA_DEBUG_ENTRIES 32768 | |
| 59 | +#define PREALLOC_DMA_DEBUG_ENTRIES 65536 | |
| 60 | 60 | |
| 61 | 61 | int dma_set_mask(struct device *dev, u64 mask) |
| 62 | 62 | { |
| @@ -584,7 +584,7 @@ static void native_machine_emergency_restart(void) · 583 unmodified lines | ||
| 584 | 584 | break; |
| 585 | 585 | |
| 586 | 586 | case BOOT_EFI: |
| 587 | − if (efi_enabled) | |
| 587 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) | |
| 588 | 588 | efi.reset_system(reboot_mode ? |
| 589 | 589 | EFI_RESET_WARM : |
| 590 | 590 | EFI_RESET_COLD, |
| @@ -807,15 +807,15 @@ void __init setup_arch(char **cmdline_p) · 806 unmodified lines | ||
| 807 | 807 | #ifdef CONFIG_EFI |
| 808 | 808 | if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, |
| 809 | 809 | "EL32", 4)) { |
| 810 | − efi_enabled = 1; | |
| 811 | − efi_64bit = false; | |
| 810 | + set_bit(EFI_BOOT, &x86_efi_facility); | |
| 812 | 811 | } else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, |
| 813 | 812 | "EL64", 4)) { |
| 814 | − efi_enabled = 1; | |
| 815 | − efi_64bit = true; | |
| 813 | + set_bit(EFI_BOOT, &x86_efi_facility); | |
| 814 | + set_bit(EFI_64BIT, &x86_efi_facility); | |
| 816 | 815 | } |
| 817 | − if (efi_enabled && efi_memblock_x86_reserve_range()) | |
| 818 | − efi_enabled = 0; | |
| 816 | + | |
| 817 | + if (efi_enabled(EFI_BOOT)) | |
| 818 | + efi_memblock_x86_reserve_range(); | |
| 819 | 819 | #endif |
| 820 | 820 | |
| 821 | 821 | x86_init.oem.arch_setup(); |
| @@ -888,7 +888,7 @@ void __init setup_arch(char **cmdline_p) · 66 unmodified lines | ||
| 888 | 888 | |
| 889 | 889 | finish_e820_parsing(); |
| 890 | 890 | |
| 891 | − if (efi_enabled) | |
| 891 | + if (efi_enabled(EFI_BOOT)) | |
| 892 | 892 | efi_init(); |
| 893 | 893 | |
| 894 | 894 | dmi_scan_machine(); |
| @@ -971,7 +971,7 @@ void __init setup_arch(char **cmdline_p) · 76 unmodified lines | ||
| 971 | 971 | * The EFI specification says that boot service code won't be called |
| 972 | 972 | * after ExitBootServices(). This is, in fact, a lie. |
| 973 | 973 | */ |
| 974 | − if (efi_enabled) | |
| 974 | + if (efi_enabled(EFI_MEMMAP)) | |
| 975 | 975 | efi_reserve_boot_services(); |
| 976 | 976 | |
| 977 | 977 | /* preallocate 4k for mptable mpc */ |
| @@ -1114,7 +1114,7 @@ void __init setup_arch(char **cmdline_p) · 136 unmodified lines | ||
| 1114 | 1114 | |
| 1115 | 1115 | #ifdef CONFIG_VT |
| 1116 | 1116 | #if defined(CONFIG_VGA_CONSOLE) |
| 1117 | − if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) | |
| 1117 | + if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) | |
| 1118 | 1118 | conswitchp = &vga_con; |
| 1119 | 1119 | #elif defined(CONFIG_DUMMY_CONSOLE) |
| 1120 | 1120 | conswitchp = &dummy_con; |
| @@ -1131,14 +1131,14 @@ void __init setup_arch(char **cmdline_p) · 10 unmodified lines | ||
| 1131 | 1131 | register_refined_jiffies(CLOCK_TICK_RATE); |
| 1132 | 1132 | |
| 1133 | 1133 | #ifdef CONFIG_EFI |
| 1134 | − /* Once setup is done above, disable efi_enabled on mismatched | |
| 1135 | − * firmware/kernel archtectures since there is no support for | |
| 1136 | − * runtime services. | |
| 1134 | + /* Once setup is done above, unmap the EFI memory map on | |
| 1135 | + * mismatched firmware/kernel archtectures since there is no | |
| 1136 | + * support for runtime services. | |
| 1137 | 1137 | */ |
| 1138 | − if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) { | |
| 1138 | + if (efi_enabled(EFI_BOOT) && | |
| 1139 | + IS_ENABLED(CONFIG_X86_64) != efi_enabled(EFI_64BIT)) { | |
| 1139 | 1140 | pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n"); |
| 1140 | 1141 | efi_unmap_memmap(); |
| 1141 | − efi_enabled = 0; | |
| 1142 | 1142 | } |
| 1143 | 1143 | #endif |
| 1144 | 1144 | } |
| @@ -51,9 +51,6 @@ · 50 unmodified lines | ||
| 51 | 51 | |
| 52 | 52 | #define EFI_DEBUG 1 |
| 53 | 53 | |
| 54 | −int efi_enabled; | |
| 55 | −EXPORT_SYMBOL(efi_enabled); | |
| 56 | − | |
| 57 | 54 | struct efi __read_mostly efi = { |
| 58 | 55 | .mps = EFI_INVALID_TABLE_ADDR, |
| 59 | 56 | .acpi = EFI_INVALID_TABLE_ADDR, |
| @@ -69,19 +66,28 @@ EXPORT_SYMBOL(efi); · 9 unmodified lines | ||
| 69 | 66 | |
| 70 | 67 | struct efi_memory_map memmap; |
| 71 | 68 | |
| 72 | −bool efi_64bit; | |
| 73 | − | |
| 74 | 69 | static struct efi efi_phys __initdata; |
| 75 | 70 | static efi_system_table_t efi_systab __initdata; |
| 76 | 71 | |
| 77 | 72 | static inline bool efi_is_native(void) |
| 78 | 73 | { |
| 79 | − return IS_ENABLED(CONFIG_X86_64) == efi_64bit; | |
| 74 | + return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT); | |
| 75 | +} | |
| 76 | + | |
| 77 | +unsigned long x86_efi_facility; | |
| 78 | + | |
| 79 | +/* | |
| 80 | + * Returns 1 if 'facility' is enabled, 0 otherwise. | |
| 81 | + */ | |
| 82 | +int efi_enabled(int facility) | |
| 83 | +{ | |
| 84 | + return test_bit(facility, &x86_efi_facility) != 0; | |
| 80 | 85 | } |
| 86 | +EXPORT_SYMBOL(efi_enabled); | |
| 81 | 87 | |
| 82 | 88 | static int __init setup_noefi(char *arg) |
| 83 | 89 | { |
| 84 | − efi_enabled = 0; | |
| 90 | + clear_bit(EFI_BOOT, &x86_efi_facility); | |
| 85 | 91 | return 0; |
| 86 | 92 | } |
| 87 | 93 | early_param("noefi", setup_noefi); |
| @@ -426,6 +432,7 @@ void __init efi_reserve_boot_services(void) · 338 unmodified lines | ||
| 426 | 432 | |
| 427 | 433 | void __init efi_unmap_memmap(void) |
| 428 | 434 | { |
| 435 | + clear_bit(EFI_MEMMAP, &x86_efi_facility); | |
| 429 | 436 | if (memmap.map) { |
| 430 | 437 | early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size); |
| 431 | 438 | memmap.map = NULL; |
| @@ -460,7 +467,7 @@ void __init efi_free_boot_services(void) · 28 unmodified lines | ||
| 460 | 467 | |
| 461 | 468 | static int __init efi_systab_init(void *phys) |
| 462 | 469 | { |
| 463 | − if (efi_64bit) { | |
| 470 | + if (efi_enabled(EFI_64BIT)) { | |
| 464 | 471 | efi_system_table_64_t *systab64; |
| 465 | 472 | u64 tmp = 0; |
| 466 | 473 | |
| @@ -552,7 +559,7 @@ static int __init efi_config_init(u64 tables, int nr_tables) · 85 unmodified lines | ||
| 552 | 559 | void *config_tables, *tablep; |
| 553 | 560 | int i, sz; |
| 554 | 561 | |
| 555 | − if (efi_64bit) | |
| 562 | + if (efi_enabled(EFI_64BIT)) | |
| 556 | 563 | sz = sizeof(efi_config_table_64_t); |
| 557 | 564 | else |
| 558 | 565 | sz = sizeof(efi_config_table_32_t); |
| @@ -572,7 +579,7 @@ static int __init efi_config_init(u64 tables, int nr_tables) · 13 unmodified lines | ||
| 572 | 579 | efi_guid_t guid; |
| 573 | 580 | unsigned long table; |
| 574 | 581 | |
| 575 | − if (efi_64bit) { | |
| 582 | + if (efi_enabled(EFI_64BIT)) { | |
| 576 | 583 | u64 table64; |
| 577 | 584 | guid = ((efi_config_table_64_t *)tablep)->guid; |
| 578 | 585 | table64 = ((efi_config_table_64_t *)tablep)->table; |
| @@ -684,7 +691,6 @@ void __init efi_init(void) · 105 unmodified lines | ||
| 684 | 691 | if (boot_params.efi_info.efi_systab_hi || |
| 685 | 692 | boot_params.efi_info.efi_memmap_hi) { |
| 686 | 693 | pr_info("Table located above 4GB, disabling EFI.\n"); |
| 687 | − efi_enabled = 0; | |
| 688 | 694 | return; |
| 689 | 695 | } |
| 690 | 696 | efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab; |
| @@ -694,10 +700,10 @@ void __init efi_init(void) · 3 unmodified lines | ||
| 694 | 700 | ((__u64)boot_params.efi_info.efi_systab_hi<<32)); |
| 695 | 701 | #endif |
| 696 | 702 | |
| 697 | − if (efi_systab_init(efi_phys.systab)) { | |
| 698 | − efi_enabled = 0; | |
| 703 | + if (efi_systab_init(efi_phys.systab)) | |
| 699 | 704 | return; |
| 700 | − } | |
| 705 | + | |
| 706 | + set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility); | |
| 701 | 707 | |
| 702 | 708 | /* |
| 703 | 709 | * Show what we know for posterity |
| @@ -715,10 +721,10 @@ void __init efi_init(void) · 11 unmodified lines | ||
| 715 | 721 | efi.systab->hdr.revision >> 16, |
| 716 | 722 | efi.systab->hdr.revision & 0xffff, vendor); |
| 717 | 723 | |
| 718 | − if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) { | |
| 719 | − efi_enabled = 0; | |
| 724 | + if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) | |
| 720 | 725 | return; |
| 721 | − } | |
| 726 | + | |
| 727 | + set_bit(EFI_CONFIG_TABLES, &x86_efi_facility); | |
| 722 | 728 | |
| 723 | 729 | /* |
| 724 | 730 | * Note: We currently don't support runtime services on an EFI |
| @@ -727,15 +733,17 @@ void __init efi_init(void) · 2 unmodified lines | ||
| 727 | 733 | |
| 728 | 734 | if (!efi_is_native()) |
| 729 | 735 | pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n"); |
| 730 | − else if (efi_runtime_init()) { | |
| 731 | − efi_enabled = 0; | |
| 732 | − return; | |
| 736 | + else { | |
| 737 | + if (efi_runtime_init()) | |
| 738 | + return; | |
| 739 | + set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); | |
| 733 | 740 | } |
| 734 | 741 | |
| 735 | − if (efi_memmap_init()) { | |
| 736 | − efi_enabled = 0; | |
| 742 | + if (efi_memmap_init()) | |
| 737 | 743 | return; |
| 738 | − } | |
| 744 | + | |
| 745 | + set_bit(EFI_MEMMAP, &x86_efi_facility); | |
| 746 | + | |
| 739 | 747 | #ifdef CONFIG_X86_32 |
| 740 | 748 | if (efi_is_native()) { |
| 741 | 749 | x86_platform.get_wallclock = efi_get_time; |
| @@ -969,6 +977,9 @@ u32 efi_mem_type(unsigned long phys_addr) · 227 unmodified lines | ||
| 969 | 977 | efi_memory_desc_t *md; |
| 970 | 978 | void *p; |
| 971 | 979 | |
| 980 | + if (!efi_enabled(EFI_MEMMAP)) | |
| 981 | + return 0; | |
| 982 | + | |
| 972 | 983 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
| 973 | 984 | md = p; |
| 974 | 985 | if ((md->phys_addr <= phys_addr) && |
| @@ -1034,7 +1034,8 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp, · 1033 unmodified lines | ||
| 1034 | 1034 | * globally purge translation cache of a virtual address or all TLB's |
| 1035 | 1035 | * @cpumask: mask of all cpu's in which the address is to be removed |
| 1036 | 1036 | * @mm: mm_struct containing virtual address range |
| 1037 | − * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu) | |
| 1037 | + * @start: start virtual address to be removed from TLB | |
| 1038 | + * @end: end virtual address to be remove from TLB | |
| 1038 | 1039 | * @cpu: the current cpu |
| 1039 | 1040 | * |
| 1040 | 1041 | * This is the entry point for initiating any UV global TLB shootdown. |
| @@ -1056,7 +1057,7 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp, · 15 unmodified lines | ||
| 1056 | 1057 | */ |
| 1057 | 1058 | const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, |
| 1058 | 1059 | struct mm_struct *mm, unsigned long start, |
| 1059 | − unsigned end, unsigned int cpu) | |
| 1060 | + unsigned long end, unsigned int cpu) | |
| 1060 | 1061 | { |
| 1061 | 1062 | int locals = 0; |
| 1062 | 1063 | int remotes = 0; |
| @@ -1113,7 +1114,10 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, · 50 unmodified lines | ||
| 1113 | 1114 | |
| 1114 | 1115 | record_send_statistics(stat, locals, hubs, remotes, bau_desc); |
| 1115 | 1116 | |
| 1116 | − bau_desc->payload.address = start; | |
| 1117 | + if (!end || (end - start) <= PAGE_SIZE) | |
| 1118 | + bau_desc->payload.address = start; | |
| 1119 | + else | |
| 1120 | + bau_desc->payload.address = TLB_FLUSH_ALL; | |
| 1117 | 1121 | bau_desc->payload.sending_cpu = cpu; |
| 1118 | 1122 | /* |
| 1119 | 1123 | * uv_flush_send_and_wait returns 0 if all cpu's were messaged, |
| @@ -250,7 +250,7 @@ acpi_physical_address __init acpi_os_get_root_pointer(void) · 249 unmodified lines | ||
| 250 | 250 | return acpi_rsdp; |
| 251 | 251 | #endif |
| 252 | 252 | |
| 253 | − if (efi_enabled) { | |
| 253 | + if (efi_enabled(EFI_CONFIG_TABLES)) { | |
| 254 | 254 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) |
| 255 | 255 | return efi.acpi20; |
| 256 | 256 | else if (efi.acpi != EFI_INVALID_TABLE_ADDR) |
| @@ -471,7 +471,7 @@ void __init dmi_scan_machine(void) · 470 unmodified lines | ||
| 471 | 471 | char __iomem *p, *q; |
| 472 | 472 | int rc; |
| 473 | 473 | |
| 474 | − if (efi_enabled) { | |
| 474 | + if (efi_enabled(EFI_CONFIG_TABLES)) { | |
| 475 | 475 | if (efi.smbios == EFI_INVALID_TABLE_ADDR) |
| 476 | 476 | goto error; |
| 477 | 477 | |
| @@ -1782,7 +1782,7 @@ efivars_init(void) · 1781 unmodified lines | ||
| 1782 | 1782 | printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION, |
| 1783 | 1783 | EFIVARS_DATE); |
| 1784 | 1784 | |
| 1785 | − if (!efi_enabled) | |
| 1785 | + if (!efi_enabled(EFI_RUNTIME_SERVICES)) | |
| 1786 | 1786 | return 0; |
| 1787 | 1787 | |
| 1788 | 1788 | /* For now we'll register the efi directory at /sys/firmware/efi */ |
| @@ -1822,7 +1822,7 @@ err_put: · 33 unmodified lines | ||
| 1822 | 1822 | static void __exit |
| 1823 | 1823 | efivars_exit(void) |
| 1824 | 1824 | { |
| 1825 | − if (efi_enabled) { | |
| 1825 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) { | |
| 1826 | 1826 | unregister_efivars(&__efivars); |
| 1827 | 1827 | kobject_put(efi_kobj); |
| 1828 | 1828 | } |
| @@ -99,7 +99,7 @@ unsigned long __init find_ibft_region(unsigned long *sizep) · 98 unmodified lines | ||
| 99 | 99 | /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will |
| 100 | 100 | * only use ACPI for this */ |
| 101 | 101 | |
| 102 | − if (!efi_enabled) | |
| 102 | + if (!efi_enabled(EFI_BOOT)) | |
| 103 | 103 | find_ibft_in_mem(); |
| 104 | 104 | |
| 105 | 105 | if (ibft_addr) { |
| @@ -429,7 +429,8 @@ bool radeon_card_posted(struct radeon_device *rdev) · 428 unmodified lines | ||
| 429 | 429 | { |
| 430 | 430 | uint32_t reg; |
| 431 | 431 | |
| 432 | − if (efi_enabled && rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) | |
| 432 | + if (efi_enabled(EFI_BOOT) && | |
| 433 | + rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) | |
| 433 | 434 | return false; |
| 434 | 435 | |
| 435 | 436 | /* first check CRTCs */ |
| @@ -244,7 +244,7 @@ static int __init ibm_rtl_init(void) { · 243 unmodified lines | ||
| 244 | 244 | if (force) |
| 245 | 245 | pr_warn("module loaded by force\n"); |
| 246 | 246 | /* first ensure that we are running on IBM HW */ |
| 247 | − else if (efi_enabled || !dmi_check_system(ibm_rtl_dmi_table)) | |
| 247 | + else if (efi_enabled(EFI_BOOT) || !dmi_check_system(ibm_rtl_dmi_table)) | |
| 248 | 248 | return -ENODEV; |
| 249 | 249 | |
| 250 | 250 | /* Get the address for the Extended BIOS Data Area */ |
| @@ -26,6 +26,7 @@ · 25 unmodified lines | ||
| 26 | 26 | #include <linux/seq_file.h> |
| 27 | 27 | #include <linux/debugfs.h> |
| 28 | 28 | #include <linux/ctype.h> |
| 29 | +#include <linux/efi.h> | |
| 29 | 30 | #include <acpi/video.h> |
| 30 | 31 | |
| 31 | 32 | /* |
| @@ -1544,6 +1545,9 @@ static int __init samsung_init(void) · 1512 unmodified lines | ||
| 1544 | 1545 | struct samsung_laptop *samsung; |
| 1545 | 1546 | int ret; |
| 1546 | 1547 | |
| 1548 | + if (efi_enabled(EFI_BOOT)) | |
| 1549 | + return -ENODEV; | |
| 1550 | + | |
| 1547 | 1551 | quirks = &samsung_unknown; |
| 1548 | 1552 | if (!force && !dmi_check_system(samsung_dmi_table)) |
| 1549 | 1553 | return -ENODEV; |
| @@ -633,7 +633,7 @@ static int isci_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) · 632 unmodified lines | ||
| 633 | 633 | return -ENOMEM; |
| 634 | 634 | pci_set_drvdata(pdev, pci_info); |
| 635 | 635 | |
| 636 | − if (efi_enabled) | |
| 636 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) | |
| 637 | 637 | orom = isci_get_efi_var(pdev); |
| 638 | 638 | |
| 639 | 639 | if (!orom) |
| @@ -618,18 +618,30 @@ extern int __init efi_setup_pcdp_console(char *); · 617 unmodified lines | ||
| 618 | 618 | #endif |
| 619 | 619 | |
| 620 | 620 | /* |
| 621 | − * We play games with efi_enabled so that the compiler will, if possible, remove | |
| 622 | − * EFI-related code altogether. | |
| 621 | + * We play games with efi_enabled so that the compiler will, if | |
| 622 | + * possible, remove EFI-related code altogether. | |
| 623 | 623 | */ |
| 624 | +#define EFI_BOOT 0 /* Were we booted from EFI? */ | |
| 625 | +#define EFI_SYSTEM_TABLES 1 /* Can we use EFI system tables? */ | |
| 626 | +#define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */ | |
| 627 | +#define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */ | |
| 628 | +#define EFI_MEMMAP 4 /* Can we use EFI memory map? */ | |
| 629 | +#define EFI_64BIT 5 /* Is the firmware 64-bit? */ | |
| 630 | + | |
| 624 | 631 | #ifdef CONFIG_EFI |
| 625 | 632 | # ifdef CONFIG_X86 |
| 626 | − extern int efi_enabled; | |
| 627 | − extern bool efi_64bit; | |
| 633 | +extern int efi_enabled(int facility); | |
| 628 | 634 | # else |
| 629 | −# define efi_enabled 1 | |
| 635 | +static inline int efi_enabled(int facility) | |
| 636 | +{ | |
| 637 | + return 1; | |
| 638 | +} | |
| 630 | 639 | # endif |
| 631 | 640 | #else |
| 632 | −# define efi_enabled 0 | |
| 641 | +static inline int efi_enabled(int facility) | |
| 642 | +{ | |
| 643 | + return 0; | |
| 644 | +} | |
| 633 | 645 | #endif |
| 634 | 646 | |
| 635 | 647 | /* |
| @@ -604,7 +604,7 @@ asmlinkage void __init start_kernel(void) · 603 unmodified lines | ||
| 604 | 604 | pidmap_init(); |
| 605 | 605 | anon_vma_init(); |
| 606 | 606 | #ifdef CONFIG_X86 |
| 607 | − if (efi_enabled) | |
| 607 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) | |
| 608 | 608 | efi_enter_virtual_mode(); |
| 609 | 609 | #endif |
| 610 | 610 | thread_info_cache_init(); |
| @@ -632,7 +632,7 @@ asmlinkage void __init start_kernel(void) · 21 unmodified lines | ||
| 632 | 632 | acpi_early_init(); /* before LAPIC and SMP init */ |
| 633 | 633 | sfi_init_late(); |
| 634 | 634 | |
| 635 | − if (efi_enabled) { | |
| 635 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) { | |
| 636 | 636 | efi_late_init(); |
| 637 | 637 | efi_free_boot_services(); |
| 638 | 638 | } |
| @@ -33,6 +33,7 @@ struct call_function_data { · 32 unmodified lines | ||
| 33 | 33 | struct call_single_data csd; |
| 34 | 34 | atomic_t refs; |
| 35 | 35 | cpumask_var_t cpumask; |
| 36 | + cpumask_var_t cpumask_ipi; | |
| 36 | 37 | }; |
| 37 | 38 | |
| 38 | 39 | static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data); |
| @@ -56,6 +57,9 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu) · 17 unmodified lines | ||
| 56 | 57 | if (!zalloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL, |
| 57 | 58 | cpu_to_node(cpu))) |
| 58 | 59 | return notifier_from_errno(-ENOMEM); |
| 60 | + if (!zalloc_cpumask_var_node(&cfd->cpumask_ipi, GFP_KERNEL, | |
| 61 | + cpu_to_node(cpu))) | |
| 62 | + return notifier_from_errno(-ENOMEM); | |
| 59 | 63 | break; |
| 60 | 64 | |
| 61 | 65 | #ifdef CONFIG_HOTPLUG_CPU |
| @@ -65,6 +69,7 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu) · 3 unmodified lines | ||
| 65 | 69 | case CPU_DEAD: |
| 66 | 70 | case CPU_DEAD_FROZEN: |
| 67 | 71 | free_cpumask_var(cfd->cpumask); |
| 72 | + free_cpumask_var(cfd->cpumask_ipi); | |
| 68 | 73 | break; |
| 69 | 74 | #endif |
| 70 | 75 | }; |
| @@ -526,6 +531,12 @@ void smp_call_function_many(const struct cpumask *mask, · 455 unmodified lines | ||
| 526 | 531 | return; |
| 527 | 532 | } |
| 528 | 533 | |
| 534 | + /* | |
| 535 | + * After we put an entry into the list, data->cpumask | |
| 536 | + * may be cleared again when another CPU sends another IPI for | |
| 537 | + * a SMP function call, so data->cpumask will be zero. | |
| 538 | + */ | |
| 539 | + cpumask_copy(data->cpumask_ipi, data->cpumask); | |
| 529 | 540 | raw_spin_lock_irqsave(&call_function.lock, flags); |
| 530 | 541 | /* |
| 531 | 542 | * Place entry at the _HEAD_ of the list, so that any cpu still |
| @@ -549,7 +560,7 @@ void smp_call_function_many(const struct cpumask *mask, · 17 unmodified lines | ||
| 549 | 560 | smp_mb(); |
| 550 | 561 | |
| 551 | 562 | /* Send a message to all CPUs in the map */ |
| 552 | − arch_send_call_function_ipi_mask(data->cpumask); | |
| 563 | + arch_send_call_function_ipi_mask(data->cpumask_ipi); | |
| 553 | 564 | |
| 554 | 565 | /* Optionally wait for the CPUs to complete */ |
| 555 | 566 | if (wait) |