From patchwork Mon May 17 12:41:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Jeffery X-Patchwork-Id: 12261829 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 02BB6C433B4 for ; Mon, 17 May 2021 12:43:41 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 89EA26101B for ; Mon, 17 May 2021 12:43:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 89EA26101B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=aj.id.au Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=U02g8/r4QyHIv5dsjKTwSXgoVmW+rIAoetrME+tnc8U=; b=TygQ/XvauecYLQA6yioc5e+gdt 9PIw/g3SP/NesucraaHRVATOmP8JVTkSenK5B7vaZvBwnZUT+wbMga8ayyY6YQH1qc+7pRbXARlvH xS+xQxIZ9OFn6zkG3oFN7Hr0JtR8A69bQu+ptb6uI10w8kbt+jOlvq/mV4XbPWuWVzEV9nD/XuUGl d4im+MtrXRn4M3yZUqs/pisu6WBjLUXp52XqGc2jUPgPtJVYAEzOzoIoYQ3kSkNRfaJvib1RepJm8 mEcgBV9ADMvDZAxf1oavAr5lehln/W3Lhm8lcGP7D/vsoSkXQdwIZdxMYNARWmg/G0AaX+RZYyYEo K0MwpZTQ==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1licYv-00ExP5-J7; Mon, 17 May 2021 12:41:34 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1licYp-00ExNq-Tz for linux-arm-kernel@desiato.infradead.org; Mon, 17 May 2021 12:41:29 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:In-Reply-To:References; bh=MF+FHtIUrSHPdv8pdx7xGvA8pK5kMkTH+JjfQNKGQSU=; b=BAn42KVws6T8UkzqLP7AYluGEp 6d2KE3ng+wLhv2ao1MMqzL0PS7UVmwHOj7PTYKfHbQ+UelJti0CvGtofFGkKUsrl16wc+DnEcbmTU QxGnp3N8mTVkZeaLBhrvMtrOVvOrd0JbVxWtOFZLY04qWAQHTryD5pX7KTewSDhoyp1HD9dDFz4iP YZ/Qe2YybdQj/1/VPJBbedUta5CDJYD/SUEtrbheArGC6WH9WoBaYfb0JhWY7n6QHHKdqpKotZora mpZfZM1A5tXZG0yloXKRAkyPjtRrTlCSHjpVuP+xzIdyivw4bI4XZo8JFIp79VLOM4/+dAtfQuFZH O3tLiGbA==; Received: from new1-smtp.messagingengine.com ([66.111.4.221]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1licYm-00DleN-Nm for linux-arm-kernel@lists.infradead.org; Mon, 17 May 2021 12:41:26 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailnew.nyi.internal (Postfix) with ESMTP id 9788E5808A4; Mon, 17 May 2021 08:41:20 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Mon, 17 May 2021 08:41:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aj.id.au; h=from :to:cc:subject:date:message-id:mime-version :content-transfer-encoding; s=fm2; bh=MF+FHtIUrSHPdv8pdx7xGvA8pK 5kMkTH+JjfQNKGQSU=; b=Jlc+d3CsoDg5Dj5AkPN6IPlUwNaL70WXBrBs+dMRN/ /OsddQIg+KK2RdgrXGSzupNs3yjokIJwzi1HuhnX1d/PU6bClf7yrzx/5Irp3Hac aGoQi4XgjX13NH+x5iazvtaGFfR+71YRC/IPT7UdVoZ9N225X4X8Iw8xW7DgA2BA KWxVOk2CDBPuYyRtVUbkxRqZ2VBXOBhc/hI9oW1+Y+GZb85HH8iBfmlbWpikux6e EokBq4fGwg1wGubtQFks6t1kYfeOSnUrRawjo9qyZH08dgOuj4bZzhsnjWElNAjI FrTbnyLuwaJxaPkUeN1geeC3H3hxxF60en+QsztDn3ew== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :message-id:mime-version:subject:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=MF+FHtIUrSHPdv8pd x7xGvA8pK5kMkTH+JjfQNKGQSU=; b=jeRyaiiheB49PyjYDrrdCFe2KLAqUonB7 8yVjWW/0KiCkm0XFMq0yoqHbq+gFIbDyF5QPN100JWC/9XhOLgnwTSK0Z812u/tU TI+P6QEPcGuaWW9ym7PzWfxPbFN8gQAf/IcyURKfndhWPCcJ2ybVisikvnJCc3v7 8j5+koqHSsUjS7JrKclMRkrbV0KHn+WMo8EASqHcr9J0Qb9KvyxetSieHMMoX7x4 jfEyJso3d0RUUvwpeqeqa1BxlyOFxssSgfW75hI8e3pNqH8j7ubglNwcuFEsJ2dA XY5BXR8NFLIB79CyPwHzBN0Moi9G5r2GYzmwY1mATbMkDQMmgTqkw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrvdeihedgheeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffoggfgsedtkeertdertddtnecuhfhrohhmpeetnhgurhgvficu lfgvfhhfvghrhicuoegrnhgurhgvfiesrghjrdhiugdrrghuqeenucggtffrrghtthgvrh hnpeegfedttdfhfeegtdejveeivdehtefhveejudeujeevvdeifeegvdduffeigeehhfen ucffohhmrghinhepphhorhhtrdguvghvnecukfhppedvtdefrdehjedrvdduhedrkeenuc evlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegrnhgurhgv fiesrghjrdhiugdrrghu X-ME-Proxy: Received: from mistburn.lan (203-57-215-8.dyn.iinet.net.au [203.57.215.8]) by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 17 May 2021 08:41:14 -0400 (EDT) From: Andrew Jeffery To: linux-serial@vger.kernel.org Cc: gregkh@linuxfoundation.org, jirislaby@kernel.org, joel@jms.id.au, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, openbmc@lists.ozlabs.org, jenmin_yuan@aspeedtech.com, ryan_chen@aspeedtech.com, miltonm@us.ibm.com, ChiaWei Wang Subject: [PATCH] tty: 8250: Add UART_BUG_TXRACE workaround for Aspeed VUART Date: Mon, 17 May 2021 22:11:05 +0930 Message-Id: <20210517124105.3565860-1-andrew@aj.id.au> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210517_054124_966078_2746F6E9 X-CRM114-Status: GOOD ( 13.47 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Aspeed Virtual UARTs directly bridge e.g. the system console UART on the LPC bus to the UART interface on the BMC's internal APB. As such there's no RS-232 signalling involved - the UART interfaces on each bus are directly connected as the producers and consumers of the one set of FIFOs. The APB in the AST2600 generally runs at 100MHz while the LPC bus peaks at 33MHz. The difference in clock speeds exposes a race in the VUART design where a Tx data burst on the APB interface can result in a byte lost on the LPC interface. The symptom is LSR[DR] remains clear on the LPC interface despite data being present in its Rx FIFO, while LSR[THRE] remains clear on the APB interface as the host has not consumed the data the BMC has transmitted. In this state, the UART has stalled and no further data can be transmitted without manual intervention (e.g. resetting the FIFOs, resulting in loss of data). The recommended work-around is to insert a read cycle on the APB interface between writes to THR. Cc: ChiaWei Wang Signed-off-by: Andrew Jeffery --- drivers/tty/serial/8250/8250.h | 1 + drivers/tty/serial/8250/8250_aspeed_vuart.c | 1 + drivers/tty/serial/8250/8250_port.c | 2 ++ 3 files changed, 4 insertions(+) diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h index 52bb21205bb6..4d6f5e0ecd4c 100644 --- a/drivers/tty/serial/8250/8250.h +++ b/drivers/tty/serial/8250/8250.h @@ -88,6 +88,7 @@ struct serial8250_config { #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ #define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ #define UART_BUG_PARITY (1 << 4) /* UART mishandles parity if FIFO enabled */ +#define UART_BUG_TXRACE (1 << 5) /* UART Tx fails to set remote DR */ #ifdef CONFIG_SERIAL_8250_SHARE_IRQ diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c index a28a394ba32a..4caab8714e2c 100644 --- a/drivers/tty/serial/8250/8250_aspeed_vuart.c +++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c @@ -440,6 +440,7 @@ static int aspeed_vuart_probe(struct platform_device *pdev) port.port.status = UPSTAT_SYNC_FIFO; port.port.dev = &pdev->dev; port.port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE); + port.bugs |= UART_BUG_TXRACE; rc = sysfs_create_group(&vuart->dev->kobj, &aspeed_vuart_attr_group); if (rc < 0) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index d45dab1ab316..6c032abfc321 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -1809,6 +1809,8 @@ void serial8250_tx_chars(struct uart_8250_port *up) count = up->tx_loadsz; do { serial_out(up, UART_TX, xmit->buf[xmit->tail]); + if (up->bugs & UART_BUG_TXRACE) + serial_in(up, UART_SCR); xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); port->icount.tx++; if (uart_circ_empty(xmit))