diff options
Diffstat (limited to 'config')
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 + |