Commit b8466fe8 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman

efi: move screen_info into efi init code

After the vga console no longer relies on global screen_info, there are
only two remaining use cases:

 - on the x86 architecture, it is used for multiple boot methods
   (bzImage, EFI, Xen, kexec) to commucate the initial VGA or framebuffer
   settings to a number of device drivers.

 - on other architectures, it is only used as part of the EFI stub,
   and only for the three sysfb framebuffers (simpledrm, simplefb, efifb).

Remove the duplicate data structure definitions by moving it into the
efi-init.c file that sets it up initially for the EFI case, leaving x86
as an exception that retains its own definition for non-EFI boots.

The added #ifdefs here are optional, I added them to further limit the
reach of screen_info to configurations that have at least one of the
users enabled.
Reviewed-by: default avatarArd Biesheuvel <ardb@kernel.org>
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Acked-by: default avatarHelge Deller <deller@gmx.de>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20231017093947.3627976-1-arnd@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1e3c8526
...@@ -71,10 +71,6 @@ static __init pteval_t create_mapping_protection(efi_memory_desc_t *md) ...@@ -71,10 +71,6 @@ static __init pteval_t create_mapping_protection(efi_memory_desc_t *md)
return pgprot_val(PAGE_KERNEL_EXEC); return pgprot_val(PAGE_KERNEL_EXEC);
} }
/* we will fill this structure from the stub, so don't put it in .bss */
struct screen_info screen_info __section(".data");
EXPORT_SYMBOL(screen_info);
int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md) int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md)
{ {
pteval_t prot_val = create_mapping_protection(md); pteval_t prot_val = create_mapping_protection(md);
......
...@@ -27,7 +27,9 @@ PROVIDE(__efistub__text = _text); ...@@ -27,7 +27,9 @@ PROVIDE(__efistub__text = _text);
PROVIDE(__efistub__end = _end); PROVIDE(__efistub__end = _end);
PROVIDE(__efistub___inittext_end = __inittext_end); PROVIDE(__efistub___inittext_end = __inittext_end);
PROVIDE(__efistub__edata = _edata); PROVIDE(__efistub__edata = _edata);
#if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB)
PROVIDE(__efistub_screen_info = screen_info); PROVIDE(__efistub_screen_info = screen_info);
#endif
PROVIDE(__efistub__ctype = _ctype); PROVIDE(__efistub__ctype = _ctype);
PROVIDE(__pi___memcpy = __pi_memcpy); PROVIDE(__pi___memcpy = __pi_memcpy);
......
...@@ -68,6 +68,11 @@ void __init efi_runtime_init(void) ...@@ -68,6 +68,11 @@ void __init efi_runtime_init(void)
unsigned long __initdata screen_info_table = EFI_INVALID_TABLE_ADDR; unsigned long __initdata screen_info_table = EFI_INVALID_TABLE_ADDR;
#if defined(CONFIG_SYSFB) || defined(CONFIG_EFI_EARLYCON)
struct screen_info screen_info __section(".data");
EXPORT_SYMBOL_GPL(screen_info);
#endif
static void __init init_screen_info(void) static void __init init_screen_info(void)
{ {
struct screen_info *si; struct screen_info *si;
...@@ -115,7 +120,8 @@ void __init efi_init(void) ...@@ -115,7 +120,8 @@ void __init efi_init(void)
set_bit(EFI_CONFIG_TABLES, &efi.flags); set_bit(EFI_CONFIG_TABLES, &efi.flags);
init_screen_info(); if (IS_ENABLED(CONFIG_EFI_EARLYCON) || IS_ENABLED(CONFIG_SYSFB))
init_screen_info();
if (boot_memmap == EFI_INVALID_TABLE_ADDR) if (boot_memmap == EFI_INVALID_TABLE_ADDR)
return; return;
......
...@@ -12,7 +12,9 @@ __efistub_kernel_entry = kernel_entry; ...@@ -12,7 +12,9 @@ __efistub_kernel_entry = kernel_entry;
__efistub_kernel_asize = kernel_asize; __efistub_kernel_asize = kernel_asize;
__efistub_kernel_fsize = kernel_fsize; __efistub_kernel_fsize = kernel_fsize;
__efistub_kernel_offset = kernel_offset; __efistub_kernel_offset = kernel_offset;
#if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB)
__efistub_screen_info = screen_info; __efistub_screen_info = screen_info;
#endif
#endif #endif
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/efi.h> #include <linux/efi.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/screen_info.h>
#include <linux/memblock.h> #include <linux/memblock.h>
#include <linux/initrd.h> #include <linux/initrd.h>
#include <linux/ioport.h> #include <linux/ioport.h>
...@@ -57,10 +56,6 @@ ...@@ -57,10 +56,6 @@
#define SMBIOS_CORE_PACKAGE_OFFSET 0x23 #define SMBIOS_CORE_PACKAGE_OFFSET 0x23
#define LOONGSON_EFI_ENABLE (1 << 3) #define LOONGSON_EFI_ENABLE (1 << 3)
#ifdef CONFIG_EFI
struct screen_info screen_info __section(".data");
#endif
unsigned long fw_arg0, fw_arg1, fw_arg2; unsigned long fw_arg0, fw_arg1, fw_arg2;
DEFINE_PER_CPU(unsigned long, kernelsp); DEFINE_PER_CPU(unsigned long, kernelsp);
struct cpuinfo_loongarch cpu_data[NR_CPUS] __read_mostly; struct cpuinfo_loongarch cpu_data[NR_CPUS] __read_mostly;
......
...@@ -28,7 +28,9 @@ __efistub__start_kernel = _start_kernel; ...@@ -28,7 +28,9 @@ __efistub__start_kernel = _start_kernel;
__efistub__end = _end; __efistub__end = _end;
__efistub__edata = _edata; __efistub__edata = _edata;
__efistub___init_text_end = __init_text_end; __efistub___init_text_end = __init_text_end;
#if defined(CONFIG_EFI_EARLYCON) || defined(CONFIG_SYSFB)
__efistub_screen_info = screen_info; __efistub_screen_info = screen_info;
#endif
#endif #endif
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include <linux/memblock.h> #include <linux/memblock.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/console.h> #include <linux/console.h>
#include <linux/screen_info.h>
#include <linux/of_fdt.h> #include <linux/of_fdt.h>
#include <linux/sched/task.h> #include <linux/sched/task.h>
#include <linux/smp.h> #include <linux/smp.h>
...@@ -40,10 +39,6 @@ ...@@ -40,10 +39,6 @@
#include "head.h" #include "head.h"
#if defined(CONFIG_EFI)
struct screen_info screen_info __section(".data");
#endif
/* /*
* The lucky hart to first increment this variable will boot the other cores. * The lucky hart to first increment this variable will boot the other cores.
* This is used before the kernel initializes the BSS so it can't be in the * This is used before the kernel initializes the BSS so it can't be in the
......
...@@ -55,6 +55,15 @@ static phys_addr_t __init efi_to_phys(unsigned long addr) ...@@ -55,6 +55,15 @@ static phys_addr_t __init efi_to_phys(unsigned long addr)
extern __weak const efi_config_table_type_t efi_arch_tables[]; extern __weak const efi_config_table_type_t efi_arch_tables[];
/*
* x86 defines its own screen_info and uses it even without EFI,
* everything else can get it from here.
*/
#if !defined(CONFIG_X86) && (defined(CONFIG_SYSFB) || defined(CONFIG_EFI_EARLYCON))
struct screen_info screen_info __section(".data");
EXPORT_SYMBOL_GPL(screen_info);
#endif
static void __init init_screen_info(void) static void __init init_screen_info(void)
{ {
struct screen_info *si; struct screen_info *si;
...@@ -240,5 +249,8 @@ void __init efi_init(void) ...@@ -240,5 +249,8 @@ void __init efi_init(void)
memblock_reserve(data.phys_map & PAGE_MASK, memblock_reserve(data.phys_map & PAGE_MASK,
PAGE_ALIGN(data.size + (data.phys_map & ~PAGE_MASK))); PAGE_ALIGN(data.size + (data.phys_map & ~PAGE_MASK)));
init_screen_info(); if (IS_ENABLED(CONFIG_X86) ||
IS_ENABLED(CONFIG_SYSFB) ||
IS_ENABLED(CONFIG_EFI_EARLYCON))
init_screen_info();
} }
...@@ -13,7 +13,13 @@ struct screen_info *alloc_screen_info(void) ...@@ -13,7 +13,13 @@ struct screen_info *alloc_screen_info(void)
{ {
if (IS_ENABLED(CONFIG_ARM)) if (IS_ENABLED(CONFIG_ARM))
return __alloc_screen_info(); return __alloc_screen_info();
return (void *)&screen_info + screen_info_offset;
if (IS_ENABLED(CONFIG_X86) ||
IS_ENABLED(CONFIG_EFI_EARLYCON) ||
IS_ENABLED(CONFIG_SYSFB))
return (void *)&screen_info + screen_info_offset;
return NULL;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment