From patchwork Mon Mar 10 01:28:19 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: 14009138 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4DFD6C28B2F for ; Mon, 10 Mar 2025 01:29:16 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trRwg-0003xQ-P1; Sun, 09 Mar 2025 21:28:42 -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 1trRwc-0003vq-Dv for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:39 -0400 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1trRwa-0006QI-Lv for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:38 -0400 Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-388cae9eb9fso1712383f8f.3 for ; Sun, 09 Mar 2025 18:28:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1741570115; x=1742174915; 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=EpcO+5mNfJW3uTvL4p/FId4A1a70cqj1/QCXsX8nNCE=; b=hnTV5Eu6Lr3w+CozjWAwpatY+HltEdhREPXD4e4RE9GTDfR4q/j4Mr7CNXyBuSrsTX wr/0ZiRFuHymdT1HP76EGMubh26DxObrcIXcHfs/ny4Fem6TetRZq6hOrA1/1LYoA5JB iAmn+64XKCbikEv7vHV80kSC95fFY0e1g69vFxs1YFrYA9xTm/qTmRZju0YK/372Obuw F0bKSa4FP5jWdfIYwD0ZDRW7iKp0usa+LkKFrn6pdIWMu0UteEfXxQ6yBBvjqjtb4Cv8 0C0l9Uf8c8PQolIyUW9pWLrtdy1xyBipLy3dACbpxZCl8tLsL5YSrwyZL/VZHnUFf73j whwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741570115; x=1742174915; 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=EpcO+5mNfJW3uTvL4p/FId4A1a70cqj1/QCXsX8nNCE=; b=b93VJD47vdG/TopCXh93jeMnA/jbTxt5lqxrELmQwWXrIdINrALzs1Ei5fLbBsZ8Ij p9NpptF3ZMWSzlOc6eWLtFXGno7lXRn5+lMFvMch5LZB/nIGX/DUh2cF+oUUuryihzB1 cwdIpUGrWqcqMqAwxD/d0stwnqa60NdYAjj+mlnkzf4R4wayuF5dr7Wr5hSN8VQbYxy7 Vol+Xtzhq1ytottC1rgJuYUwJaFmo9ap0MYHsszjeaW7JsGCjQ0leNFmVM3CBFj2IycJ j8tqhQMFlkR1r8JLzeh1D0KPLQgsGntAcrumWVFSLlnt149ZNkW/k8FVoX3V+LnT7hoh MFVQ== X-Gm-Message-State: AOJu0Yxe+O133S/kKIRQTGxvcwavg14MmVnzv0zd+J3j1bcRIXBIhMgw nMKUqBLJCIwsaHY8CPWl2w0WRgClxQhtmNRa4zkXJWUNaDxWXL6vRi7bENl7cADh/DMpKdOjFyT TWMQ= X-Gm-Gg: ASbGncsoe9xqZyq7ilrY9tKX8Hih/T/77+C5H7rcxIMxiz7qxB+hMOtYxZj3piJpesj 6hjKK/tPtGHpimmD94lIurjbVgJhRKBzk29x+vVNJvXHWh3pZj7qZWSLA9r/hcUud56c18gDX1V R/VKstZd/GfouqcKoQmL+sZY2wwJBGWn+ldY3i+IV0FgZP1i828BUd3cC1+cA7egxNnn7yo0DAl n/fNgNdhywODsSn23JXVJKgO9HcwatVwipxJjGKsRefLfEA6fCA/JBK1PAyOS45fgynph14/qYf 5hbsl4WKVO+Bi/4fyD62y54F6akZ2tsYSa6eRk1UsLZIrRYwDr+ae5sb2Lddd784PuslorE3AsK s+xA3ENz7eLiji34syfKp2d01ckvcUg== X-Google-Smtp-Source: AGHT+IH5muMIhBM+Y6yNUoVlIeL0HObPTqaKEqPGBd/JMLnGJQrO5JihMRRlzQ98F/y0itjeTq2Zmg== X-Received: by 2002:a5d:6d0a:0:b0:391:41fb:89ff with SMTP id ffacd0b85a97d-39141fb8c49mr2550978f8f.27.1741570114827; Sun, 09 Mar 2025 18:28:34 -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-3912c01ebddsm13618110f8f.60.2025.03.09.18.28.32 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 09 Mar 2025 18:28:33 -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 1/7] hw/char/pl011: Add transmit FIFO to PL011State Date: Mon, 10 Mar 2025 02:28:19 +0100 Message-ID: <20250310012825.79614-2-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::433; envelope-from=philmd@linaro.org; helo=mail-wr1-x433.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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org In order to make the next commit easier to review, introduce the transmit FIFO, but do not yet use it. We only migrate the TX FIFO if it is in use. When migrating from new to old VM: - if the fifo is empty, migration will still work because of the subsection. - if the fifo is not empty, the subsection will be ignored, with the only consequence being that some characters will be dropped. Since the FIFO is created empty, we don't need a migration pre_load() handler. Uninline pl011_reset_tx_fifo(). Reviewed-by: Alex Bennée Signed-off-by: Philippe Mathieu-Daudé --- include/hw/char/pl011.h | 2 ++ hw/char/pl011.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/include/hw/char/pl011.h b/include/hw/char/pl011.h index 4fcaf3d7d30..e8d95961f66 100644 --- a/include/hw/char/pl011.h +++ b/include/hw/char/pl011.h @@ -18,6 +18,7 @@ #include "hw/sysbus.h" #include "chardev/char-fe.h" #include "qom/object.h" +#include "qemu/fifo8.h" #define TYPE_PL011 "pl011" OBJECT_DECLARE_SIMPLE_TYPE(PL011State, PL011) @@ -52,6 +53,7 @@ struct PL011State { Clock *clk; bool migrate_clk; const unsigned char *id; + Fifo8 xmit_fifo; }; DeviceState *pl011_create(hwaddr addr, qemu_irq irq, Chardev *chr); diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 23a9db8c57c..0e9ad5d5d90 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -167,11 +167,13 @@ static inline void pl011_reset_rx_fifo(PL011State *s) s->flags |= PL011_FLAG_RXFE; } -static inline void pl011_reset_tx_fifo(PL011State *s) +static void pl011_reset_tx_fifo(PL011State *s) { /* Reset FIFO flags */ s->flags &= ~PL011_FLAG_TXFF; s->flags |= PL011_FLAG_TXFE; + + fifo8_reset(&s->xmit_fifo); } static void pl011_fifo_rx_put(void *opaque, uint32_t value) @@ -560,6 +562,24 @@ static const VMStateDescription vmstate_pl011_clock = { } }; +static bool pl011_xmit_fifo_state_needed(void *opaque) +{ + PL011State* s = opaque; + + return pl011_is_fifo_enabled(s) && !fifo8_is_empty(&s->xmit_fifo); +} + +static const VMStateDescription vmstate_pl011_xmit_fifo = { + .name = "pl011/xmit_fifo", + .version_id = 1, + .minimum_version_id = 1, + .needed = pl011_xmit_fifo_state_needed, + .fields = (VMStateField[]) { + VMSTATE_FIFO8(xmit_fifo, PL011State), + VMSTATE_END_OF_LIST() + } +}; + static int pl011_post_load(void *opaque, int version_id) { PL011State* s = opaque; @@ -614,7 +634,11 @@ static const VMStateDescription vmstate_pl011 = { .subsections = (const VMStateDescription * const []) { &vmstate_pl011_clock, NULL - } + }, + .subsections = (const VMStateDescription * []) { + &vmstate_pl011_xmit_fifo, + NULL + }, }; static const Property pl011_properties[] = { @@ -628,6 +652,7 @@ static void pl011_init(Object *obj) PL011State *s = PL011(obj); int i; + fifo8_create(&s->xmit_fifo, PL011_FIFO_DEPTH); memory_region_init_io(&s->iomem, OBJECT(s), &pl011_ops, s, "pl011", 0x1000); sysbus_init_mmio(sbd, &s->iomem); for (i = 0; i < ARRAY_SIZE(s->irq); i++) { @@ -640,6 +665,13 @@ static void pl011_init(Object *obj) s->id = pl011_id_arm; } +static void pl011_finalize(Object *obj) +{ + PL011State *s = PL011(obj); + + fifo8_destroy(&s->xmit_fifo); +} + static void pl011_realize(DeviceState *dev, Error **errp) { PL011State *s = PL011(dev); @@ -683,6 +715,7 @@ static const TypeInfo pl011_arm_info = { .parent = TYPE_SYS_BUS_DEVICE, .instance_size = sizeof(PL011State), .instance_init = pl011_init, + .instance_finalize = pl011_finalize, .class_init = pl011_class_init, }; From patchwork Mon Mar 10 01:28:20 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: 14009140 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 485F4C28B28 for ; Mon, 10 Mar 2025 01:29:26 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trRwm-0003yV-IB; Sun, 09 Mar 2025 21:28:51 -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 1trRwh-0003xX-Af for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:43 -0400 Received: from mail-wr1-x42f.google.com ([2a00:1450:4864:20::42f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1trRwf-0006Qr-JN for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:43 -0400 Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-3913958ebf2so1540528f8f.3 for ; Sun, 09 Mar 2025 18:28:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1741570119; x=1742174919; 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=Tm1aRIWaBwgx/6x0GFSv25uAoJq4igL/u+tjPwXH2Gs=; b=qh1eI1c0ouGSETKIEx3D8o8IPsQlrJ8bitK4tBhFViZE6wd2AqSq/+dna024B1eBW6 PZm8OY6aFFa2YC4X/jsg14r4aBlzjRvIz4ObuH9OiknK9CfofdwR9MKUiRJi6lLXTnrr MwVMFEGz+SCUiYHSg1jqBZpBXdx4r3csCyfFTQ5e39vdgr3vT4o71r9jj3c28eyg5YT7 U25AglI/GQ3FGl6VZzkYrekf23lHahZ/dXalBR3AY28COJNaP2aelkfGgo3RJIkSTjGU q7ixlfk7SpDbsplsV9KNvtjgORQT3i2Xisq3SSSeKdqMGqBmVldobktseZTxSzmDkxMm oEfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741570119; x=1742174919; 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=Tm1aRIWaBwgx/6x0GFSv25uAoJq4igL/u+tjPwXH2Gs=; b=USIruzQjrwjrTFc7aGMs/Ijb/8MKeYM+MnuVAfp4QuTtw2577aXAFKLNz1DIfN1ZEK WFl7bugMZUFIYslv5SoZB7b5NwH8I2riEIQObPFDcLnRVmogzpOCRI5ki7ippAwwnOQ1 8SpoPVKuWJw7FVA9gRYBlSQEw0BUqi50Ljd0FCC7a9WBB+f1MsLnhiMmC5Q9HDBTw4Jp aqIrcFYh4WH+KZkYOFTS+JvLVwtwIcihPT4sYBXqdlLHY+2diZhsMV3hYnGRmEBpX8Ac +txfzpOPycR/L8FbFuPmrDWO8yq1bVrqRwQRSmkor4p03LVP3qDw86NWfS0mK1S2VPDV qPrg== X-Gm-Message-State: AOJu0YzaBResL0qmptcnZoeLo6dZIv22UrOpzcKNJm68CtGH+/4W5Co2 0ggfFHlNu8xxSn0fSV60M9bY/eG6OXzGxxGj4WSxrQykxHVaP6HGHn3Q6vjFHkvAyz2DSbqGjC7 bD6Q= X-Gm-Gg: ASbGncuF+RiYD+q7OMyFM0QkPoefp65IJBkiz6x87HpNnrFgdZSIxuihqDMOtS3n8TA nXwbqFwiVBKB5up4m9k6PPE4r5eX8yC8Bwrv/WFWxfWY27uIZLD0QQtsk58tk0DW7LF8J0F1L1/ BDTFCjFSSINxcZk679i9oVTvuidVrJxaZayfOcZjHg/+4pCdxIc2HzzBI/J4EFDRkFMNv1vnKVa 8QbEiN+c9/S0aKAnq0ufYbNEZNFtE/uYIACiloLyl1bmveJedykUgidMfOkwQ72KFZYXhc4tYtx lZAsIkiFDznFxJLIPOQns1HzISabFSHWD7pwdYj3UqjtZbjJne6z7jW+bG+yr5/cQzDSV/qa86X GtyVyES/Kkgbmi5bwhhK9xV2JJlbwlw== X-Google-Smtp-Source: AGHT+IH20yJX06giVzvivOa3QisLS22r9+2wZ9shvU/XR8v/DxHT+Vns6c2HBLmMYL96VsU4Q9vEtg== X-Received: by 2002:a05:6000:18a3:b0:391:1388:64b7 with SMTP id ffacd0b85a97d-39132da8f0amr7923213f8f.46.1741570119480; Sun, 09 Mar 2025 18:28:39 -0700 (PDT) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43cef25f075sm45918365e9.28.2025.03.09.18.28.38 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 09 Mar 2025 18:28:39 -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 2/7] hw/char/pl011: Introduce pl011_xmit() Date: Mon, 10 Mar 2025 02:28:20 +0100 Message-ID: <20250310012825.79614-3-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::42f; envelope-from=philmd@linaro.org; helo=mail-wr1-x42f.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=unavailable 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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Extract pl011_xmit() from pl011_write_txdata(). Use the FIFO to pass the single character to be transmitted. Update flags appropriately. Reviewed-by: Peter Maydell Signed-off-by: Philippe Mathieu-Daudé --- hw/char/pl011.c | 43 ++++++++++++++++++++++++++++++++++++------- hw/char/trace-events | 3 +++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 0e9ad5d5d90..113b29cd9e6 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -226,6 +226,36 @@ static void pl011_loopback_tx(PL011State *s, uint32_t value) pl011_fifo_rx_put(s, value); } +static void pl011_xmit(PL011State *s) +{ + int bytes_consumed; + uint8_t buf[PL011_FIFO_DEPTH]; + uint32_t count; + bool emptied_fifo; + + count = fifo8_num_used(&s->xmit_fifo); + trace_pl011_fifo_tx_xmit_used(count); + + buf[0] = fifo8_pop(&s->xmit_fifo); + bytes_consumed = 1; + + /* + * XXX this blocks entire thread. Rewrite to use + * qemu_chr_fe_write and background I/O callbacks + */ + qemu_chr_fe_write_all(&s->chr, buf, bytes_consumed); + trace_pl011_fifo_tx_xmit_consumed(bytes_consumed); + s->int_level |= INT_TX; + s->flags &= ~PL011_FLAG_TXFF; + + emptied_fifo = fifo8_is_empty(&s->xmit_fifo); + if (emptied_fifo) { + s->flags |= PL011_FLAG_TXFE; + } + + pl011_update(s); +} + static void pl011_write_txdata(PL011State *s, uint8_t data) { if (!(s->cr & CR_UARTEN)) { @@ -237,14 +267,13 @@ static void pl011_write_txdata(PL011State *s, uint8_t data) "PL011 data written to disabled TX UART\n"); } - /* - * XXX this blocks entire thread. Rewrite to use - * qemu_chr_fe_write and background I/O callbacks - */ - qemu_chr_fe_write_all(&s->chr, &data, 1); + trace_pl011_fifo_tx_put(data); pl011_loopback_tx(s, data); - s->int_level |= INT_TX; - pl011_update(s); + fifo8_push(&s->xmit_fifo, data); + s->flags |= PL011_FLAG_TXFF; + s->flags &= ~PL011_FLAG_TXFE; + + pl011_xmit(s); } static uint32_t pl011_read_rxdata(PL011State *s) diff --git a/hw/char/trace-events b/hw/char/trace-events index 05a33036c12..1bab98fb5f3 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -65,6 +65,9 @@ pl011_write(uint32_t addr, uint32_t value, const char *regname) "addr 0x%03x val pl011_can_receive(uint32_t lcr, unsigned rx_fifo_used, size_t rx_fifo_depth, unsigned rx_fifo_available) "LCR 0x%02x, RX FIFO used %u/%zu, can_receive %u chars" 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_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_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" From patchwork Mon Mar 10 01:28:21 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: 14009141 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 44BB8C28B28 for ; Mon, 10 Mar 2025 01:29:54 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trRwv-00044M-4p; Sun, 09 Mar 2025 21:28:57 -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 1trRwo-0003zG-3r for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:51 -0400 Received: from mail-wr1-x42c.google.com ([2a00:1450:4864:20::42c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1trRwl-0006RU-Dc for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:48 -0400 Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-388cae9eb9fso1712421f8f.3 for ; Sun, 09 Mar 2025 18:28:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1741570125; x=1742174925; 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=8ce/6NRq1JPvdEj2O0uStpJg+L6PTsOBLcGGWbCWAug=; b=tNUvdt5lwIZGxaZT9eXnOYNuO8PtEA+6+48BJaTtk7ziAx0FOlKCNsbqrOEEA+UJMg hAAkHiLAecUrtAmXWCQKdHI+HaP5Td0BwgEaJGSwe1nZG2ZYqnjSVrSb29CC0uVVHSUC tvDeqkcKnij1vYaHTr/ItqY62feMTj42Mt003imwgHzUnTN2oELnZ+JjOfI6FEdn1/Xe yURZsLH04i/xqW4SXqS6z6fqc9/gQd7pz6Fm6LIJhMtJW3uZsHVrZ519KwKed/F1neIP rQsotQ/9K+FV03Ves7JuFzaw4bxtHKu2OKrNO7boMeeE9xfjFx5vmqujXePsnO8gsCXY QoVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741570125; x=1742174925; 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=8ce/6NRq1JPvdEj2O0uStpJg+L6PTsOBLcGGWbCWAug=; b=MTS76wW3I7Eb49ubDrA3lbv/gYyvGzgplowM8AxM+1m4YcKOtwJmgCynTDARTwTnIq JNsVN6z5vxy+CUmVw0XLW1OGt+3kxTSqVxDOfGmnO3DQ6OBryKLVSrw6JVd+K1xOIzSv CwtJuX9I9vl6DZle/8XMUUSQ/gkI9iWp4rHNGMYINqmfITqbzz5/vJPYOrNevJPVGQ/h xsOyNTRBCvTL0QyDWEz8yTQBfURh5c9EyGoR23ditGLgYZ49thI3oMeeedzh7QHLto1Q z55FFFh+6qNYQKWezQsmt3MTOMaHWqgXsp6lUdg8VAgT1iApNkwNU4X/2DBiyX7dbeX4 47uA== X-Gm-Message-State: AOJu0YxWCau8LD1/m5NZnoZHCoRk+QBwTG6F8DIi/w+R983NdtxVF1/0 8udxY60yFi5TlUWOKBT+oZhGbxZsXM81mlpQch2nQx0UGqRNXqPGiy7YlJAqdUtB7CXoToJnrGX nHTw= X-Gm-Gg: ASbGnctno87cxd1mJ+pCVZg0DDqEN8mDBt5DzEQcF3nHuP4mg/Ek44Nkn16tGGhLyfR dIU4FH/xTVrQXLmKHTZhA4YCMxubKLGE0aYzp9s+O6lL7kkzXfcX3Bhqp+J1kAlkTD5rRQ/ewCj MQ6jzfL6CqhRdIELjfugMxcJnXt4Opjp1fA3rwrHkCuexbSh+2jPD7rSfzFVWrYFuiaTlcy8UFg XAumUBp19LXDJODHLq9+yUr7FC9K5YqbN/Y3SH+tW0OJO95KckmQDmPQnradElWZR3Sjg+zDLte BjpThjaPShIGqZGpNOoGNLCQatpsI5BJFsfuoU15v0LgyJDZvsbxzMExPpIrrg0U56q6T8gcS5b d8838Kw8Z1tbebzpWPZuwRLYGdT5fwA== X-Google-Smtp-Source: AGHT+IHMH17IYR5Ovj/m37Ab6pmHw+/2HW5zZIKNLc6UOxDZXcPHSvolywRQoMV9c6kqY3HkAiGxkA== X-Received: by 2002:a05:6000:410a:b0:391:4559:8761 with SMTP id ffacd0b85a97d-39145598929mr1319845f8f.36.1741570125026; Sun, 09 Mar 2025 18:28:45 -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-3912bfba83csm13154773f8f.6.2025.03.09.18.28.43 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 09 Mar 2025 18:28:44 -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 3/7] hw/char/pl011: Factor pl011_xmit_cb() out as GSource Date: Mon, 10 Mar 2025 02:28:21 +0100 Message-ID: <20250310012825.79614-4-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::42c; envelope-from=philmd@linaro.org; helo=mail-wr1-x42c.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=unavailable 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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Implement pl011_xmit_cb() using the FEWatchFunc prototype to register it as GSource. While the return value is not yet used, we return G_SOURCE_REMOVE, meaning the GSource is removed from the main loop (because we only send one char). Reviewed-by: Peter Maydell Signed-off-by: Philippe Mathieu-Daudé --- hw/char/pl011.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 113b29cd9e6..18ea03a52f4 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -226,8 +226,9 @@ static void pl011_loopback_tx(PL011State *s, uint32_t value) pl011_fifo_rx_put(s, value); } -static void pl011_xmit(PL011State *s) +static gboolean pl011_xmit_cb(void *do_not_use, GIOCondition cond, void *opaque) { + PL011State *s = opaque; int bytes_consumed; uint8_t buf[PL011_FIFO_DEPTH]; uint32_t count; @@ -254,6 +255,13 @@ static void pl011_xmit(PL011State *s) } pl011_update(s); + + return G_SOURCE_REMOVE; +} + +static void pl011_xmit(PL011State *s) +{ + (void)pl011_xmit_cb(NULL, G_IO_OUT, s); } static void pl011_write_txdata(PL011State *s, uint8_t data) @@ -630,6 +638,11 @@ static int pl011_post_load(void *opaque, int version_id) s->read_pos = 0; } + if (!fifo8_is_empty(&s->xmit_fifo)) { + /* Reschedule another transmission */ + qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP, pl011_xmit_cb, s); + } + s->ibrd &= IBRD_MASK; s->fbrd &= FBRD_MASK; From patchwork Mon Mar 10 01:28:22 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: 14009143 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C45C7C28B2F for ; Mon, 10 Mar 2025 01:30:23 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trRwx-00045E-Gh; Sun, 09 Mar 2025 21:28:59 -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 1trRws-00043d-Mu for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:54 -0400 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1trRwr-0006T0-0K for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:28:54 -0400 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-43690d4605dso21509495e9.0 for ; Sun, 09 Mar 2025 18:28:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1741570130; x=1742174930; 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=wS79SS1CQxxkd3qnon8nNpovVlwqoGNVt9KU+09W3OY=; b=Sh9rTsV9fmGjKOKmxQtfUekDlfPLJKDn8zH6SXpz4XysntLgSvDG8u4ErurzWw3V0u BIirtzv3a4rwaHB7LCQcwnFC2Yh9lWSUs0Phn4UrsBRKHQL8uE5DlHTrsOlDmhhxSpyT TQxg134EJaIeoSRMnLfXmKEQPa3p0z0MyLUhUqogk79TicqGPhaA5R4g836urN8Q/8iD yVL8FBWBaGlqxasb69YuwuBNCVLABgBbcLTzXGooqHMh3gFIRKOfpJloyACTl34MYj3F UBa6Tc27gy7yLme8TitRSApCWM+vSVJtSqSJwOJGKZFgwO7RF6hwlkLDeqlOS8Q18kQg v3DA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741570130; x=1742174930; 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=wS79SS1CQxxkd3qnon8nNpovVlwqoGNVt9KU+09W3OY=; b=p/1gAnt2f5rjsa6kZEuhOj4z28HEqmseDsKTM++qSCwnbAgicvvJhzYxt721I3z607 eFyw7Bt8W9Qi5NWwGyzD+Y2OQafLjNIKCiwUES5AHK0fosASmJnfcZeymUaEMYrJaBxm JRNrlOwRHKMA6KlhlsCNjDYbRnorn6t/8rhABwglx1xOtZNlLflU9E331BPbqw/AA3YJ UfZl9dalDlx6G1w/uUodoRIAIrTih/mjIsBK9K0KJl42uTk2a+YxDywW4drhMySLGTXR 5WXEp6eusS89lhwNgQX67vvJ/E3DZPsoS/va8ulrVIuiQBG6AdltvyoMMDOSxTKoKeeM JbQg== X-Gm-Message-State: AOJu0YxVQT5g0pF4QNt01CIMo5Vo5ekR9a4nzOSOxk4R1NQalVeLImTB gAAeQldd1Y26NlfdBluDE9yHXTZM4/1fyJgWaPazJ3bX3JPfugtBcJyzz+TkbZS6+l3vWtPGm3I P2KA= X-Gm-Gg: ASbGnctKnRkdZIAbC9N9CUKHhYJCheJhV745DfVz2SrAOmZu0YIhgce0Aton0qqF7Eo 2PD/HZvX4N86HcgYG9M94AjV4uKurejD4Nxi1piAWD6Vn9SbggLUFxmJHHy8NvswY2NHL38ZMUi paKZyF39efJZpOyZrEBxPEDLXTCsIDwpUQLKiZWKCBGLGwWVniryVStc2sw6QVjom23LRYQioZB VmeFoBThxB+JuD31gURLUAT9CWHOC1OiJhgspcCRIvnw8pMg6JqXD21rK/Y3e1gWUSZZCVfoI+q JddF9sB1scSM+N5VFpN0WX8RWI5tqz4yfFeQpU2MVvg8KHklmASx6H11zN3fLxhjRPEbsnmfMCt YPgPlj3soZYJpem9kAFs= X-Google-Smtp-Source: AGHT+IEU+o3PvNWcLG1GvyNSXZDCJC2rsfUpn1+77ppYPB98quLAsSLIG7OR2dN6KsAByfSmYcdcrQ== X-Received: by 2002:a05:6000:18ae:b0:390:f394:6271 with SMTP id ffacd0b85a97d-39132da96b3mr8000092f8f.43.1741570130520; Sun, 09 Mar 2025 18:28:50 -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-3912bfb79fbsm13570645f8f.13.2025.03.09.18.28.48 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 09 Mar 2025 18:28:49 -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 4/7] hw/char/pl011: Trace FIFO enablement Date: Mon, 10 Mar 2025 02:28:22 +0100 Message-ID: <20250310012825.79614-5-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::331; envelope-from=philmd@linaro.org; helo=mail-wm1-x331.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=unavailable 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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Peter Maydell --- hw/char/pl011.c | 3 ++- hw/char/trace-events | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 18ea03a52f4..34a5cb3af5d 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -480,8 +480,9 @@ static void pl011_write(void *opaque, hwaddr offset, pl011_trace_baudrate_change(s); break; case 11: /* UARTLCR_H */ - /* Reset the FIFO state on FIFO enable or disable */ if ((s->lcr ^ value) & LCR_FEN) { + /* Reset the FIFO state on FIFO enable or disable */ + trace_pl011_fifo_enable(value & LCR_FEN); pl011_reset_rx_fifo(s); pl011_reset_tx_fifo(s); } diff --git a/hw/char/trace-events b/hw/char/trace-events index 1bab98fb5f3..c857f4c4b38 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -63,6 +63,7 @@ pl011_read(uint32_t addr, uint32_t value, const char *regname) "addr 0x%03x valu pl011_read_fifo(unsigned rx_fifo_used, size_t rx_fifo_depth) "RX FIFO read, used %u/%zu" pl011_write(uint32_t addr, uint32_t value, const char *regname) "addr 0x%03x value 0x%08x reg %s" pl011_can_receive(uint32_t lcr, unsigned rx_fifo_used, size_t rx_fifo_depth, unsigned rx_fifo_available) "LCR 0x%02x, RX FIFO used %u/%zu, can_receive %u chars" +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_put(uint8_t byte) "TX FIFO push char [0x%02x]" 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: 14009142 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4DA7CC28B2F for ; Mon, 10 Mar 2025 01:30:00 +0000 (UTC) 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-Google-Smtp-Source: AGHT+IGphJAcD0hHs9UVKSzIESU0UZmz+rBU6+wpQxVMMaLI67PcRhQxTFZwaPkKhax6w6i6hAIsrA== 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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.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" From patchwork Mon Mar 10 01:28:24 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: 14009144 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 02E98C28B28 for ; Mon, 10 Mar 2025 01:30:51 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trRx6-0004FL-FG; Sun, 09 Mar 2025 21:29:08 -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 1trRx1-000499-RL for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:29:06 -0400 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1trRx0-0006UR-8G for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:29:03 -0400 Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-3912baafc58so2568682f8f.1 for ; Sun, 09 Mar 2025 18:29:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1741570140; x=1742174940; 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=nKtjkSGQAPRNNqtasOzh5Hz0iRBusUZv23b35HZSLgg=; b=hVaxKV3TBOhDT371aMbXEMAPOBN31mYmf14ZqVNMrL3t6G3w8HZUrF/5HRqtGDfY/r 8ofXTZ8J1xHO11jSqas9qX1I1AJTUn2NKffhqTAXdd/F+dH56KRxottocYoFWOY4phqR 3WjrhQECVxxSyWig3rpzzzVS2b9VB5hdF55o0RNGkRsyMqRgjfP3zH4i/rjNDZsWrpBU HitHbRfWyRzAbV6jeXNi1oWCZ/9lTxXvyGlTXIwfjXBKFp5K1x3fOqi1MiNigXizhz2+ /GhtC0c5Qej6IXr3o0HEiokW+RfLmQs0I3ri7jJpi/Thz6mLrPrxTLch3CyGd+aWoq0g 02Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741570140; x=1742174940; 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=nKtjkSGQAPRNNqtasOzh5Hz0iRBusUZv23b35HZSLgg=; b=VtN4BqRBmBP3HnscxZq869oLvgjVM1xwuH8EVFhid6wao8lmOAZN348wACo9ffPRSk I4iYQr3F5u3xrUrBrEnJZwI+TuGnPwYJGwSNSqEk4InCb6rVpYhQ8BvSp1O6MPVVqEkO yFQqL+CsznuskIF4hYmS9j0xiyXwwJTvfBMytc/n4IWZEVmWo81eUeli8E9mKi746+To IeT1f+uxBsZxnoqU2qJ7vZtOyTaujlH9iAb5FjWzsbXO53q5SzuZ5TK+okSFviiO7PJc j1G52US3/J4NAhUlhOSzxetqKySizayKhDp3h9jyZJqeM03So76RmWzqdURDQYZdlFqk zwOw== X-Gm-Message-State: AOJu0YxLgYseZme/XKrp5uQ+kwy1AdklgE838dpQ03Y/FMPbsM4ZkVn0 uCBo6Jyrl8P4d61O9pu98uV0lmk2BUVyOdDV7126jyz50KWHkxFV4dhG9upJFOxB1uRRB/H+Rht nZHw= X-Gm-Gg: ASbGncvCf6jgLUYGBm/b4FzNWSZmIPu2sv7XFPJbonu0YhDrmJAYPuBSQ/nn5HD3pE9 vhiGV8+fhiFQ/+dZkhz2L5jwVBhFCRhorBIl2NED35vNcPHn/MC95F7p8RozkHxzbHA4z9w73s8 rX5mNf/XP0kUQVJd/SJSe8l2zLRLT8Q3cunobNDzpfPFmdLOqnnczWWdnVXX6jYhWTK8aBGjGya VDgfOnNBdbslNbi3ORRSBlZKqA1Q6nJm9KfGbjebOMZbu/ZWJJQWtvntt9Ae06LI7fBSbfz63Mx pduTmORCea/lzThsvdCuy/bmzqeumVtD83OUb82ambtQc+pBpa8KLNcUzJZs5hFuzq0Flrc6U+L DxnKn7WXrkGhFR8UIoks= X-Google-Smtp-Source: AGHT+IHNntuQ+2t/fvIlVmWKxkKTZizcSizGwVgK0BelP3nmHfAzIaAMvncZimaF2C6X3H/VvhggUg== X-Received: by 2002:adf:a3cd:0:b0:391:46a6:f0db with SMTP id ffacd0b85a97d-39146a6f2ddmr1260640f8f.37.1741570140590; Sun, 09 Mar 2025 18:29:00 -0700 (PDT) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43cee22c13fsm51483595e9.40.2025.03.09.18.28.59 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 09 Mar 2025 18:29:00 -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 6/7] hw/char/pl011: Drain TX FIFO when no backend connected Date: Mon, 10 Mar 2025 02:28:24 +0100 Message-ID: <20250310012825.79614-7-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::430; envelope-from=philmd@linaro.org; helo=mail-wr1-x430.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=unavailable 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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org When no character backend is connected, the PL011 frontend just drains the FIFO. Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Peter Maydell --- hw/char/pl011.c | 13 +++++++++++++ hw/char/trace-events | 1 + 2 files changed, 14 insertions(+) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index f67ce951ac9..6d26a3e13f8 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -241,6 +241,13 @@ static void pl011_loopback_tx(PL011State *s, uint32_t value) pl011_fifo_rx_put(s, value); } +static void pl011_drain_tx(PL011State *s) +{ + trace_pl011_fifo_tx_drain(fifo8_num_used(&s->xmit_fifo)); + pl011_reset_tx_fifo(s); + s->rsr &= ~RSR_OE; +} + static gboolean pl011_xmit_cb(void *do_not_use, GIOCondition cond, void *opaque) { PL011State *s = opaque; @@ -252,6 +259,12 @@ static gboolean pl011_xmit_cb(void *do_not_use, GIOCondition cond, void *opaque) count = fifo8_num_used(&s->xmit_fifo); trace_pl011_fifo_tx_xmit_used(count); + if (!qemu_chr_fe_backend_connected(&s->chr)) { + /* Instant drain the fifo when there's no back-end. */ + pl011_drain_tx(s); + return G_SOURCE_REMOVE; + } + buf[0] = fifo8_pop(&s->xmit_fifo); bytes_consumed = 1; diff --git a/hw/char/trace-events b/hw/char/trace-events index d52f511a1e2..730d6292a2d 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -71,6 +71,7 @@ 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_fifo_tx_drain(unsigned drained) "TX FIFO draining %u chars" 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" From patchwork Mon Mar 10 01:28:25 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: 14009139 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8FBA9C28B28 for ; Mon, 10 Mar 2025 01:29:22 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1trRx9-0004GF-3L; Sun, 09 Mar 2025 21:29:11 -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 1trRx7-0004G1-HS for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:29:09 -0400 Received: from mail-wr1-x432.google.com ([2a00:1450:4864:20::432]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1trRx5-0006VM-Qx for qemu-devel@nongnu.org; Sun, 09 Mar 2025 21:29:09 -0400 Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-3913b539aabso713521f8f.2 for ; Sun, 09 Mar 2025 18:29:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1741570146; x=1742174946; 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=Rrde3KHLzAFDrcctuuOnFTDDeYEo7R3jlkMLF4h0mXs=; b=h+1t1WNCzB1E2JtC0Hswyfgt7C2qX2aUCbB7oQO/hyAoPLJTdKM3pYjHImRW/CK9Ey 26zDRlqyzSToMlFfc3iffPYEEyYFd84PzzzYonbLDdtira5fKPwx+fvbJ9mGEvBc6ygV wXzLnDfz4ngHx5DyXDcQ6pbSZrP51G7volD5r4hfF6d0nFP/q4DjrwlFfF2BwPYJr1Ks p5dS0lPljXplffgIAPEGAFezCQlW7j8we+jgRtf6wmPJNxs5hMJBo8mSqBgfjqcu7lUi hZC57rqLnbrQZ3P3sUwM3Q/OGnzGo9jmGCQKH24B3XW3zFWXBkdRcrDB9c+4u4Ft+oqc 9JxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741570146; x=1742174946; 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=Rrde3KHLzAFDrcctuuOnFTDDeYEo7R3jlkMLF4h0mXs=; b=Y3My6Hksqz4YhB+aXR3a4NaIcn+EFCebJsm/ja+zxcTaBaO+yspb0Y6CDse4e8W4sC RdBr5fYQSWTeuMU9IisURy3Hp4vcU9EyZe/6UzJc72k7Uq3gozRiZzBrv52Lhly/NcHd j7A5J+7Ek9WBwR7+I/YQX21DuijEV3kNDxK2Oo+HkWJt4FjLlTnXKIPvDuMT6YP3BiAS ka1tL7e52+qcbwxZYSKzcEN/v3zR+bI02bnxK4X+9JVghWcNWRddApKJ3JxzBnN3kYgi iiJ4HQ5BEj6AuKXK4pjdK2W+6FOdB4S6c20kkSXwucSxtyWkyUQZQYRjCovPkoNNilrp 5jnw== X-Gm-Message-State: AOJu0Yw5HpWeK1riyyf/TsVwEJZfO7n34q+gl9jRP05Sd20spTFq6JLZ z9/ywVKMG3Fg0veHLPCWbNeLnJFi6zmiKUL2CqJeADPvIx/y4jIhTY/kWUNaOiLz/ABQuhQFIRX D+f0= X-Gm-Gg: ASbGncttuwgA/ugriv/zDNLwCmZGQbe7Lo18T2Ee7mk7tJD6M8zR38UaMvinUpZpMLt 4Uz4wHXZt/jcWEPomoBsYJgJXQ8SOgNuIRwqFR/SFySIuc/quRq0yIlV1uj3igZv8zILIet0pnd QgbbocGXu8e+/o2oN+P/MjQd5cn9jOpLnFdxFIexLdbuV3qaFzsZhHwtipGlRy87kvwg4W2QYbP lOm711piSmc+Q77hHThisS1eKzemeKiMdrJrw8PP2fhccU2wjzskpmZTGKeGJQvb7udc0T5delh mbjfPFhY0ok6aAe/CTZ21mxWlmcnbqa++Yr6hfPg9BN0ujT8FDybMSlFFbpZTzyseblYTLOcFgv ocyPVTjsRHq+sKj/gBnc= X-Google-Smtp-Source: AGHT+IEjjbNUd/fjjVs/TgqBs+38DGmL924XOhJ7YZDqRqjfyUSLEZxaWX1770a0FruR1ihuojC2sA== X-Received: by 2002:a05:6000:402a:b0:391:2fe3:24ec with SMTP id ffacd0b85a97d-39132d3c1a9mr7994487f8f.14.1741570145997; Sun, 09 Mar 2025 18:29:05 -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-3912bfe0004sm13025061f8f.40.2025.03.09.18.29.04 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 09 Mar 2025 18:29:04 -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?= , Mikko Rapeli Subject: [PATCH v7 7/7] hw/char/pl011: Implement TX FIFO Date: Mon, 10 Mar 2025 02:28:25 +0100 Message-ID: <20250310012825.79614-8-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::432; envelope-from=philmd@linaro.org; helo=mail-wr1-x432.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=unavailable 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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org If the UART back-end chardev doesn't drain data as fast as stdout does or blocks, buffer in the TX FIFO to try again later. This avoids having the IO-thread busy waiting on chardev back-ends, reported recently when testing the Trusted Reference Stack and using the socket backend. Implement registering a front-end 'watch' callback on back-end events, so we can resume transmitting when the back-end is writable again, not blocking the main loop. Similarly to the RX FIFO path, FIFO level selection is not implemented (interrupt is triggered when a single byte is available in the FIFO). Reported-by: Mikko Rapeli Suggested-by: Alex Bennée Reviewed-by: Peter Maydell Signed-off-by: Philippe Mathieu-Daudé --- hw/char/pl011.c | 35 +++++++++++++++++++++++++++-------- hw/char/trace-events | 1 + 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 6d26a3e13f8..d93cd8b3f0e 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -258,6 +258,10 @@ static gboolean pl011_xmit_cb(void *do_not_use, GIOCondition cond, void *opaque) count = fifo8_num_used(&s->xmit_fifo); trace_pl011_fifo_tx_xmit_used(count); + if (count < 1) { + /* FIFO empty */ + return G_SOURCE_REMOVE; + } if (!qemu_chr_fe_backend_connected(&s->chr)) { /* Instant drain the fifo when there's no back-end. */ @@ -265,15 +269,23 @@ static gboolean pl011_xmit_cb(void *do_not_use, GIOCondition cond, void *opaque) return G_SOURCE_REMOVE; } - buf[0] = fifo8_pop(&s->xmit_fifo); - bytes_consumed = 1; + count = fifo8_peek_buf(&s->xmit_fifo, buf, fifo8_num_used(&s->xmit_fifo)); + trace_pl011_fifo_tx_xmit_peek(count); - /* - * XXX this blocks entire thread. Rewrite to use - * qemu_chr_fe_write and background I/O callbacks - */ - qemu_chr_fe_write_all(&s->chr, buf, bytes_consumed); + /* Transmit as much data as we can. */ + bytes_consumed = qemu_chr_fe_write(&s->chr, buf, count); trace_pl011_fifo_tx_xmit_consumed(bytes_consumed); + if (bytes_consumed < 0) { + /* Error in back-end: drain the fifo. */ + pl011_drain_tx(s); + return G_SOURCE_REMOVE; + } else if (bytes_consumed == 0) { + /* Couldn't send anything, try again later */ + return G_SOURCE_CONTINUE; + } + + /* Pop the data we could transmit. */ + fifo8_drop(&s->xmit_fifo, bytes_consumed); s->int_level |= INT_TX; s->flags &= ~PL011_FLAG_TXFF; @@ -284,6 +296,11 @@ static gboolean pl011_xmit_cb(void *do_not_use, GIOCondition cond, void *opaque) pl011_update(s); + if (!emptied_fifo) { + /* Reschedule another transmission if we couldn't transmit all. */ + return G_SOURCE_CONTINUE; + } + return G_SOURCE_REMOVE; } @@ -313,7 +330,9 @@ static void pl011_write_txdata(PL011State *s, uint8_t data) trace_pl011_fifo_tx_put(data); pl011_loopback_tx(s, data); fifo8_push(&s->xmit_fifo, data); - s->flags |= PL011_FLAG_TXFF; + if (pl011_is_tx_fifo_full(s)) { + s->flags |= PL011_FLAG_TXFF; + } s->flags &= ~PL011_FLAG_TXFE; pl011_xmit(s); diff --git a/hw/char/trace-events b/hw/char/trace-events index 730d6292a2d..c377f971a6c 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -68,6 +68,7 @@ pl011_fifo_rx_put(uint32_t c, unsigned read_count, size_t rx_fifo_depth) "RX FIF 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_peek(unsigned sent) "TX FIFO peek %u chars" 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"