summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0074-serial-xilinx_uartps-Use-port-lock-wrappers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0074-serial-xilinx_uartps-Use-port-lock-wrappers.patch')
-rw-r--r--debian/patches-rt/0074-serial-xilinx_uartps-Use-port-lock-wrappers.patch276
1 files changed, 276 insertions, 0 deletions
diff --git a/debian/patches-rt/0074-serial-xilinx_uartps-Use-port-lock-wrappers.patch b/debian/patches-rt/0074-serial-xilinx_uartps-Use-port-lock-wrappers.patch
new file mode 100644
index 000000000..307ee6df7
--- /dev/null
+++ b/debian/patches-rt/0074-serial-xilinx_uartps-Use-port-lock-wrappers.patch
@@ -0,0 +1,276 @@
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Thu, 14 Sep 2023 20:44:31 +0206
+Subject: [PATCH 074/134] serial: xilinx_uartps: 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-75-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/xilinx_uartps.c | 56 ++++++++++++++++++-------------------
+ 1 file changed, 28 insertions(+), 28 deletions(-)
+
+--- a/drivers/tty/serial/xilinx_uartps.c
++++ b/drivers/tty/serial/xilinx_uartps.c
+@@ -346,7 +346,7 @@ static irqreturn_t cdns_uart_isr(int irq
+ struct uart_port *port = (struct uart_port *)dev_id;
+ unsigned int isrstatus;
+
+- spin_lock(&port->lock);
++ uart_port_lock(port);
+
+ /* Read the interrupt status register to determine which
+ * interrupt(s) is/are active and clear them.
+@@ -369,7 +369,7 @@ static irqreturn_t cdns_uart_isr(int irq
+ !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS))
+ cdns_uart_handle_rx(dev_id, isrstatus);
+
+- spin_unlock(&port->lock);
++ uart_port_unlock(port);
+ return IRQ_HANDLED;
+ }
+
+@@ -506,14 +506,14 @@ static int cdns_uart_clk_notifier_cb(str
+ return NOTIFY_BAD;
+ }
+
+- spin_lock_irqsave(&cdns_uart->port->lock, flags);
++ uart_port_lock_irqsave(cdns_uart->port, &flags);
+
+ /* Disable the TX and RX to set baud rate */
+ ctrl_reg = readl(port->membase + CDNS_UART_CR);
+ ctrl_reg |= CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS;
+ writel(ctrl_reg, port->membase + CDNS_UART_CR);
+
+- spin_unlock_irqrestore(&cdns_uart->port->lock, flags);
++ uart_port_unlock_irqrestore(cdns_uart->port, flags);
+
+ return NOTIFY_OK;
+ }
+@@ -523,7 +523,7 @@ static int cdns_uart_clk_notifier_cb(str
+ * frequency.
+ */
+
+- spin_lock_irqsave(&cdns_uart->port->lock, flags);
++ uart_port_lock_irqsave(cdns_uart->port, &flags);
+
+ locked = 1;
+ port->uartclk = ndata->new_rate;
+@@ -533,7 +533,7 @@ static int cdns_uart_clk_notifier_cb(str
+ fallthrough;
+ case ABORT_RATE_CHANGE:
+ if (!locked)
+- spin_lock_irqsave(&cdns_uart->port->lock, flags);
++ uart_port_lock_irqsave(cdns_uart->port, &flags);
+
+ /* Set TX/RX Reset */
+ ctrl_reg = readl(port->membase + CDNS_UART_CR);
+@@ -555,7 +555,7 @@ static int cdns_uart_clk_notifier_cb(str
+ ctrl_reg |= CDNS_UART_CR_TX_EN | CDNS_UART_CR_RX_EN;
+ writel(ctrl_reg, port->membase + CDNS_UART_CR);
+
+- spin_unlock_irqrestore(&cdns_uart->port->lock, flags);
++ uart_port_unlock_irqrestore(cdns_uart->port, flags);
+
+ return NOTIFY_OK;
+ default:
+@@ -652,7 +652,7 @@ static void cdns_uart_break_ctl(struct u
+ unsigned int status;
+ unsigned long flags;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ status = readl(port->membase + CDNS_UART_CR);
+
+@@ -664,7 +664,7 @@ static void cdns_uart_break_ctl(struct u
+ writel(CDNS_UART_CR_STOPBRK | status,
+ port->membase + CDNS_UART_CR);
+ }
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+
+ /**
+@@ -683,7 +683,7 @@ static void cdns_uart_set_termios(struct
+ unsigned long flags;
+ unsigned int ctrl_reg, mode_reg;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ /* Disable the TX and RX to set baud rate */
+ ctrl_reg = readl(port->membase + CDNS_UART_CR);
+@@ -794,7 +794,7 @@ static void cdns_uart_set_termios(struct
+ cval &= ~CDNS_UART_MODEMCR_FCM;
+ writel(cval, port->membase + CDNS_UART_MODEMCR);
+
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+
+ /**
+@@ -813,7 +813,7 @@ static int cdns_uart_startup(struct uart
+
+ is_brk_support = cdns_uart->quirks & CDNS_UART_RXBS_SUPPORT;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ /* Disable the TX and RX */
+ writel(CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS,
+@@ -861,7 +861,7 @@ static int cdns_uart_startup(struct uart
+ writel(readl(port->membase + CDNS_UART_ISR),
+ port->membase + CDNS_UART_ISR);
+
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+
+ ret = request_irq(port->irq, cdns_uart_isr, 0, CDNS_UART_NAME, port);
+ if (ret) {
+@@ -889,7 +889,7 @@ static void cdns_uart_shutdown(struct ua
+ int status;
+ unsigned long flags;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ /* Disable interrupts */
+ status = readl(port->membase + CDNS_UART_IMR);
+@@ -900,7 +900,7 @@ static void cdns_uart_shutdown(struct ua
+ writel(CDNS_UART_CR_TX_DIS | CDNS_UART_CR_RX_DIS,
+ port->membase + CDNS_UART_CR);
+
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+
+ free_irq(port->irq, port);
+ }
+@@ -1050,7 +1050,7 @@ static int cdns_uart_poll_get_char(struc
+ int c;
+ unsigned long flags;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ /* Check if FIFO is empty */
+ if (readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY)
+@@ -1058,7 +1058,7 @@ static int cdns_uart_poll_get_char(struc
+ else /* Read a character */
+ c = (unsigned char) readl(port->membase + CDNS_UART_FIFO);
+
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+
+ return c;
+ }
+@@ -1067,7 +1067,7 @@ static void cdns_uart_poll_put_char(stru
+ {
+ unsigned long flags;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ /* Wait until FIFO is empty */
+ while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY))
+@@ -1080,7 +1080,7 @@ static void cdns_uart_poll_put_char(stru
+ while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_TXEMPTY))
+ cpu_relax();
+
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+ #endif
+
+@@ -1232,9 +1232,9 @@ static void cdns_uart_console_write(stru
+ if (port->sysrq)
+ locked = 0;
+ else if (oops_in_progress)
+- locked = spin_trylock_irqsave(&port->lock, flags);
++ locked = uart_port_trylock_irqsave(port, &flags);
+ else
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ /* save and disable interrupt */
+ imr = readl(port->membase + CDNS_UART_IMR);
+@@ -1257,7 +1257,7 @@ static void cdns_uart_console_write(stru
+ writel(imr, port->membase + CDNS_UART_IER);
+
+ if (locked)
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+
+ /**
+@@ -1325,7 +1325,7 @@ static int cdns_uart_suspend(struct devi
+ if (console_suspend_enabled && uart_console(port) && may_wake) {
+ unsigned long flags;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ /* Empty the receive FIFO 1st before making changes */
+ while (!(readl(port->membase + CDNS_UART_SR) &
+ CDNS_UART_SR_RXEMPTY))
+@@ -1334,7 +1334,7 @@ static int cdns_uart_suspend(struct devi
+ writel(1, port->membase + CDNS_UART_RXWM);
+ /* disable RX timeout interrups */
+ writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IDR);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+
+ /*
+@@ -1372,7 +1372,7 @@ static int cdns_uart_resume(struct devic
+ return ret;
+ }
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+
+ /* Set TX/RX Reset */
+ ctrl_reg = readl(port->membase + CDNS_UART_CR);
+@@ -1392,14 +1392,14 @@ static int cdns_uart_resume(struct devic
+
+ clk_disable(cdns_uart->uartclk);
+ clk_disable(cdns_uart->pclk);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ } else {
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ /* restore original rx trigger level */
+ writel(rx_trigger_level, port->membase + CDNS_UART_RXWM);
+ /* enable RX timeout interrupt */
+ writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IER);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+
+ return uart_resume_port(cdns_uart->cdns_uart_driver, port);