forked from Minki/linux
earlycon: prevent multiple register_console()
If the earlycon parameter is given twice, the kernel will spit out a WARN() in register_console() because it was already registered. The non-dt variant setup_earlycon() already handles that gracefully. The dt variant of_setup_earlycon() doesn't. Add the check there and add the -EALREADY handling in early_init_dt_scan_chosen_stdout(). FWIW, this doesn't happen if CONFIG_ACPI_SPCR_TABLE is set. In that case the registration is delayed until after earlycon parameter(s) are parsed. Reviewed-by: Rob Herring <robh@kernel.org> Signed-off-by: Michael Walle <michael@walle.cc> Link: https://lore.kernel.org/r/20220628120705.200617-1-michael@walle.cc Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b9491b2e45
commit
65e20e8cbb
@ -1025,6 +1025,7 @@ int __init early_init_dt_scan_chosen_stdout(void)
|
||||
int l;
|
||||
const struct earlycon_id *match;
|
||||
const void *fdt = initial_boot_params;
|
||||
int ret;
|
||||
|
||||
offset = fdt_path_offset(fdt, "/chosen");
|
||||
if (offset < 0)
|
||||
@ -1057,7 +1058,8 @@ int __init early_init_dt_scan_chosen_stdout(void)
|
||||
if (fdt_node_check_compatible(fdt, offset, match->compatible))
|
||||
continue;
|
||||
|
||||
if (of_setup_earlycon(match, offset, options) == 0)
|
||||
ret = of_setup_earlycon(match, offset, options);
|
||||
if (!ret || ret == -EALREADY)
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
|
@ -253,6 +253,9 @@ int __init of_setup_earlycon(const struct earlycon_id *match,
|
||||
bool big_endian;
|
||||
u64 addr;
|
||||
|
||||
if (early_con.flags & CON_ENABLED)
|
||||
return -EALREADY;
|
||||
|
||||
spin_lock_init(&port->lock);
|
||||
port->iotype = UPIO_MEM;
|
||||
addr = of_flat_dt_translate_address(node);
|
||||
|
Loading…
Reference in New Issue
Block a user