From patchwork Mon Mar 10 01:28:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= X-Patchwork-Id: 872170 Delivered-To: patch@linaro.org Received: by 2002:a5d:64ce:0:b0:38f:210b:807b with SMTP id f14csp764461wri; Sun, 9 Mar 2025 18:30:00 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWHxd3e7250skZdbFmGmP/C0ALGqn7GZqSIXGv2xhegkU6AUQuDCH/zy/qckjPTKoSgRDtS6A==@linaro.org X-Google-Smtp-Source: AGHT+IElOnmgpyaw2xXY+KDCbCHryi80rMOrqwfOFfu2yLpGsrDzTah+M/97+JLLXAY5BSpJBVCZ X-Received: by 2002:a05:6214:250e:b0:6d8:9872:adc1 with SMTP id 6a1803df08f44-6e900693d5cmr184649916d6.38.1741570200122; Sun, 09 Mar 2025 18:30:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1741570200; cv=none; d=google.com; s=arc-20240605; b=dr9I2VcWaJcpKZN2+GjApnhdFnf2xm6GB6y7x8LgAbhap7qnYheIvb/rwIDq9xPrvN ojI4kduKYzecdJMu30b5pNYLO7/WLLfIbtQbCEK4UfBqN00tDKZlnyv7zK09zQaxAFO3 9Pp/8nspNgeiLEu5C+/84f+yE2bO4Hxie15hCkhXrE7WjL6JCro3SukPDQEqgjKrmjiL 5Gc3MHXi+OvVcv1hoih0pNZ38+32ZGF9QKqxsNxztkaxpmbyilHAjJ9rixSOI/TBxz6H 7+9c+7u5DX7SsBqQuOhRLWupmOTrl9gX6ZwSPvqpXXwES/ZSObFG2OcqaI4eymBrP/gS Gdcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=6mdjFtYQM1H0sW4TtB9D0TGJccy9eC3YWJZP9lSZSPQ=; fh=EPO+XMDoylG26O8AfLK4l02IrH8PqYL7jb8PVK09dDA=; b=OYBR+HCkTR2nurgdXD3qkhJ3LFE5glB50w3NTrEkKS+zUiPMQXt7VuBel4ccb4Kim9 msLHI5U1C9v5v5u+OAzOshOFqEht4OMKELoaBeityXsQfG/YZOYMsoHFmXaqpCWwKf/o NVwIHh12jDNJ+GS8sG9S5odJqbCS0SQY/niQYJ3+nunM6fJAv8q3hpP627b/dR4/C7mB c9fc1a6vD1ETrRXT2blskFXwljp48+KavtCQqf61MinxmwOroPf8YxDGmHH+7yJLVbCw dxnQt67nrMJ4OuiWDYV3FkzMVTOu8pfR3yxxHVlMTIZY5yY7sOFIK9p4nCH3p3zPqmF4 ZEWg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=jeWRAsYJ; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id 6a1803df08f44-6e904634c67si55403946d6.404.2025.03.09.18.29.59 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Sun, 09 Mar 2025 18:30:00 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=jeWRAsYJ; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org; dara=neutral header.i=@linaro.org Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trRwz-00045b-Sq; Sun, 09 Mar 2025 21:29:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1trRwy-00045H-0T for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:29:00 -0400 Received: from mail-wm1-x32d.google.com ([2a00:1450:4864:20::32d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1trRww-0006Tp-B2 for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:59 -0400 Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-43bc48ff815so20985285e9.0 for ; Sun, 09 Mar 2025 18:28:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1741570136; x=1742174936; darn=nongnu.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=6mdjFtYQM1H0sW4TtB9D0TGJccy9eC3YWJZP9lSZSPQ=; b=jeWRAsYJBSqJk4z3I/s3CMUO2uCKN2jOKOigcTysUVjL1sw6yQDg+WiW1r3eA2Wv77 SVCS0Nb9ZovqyKPQ+lox7JHxWjNunK4cGqsf3XXaqsllSdeTshB4Lqn0qVGRiWxynhM6 1nSYYyBJF04wai108do4GUB8c+d/tDeegxgQafVs4gKfOMYu+jfiIMhTkjih1bQE6q7g MCtz2etTVuoZsrjAYAGJjg01qAcxbkyI+WxMMITdY1+dF0xDTTpKNC3LSnY9zmNyil1e 2qD3+zPQCxQgnyT54A/OcSIPasZfL+T6wr+g1Q1mMoXrsO29EBQiL/646M1hZ5h7bOEj fzzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741570136; x=1742174936; 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=6mdjFtYQM1H0sW4TtB9D0TGJccy9eC3YWJZP9lSZSPQ=; b=qiPnaFbiKk9lIvW6RgFgzBl7wCTOvMasJJevwv7xWGF6QqaUmpUy/YI5i4ljVe9Jd6 mOsnRP7bUQuj0pV1LWbNUjIYL1U9A1h9P80i8XYBCHHutIzxxB540bue6BH7eJftGXPR ZPGI560sd0rVql+M79niLesontr0+qcDBySc7qiYj/Y7hNwb4AaZDAn5bhqnLxJhQ3Zl B9m1km79m1+UOT/He+q9c+vtk7edG5dVyfMqVeXELyDK+F+RODHAnozOAHNamB5/Y/as L7ZKQpUahnPP5c9jsV4kKUW2fQZ7MM7Pj4w5TMTr6gnL6W0jOorlDYfA/v1jqSv+3WQQ fonw== X-Gm-Message-State: AOJu0YyqbPfdgKpKgi4yBVszfyet0x6aH+6DeKj+E8W3GAwUUUNgXHWh gSKi77Zzwi+vWudRq7cCJI7uNaRBWihRCAFAGDuCVMfjpRrKBxQ2cdeUZEUds3y0pGxS6lq/Lfr q0Ro= X-Gm-Gg: ASbGnctrsWOoSEzDg8brFIS6dI/y22dYs3OLNa5W0pXrixwapBQDnch8GoPI2dKzCJ1 pGeUWPrq0WvKwE22hiZaOrrDWLvB6wS1AyactS2bWge+wlcE8SGfn8BfeMluQeSl+JA+3x8UtSv ArayXsXCyh87qIf/b7Yv1eHcleJOWYhoBtjjZriwWQ8UDsBbPvSUUm80TlZrTxs4v+EcjyB8qtR bp47ZxWqAq9QAsSZdhF6F671erEesdKIHP6nKlG2AgZU4us+lESnrMrxqWO7J7N7Cn9+rDxTJ5C F0cd17fjDIBx1l2vfv0EKM9/oWq58LdFAELfzkbKkobRknOkNaDyuYNudxQMyDt7SO7i0YbucMZ toeRZeUK5kxZQh2qjJAI= X-Received: by 2002:a05:600c:1c95:b0:439:98fd:a4b6 with SMTP id 5b1f17b1804b1-43ce4dd7f59mr42259595e9.15.1741570135956; Sun, 09 Mar 2025 18:28:55 -0700 (PDT) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3912bfb799fsm13221355f8f.2.2025.03.09.18.28.54 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 09 Mar 2025 18:28:54 -0700 (PDT) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lure?= =?utf-8?q?au?= , =?utf-8?q?Alex_Benn=C3=A9e?= , Mark Cave-Ayland , qemu-arm@nongnu.org, Paolo Bonzini , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= Subject: [PATCH v7 5/7] hw/char/pl011: Consider TX FIFO overrun error Date: Mon, 10 Mar 2025 02:28:23 +0100 Message-ID: <20250310012825.79614-6-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250310012825.79614-1-philmd@linaro.org> References: <20250310012825.79614-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::32d; envelope-from=philmd@linaro.org; helo=mail-wm1-x32d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org When transmission is disabled, characters are still queued to the FIFO which eventually overruns. Report that error condition in the status register. Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Peter Maydell --- hw/char/pl011.c | 22 ++++++++++++++++++++++ hw/char/trace-events | 2 ++ 2 files changed, 24 insertions(+) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 34a5cb3af5d..f67ce951ac9 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -61,6 +61,9 @@ DeviceState *pl011_create(hwaddr addr, qemu_irq irq, Chardev *chr) /* Data Register, UARTDR */ #define DR_BE (1 << 10) +/* Receive Status Register/Error Clear Register, UARTRSR/UARTECR */ +#define RSR_OE (1 << 3) + /* Interrupt status bits in UARTRIS, UARTMIS, UARTIMSC */ #define INT_OE (1 << 10) #define INT_BE (1 << 9) @@ -157,6 +160,18 @@ static inline unsigned pl011_get_fifo_depth(PL011State *s) return pl011_is_fifo_enabled(s) ? PL011_FIFO_DEPTH : 1; } +static bool pl011_is_tx_fifo_full(PL011State *s) +{ + bool fifo_enabled = pl011_is_fifo_enabled(s); + bool tx_fifo_full = fifo_enabled + ? fifo8_is_full(&s->xmit_fifo) + : !fifo8_is_empty(&s->xmit_fifo); + + trace_pl011_fifo_tx_is_full(fifo_enabled ? "FIFO" : "CHAR", tx_fifo_full); + + return tx_fifo_full; +} + static inline void pl011_reset_rx_fifo(PL011State *s) { s->read_count = 0; @@ -275,6 +290,13 @@ static void pl011_write_txdata(PL011State *s, uint8_t data) "PL011 data written to disabled TX UART\n"); } + if (pl011_is_tx_fifo_full(s)) { + /* The FIFO is already full. Content remains valid. */ + trace_pl011_fifo_tx_overrun(); + s->rsr |= RSR_OE; + return; + } + trace_pl011_fifo_tx_put(data); pl011_loopback_tx(s, data); fifo8_push(&s->xmit_fifo, data); diff --git a/hw/char/trace-events b/hw/char/trace-events index c857f4c4b38..d52f511a1e2 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -66,9 +66,11 @@ pl011_can_receive(uint32_t lcr, unsigned rx_fifo_used, size_t rx_fifo_depth, uns pl011_fifo_enable(bool enable) "enable:%u" pl011_fifo_rx_put(uint32_t c, unsigned read_count, size_t rx_fifo_depth) "RX FIFO push char [0x%02x] %d/%zu depth used" pl011_fifo_rx_full(void) "RX FIFO now full, RXFF set" +pl011_fifo_tx_is_full(const char *desc, bool full) "mode:%s full:%u" pl011_fifo_tx_put(uint8_t byte) "TX FIFO push char [0x%02x]" pl011_fifo_tx_xmit_used(unsigned sent) "TX FIFO used %u chars" pl011_fifo_tx_xmit_consumed(unsigned sent) "TX FIFO consumed %u chars" +pl011_fifo_tx_overrun(void) "TX FIFO overrun" pl011_baudrate_change(unsigned int baudrate, uint64_t clock, uint32_t ibrd, uint32_t fbrd) "new baudrate %u (clk: %" PRIu64 "hz, ibrd: %" PRIu32 ", fbrd: %" PRIu32 ")" pl011_receive(int size) "recv %d chars"