From patchwork Tue Jun 10 09:21:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yunhui Cui X-Patchwork-Id: 895731 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0429B28AB16 for ; Tue, 10 Jun 2025 09:22:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547350; cv=none; b=SNqhVesu9/0Y53xZae/SJxqFtEgZkHiy6IJzr19jCHzXmefVVyNsSSYC382cbc/3NH3bDNYphk+3sR2oedkgWYbm1nCaMGJi3MFNmsGkhr2BZ+g/otQMb0ZkEAVSZf5vLkDlYem8asYDguGClIy/Ff1DkK4qVDDB431iLBlx1qs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547350; c=relaxed/simple; bh=Yay0E1IktJ5U3dv9Jr5sXBr5qazP/zu1WzMA4ShslGg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZGm170e04RmGxYKo6jw8t9PaAwNLnBoB2UGJ7+z01l2UV/ftrWq0FKVYyfEP4R457cc2SB/A1tb88LAKAvhKDBl8Os7LqO08v3u9RDad/r+9EHODCu4LH7snMNFA79/eoJIpp1spbpnMhFgMXXfDmVVzrHqK009x4f1OMgaTbT8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=jVFiiOF3; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="jVFiiOF3" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-234fcadde3eso61725755ad.0 for ; Tue, 10 Jun 2025 02:22:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1749547348; x=1750152148; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Inkjt4Nq2XV942wyB2oCSN3ntPshT/X6vryIjMwcT1A=; b=jVFiiOF38oqLjJUReNTGhqSFrZZPEFMTginsQDmkYe2OyS1Rjv0O6n3784AmpWp2rY pSnmlsUzdoVTwZDYZZjw/7IXKBpdWIG5pLa74sAG97KQxLNk+TN05KAG2hUayyOkMq0M 4aGsGiJkvOTCG6rh/pL/D+E3B8+bVCrLQaPHy5ipZJ/e9XAAbdZkMWJNzI/jpjNvdEJx boMy8AUZzLsft9eDXqFnkB0R3iV1s8NTb1dneAo0u7zzgrDqbiBoT7k1zPaxz9FHOfNZ mGvZvSvUOqUEeMvW199o98XZN28o6Z05+dV/TRCD1ukzilHlg52A3zgX9eKSpAoWyfYZ 0JUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749547348; x=1750152148; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Inkjt4Nq2XV942wyB2oCSN3ntPshT/X6vryIjMwcT1A=; b=irNmg3kCjpW6I4x0qEk/x8kbeIaHIseNKx0vb/GQMNJHsPZaHD3AXUofXVqXor64h+ dTv1eUP256a938oEJuXnUB2BueMDsxrX2YV5FcJKddntIHDFLBhuzYpXs1GULymnpyn2 /QR5WoSOV10zQ6tSV+jYd+SuaEurly7liGqyOiORsWPd6l3bAdPVpfKj72OwITEQkwvt hwwD7O6OPeKZdZITF4Bz/jnWrgkGcrQABMcdkDkcQnW1XgKMHyqzcif0bbNJT3vg2zI0 hwkx7q8MkwoSXmcs/2fE++xwwDHICNQ0Svg7/4duWLYPCVT05kujgj8qj/hQ9B41L1qk 86Sw== X-Forwarded-Encrypted: i=1; AJvYcCVtqqSYbwfjfsBNFMvKOf/BIBvgi1vqRWDZKi1yr9O6cmB/dHPR66wRS7/FCstM5Veo58Drqv9i77SHu34=@vger.kernel.org X-Gm-Message-State: AOJu0YzNetmaez6H+GAMcW20SN49GVQUq9EoxRnnAvdeZWE2w1oxAdVh HQcFWiB7JgmR5FjRRw4rEh0/PZiuIYa4bJu+JcdNmg4I/7WSPIeHDdWb5hoHSHRz4gg2DBKeLXB uou0wjGo= X-Gm-Gg: ASbGncvrgcXpsEcAgT+9mxaLugc5nIXUVrIwEOYCUv0K+Fl5bDkVk8TYB6dLfN3sut1 lXahpJWoZtbPigbwIawUjdXl/mgky7+Yv22zZOXc0y5FUC8mIxspMqLGBA8O6SjVihx0llKheEq ldOg8JZn6QpxWpyN+HCrn+VhkMttcRytvqAYTgfgpKaZhSWLHs4dJ1KXS6EFos8DzqtXvozr7/k zyJ+o2/fi0Q3xbz9lsYCx158Jth1lkSAwjYOc1UZRCk2m8QQ2A8XV6eN+oS2Sc89IkQ1aa/p1b2 4wwCfacBpuNXSZQOuf5FhzFoAtERjh3Tvqtc9qKLaZLBjUR3vUAxNcfDMZ4wRmQi3vyBJt1j5XK h0Nm28BiAU8vL8+MEBewU5KWi/AYlLqT8KXibIsszdA== X-Google-Smtp-Source: AGHT+IGF1wKkfYtuiimtR/p3LIkqw+9S8l8lvSXg9Z3PNzxGl9/ZZMkReEoX7Hs9Ut7c8jSVbeCQjA== X-Received: by 2002:a17:903:22c7:b0:234:b123:b4ff with SMTP id d9443c01a7336-23601d08686mr221662445ad.21.1749547348162; Tue, 10 Jun 2025 02:22:28 -0700 (PDT) Received: from L6YN4KR4K9.bytedance.net ([61.213.176.56]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-236032fc9ebsm66968605ad.106.2025.06.10.02.22.21 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 10 Jun 2025 02:22:27 -0700 (PDT) From: Yunhui Cui To: arnd@arndb.de, andriy.shevchenko@linux.intel.com, benjamin.larsson@genexis.eu, cuiyunhui@bytedance.com, gregkh@linuxfoundation.org, heikki.krogerus@linux.intel.com, ilpo.jarvinen@linux.intel.com, jirislaby@kernel.org, jkeeping@inmusicbrands.com, john.ogness@linutronix.de, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, markus.mayer@linaro.org, matt.porter@linaro.org, namcao@linutronix.de, paulmck@kernel.org, pmladek@suse.com, schnelle@linux.ibm.com, sunilvl@ventanamicro.com, tim.kryger@linaro.org Cc: stable@vger.kernel.org Subject: [PATCH v9 1/4] serial: 8250: fix panic due to PSLVERR Date: Tue, 10 Jun 2025 17:21:32 +0800 Message-Id: <20250610092135.28738-2-cuiyunhui@bytedance.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20250610092135.28738-1-cuiyunhui@bytedance.com> References: <20250610092135.28738-1-cuiyunhui@bytedance.com> Precedence: bulk X-Mailing-List: linux-serial@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 When the PSLVERR_RESP_EN parameter is set to 1, the device generates an error response if an attempt is made to read an empty RBR (Receive Buffer Register) while the FIFO is enabled. In serial8250_do_startup(), calling serial_port_out(port, UART_LCR, UART_LCR_WLEN8) triggers dw8250_check_lcr(), which invokes dw8250_force_idle() and serial8250_clear_and_reinit_fifos(). The latter function enables the FIFO via serial_out(p, UART_FCR, p->fcr). Execution proceeds to the serial_port_in(port, UART_RX). This satisfies the PSLVERR trigger condition. When another CPU (e.g., using printk()) is accessing the UART (UART is busy), the current CPU fails the check (value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR) in dw8250_check_lcr(), causing it to enter dw8250_force_idle(). Put serial_port_out(port, UART_LCR, UART_LCR_WLEN8) under the port->lock to fix this issue. Panic backtrace: [ 0.442336] Oops - unknown exception [#1] [ 0.442343] epc : dw8250_serial_in32+0x1e/0x4a [ 0.442351] ra : serial8250_do_startup+0x2c8/0x88e ... [ 0.442416] console_on_rootfs+0x26/0x70 Fixes: c49436b657d0 ("serial: 8250_dw: Improve unwritable LCR workaround") Link: https://lore.kernel.org/all/84cydt5peu.fsf@jogness.linutronix.de/T/ Signed-off-by: Yunhui Cui Cc: stable@vger.kernel.org --- drivers/tty/serial/8250/8250_port.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 6d7b8c4667c9c..07fe818dffa34 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -2376,9 +2376,10 @@ int serial8250_do_startup(struct uart_port *port) /* * Now, initialize the UART */ - serial_port_out(port, UART_LCR, UART_LCR_WLEN8); uart_port_lock_irqsave(port, &flags); + serial_port_out(port, UART_LCR, UART_LCR_WLEN8); + if (up->port.flags & UPF_FOURPORT) { if (!up->port.irq) up->port.mctrl |= TIOCM_OUT1; From patchwork Tue Jun 10 09:21:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yunhui Cui X-Patchwork-Id: 895498 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B6D46288CB9 for ; Tue, 10 Jun 2025 09:22:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547358; cv=none; b=aIX19H4px6f5j7MuTQZv/epOEJrWpr0NLTPUen0o1ugSWwzOA37IPmQHc53onQsHIT85jOIrwhaFQgAi1wGgUAZ6UWu4cC05Xwgpiny5Kh+HOYHLRGbKgKNwCKHPciHq9f+rABIG1N1TWs8GIykh70QOXOUzB70Z73M2jSR8TcQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547358; c=relaxed/simple; bh=wS0CLPtfhOm5b92kf/uhx1Ra/XOqdQalM0tptjFMS7w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GD7FILiHAxuUm4KucEeg+WN5u9K6toYrq5UjaC6cuBEK5MarfObRdvqbnopDLiFyOZIxbiU8bX5xjrbbY4T6IylNPCAWhJxSAEdxaQnGQeFQch5cX0RcikDyjQG8GFU+P0LffOVqJOzwkacs/3ymYfEtZQ4oV01QDesWuew+7x8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=DEWwRNAf; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="DEWwRNAf" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2345c60507bso36604075ad.0 for ; Tue, 10 Jun 2025 02:22:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1749547355; x=1750152155; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=va3siO387j2VoC06GK/4QFQK9voTcsrvQqeBKNKR4Iw=; b=DEWwRNAf0QB2d7GkzvpEDbRUyXqhoQQ/vHt80SnhzPnM7GUUyESOHyNPXAkWKlVIxu QeMWeeAbkCYiik3qIN+4ufsZB9lPUSX2fkytzQ+dsWX11E4sJyzH8DOKkfTyCqJBGYgy Gee0TjotVAdPxmB0+H1pWb5qNMM541rpYePFR7oXqN7OKaCaBN+FYc6iqL62FQSC2HUP 7s15EUrFdXLtxWxrEpERwq4XyiMcN/fMfgwmwCUitSE3eWJRciRYeBHSSsrbykwQpV0N 3Tyiteh71ern4CQtx74JD9VbpOhtEMfpXR21CXU7ROPJEXpiBGa0aNNZetOUegbHt4uV xGYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749547355; x=1750152155; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=va3siO387j2VoC06GK/4QFQK9voTcsrvQqeBKNKR4Iw=; b=ebZX8lv25lwdr5l1Irb3LKvzuK70PKZTY3nqgdjRLteRX6GzhvUm0UQq3H7R2EOHtk +gBxyMgLmHu2UO5HVNmqQ+KkrawSRg1Jn2CNKu6AlREjLrv5THn5zQAOHd45wo4zTjgv RWFWoqxDj8bO/oQvI28c04iC17INi1K9PIOaxdHiMT6xUzMlfxWAVquQqEEvBWNIHZ4b KvvAjmzFAi1mib94mUJ4PiIt/ZROoEZZ5TbQWWi9JPho7QCIsRzLDdB5UGQm2PBcc2LJ uEXoSZGnchG0PgZEl2i9k4txzbvYTYzxXhIyFDNEBjVAoP6A68+dArlIDNsiy5Q0/q9G Cfww== X-Forwarded-Encrypted: i=1; AJvYcCXZJDcCkm3Y0i63mrOaRv8jSIwrUD6MGv4e5/g6OAdHH3FCqDAmcvHozi/OfxeklPU25PQqZM7H96o1wEc=@vger.kernel.org X-Gm-Message-State: AOJu0YwMw6yBst9S0y1j5cKGUYsvdtEwnj+UxYmVq027x/4xcVCzzgdk Pr/9Lk+0cdlpbL//C3ptfNhKQ/Iq4bdwOhUcX/py2H+cW0zhGg+n9+yREhyB+1/CCBw= X-Gm-Gg: ASbGncvQDapZwaBD1lKD1WKysSDacIyFLb0GP+By5siPC6cvE0hGAUKteLVPi0rhyL+ 1oSwSAp9tp1k6xoo1yeKZeHKszwKSDyrPKE1C7FVvID3xWB/uft/IWKEsqT8F3aoLt5LhOvjlF7 J3T2Za7A4m++cagXUMpoyUkzqcvrp7zccjQina2FTYf5auD/53Fr0Fp+mzlwIWHqFH0eJBsdXwR cuSM2Aw4pQgCXZh/oEFGxT1TgG+z76W7MdklJPjJcUY+aoSc1tWN3xER14mjm4DwkongRZkApAQ t145uEKenCIh7n1+LWo279nH+0Q+kOYcUzRtoSOzV9VfqEnq5F8BPjtdY/iL9YdgsqJkA04BcgS MGBZzrcIjpFy+KcpKWqBJjiqG11oOE3MoTR0JXRsEmQ== X-Google-Smtp-Source: AGHT+IGbJIHfa2t3hQ2mUqrjlD8bC5fxJHJIfWVyoLl/p5BzNAK7pEuE5ojARq5pOZZifArzHeM8sQ== X-Received: by 2002:a17:902:ec92:b0:235:f298:cbb3 with SMTP id d9443c01a7336-23601d05c8bmr191836805ad.18.1749547354908; Tue, 10 Jun 2025 02:22:34 -0700 (PDT) Received: from L6YN4KR4K9.bytedance.net ([61.213.176.56]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-236032fc9ebsm66968605ad.106.2025.06.10.02.22.28 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 10 Jun 2025 02:22:34 -0700 (PDT) From: Yunhui Cui To: arnd@arndb.de, andriy.shevchenko@linux.intel.com, benjamin.larsson@genexis.eu, cuiyunhui@bytedance.com, gregkh@linuxfoundation.org, heikki.krogerus@linux.intel.com, ilpo.jarvinen@linux.intel.com, jirislaby@kernel.org, jkeeping@inmusicbrands.com, john.ogness@linutronix.de, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, markus.mayer@linaro.org, matt.porter@linaro.org, namcao@linutronix.de, paulmck@kernel.org, pmladek@suse.com, schnelle@linux.ibm.com, sunilvl@ventanamicro.com, tim.kryger@linaro.org Cc: stable@vger.kernel.org Subject: [PATCH v9 2/4] serial: 8250_dw: fix PSLVERR on RX_TIMEOUT Date: Tue, 10 Jun 2025 17:21:33 +0800 Message-Id: <20250610092135.28738-3-cuiyunhui@bytedance.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20250610092135.28738-1-cuiyunhui@bytedance.com> References: <20250610092135.28738-1-cuiyunhui@bytedance.com> Precedence: bulk X-Mailing-List: linux-serial@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The DW UART may trigger the RX_TIMEOUT interrupt without data present and remain stuck in this state indefinitely. The dw8250_handle_irq() function detects this condition by checking if the UART_LSR_DR bit is not set when RX_TIMEOUT occurs. When detected, it performs a "dummy read" to recover the DW UART from this state. When the PSLVERR_RESP_EN parameter is set to 1, reading the UART_RX while the FIFO is enabled and UART_LSR_DR is not set will generate a PSLVERR error, which may lead to a system panic. There are two methods to prevent PSLVERR: one is to check if UART_LSR_DR is set before reading UART_RX when the FIFO is enabled, and the other is to read UART_RX when the FIFO is disabled. Given these two scenarios, the FIFO must be disabled before the "dummy read" operation and re-enabled afterward to maintain normal UART functionality. Fixes: 424d79183af0 ("serial: 8250_dw: Avoid "too much work" from bogus rx timeout interrupt") Signed-off-by: Yunhui Cui Cc: stable@vger.kernel.org --- drivers/tty/serial/8250/8250_dw.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index 1902f29444a1c..082b7fcf251db 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -297,9 +297,17 @@ static int dw8250_handle_irq(struct uart_port *p) uart_port_lock_irqsave(p, &flags); status = serial_lsr_in(up); - if (!(status & (UART_LSR_DR | UART_LSR_BI))) + if (!(status & (UART_LSR_DR | UART_LSR_BI))) { + /* To avoid PSLVERR, disable the FIFO first. */ + if (up->fcr & UART_FCR_ENABLE_FIFO) + serial_out(up, UART_FCR, 0); + serial_port_in(p, UART_RX); + if (up->fcr & UART_FCR_ENABLE_FIFO) + serial_out(up, UART_FCR, up->fcr); + } + uart_port_unlock_irqrestore(p, flags); } From patchwork Tue Jun 10 09:21:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yunhui Cui X-Patchwork-Id: 895730 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 62B5828B4E1 for ; Tue, 10 Jun 2025 09:22:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547363; cv=none; b=kN9pJDWS66BTxyrxqOBdRa8uOrgJYQK8Ru/MVNZ2+0t1pjMj2QBubau9NEwO54zwc2t69gcV5PgeP9HmVfC6Ik38jNDR8l4LE/mGxiZ+ok+EO2EU4sfWsg4q8oAun18L1dB6p8DtVArPzfamFvg0CemfCbUM6+QXAMtHyWi84k0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547363; c=relaxed/simple; bh=qGjOULSQfrhZNYJbcbq9J/bx7G4cga14Ksr4xHqMKco=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GJ0Z14vyzH9rrBXI94VN0E+t8qRgC2swa2GEbJ4KmxTbDCp19EBB6O1+zOvEXdnzXrvGEthpASm569cIKbamXaBtc93lXqyDOX+B/wiQw4vuAWlF4rP9if4mJeoIPP1aktC+BxCnVUIa3ylQ8FYGQfCO0+zkqI3Talee7Whh6EM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=X3zOLXdP; arc=none smtp.client-ip=209.85.216.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="X3zOLXdP" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-311d5fdf1f0so4311822a91.1 for ; Tue, 10 Jun 2025 02:22:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1749547362; x=1750152162; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=4MgSetHRD9od3OJ7iz2rDkPKMWGhLjKM4sQsvvkn2HM=; b=X3zOLXdPj/USKfWtKzO5pYLFm+lJFGmkp9XClStqWELox/zcQx1K35/1udJqlbgqO2 WXBYIYoUHZ6b2Dr9oDhLKYUHQwlU55NsGoPaj+r1MAyzH1wTSe+qvLZiPkaHdTfnlKp7 mfaEsSlS00ytd0g2svs9I1xDEKRH4XpWW8JHDEQMkHIVbFjyFCIZ5Q/DXQC+UAwoXQFA ZYy4kLrSELXNATMnzj8ls2ceagWOXTRvmO03xv2fydjWkz6/TQ6avrGsq30MwFHLgDOR NG1mmRuM8tlMLAOZWTv4QBsoPxWcXigX6NQgtPitr2nuOyd8gofilrbTriAc8/W+nJQI aksg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749547362; x=1750152162; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4MgSetHRD9od3OJ7iz2rDkPKMWGhLjKM4sQsvvkn2HM=; b=hnqAvsPu2wHq4xEKe1//p9RszIfe9YmQ+mA13P0ma2MVg6Wcr9py+/BwBGbY4S4GZW gW1RERvR0PRbWGZGpGAgdIxaygj8DLE88wxzYd21HtYgHeQVToUo9xTpeNmRrgTXWXoK kgfkvU+wiAUv9+NauPhVO18SVvLKMd/19tok2IPSHwmNQ/JwrOspXBiAeyz/5ZbwZK8i 87XUDI6cq8f5PvbX/BthFrSflRhNwGtUlf8x8ICGGqM1XErE+oc0ChYHRDjchXA86ztu fxefgMQxfUQAZaSOPCCmRTYZHjU9lawXnnkr68cqKfs8+H556YOb+bul9aLX4QdTj6Po fIJg== X-Forwarded-Encrypted: i=1; AJvYcCX9qRH9ES6JMnN+LQ3n00oqX3smY56oW6zOYYpGoJChwOI72J/vLIpw2iremfjgzbyhf2V0NDytRQmOtJg=@vger.kernel.org X-Gm-Message-State: AOJu0Yy7WYVyHDI8nphILuQEvJIOUnoiecNyLnw/JYOi43tX8/g4mQtt 8Wssc/OxLfyZWphLGAjLSaHeoy8URWjx9xBNveA1F3p6PF76qXGfonfjWeAXeHw3fe0= X-Gm-Gg: ASbGnct9wsUVs83sllIowiEOSsg3PxJnDXc4s8pbfQ1hB4GaCKUk8ukK535kXLPfRjC iVyz78oPN5UvbtUijeB7BFsmgrTFTzQcU0NOfNYCF+FYnpnM8jMoTPfpDqX7v5rW299SfeH8ok0 HBByLvCvShGX3bCjKxGpk5X0nFpSvqRKcnH5HWND3gY3E+txmdCigjg3YCugZ1wr86y9z7ddqUg LxuEXNMSRqe8k3ApshILLMZ87pIKlPcBIUb9yY16gRrgTi5mmHzQ6TNS/W8D4nEm1mZdiBBwwMC R/K8ZDI5isJuh4bVQw4IpeGMbJpjX76QrFv5gqy33VBKtV0zg8gkCByZCfwrtro+LaOkdg4dldU 6eSRB9PUoiXzEWPOtQHwoM/6XzQmlwSPKjQLPjEX3m9aCm+pAnnPZ X-Google-Smtp-Source: AGHT+IGZ6kCTpPTdoYwEBrEfm3L6AeIfxAzFF36vrkgy3DUS4kpMxoV+uz127U6xDCaxRl/X5+hdwQ== X-Received: by 2002:a17:90b:390e:b0:312:ec:412f with SMTP id 98e67ed59e1d1-31346b3fc52mr28602435a91.14.1749547361546; Tue, 10 Jun 2025 02:22:41 -0700 (PDT) Received: from L6YN4KR4K9.bytedance.net ([61.213.176.56]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-236032fc9ebsm66968605ad.106.2025.06.10.02.22.35 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 10 Jun 2025 02:22:41 -0700 (PDT) From: Yunhui Cui To: arnd@arndb.de, andriy.shevchenko@linux.intel.com, benjamin.larsson@genexis.eu, cuiyunhui@bytedance.com, gregkh@linuxfoundation.org, heikki.krogerus@linux.intel.com, ilpo.jarvinen@linux.intel.com, jirislaby@kernel.org, jkeeping@inmusicbrands.com, john.ogness@linutronix.de, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, markus.mayer@linaro.org, matt.porter@linaro.org, namcao@linutronix.de, paulmck@kernel.org, pmladek@suse.com, schnelle@linux.ibm.com, sunilvl@ventanamicro.com, tim.kryger@linaro.org Subject: [PATCH v9 3/4] serial: 8250: avoid potential PSLVERR issue Date: Tue, 10 Jun 2025 17:21:34 +0800 Message-Id: <20250610092135.28738-4-cuiyunhui@bytedance.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20250610092135.28738-1-cuiyunhui@bytedance.com> References: <20250610092135.28738-1-cuiyunhui@bytedance.com> Precedence: bulk X-Mailing-List: linux-serial@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 When the PSLVERR_RESP_EN parameter is set to 1, reading UART_RX while the FIFO is enabled and UART_LSR_DR is not set will generate a PSLVERR error. Failure to check the UART_LSR_DR before reading UART_RX, or the non- atomic nature of clearing the FIFO and reading UART_RX, poses potential risks that could lead to PSLVERR. PSLVERR is addressed through two methods. One is to introduce serial8250_discard_data() to check whether UART_LSR_DR is set before reading UART_RX, thus solving the PSLVERR issue when the FIFO is enabled. The other is to place FIFO clearing and reading of UART_RX under port->lock. Signed-off-by: Yunhui Cui --- drivers/tty/serial/8250/8250.h | 13 +++++++++++++ drivers/tty/serial/8250/8250_port.c | 26 +++++++++++++++----------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h index 18530c31a5981..b3fb8a550db35 100644 --- a/drivers/tty/serial/8250/8250.h +++ b/drivers/tty/serial/8250/8250.h @@ -162,6 +162,19 @@ static inline u16 serial_lsr_in(struct uart_8250_port *up) return lsr; } +/* + * To avoid PSLVERR, check UART_LSR_DR in UART_LSR before + * reading UART_RX. + */ +static inline void serial8250_discard_data(struct uart_8250_port *up) +{ + u16 lsr; + + lsr = serial_in(up, UART_LSR); + if (lsr & UART_LSR_DR) + serial_in(up, UART_RX); +} + /* * For the 16C950 */ diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 07fe818dffa34..0560df9b064f9 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -764,8 +764,6 @@ static void disable_rsa(struct uart_8250_port *up) if (up->port.type == PORT_RSA && up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) { - uart_port_lock_irq(&up->port); - mode = serial_in(up, UART_RSA_MSR); result = !(mode & UART_RSA_MSR_FIFO); @@ -777,7 +775,6 @@ static void disable_rsa(struct uart_8250_port *up) if (result) up->port.uartclk = SERIAL_RSA_BAUD_BASE_LO * 16; - uart_port_unlock_irq(&up->port); } } #endif /* CONFIG_SERIAL_8250_RSA */ @@ -1353,9 +1350,8 @@ static void autoconfig_irq(struct uart_8250_port *up) /* Synchronize UART_IER access against the console. */ uart_port_lock_irq(port); serial_out(up, UART_IER, UART_IER_ALL_INTR); + serial8250_discard_data(up); uart_port_unlock_irq(port); - serial_in(up, UART_LSR); - serial_in(up, UART_RX); serial_in(up, UART_IIR); serial_in(up, UART_MSR); serial_out(up, UART_TX, 0xFF); @@ -2260,13 +2256,20 @@ int serial8250_do_startup(struct uart_port *port) * Clear the FIFO buffers and disable them. * (they will be reenabled in set_termios()) */ + uart_port_lock_irqsave(port, &flags); serial8250_clear_fifos(up); /* - * Clear the interrupt registers. + * Read UART_RX to clear interrupts (e.g., Character Timeout). + * To prevent PSLVERR, we can either disable the FIFO before reading + * UART_RX or read UART_RX only when UART_LSR_DR is set while the FIFO + * remains enabled. If using the latter approach to avoid PSLVERR, it + * creates a contradiction with the interrupt-clearing (see the + * rx_timeout handling in dw8250_handle_irq()). */ serial_port_in(port, UART_LSR); serial_port_in(port, UART_RX); + uart_port_unlock_irqrestore(port, flags); serial_port_in(port, UART_IIR); serial_port_in(port, UART_MSR); @@ -2423,15 +2426,13 @@ int serial8250_do_startup(struct uart_port *port) } } - uart_port_unlock_irqrestore(port, flags); - /* * Clear the interrupt registers again for luck, and clear the * saved flags to avoid getting false values from polling * routines or the previous session. */ - serial_port_in(port, UART_LSR); - serial_port_in(port, UART_RX); + serial8250_discard_data(up); + uart_port_unlock_irqrestore(port, flags); serial_port_in(port, UART_IIR); serial_port_in(port, UART_MSR); up->lsr_saved_flags = 0; @@ -2513,7 +2514,6 @@ void serial8250_do_shutdown(struct uart_port *port) port->mctrl &= ~TIOCM_OUT2; serial8250_set_mctrl(port, port->mctrl); - uart_port_unlock_irqrestore(port, flags); /* * Disable break condition and FIFOs @@ -2532,8 +2532,12 @@ void serial8250_do_shutdown(struct uart_port *port) /* * Read data port to reset things, and then unlink from * the IRQ chain. + * + * Since reading UART_RX clears interrupts, doing so with + * FIFO disabled won't trigger PSLVERR. */ serial_port_in(port, UART_RX); + uart_port_unlock_irqrestore(port, flags); serial8250_rpm_put(up); up->ops->release_irq(up); From patchwork Tue Jun 10 09:21:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yunhui Cui X-Patchwork-Id: 895497 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C8EB828C014 for ; Tue, 10 Jun 2025 09:22:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547370; cv=none; b=GAxgAc2zExJDc9Uftfu1qF0h9RNj36De6RzgsPmQs0axwjnKgSPVNTcx5neZmLvVOiQVZKlE7pNaSWtVY581KP9gEww1T1ErxrIQW3/V9ujkZqsXOnIZP6gYrqaMYjEKV01mxtmOIV9Oab8WMMEl5n5XBcRSlwkocG9S4UG3eG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749547370; c=relaxed/simple; bh=DzbUGvSEz9fXtmlVmzQnGoE1SPjPgfLt2lNAwCzzejU=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=AYb3c1dghG6/uDBKAuDUIbrh6dTbrB0bGpFE8J87YjYUqbllMn25erIsIga6BA1fwUrIhycbpva9lGxvgr1xLIgtWAvcUsIH1F/hF8dxHnBNqwKv/ztq/Ve/5ueEWAKjvWAX0RhGzT/RR/LkrdhexsQ1YR1Orkycoqa13pIsaZs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=MNC37Ilv; arc=none smtp.client-ip=209.85.215.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="MNC37Ilv" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-b170c99aa49so3113079a12.1 for ; Tue, 10 Jun 2025 02:22:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1749547368; x=1750152168; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=eIl3jd/zdjxk0DCEyY2ZK8PBBrmx2B/ph5KlqW1T7PA=; b=MNC37IlvYU6eRoRLZ3arnZ6GlpV6oXraHAenZG4laW8R96idorpAit8LEPgVpQOnrT 0BRnUPQsVWvV3+pHIQvvXr+Js96tGHZhxO2b/6y2YOzJrg0JkW97oTNaeHxLrp0bOquc 6W0UxuN8ZWYkA4evXWcMimlu39ITPbqeSkjH1PrLBi774JYXGK1X6xQmLj2x3RxZD/fz pgQpRk185M/FDR9p1P/fYgijCy+ikztZzfUKhGQdBCm5GU2qZv75lsanFm+Z/H/hSPaq FV628Sjsa12xVmjt1ikbfSQB+VQ+slPguDxXE5m7GyOrWP924fxJkLq8CQdAxOnlfpIQ PLuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749547368; x=1750152168; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eIl3jd/zdjxk0DCEyY2ZK8PBBrmx2B/ph5KlqW1T7PA=; b=JPWZjUC3c11ymb/D08GZHqOD/lPsl3WGWnA/wrDVtH+yqwffOR+lCZpQBqh0DygDz6 cXbj2tWUZmIsR0Z56bSyY9p6rk0fNqpdij++k2S/8xwXLxf0whe8GNqYZXLE5V+VE87i 25I7k6mV04VUrhrnCnth0bNCCifpa/fidvKnz2uldaIqwBNj3C2CvPzLGv1EjrJFJYBI w+eUZRslOFVxil2eh68Tg44CfmsgH+tULv3VSH/nP5XbJtFY3z1h+L9qZH2SNjimR7qv QFK4tz3Q05lbm1lOjRD88EGWS3oafghEIdl25EOInv4S0FSir+gyzW7dizx84QAXJvGK fRPQ== X-Forwarded-Encrypted: i=1; AJvYcCVhVfBBDKrvmeGcbt/VqQdlAVG12cSfdsGFrVGyZNR/OmqIFhA7i44SQT5XtmMPCBZiifgLBHAwSUhY/Xo=@vger.kernel.org X-Gm-Message-State: AOJu0YzVvnqbi4j8aroVHVN5NpiPvtMXX9KL3lp9DBN9nFodJG6YJ+j8 0gkfj/WbQTUD29AP/SFjWOukY6y3FhpC4C/SzpQ1vqBuKyEGaeloYf+cldFo/ILh114= X-Gm-Gg: ASbGncsE+19dIcxi9x4TTnPzjfmpa83O/iBtcLGsOqemoMZxR+OJgI8D0/zhLuphv2V bFq6qeKSuDOrlGC+32tkcmIerLoFNZdDV/vdwQae1Ug2L6kNnouLTYbXyp6xgGlkZ1zhQflnbCz X+xGs9WxYYyb+4M3rBP0wwVoc2GumNclVJcaVHPQaXvCq3EQM6YLePKdrMBCBeF4CqPF+JlGeeW oG4obT0J49BMYRuMdXazmYcQCn8xNMjB8EVy6wwkNQwDChzeK+4gMxwmja8RysFuqpB7VVlC4hu e4BAyBiETUqKetZ5q3kRbp4qI8toI6Z4EWksImrOlY1myFOsE00uheQV5uG6B/wZdHGboO+aqHy NfUSIWRDOSCgsZOH+aGEp1WfDylltqqIDeM+zLpCgaw== X-Google-Smtp-Source: AGHT+IE7oP5018f+7id9MCmnywhwE2pvWciy02cmVcTCGl4f70NgKZt5UeEuXcYAHe0aQ6mb0oXMyg== X-Received: by 2002:a17:90b:538d:b0:311:f99e:7f51 with SMTP id 98e67ed59e1d1-313a16cf863mr3112140a91.18.1749547367955; Tue, 10 Jun 2025 02:22:47 -0700 (PDT) Received: from L6YN4KR4K9.bytedance.net ([61.213.176.56]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-236032fc9ebsm66968605ad.106.2025.06.10.02.22.41 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 10 Jun 2025 02:22:47 -0700 (PDT) From: Yunhui Cui To: arnd@arndb.de, andriy.shevchenko@linux.intel.com, benjamin.larsson@genexis.eu, cuiyunhui@bytedance.com, gregkh@linuxfoundation.org, heikki.krogerus@linux.intel.com, ilpo.jarvinen@linux.intel.com, jirislaby@kernel.org, jkeeping@inmusicbrands.com, john.ogness@linutronix.de, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, markus.mayer@linaro.org, matt.porter@linaro.org, namcao@linutronix.de, paulmck@kernel.org, pmladek@suse.com, schnelle@linux.ibm.com, sunilvl@ventanamicro.com, tim.kryger@linaro.org Subject: [PATCH v9 4/4] serial: 8250_dw: assert port->lock is held in dw8250_force_idle() Date: Tue, 10 Jun 2025 17:21:35 +0800 Message-Id: <20250610092135.28738-5-cuiyunhui@bytedance.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20250610092135.28738-1-cuiyunhui@bytedance.com> References: <20250610092135.28738-1-cuiyunhui@bytedance.com> Precedence: bulk X-Mailing-List: linux-serial@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Reading UART_RX and checking whether UART_LSR_DR is set should be atomic. Ensure the caller of dw8250_force_idle() holds port->lock. Signed-off-by: Yunhui Cui --- drivers/tty/serial/8250/8250_dw.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index 082b7fcf251db..686f9117a3339 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -117,6 +118,9 @@ static void dw8250_force_idle(struct uart_port *p) struct uart_8250_port *up = up_to_u8250p(p); unsigned int lsr; + /* Reading UART_LSR and UART_RX should be atomic. */ + lockdep_assert_held_once(&p->lock); + /* * The following call currently performs serial_out() * against the FCR register. Because it differs to LCR