123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- From 13263cb35e8fc82f15aad2c1091f2b05342fbe0f Mon Sep 17 00:00:00 2001
- From: Simon Glass <sjg@chromium.org>
- Date: Wed, 1 Nov 2023 12:04:42 -0600
- Subject: [PATCH 1/1] x86: serial: ns16550: Allow the UART to be silently
- disabled
- U-Boot normally requires a UART. When booting from coreboot it is
- sometimes just not available, e.g. when no sysinfo or DBG2 information
- is provided.
- In this case we need to continue running, since the display can be used.
- Add a flag to disable serial for this case.
- This allows U-Boot to start up and operation from the display, instead
- of hanging on start-up.
- This could perhaps be hidden behind a Kconfig option to reduce code
- size.
- Signed-off-by: Simon Glass <sjg@chromium.org>
- ---
- drivers/serial/ns16550.c | 17 +++++++++++++++--
- drivers/serial/serial_coreboot.c | 1 +
- include/ns16550.h | 1 +
- 3 files changed, 17 insertions(+), 2 deletions(-)
- diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
- index 6fcb5b523a..891124fc62 100644
- --- a/drivers/serial/ns16550.c
- +++ b/drivers/serial/ns16550.c
- @@ -384,6 +384,8 @@ static int ns16550_serial_putc(struct udevice *dev, const char ch)
- {
- struct ns16550 *const com_port = dev_get_priv(dev);
-
- + if (com_port->plat->flags & NS16550_FLAG_DISABLE)
- + return 0;
- if (!(serial_in(&com_port->lsr) & UART_LSR_THRE))
- return -EAGAIN;
- serial_out(ch, &com_port->thr);
- @@ -404,6 +406,9 @@ static int ns16550_serial_pending(struct udevice *dev, bool input)
- {
- struct ns16550 *const com_port = dev_get_priv(dev);
-
- + if (com_port->plat->flags & NS16550_FLAG_DISABLE)
- + return 0;
- +
- if (input)
- return (serial_in(&com_port->lsr) & UART_LSR_DR) ? 1 : 0;
- else
- @@ -414,6 +419,9 @@ static int ns16550_serial_getc(struct udevice *dev)
- {
- struct ns16550 *const com_port = dev_get_priv(dev);
-
- + if (com_port->plat->flags & NS16550_FLAG_DISABLE)
- + return 0;
- +
- if (!(serial_in(&com_port->lsr) & UART_LSR_DR))
- return -EAGAIN;
-
- @@ -428,7 +436,8 @@ static int ns16550_serial_setbrg(struct udevice *dev, int baudrate)
-
- clock_divisor = ns16550_calc_divisor(com_port, plat->clock, baudrate);
-
- - ns16550_setbrg(com_port, clock_divisor);
- + if (!(plat->flags & NS16550_FLAG_DISABLE))
- + ns16550_setbrg(com_port, clock_divisor);
-
- return 0;
- }
- @@ -441,6 +450,9 @@ static int ns16550_serial_setconfig(struct udevice *dev, uint serial_config)
- uint bits = SERIAL_GET_BITS(serial_config);
- uint stop = SERIAL_GET_STOP(serial_config);
-
- + if (com_port->plat->flags & NS16550_FLAG_DISABLE)
- + return 0;
- +
- /*
- * only parity config is implemented, check if other serial settings
- * are the default one.
- @@ -533,7 +545,8 @@ int ns16550_serial_probe(struct udevice *dev)
- reset_deassert_bulk(&reset_bulk);
-
- com_port->plat = dev_get_plat(dev);
- - ns16550_init(com_port, -1);
- + if (!(plat->flags & NS16550_FLAG_DISABLE))
- + ns16550_init(com_port, -1);
-
- return 0;
- }
- diff --git a/drivers/serial/serial_coreboot.c b/drivers/serial/serial_coreboot.c
- index b1f69f6998..a885809abd 100644
- --- a/drivers/serial/serial_coreboot.c
- +++ b/drivers/serial/serial_coreboot.c
- @@ -119,6 +119,7 @@ static int coreboot_of_to_plat(struct udevice *dev)
- * there is no UART, which may panic. So stay silent and
- * pray that the video console will work.
- */
- + plat->flags |= NS16550_FLAG_DISABLE;
- log_debug("Cannot detect UART\n");
- }
-
- diff --git a/include/ns16550.h b/include/ns16550.h
- index 7f48130008..3c4f3e7539 100644
- --- a/include/ns16550.h
- +++ b/include/ns16550.h
- @@ -52,6 +52,7 @@ enum ns16550_flags {
- NS16550_FLAG_IO = 1 << 0, /* Use I/O access (else mem-mapped) */
- NS16550_FLAG_ENDIAN = 1 << 1, /* Use out_le/be_32() */
- NS16550_FLAG_BE = 1 << 2, /* Big-endian access (else little) */
- + NS16550_FLAG_DISABLE = BIT(3), /* No output or input */
- };
-
- /**
- --
- 2.39.5
|