summaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/u-boot/x86/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch116
-rw-r--r--config/u-boot/x86_64/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch116
2 files changed, 232 insertions, 0 deletions
diff --git a/config/u-boot/x86/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch b/config/u-boot/x86/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch
new file mode 100644
index 00000000..e3969d03
--- /dev/null
+++ b/config/u-boot/x86/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch
@@ -0,0 +1,116 @@
+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
+
diff --git a/config/u-boot/x86_64/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch b/config/u-boot/x86_64/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch
new file mode 100644
index 00000000..e3969d03
--- /dev/null
+++ b/config/u-boot/x86_64/patches/0001-x86-serial-ns16550-Allow-the-UART-to-be-silently-dis.patch
@@ -0,0 +1,116 @@
+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
+