From 127ca6582a90567ded4fa6168c1582d2d5ac37f0 Mon Sep 17 00:00:00 2001 From: Eric Snowberg Date: Wed, 10 May 2017 07:50:11 -0700 Subject: [PATCH] sparc64: /sys/firmware/efi missing during EFI boot The newest version of OBP is capable of doing an EFI boot. When Linux is booted thru this EFI loader, the /sys/firmware/efi directory does not exist. Many userspace applications, such as GRUB, check whether the dir /sys/firmware/efi exists, if it exists it means the kernel has booted in EFI mode. A new Open Firmware property called efi-booter has been added to /chosen. This new property is only present when doing an EFI boot. Signed-off-by: Eric Snowberg Reviewed-by Thomas Tai Orabug: 26037358 Signed-off-by: Allen Pais --- arch/sparc/Kconfig | 4 ++++ arch/sparc/kernel/setup_64.c | 16 ++++++++++++++++ drivers/firmware/efi/efi.c | 2 ++ 3 files changed, 22 insertions(+) diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index d7e04608a4d5e..33b47002d4ab7 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -125,6 +125,10 @@ config AUDIT_ARCH config HAVE_SETUP_PER_CPU_AREA def_bool y if SPARC64 +config EFI + def_bool y if SPARC64 + select UCS2_STRING + config NEED_PER_CPU_EMBED_FIRST_CHUNK def_bool y if SPARC64 diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 9e86df09a8e4a..8e28a813cef2a 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -662,6 +663,19 @@ void __init alloc_irqstack_bootmem(void) } } +void __init sparc_efi_init(void) +{ +#ifdef CONFIG_EFI + phandle node; + + node = prom_finddevice("/chosen"); + if (prom_getproplen(node, "efi-booter") > 0) { + set_bit(EFI_BOOT, &efi.flags); + set_bit(EFI_64BIT, &efi.flags); + } +#endif +} + void __init setup_arch(char **cmdline_p) { /* Initialize PROM console and command line. */ @@ -717,6 +731,8 @@ void __init setup_arch(char **cmdline_p) } #endif + sparc_efi_init(); + /* Get boot processor trap_block[] setup. */ init_cur_cpu_trap(current_thread_info()); diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index 63226e9036a15..a859e576ed46c 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c @@ -339,6 +339,7 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz, return 0; } +#ifndef CONFIG_SPARC int __init efi_config_init(efi_config_table_type_t *arch_tables) { void *config_tables; @@ -365,6 +366,7 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables) early_memunmap(config_tables, efi.systab->nr_tables * sz); return ret; } +#endif #ifdef CONFIG_EFI_VARS_MODULE static int __init efi_load_efivars(void) -- 2.50.1