Skip to content

Commit

Permalink
init: Don't proxy console= to earlycon
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Petr Mladek <[email protected]>
Tested-by: Petr Mladek <[email protected]>
Link: https://lore.kernel.org/r/20240911123507.v2.1.Id08823b2f848237ae90ce5c5fa7e027e97c33ad3@changeid
Signed-off-by: Petr Mladek <[email protected]>
  • Loading branch information
Raul E Rangel authored and pmladek committed Oct 1, 2024
1 parent c903327 commit 17b6557
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
23 changes: 23 additions & 0 deletions drivers/tty/serial/earlycon.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
5 changes: 1 addition & 4 deletions init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit 17b6557

Please sign in to comment.