mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 04:04:26 +08:00
init: Don't proxy console=
to earlycon
Today we are proxying the `console=` command line args to the `param_setup_earlycon()` handler. This is done because the following are equivalent: console=uart[8250],mmio,<addr>[,options] earlycon=uart[8250],mmio,<addr>[,options] Both invocations enable an early `bootconsole`. `console=uartXXXX` is just an alias for `earlycon=uartXXXX`. In addition, when `earlycon=` (empty value) or just `earlycon` (no value) is specified on the command line, we enable the earlycon `bootconsole` specified by the SPCR table or the DT. The problem arises when `console=` (empty value) is specified on the command line. It's intention is to disable the `console`, but what happens instead is that the SPRC/DT console gets enabled. This happens because we are proxying the `console=` (empty value) parameter to the `earlycon` handler. The `earlycon` handler then sees that the parameter value is empty, so it enables the SPCR/DT `bootconsole`. This change makes it so that the `console` or `console=` parameters no longer enable the SPCR/DT `bootconsole`. I also cleans up the hack in `main.c` that would forward the `console` parameter to the `earlycon` handler. Signed-off-by: Raul E Rangel <rrangel@chromium.org> Reviewed-by: Petr Mladek <pmladek@suse.com> Tested-by: Petr Mladek <pmladek@suse.com> Link: https://lore.kernel.org/r/20240911123507.v2.1.Id08823b2f848237ae90ce5c5fa7e027e97c33ad3@changeid Signed-off-by: Petr Mladek <pmladek@suse.com>
This commit is contained in:
parent
c903327d32
commit
17b655759e
@ -248,6 +248,29 @@ static int __init param_setup_earlycon(char *buf)
|
||||
}
|
||||
early_param("earlycon", param_setup_earlycon);
|
||||
|
||||
/*
|
||||
* The `console` parameter is overloaded. It's handled here as an early param
|
||||
* and in `printk.c` as a late param. It's possible to specify an early
|
||||
* `bootconsole` using `earlycon=uartXXXX` (handled above), or via
|
||||
* the `console=uartXXX` alias. See the comment in `8250_early.c`.
|
||||
*/
|
||||
static int __init param_setup_earlycon_console_alias(char *buf)
|
||||
{
|
||||
/*
|
||||
* A plain `console` parameter must not enable the SPCR `bootconsole`
|
||||
* like a plain `earlycon` does.
|
||||
*
|
||||
* A `console=` parameter that specifies an empty value is used to
|
||||
* disable the `console`, not the `earlycon` `bootconsole`. The
|
||||
* disabling of the `console` is handled by `printk.c`.
|
||||
*/
|
||||
if (!buf || !buf[0])
|
||||
return 0;
|
||||
|
||||
return param_setup_earlycon(buf);
|
||||
}
|
||||
early_param("console", param_setup_earlycon_console_alias);
|
||||
|
||||
#ifdef CONFIG_OF_EARLY_FLATTREE
|
||||
|
||||
int __init of_setup_earlycon(const struct earlycon_id *match,
|
||||
|
@ -754,10 +754,7 @@ static int __init do_early_param(char *param, char *val,
|
||||
const struct obs_kernel_param *p;
|
||||
|
||||
for (p = __setup_start; p < __setup_end; p++) {
|
||||
if ((p->early && parameq(param, p->str)) ||
|
||||
(strcmp(param, "console") == 0 &&
|
||||
strcmp(p->str, "earlycon") == 0)
|
||||
) {
|
||||
if (p->early && parameq(param, p->str)) {
|
||||
if (p->setup_func(val) != 0)
|
||||
pr_warn("Malformed early option '%s'\n", param);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user