diff options
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 + | 
