summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0056-serial-tegra-Use-port-lock-wrappers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0056-serial-tegra-Use-port-lock-wrappers.patch')
-rw-r--r--debian/patches-rt/0056-serial-tegra-Use-port-lock-wrappers.patch176
1 files changed, 176 insertions, 0 deletions
diff --git a/debian/patches-rt/0056-serial-tegra-Use-port-lock-wrappers.patch b/debian/patches-rt/0056-serial-tegra-Use-port-lock-wrappers.patch
new file mode 100644
index 0000000000..f53b521dc0
--- /dev/null
+++ b/debian/patches-rt/0056-serial-tegra-Use-port-lock-wrappers.patch
@@ -0,0 +1,176 @@
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Thu, 14 Sep 2023 20:44:13 +0206
+Subject: [PATCH 056/134] serial: tegra: Use port lock wrappers
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patches-6.6.7-rt18.tar.xz
+
+When a serial port is used for kernel console output, then all
+modifications to the UART registers which are done from other contexts,
+e.g. getty, termios, are interference points for the kernel console.
+
+So far this has been ignored and the printk output is based on the
+principle of hope. The rework of the console infrastructure which aims to
+support threaded and atomic consoles, requires to mark sections which
+modify the UART registers as unsafe. This allows the atomic write function
+to make informed decisions and eventually to restore operational state. It
+also allows to prevent the regular UART code from modifying UART registers
+while printk output is in progress.
+
+All modifications of UART registers are guarded by the UART port lock,
+which provides an obvious synchronization point with the console
+infrastructure.
+
+To avoid adding this functionality to all UART drivers, wrap the
+spin_[un]lock*() invocations for uart_port::lock into helper functions
+which just contain the spin_[un]lock*() invocations for now. In a
+subsequent step these helpers will gain the console synchronization
+mechanisms.
+
+Converted with coccinelle. No functional change.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Link: https://lore.kernel.org/r/20230914183831.587273-57-john.ogness@linutronix.de
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ drivers/tty/serial/serial-tegra.c | 32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+--- a/drivers/tty/serial/serial-tegra.c
++++ b/drivers/tty/serial/serial-tegra.c
+@@ -411,7 +411,7 @@ static int tegra_set_baudrate(struct teg
+ divisor = DIV_ROUND_CLOSEST(rate, baud * 16);
+ }
+
+- spin_lock_irqsave(&tup->uport.lock, flags);
++ uart_port_lock_irqsave(&tup->uport, &flags);
+ lcr = tup->lcr_shadow;
+ lcr |= UART_LCR_DLAB;
+ tegra_uart_write(tup, lcr, UART_LCR);
+@@ -424,7 +424,7 @@ static int tegra_set_baudrate(struct teg
+
+ /* Dummy read to ensure the write is posted */
+ tegra_uart_read(tup, UART_SCR);
+- spin_unlock_irqrestore(&tup->uport.lock, flags);
++ uart_port_unlock_irqrestore(&tup->uport, flags);
+
+ tup->current_baud = baud;
+
+@@ -522,13 +522,13 @@ static void tegra_uart_tx_dma_complete(v
+ dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
+ count = tup->tx_bytes_requested - state.residue;
+ async_tx_ack(tup->tx_dma_desc);
+- spin_lock_irqsave(&tup->uport.lock, flags);
++ uart_port_lock_irqsave(&tup->uport, &flags);
+ uart_xmit_advance(&tup->uport, count);
+ tup->tx_in_progress = 0;
+ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+ uart_write_wakeup(&tup->uport);
+ tegra_uart_start_next_tx(tup);
+- spin_unlock_irqrestore(&tup->uport.lock, flags);
++ uart_port_unlock_irqrestore(&tup->uport, flags);
+ }
+
+ static int tegra_uart_start_tx_dma(struct tegra_uart_port *tup,
+@@ -598,13 +598,13 @@ static unsigned int tegra_uart_tx_empty(
+ unsigned int ret = 0;
+ unsigned long flags;
+
+- spin_lock_irqsave(&u->lock, flags);
++ uart_port_lock_irqsave(u, &flags);
+ if (!tup->tx_in_progress) {
+ unsigned long lsr = tegra_uart_read(tup, UART_LSR);
+ if ((lsr & TX_EMPTY_STATUS) == TX_EMPTY_STATUS)
+ ret = TIOCSER_TEMT;
+ }
+- spin_unlock_irqrestore(&u->lock, flags);
++ uart_port_unlock_irqrestore(u, flags);
+ return ret;
+ }
+
+@@ -727,7 +727,7 @@ static void tegra_uart_rx_dma_complete(v
+ struct dma_tx_state state;
+ enum dma_status status;
+
+- spin_lock_irqsave(&u->lock, flags);
++ uart_port_lock_irqsave(u, &flags);
+
+ status = dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
+
+@@ -749,7 +749,7 @@ static void tegra_uart_rx_dma_complete(v
+ set_rts(tup, true);
+
+ done:
+- spin_unlock_irqrestore(&u->lock, flags);
++ uart_port_unlock_irqrestore(u, flags);
+ }
+
+ static void tegra_uart_terminate_rx_dma(struct tegra_uart_port *tup)
+@@ -836,7 +836,7 @@ static irqreturn_t tegra_uart_isr(int ir
+ bool is_rx_int = false;
+ unsigned long flags;
+
+- spin_lock_irqsave(&u->lock, flags);
++ uart_port_lock_irqsave(u, &flags);
+ while (1) {
+ iir = tegra_uart_read(tup, UART_IIR);
+ if (iir & UART_IIR_NO_INT) {
+@@ -852,7 +852,7 @@ static irqreturn_t tegra_uart_isr(int ir
+ } else if (is_rx_start) {
+ tegra_uart_start_rx_dma(tup);
+ }
+- spin_unlock_irqrestore(&u->lock, flags);
++ uart_port_unlock_irqrestore(u, flags);
+ return IRQ_HANDLED;
+ }
+
+@@ -969,11 +969,11 @@ static void tegra_uart_hw_deinit(struct
+ }
+ }
+
+- spin_lock_irqsave(&tup->uport.lock, flags);
++ uart_port_lock_irqsave(&tup->uport, &flags);
+ /* Reset the Rx and Tx FIFOs */
+ tegra_uart_fifo_reset(tup, UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);
+ tup->current_baud = 0;
+- spin_unlock_irqrestore(&tup->uport.lock, flags);
++ uart_port_unlock_irqrestore(&tup->uport, flags);
+
+ tup->rx_in_progress = 0;
+ tup->tx_in_progress = 0;
+@@ -1292,7 +1292,7 @@ static void tegra_uart_set_termios(struc
+ int ret;
+
+ max_divider *= 16;
+- spin_lock_irqsave(&u->lock, flags);
++ uart_port_lock_irqsave(u, &flags);
+
+ /* Changing configuration, it is safe to stop any rx now */
+ if (tup->rts_active)
+@@ -1341,7 +1341,7 @@ static void tegra_uart_set_termios(struc
+ baud = uart_get_baud_rate(u, termios, oldtermios,
+ parent_clk_rate/max_divider,
+ parent_clk_rate/16);
+- spin_unlock_irqrestore(&u->lock, flags);
++ uart_port_unlock_irqrestore(u, flags);
+ ret = tegra_set_baudrate(tup, baud);
+ if (ret < 0) {
+ dev_err(tup->uport.dev, "Failed to set baud rate\n");
+@@ -1349,7 +1349,7 @@ static void tegra_uart_set_termios(struc
+ }
+ if (tty_termios_baud_rate(termios))
+ tty_termios_encode_baud_rate(termios, baud, baud);
+- spin_lock_irqsave(&u->lock, flags);
++ uart_port_lock_irqsave(u, &flags);
+
+ /* Flow control */
+ if (termios->c_cflag & CRTSCTS) {
+@@ -1382,7 +1382,7 @@ static void tegra_uart_set_termios(struc
+ if (termios->c_iflag & IGNBRK)
+ tup->uport.ignore_status_mask |= UART_LSR_BI;
+
+- spin_unlock_irqrestore(&u->lock, flags);
++ uart_port_unlock_irqrestore(u, flags);
+ }
+
+ static const char *tegra_uart_type(struct uart_port *u)