117 lines
3.7 KiB
Diff
117 lines
3.7 KiB
Diff
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
|
|
|