[PATCH] console: Prefer currently selected serial console as stdio device
Simon Glass
sjg at chromium.org
Mon Mar 16 03:44:03 CET 2026
Hi Marek,
On Sun, 15 Mar 2026 at 17:53, Marek Vasut
<marek.vasut+renesas at mailbox.org> wrote:
>
> Adjust the scan for default console stdio device to prefer the
> currently selected serial device. This is useful in combination
> with CONFIG_SERIAL_PROBE_ALL=y, in which case the system would
> instantiate all serial devices as stdio devices in the order in
> which they are listed in control DT. The currently selected serial
> device may not be the first device listed in DT, in which case the
> current console_init_r() implementation unexpectedly switches to
> another serial console after listing stderr using "Err:" line, and
> just before showing U-Boot shell, which is not the desired behavior.
>
> The scan runs twice. The first round looks up the current serial
> console device and tests whether it is suitable as a console. If
> yes, then the scanning ends, otherwise the second round starts.
> The second round of scanning simply picks up the first suitable
> console device.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Alexander Sverdlin <alexander.sverdlin at siemens.com>
> Cc: Andre Przywara <andre.przywara at arm.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: u-boot at lists.denx.de
> ---
> common/console.c | 38 ++++++++++++++++++++++++++++----------
> 1 file changed, 28 insertions(+), 10 deletions(-)
>
> diff --git a/common/console.c b/common/console.c
> index 48586fd2166..3de53c66094 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -1208,17 +1208,35 @@ int console_init_r(void)
> outputdev = console_search_dev (DEV_FLAGS_OUTPUT, "serial");
> }
>
> - /* Scan devices looking for input and output devices */
> - list_for_each(pos, list) {
> - dev = list_entry(pos, struct stdio_dev, list);
> -
> - if ((dev->flags & DEV_FLAGS_INPUT) && (inputdev == NULL)) {
> - inputdev = dev;
> - }
> - if ((dev->flags & DEV_FLAGS_OUTPUT) && (outputdev == NULL)) {
> - outputdev = dev;
> + /*
> + * Scan devices looking for input and output devices.
> + * The scan runs twice. The first round looks up the current
> + * serial console device and tests whether it is suitable as
> + * a console. If yes, then the scanning ends, otherwise the
> + * second round starts. The second round of scanning simply
> + * picks up the first suitable console device. This scanning
> + * method allows retaining the currently selected serial
> + * console, especially in case DM contains multiple suitable
> + * serial consoles and the currently selected one is not the
> + * first stdio device in the list.
> + */
> + for (i = 0; i < 1; i++) {
It looks like it only runs once? Is this the loop you are referring to?
> + list_for_each(pos, list) {
> + dev = list_entry(pos, struct stdio_dev, list);
> + if (!i && dev->priv != gd->cur_serial_dev)
> + continue;
> +
> + if ((dev->flags & DEV_FLAGS_INPUT) && (inputdev == NULL)) {
!inputdev
> + inputdev = dev;
> + }
> + if ((dev->flags & DEV_FLAGS_OUTPUT) && (outputdev == NULL)) {
> + outputdev = dev;
> + }
> + if (inputdev && outputdev)
> + break;
> }
> - if(inputdev && outputdev)
> +
> + if (inputdev && outputdev)
> break;
> }
I think you could have a function like is_suitable(), call it on
gd->cur_serial_dev and then go into the loop failing that. It might
give smaller code and avoid the extra loop.
>
> --
> 2.51.0
>
Regards,
Simon
More information about the U-Boot
mailing list