Commit 65e20e8c authored by Michael Walle's avatar Michael Walle Committed by Greg Kroah-Hartman
Browse files

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: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarMichael Walle <michael@walle.cc>
Link: https://lore.kernel.org/r/20220628120705.200617-1-michael@walle.cc


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b9491b2e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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);