aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/mm/pageattr.c10
-rw-r--r--arch/x86/platform/efi/efi.c30
-rw-r--r--include/linux/efi.h2
-rw-r--r--init/main.c8
4 files changed, 14 insertions, 36 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index a718e0d23503..931930a96160 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -919,11 +919,13 @@ static int change_page_attr_set_clr(unsigned long *addr, int numpages,
919 919
920 /* 920 /*
921 * On success we use clflush, when the CPU supports it to 921 * On success we use clflush, when the CPU supports it to
922 * avoid the wbindv. If the CPU does not support it and in the 922 * avoid the wbindv. If the CPU does not support it, in the
923 * error case we fall back to cpa_flush_all (which uses 923 * error case, and during early boot (for EFI) we fall back
924 * wbindv): 924 * to cpa_flush_all (which uses wbinvd):
925 */ 925 */
926 if (!ret && cpu_has_clflush) { 926 if (early_boot_irqs_disabled)
927 __cpa_flush_all((void *)(long)cache);
928 else if (!ret && cpu_has_clflush) {
927 if (cpa.flags & (CPA_PAGES_ARRAY | CPA_ARRAY)) { 929 if (cpa.flags & (CPA_PAGES_ARRAY | CPA_ARRAY)) {
928 cpa_flush_array(addr, numpages, cache, 930 cpa_flush_array(addr, numpages, cache,
929 cpa.flags, pages); 931 cpa.flags, pages);
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index aded2a91162a..757834434e59 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -235,22 +235,7 @@ static efi_status_t __init phys_efi_set_virtual_address_map(
235 return status; 235 return status;
236} 236}
237 237
238static efi_status_t __init phys_efi_get_time(efi_time_t *tm, 238static int efi_set_rtc_mmss(unsigned long nowtime)
239 efi_time_cap_t *tc)
240{
241 unsigned long flags;
242 efi_status_t status;
243
244 spin_lock_irqsave(&rtc_lock, flags);
245 efi_call_phys_prelog();
246 status = efi_call_phys2(efi_phys.get_time, virt_to_phys(tm),
247 virt_to_phys(tc));
248 efi_call_phys_epilog();
249 spin_unlock_irqrestore(&rtc_lock, flags);
250 return status;
251}
252
253int efi_set_rtc_mmss(unsigned long nowtime)
254{ 239{
255 int real_seconds, real_minutes; 240 int real_seconds, real_minutes;
256 efi_status_t status; 241 efi_status_t status;
@@ -279,7 +264,7 @@ int efi_set_rtc_mmss(unsigned long nowtime)
279 return 0; 264 return 0;
280} 265}
281 266
282unsigned long efi_get_time(void) 267static unsigned long efi_get_time(void)
283{ 268{
284 efi_status_t status; 269 efi_status_t status;
285 efi_time_t eft; 270 efi_time_t eft;
@@ -635,18 +620,13 @@ static int __init efi_runtime_init(void)
635 } 620 }
636 /* 621 /*
637 * We will only need *early* access to the following 622 * We will only need *early* access to the following
638 * two EFI runtime services before set_virtual_address_map 623 * EFI runtime service before set_virtual_address_map
639 * is invoked. 624 * is invoked.
640 */ 625 */
641 efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
642 efi_phys.set_virtual_address_map = 626 efi_phys.set_virtual_address_map =
643 (efi_set_virtual_address_map_t *) 627 (efi_set_virtual_address_map_t *)
644 runtime->set_virtual_address_map; 628 runtime->set_virtual_address_map;
645 /* 629
646 * Make efi_get_time can be called before entering
647 * virtual mode.
648 */
649 efi.get_time = phys_efi_get_time;
650 early_iounmap(runtime, sizeof(efi_runtime_services_t)); 630 early_iounmap(runtime, sizeof(efi_runtime_services_t));
651 631
652 return 0; 632 return 0;
@@ -734,12 +714,10 @@ void __init efi_init(void)
734 efi_enabled = 0; 714 efi_enabled = 0;
735 return; 715 return;
736 } 716 }
737#ifdef CONFIG_X86_32
738 if (efi_native) { 717 if (efi_native) {
739 x86_platform.get_wallclock = efi_get_time; 718 x86_platform.get_wallclock = efi_get_time;
740 x86_platform.set_wallclock = efi_set_rtc_mmss; 719 x86_platform.set_wallclock = efi_set_rtc_mmss;
741 } 720 }
742#endif
743 721
744#if EFI_DEBUG 722#if EFI_DEBUG
745 print_efi_memmap(); 723 print_efi_memmap();
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 337aefbfb003..5e2308d9c6be 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -516,8 +516,6 @@ extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);
516extern int __init efi_uart_console_only (void); 516extern int __init efi_uart_console_only (void);
517extern void efi_initialize_iomem_resources(struct resource *code_resource, 517extern void efi_initialize_iomem_resources(struct resource *code_resource,
518 struct resource *data_resource, struct resource *bss_resource); 518 struct resource *data_resource, struct resource *bss_resource);
519extern unsigned long efi_get_time(void);
520extern int efi_set_rtc_mmss(unsigned long nowtime);
521extern void efi_reserve_boot_services(void); 519extern void efi_reserve_boot_services(void);
522extern struct efi_memory_map memmap; 520extern struct efi_memory_map memmap;
523 521
diff --git a/init/main.c b/init/main.c
index 9cf77ab138a6..ae70b647b4d9 100644
--- a/init/main.c
+++ b/init/main.c
@@ -461,6 +461,10 @@ static void __init mm_init(void)
461 percpu_init_late(); 461 percpu_init_late();
462 pgtable_cache_init(); 462 pgtable_cache_init();
463 vmalloc_init(); 463 vmalloc_init();
464#ifdef CONFIG_X86
465 if (efi_enabled)
466 efi_enter_virtual_mode();
467#endif
464} 468}
465 469
466asmlinkage void __init start_kernel(void) 470asmlinkage void __init start_kernel(void)
@@ -601,10 +605,6 @@ asmlinkage void __init start_kernel(void)
601 calibrate_delay(); 605 calibrate_delay();
602 pidmap_init(); 606 pidmap_init();
603 anon_vma_init(); 607 anon_vma_init();
604#ifdef CONFIG_X86
605 if (efi_enabled)
606 efi_enter_virtual_mode();
607#endif
608 thread_info_cache_init(); 608 thread_info_cache_init();
609 cred_init(); 609 cred_init();
610 fork_init(totalram_pages); 610 fork_init(totalram_pages);