mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
efi: earlycon: Reprobe after parsing config tables
Commit732ea9db9d
("efi: libstub: Move screen_info handling to common code") reorganized the earlycon handling so that all architectures pass the screen_info data via a EFI config table instead of populating struct screen_info directly, as the latter is only possible when the EFI stub is baked into the kernel (and not into the decompressor). However, this means that struct screen_info may not have been populated yet by the time the earlycon probe takes place, and this results in a non-functional early console. So let's probe again right after parsing the config tables and populating struct screen_info. Note that this means that earlycon output starts a bit later than before, and so it may fail to capture issues that occur while doing the early EFI initialization. Fixes:732ea9db9d
("efi: libstub: Move screen_info handling to common code") Reported-by: Shawn Guo <shawn.guo@linaro.org> Tested-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
3c66bb1918
commit
8b3a149db4
@ -215,6 +215,14 @@ efi_earlycon_write(struct console *con, const char *str, unsigned int num)
|
||||
}
|
||||
}
|
||||
|
||||
static bool __initdata fb_probed;
|
||||
|
||||
void __init efi_earlycon_reprobe(void)
|
||||
{
|
||||
if (fb_probed)
|
||||
setup_earlycon("efifb");
|
||||
}
|
||||
|
||||
static int __init efi_earlycon_setup(struct earlycon_device *device,
|
||||
const char *opt)
|
||||
{
|
||||
@ -222,15 +230,17 @@ static int __init efi_earlycon_setup(struct earlycon_device *device,
|
||||
u16 xres, yres;
|
||||
u32 i;
|
||||
|
||||
if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
|
||||
fb_wb = opt && !strcmp(opt, "ram");
|
||||
|
||||
if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI) {
|
||||
fb_probed = true;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
fb_base = screen_info.lfb_base;
|
||||
if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
|
||||
fb_base |= (u64)screen_info.ext_lfb_base << 32;
|
||||
|
||||
fb_wb = opt && !strcmp(opt, "ram");
|
||||
|
||||
si = &screen_info;
|
||||
xres = si->lfb_width;
|
||||
yres = si->lfb_height;
|
||||
|
@ -72,6 +72,9 @@ static void __init init_screen_info(void)
|
||||
if (memblock_is_map_memory(screen_info.lfb_base))
|
||||
memblock_mark_nomap(screen_info.lfb_base,
|
||||
screen_info.lfb_size);
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_EARLYCON))
|
||||
efi_earlycon_reprobe();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -693,6 +693,7 @@ efi_guid_to_str(efi_guid_t *guid, char *out)
|
||||
}
|
||||
|
||||
extern void efi_init (void);
|
||||
extern void efi_earlycon_reprobe(void);
|
||||
#ifdef CONFIG_EFI
|
||||
extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user