History

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

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

Linus Torvalds committed 13 years ago

Commit bdb0ae62 parents 0fe94b9 e00942422 files · +118 −66Browse files

Unified · Split

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

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t