summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0009-serial-core-Introduce-wrapper-to-set-uart_port-cons.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0009-serial-core-Introduce-wrapper-to-set-uart_port-cons.patch')
-rw-r--r--debian/patches-rt/0009-serial-core-Introduce-wrapper-to-set-uart_port-cons.patch116
1 files changed, 116 insertions, 0 deletions
diff --git a/debian/patches-rt/0009-serial-core-Introduce-wrapper-to-set-uart_port-cons.patch b/debian/patches-rt/0009-serial-core-Introduce-wrapper-to-set-uart_port-cons.patch
new file mode 100644
index 0000000000..68106c6e89
--- /dev/null
+++ b/debian/patches-rt/0009-serial-core-Introduce-wrapper-to-set-uart_port-cons.patch
@@ -0,0 +1,116 @@
+From: John Ogness <john.ogness@linutronix.de>
+Date: Wed, 17 Apr 2024 12:13:24 +0000
+Subject: [PATCH 09/46] serial: core: Introduce wrapper to set @uart_port->cons
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.9/older/patches-6.9-rt5.tar.xz
+
+Introduce uart_port_set_cons() as a wrapper to set @cons of a
+uart_port. The wrapper sets @cons under the port lock in order
+to prevent @cons from disappearing while another context is
+holding the port lock. This is necessary for a follow-up
+commit relating to the port lock wrappers, which rely on @cons
+not changing between lock and unlock.
+
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ drivers/tty/serial/8250/8250_core.c | 6 +++---
+ drivers/tty/serial/amba-pl011.c | 2 +-
+ drivers/tty/serial/serial_core.c | 16 ++++++++--------
+ include/linux/serial_core.h | 17 +++++++++++++++++
+ 4 files changed, 29 insertions(+), 12 deletions(-)
+
+--- a/drivers/tty/serial/8250/8250_core.c
++++ b/drivers/tty/serial/8250/8250_core.c
+@@ -627,11 +627,11 @@ static int univ8250_console_setup(struct
+
+ port = &serial8250_ports[co->index].port;
+ /* link port to console */
+- port->cons = co;
++ uart_port_set_cons(port, co);
+
+ retval = serial8250_console_setup(port, options, false);
+ if (retval != 0)
+- port->cons = NULL;
++ uart_port_set_cons(port, NULL);
+ return retval;
+ }
+
+@@ -689,7 +689,7 @@ static int univ8250_console_match(struct
+ continue;
+
+ co->index = i;
+- port->cons = co;
++ uart_port_set_cons(port, co);
+ return serial8250_console_setup(port, options, true);
+ }
+
+--- a/drivers/tty/serial/amba-pl011.c
++++ b/drivers/tty/serial/amba-pl011.c
+@@ -2488,7 +2488,7 @@ static int pl011_console_match(struct co
+ continue;
+
+ co->index = i;
+- port->cons = co;
++ uart_port_set_cons(port, co);
+ return pl011_console_setup(co, options);
+ }
+
+--- a/drivers/tty/serial/serial_core.c
++++ b/drivers/tty/serial/serial_core.c
+@@ -3172,8 +3172,15 @@ static int serial_core_add_one_port(stru
+ state->uart_port = uport;
+ uport->state = state;
+
++ /*
++ * If this port is in use as a console then the spinlock is already
++ * initialised.
++ */
++ if (!uart_console_registered(uport))
++ uart_port_spin_lock_init(uport);
++
+ state->pm_state = UART_PM_STATE_UNDEFINED;
+- uport->cons = drv->cons;
++ uart_port_set_cons(uport, drv->cons);
+ uport->minor = drv->tty_driver->minor_start + uport->line;
+ uport->name = kasprintf(GFP_KERNEL, "%s%d", drv->dev_name,
+ drv->tty_driver->name_base + uport->line);
+@@ -3182,13 +3189,6 @@ static int serial_core_add_one_port(stru
+ goto out;
+ }
+
+- /*
+- * If this port is in use as a console then the spinlock is already
+- * initialised.
+- */
+- if (!uart_console_registered(uport))
+- uart_port_spin_lock_init(uport);
+-
+ if (uport->cons && uport->dev)
+ of_console_check(uport->dev->of_node, uport->cons->name, uport->line);
+
+--- a/include/linux/serial_core.h
++++ b/include/linux/serial_core.h
+@@ -610,6 +610,23 @@ static inline void __uart_port_unlock_ir
+ }
+
+ /**
++ * uart_port_set_cons - Safely set the @cons field for a uart
++ * @up: The uart port to set
++ * @con: The new console to set to
++ *
++ * This function must be used to set @up->cons. It uses the port lock to
++ * synchronize with the port lock wrappers in order to ensure that the console
++ * cannot change or disappear while another context is holding the port lock.
++ */
++static inline void uart_port_set_cons(struct uart_port *up, struct console *con)
++{
++ unsigned long flags;
++
++ __uart_port_lock_irqsave(up, &flags);
++ up->cons = con;
++ __uart_port_unlock_irqrestore(up, flags);
++}
++/**
+ * uart_port_lock - Lock the UART port
+ * @up: Pointer to UART port structure
+ */