From patchwork Sat Feb 8 16:39:05 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: 13966435 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 6E2D6C021A0 for ; Sat, 8 Feb 2025 16:40:56 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgnrX-00010f-OO; Sat, 08 Feb 2025 11:39:23 -0500 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 1tgnrW-00010N-Cn for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:22 -0500 Received: from mail-wm1-x332.google.com ([2a00:1450:4864:20::332]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgnrU-0008NL-TP for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:22 -0500 Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-43934d41730so4090305e9.2 for ; Sat, 08 Feb 2025 08:39:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1739032759; x=1739637559; 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=pnDfQ0pDNHjagyoidO1nQy0wbrzE23spPhP9nSEJCp0=; b=M2GYL5VJbm3fLpUbuaP+A2IqSlhhpa3F1nFe/LltDcWNRdRaBZsGyX8hOTWbzjTNZK Qwo375LO45k2qrXXu0t52+12WuMzhpAxxQ0GVCLC3lG4X7L6QZ7YNd/+tDwrrNTd65Xh Du5dCy9ADLHcTxybYGmguEWiRNwwa3k1P16Q6RppbGs6JF5X20jO9XAG6gMjd3h5cw4G Wn8litcw+1x+osRn9gV94MR8JB5annIC7pMQCULRJvcBARdfp1K6nQ4tokib6+pdwC5N PG9MOL4yKeM9mQoHaG2ilUJCKldwylOMfFnI/yeiFkLf4iRQj6UcyKhpUsoG+E2zjf/8 /Vxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739032759; x=1739637559; 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=pnDfQ0pDNHjagyoidO1nQy0wbrzE23spPhP9nSEJCp0=; b=NVFXsCt8J+hOp9pBDtovE/TFwvnruvthk+w7CFXORnYadNYTpzqTxUrj5oc+suXo6c YzjbTckdhLPmTqWBplW+hhJqIpxdvunWqy6zM1z6H5qRFGwMoVzmM2wtCrBSUuqZq3J/ aqZ3K1ywCo+kXcwxjr8mbLslFsVDb62AhoBKFn1MHd9FUN/BPSqf9dWkuBBleg8trHvJ onZx7W+1gRBqc2LTy6OCbCyobp2Ml8wSCFuuX6j9TqbS9++PAk4v5h68HvpJy0pQvp1e cokhm/j22A2IfqlEiKDm2Z1OD5QjCv/enxKVz6uLpfojL1noV70ySu3Ua8gMv5kjMBuW EyOw== X-Gm-Message-State: AOJu0Yy9MvDzp6zgctooD2m/TscsNhMKx073ErQWtEDtl/KwsRqFdjFE jZ41Fa4nk/5h6qJJKS7CpcZQ6ImQJ4JS0Is0d24aM5wv47HonMJnqfY2KIDfScFM1yTY1FnbPkw u0zY= X-Gm-Gg: ASbGnctW3F143Wk8DbyAmnK8V8yDGsQptRBcFfXVGX5t+vGUVj43uIEArkX0OFMWs/Q TcH0LfJfrbzs6XEJ6Trjt7C8xlcL83OifXmk+kuaJ3nZN/LGw0mMa6ZjrzbCHHG4pfcUp4wXn3j usBngtPEfOgMug8eOCKvK0m8ff7mhACwmQ/O/A18DJO5vev1kaOQvhHaUSJKAxaSrlac1WSDc07 e54vIPlHTS/Ha9tSjT9/e2BTQq9+lFC9r8oc5U8AWoNYaUrwpi0jbfP99pVmuc+v4WcNToOpVwq QydRahpBf8TSqeOrtVddqYbey3rTwXkHJZX3BLahUKbZskdxa5V+zvPYlGCoiaDNbA== X-Google-Smtp-Source: AGHT+IGtem7OP/J+ciEP6t1sttj6uUucFHKFy2ilA0KO9IbGMYq37p+5gV+Q9tzUmRYGQPuY0zZLXQ== X-Received: by 2002:a05:6000:1887:b0:386:3356:f3ac with SMTP id ffacd0b85a97d-38dc90edfecmr5468949f8f.26.1739032758923; Sat, 08 Feb 2025 08:39:18 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38dbdd54624sm7410071f8f.45.2025.02.08.08.39.17 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 08 Feb 2025 08:39:18 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Paolo Bonzini , qemu-arm@nongnu.org, Mark Cave-Ayland , =?utf-8?q?Alex_Benn=C3=A9?= =?utf-8?q?e?= , Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Richard Henderson Subject: [PATCH v6 1/7] hw/char/pl011: Warn when using disabled receiver Date: Sat, 8 Feb 2025 17:39:05 +0100 Message-ID: <20250208163911.54522-2-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250208163911.54522-1-philmd@linaro.org> References: <20250208163911.54522-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::332; envelope-from=philmd@linaro.org; helo=mail-wm1-x332.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 We shouldn't receive characters when the full UART or its receiver is disabled. However we don't want to break the possibly incomplete "my first bare metal assembly program"s, so we choose to simply display a warning when this occurs. Reviewed-by: Richard Henderson Signed-off-by: Philippe Mathieu-Daudé --- hw/char/pl011.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 06ce851044d..60cea1d9a16 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -85,6 +85,7 @@ DeviceState *pl011_create(hwaddr addr, qemu_irq irq, Chardev *chr) #define CR_OUT1 (1 << 12) #define CR_RTS (1 << 11) #define CR_DTR (1 << 10) +#define CR_RXE (1 << 9) #define CR_TXE (1 << 8) #define CR_LBE (1 << 7) #define CR_UARTEN (1 << 0) @@ -487,6 +488,12 @@ static int pl011_can_receive(void *opaque) PL011State *s = (PL011State *)opaque; int r; + if (!(s->cr & CR_UARTEN)) { + qemu_log_mask(LOG_GUEST_ERROR, "PL011 reading data on disabled UART\n"); + } + if (!(s->cr & CR_RXE)) { + qemu_log_mask(LOG_GUEST_ERROR, "PL011 reading data on disabled TX UART\n"); + } r = s->read_count < pl011_get_fifo_depth(s); trace_pl011_can_receive(s->lcr, s->read_count, r); return r; From patchwork Sat Feb 8 16:39:06 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: 13966431 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 E0649C02198 for ; Sat, 8 Feb 2025 16:40:09 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgnrf-00011w-EQ; Sat, 08 Feb 2025 11:39:31 -0500 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 1tgnrd-00011S-VC for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:30 -0500 Received: from mail-wr1-x42a.google.com ([2a00:1450:4864:20::42a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgnrb-0008OM-CW for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:29 -0500 Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-38a8b17d7a7so1431778f8f.2 for ; Sat, 08 Feb 2025 08:39:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1739032765; x=1739637565; 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=AcA7adOksZJD+UONQiU8US0WrcIGd+kxe3T2X7yAEcA=; b=BreY4QpU6wt+wCY+rpCPDIgJJ92jJfy3T16UwQCWhAwxkOTfEITVV6EPXsp0Ur2I+j VqCfJgKQMtS5reTd5jrhyU6LlqYTY19cSOOcRirt+yNDMJeTWOEpjCjuJB7S4SeNtoKZ poinmkvPXwLBgepH2KAKkA6dU0O4nGeHMK2x3labuIKRY1eP85+jAnuWyNu84FcZ3kid 1BHmLSddcKNBzweCyKow/vijE0EkNI3tVHHgRbElqz4vM7meZNsAwqk9hvXA9dudZix9 1bqkSbUI9SLsBKx5kd+HiM4F0OFrPhQVlSRnPuh6E8tw/irlM43RosRszT9CL3PSDlNu NBSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739032765; x=1739637565; 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=AcA7adOksZJD+UONQiU8US0WrcIGd+kxe3T2X7yAEcA=; b=uvGEFsAFlnfORfZxFhhzFhIULEXS8Z8Eld7t/m99Fg4cLrkgxE9+quGK8cfaB+KNFC sq+C/uiJICm+OogcQCvowCsvunodZcZUgY6bZQpBUi/3MqM+muAsXqIinGwwVWgEcdwb LowGdlvgCQJetG6GECbTDmr7XRPMB46YeQctRmxTehPCQ7yCEVehPRUHheiDC5qMLjD5 AWcogNfJAja3jzIzm4V4bNcn13DwSdFnF9Gq6hKkNEL46GQ+wGCwx2CgdFbtNBaKlDgK usnpmErlkMjgcItwRJCFjGAXHCoBRGjMfrktA92qIOSLE/yoRbI+DiTV1YmDsQXMrX5F FzOg== X-Gm-Message-State: AOJu0YyeI4JKROj9lkydHrDQq5zDblyCdW5Va5Oxi9vpzt+HGzq4i+Gk PIBmlE3h2rqxIV2OB/K9c56y/5sNPoDEM1sgasJUbIQQ8O1SrnZma8Do0LTTShOJkqikD4ZBYCx OQs8= X-Gm-Gg: ASbGncvJkL+xpTDWS1nyGr9qv1c39Czuy9ZF2EoOgrQ1avilGgQ+4ryNQt75ZkSQwRc vLKh5YN1QgHcTvLe3kvzMMm3g17v46C/EreHF2aPxjy5f23BUoILtWO+izKQXmSqa/bYDAmMnRT BuiIG0No7YCFRh9896l3qerumyDdKQw3wbP+K02NHbinbLHlMXVLGpJUvKfnScczi10L27K3oi0 3Ovubx4BXiVrIGdXYQcQi4O2KlHhf7LOUzj/JXjAnAOg1FqdUiLPD5Jr2pqip40X201Vhu0vCUs +8qbgaDBs7V2yr5fv89q1yeuRYeAi14dPkG4X1hl54KKwuR4zKi7nQfW/J72maVL5g== X-Google-Smtp-Source: AGHT+IEdTgs0/7BmFE/lYXZS9m5FuUhqNVoPpaW8JwjPjKIKOJi1em2pZpdtO0n7teZaA1euLiI3sw== X-Received: by 2002:adf:efc4:0:b0:38a:4b8b:c57a with SMTP id ffacd0b85a97d-38dc93509damr5335898f8f.44.1739032765467; Sat, 08 Feb 2025 08:39:25 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4390daf4480sm125465305e9.27.2025.02.08.08.39.23 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 08 Feb 2025 08:39:24 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Paolo Bonzini , qemu-arm@nongnu.org, Mark Cave-Ayland , =?utf-8?q?Alex_Benn=C3=A9?= =?utf-8?q?e?= , Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= Subject: [PATCH v6 2/7] hw/char/pl011: Add transmit FIFO to PL011State Date: Sat, 8 Feb 2025 17:39:06 +0100 Message-ID: <20250208163911.54522-3-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250208163911.54522-1-philmd@linaro.org> References: <20250208163911.54522-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::42a; envelope-from=philmd@linaro.org; helo=mail-wr1-x42a.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 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 60cea1d9a16..807fcdee50b 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) @@ -553,6 +555,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; @@ -607,7 +627,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[] = { @@ -621,6 +645,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++) { @@ -633,6 +658,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); @@ -676,6 +708,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 Sat Feb 8 16:39:07 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: 13966432 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 53466C0219E for ; Sat, 8 Feb 2025 16:40:21 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgnrp-00013J-1b; Sat, 08 Feb 2025 11:39:41 -0500 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 1tgnri-00012f-RT for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:35 -0500 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgnrh-0008P5-5e for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:34 -0500 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-436a03197b2so20191525e9.2 for ; Sat, 08 Feb 2025 08:39:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1739032771; x=1739637571; 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=BHNgIGYUe1Afrdl08LOWU03e5kzF56Zt76xmOxbCwW0=; b=Cmq7FRNyadq2jHatYbe3wjIa26my42RrvWRY8QMLUH96D640yfZ7NLEeTUwx5ESVWE bieJ+iK24hG7zLAPRp8tNkRI6UsH+We43xBPK1HUwDiOkIncMmH4AfjnTdX7nh/M1S2c KGtK3JPThYZtyh88N91+z8niXOyb4mAP190+bKVdOeQm9F35/yqAJaDx1GnH3BLYsXNK gcajfM6pKpXqpQ98epmhMbOVy9+4KMYnsgtJuObwhlt3zwxCQDZAU3eO3de6MrCCr79T Kb/Nm2DG7F63Cl2r7evaMJAMpqv9nGPTv7yOI7YHRb7Yn8CTPspp+Ox8MUeWoTKoj3CR QgBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739032771; x=1739637571; 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=BHNgIGYUe1Afrdl08LOWU03e5kzF56Zt76xmOxbCwW0=; b=XbcUoOdfmTKFrkxhGpmOr/t2xME+kNTw0QxAg5vszZgkBJKdroGXc67a7HRdQdq6EC IulFymlH8M62bl0FxgZCrxEPoAvdl2elz/uatHrFrnGwnW0ThlJh+a43G4yXiQ/Llu/6 wRdE2GJtaDIlGQVKAi/8LsH6QWm/ZL/DuQlsSZrvX5+8MKpbtPBHTjg4QN85S2nfiFDU T1vFbe06rMltIZGjTASlwo+cePRq11q6PYemmvR/DFGy0e/wGdmK1c2TVIGTw4Hj5k9c 9bJ4oGxkacZ8ygawHKp76aYsuNn8sicgH/NIO7rSRnDKku8N4qKF9o7HL+kUXTPMsEEY 9Pew== X-Gm-Message-State: AOJu0Yy4eBPA9FQMbuIkPGbzGyd/8ZCPtA/IhqSFuFCG0UbcGCX++zqR BT8ker6Cu56RypnB8RPj1HPYkclnTRFmHNquXi3e7zZ4OEWkoS21+KgwxIh4KRk6ajQEY2YaVzi vR5c= X-Gm-Gg: ASbGncudEuGSkfeiU50vW819tV744JmkttTipmyzzGnG1HDZlv+De178NMArnmMcM9m gYu8N1StrvoaTQcIN3SQguMlDh2Bv1tID6BEkxeD4CQcSh1A4QUq4DByW9ZM2vBzo76PxyFMoPd bjJsTm2Ytu2nHe+9CKUFgFaSx3lIVBD1JeE1zBl28rSMIRLt1CKRbxnFHXBfkQzLW4I8chGfWk5 J/sWCmV8RtauRSjIxKrjoEXhVkWDSxKLmELt2rQyfeTQBNv2LWK886uMT+/Px8elRi7A19yPwGG 7fQ9larjxu5K7VLFrDMqooaneufFFGR/FKY+LgnndR37HJQ/PT3eBlXu8WB448CkKQ== X-Google-Smtp-Source: AGHT+IFYXCzbTFyNpFo+/GYGePnB+ahiUdqXKhY+NZKi+ZPsvLUsiHHLIKejAHlbITfeO0ayn66qUw== X-Received: by 2002:a5d:6d8b:0:b0:38d:d328:7987 with SMTP id ffacd0b85a97d-38dd3287fd1mr2148023f8f.40.1739032770614; Sat, 08 Feb 2025 08:39:30 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38dd1d3a2c3sm2661793f8f.50.2025.02.08.08.39.29 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 08 Feb 2025 08:39:29 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Paolo Bonzini , qemu-arm@nongnu.org, Mark Cave-Ayland , =?utf-8?q?Alex_Benn=C3=A9?= =?utf-8?q?e?= , Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= Subject: [PATCH v6 3/7] hw/char/pl011: Introduce pl011_xmit() as GSource Date: Sat, 8 Feb 2025 17:39:07 +0100 Message-ID: <20250208163911.54522-4-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250208163911.54522-1-philmd@linaro.org> References: <20250208163911.54522-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::32f; envelope-from=philmd@linaro.org; helo=mail-wm1-x32f.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 Extract pl011_xmit() from pl011_write_txdata(). Use the FIFO to pass the character to be transmitted. Implement it using the FEWatchFunc prototype, since we want to register it as GSource later. 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). Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Peter Maydell --- hw/char/pl011.c | 36 +++++++++++++++++++++++++++++------- hw/char/trace-events | 3 +++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 807fcdee50b..b9c9e5b5983 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -226,6 +226,32 @@ static void pl011_loopback_tx(PL011State *s, uint32_t value) pl011_fifo_rx_put(s, value); } +static gboolean pl011_xmit(void *do_not_use, GIOCondition cond, void *opaque) +{ + PL011State *s = opaque; + int bytes_consumed; + uint8_t data; + uint32_t count; + + count = fifo8_num_used(&s->xmit_fifo); + trace_pl011_fifo_tx_xmit_used(count); + + data = 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, &data, bytes_consumed); + trace_pl011_fifo_tx_xmit_consumed(bytes_consumed); + s->int_level |= INT_TX; + + pl011_update(s); + + return G_SOURCE_REMOVE; +} + static void pl011_write_txdata(PL011State *s, uint8_t data) { if (!(s->cr & CR_UARTEN)) { @@ -237,14 +263,10 @@ 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); + pl011_xmit(NULL, G_IO_OUT, s); } static uint32_t pl011_read_rxdata(PL011State *s) diff --git a/hw/char/trace-events b/hw/char/trace-events index b2e3d25ae34..3d07866be5c 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, int read_count, int r) "LCR 0x%08x read_count %d returning %d" pl011_fifo_rx_put(uint32_t c, int read_count) "new char 0x%02x read_count now %d" 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 ")" # cmsdk-apb-uart.c From patchwork Sat Feb 8 16:39:08 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: 13966433 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 F257AC02198 for ; Sat, 8 Feb 2025 16:40:34 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgnry-00015n-Tx; Sat, 08 Feb 2025 11:39:51 -0500 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 1tgnrq-00013z-2e for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:42 -0500 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 1tgnrl-0008QO-Iw for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:39 -0500 Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-38dcc6bfbccso801446f8f.0 for ; Sat, 08 Feb 2025 08:39:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1739032775; x=1739637575; 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=PHdzv7+PANz1XyqKozB4I/EYUC6swY8LmKK++HWkyR0=; b=kDBBkTv5KppBmGHg2Z3/AtNBByktxo4YP96cIxp6k8dNUvy3z7g+dqTQfPmcIYSI1x HtNI10BDaUDKFK8e7sE33WEdg/j9xvblmAfExTJMk6wZQgEjLajFlJLSF8azJrZnHpGh swV5bXtNdy/UmyA9egR/kOOuA03egrZ7qtpubenX+HiIi5xm5IPYXkmERrPpAF6jqOnL 5zxvY9zIPYM4xfoXhRuiualMpt2ik/XjqSUj0Hw+Gm6LoTgvI7wufcTh+w4+knAxJLRK Aa85bi+swxFScco0aDKA7HR7paSxul97NLh5PZQuoXPG3JhRihk4a6dkgQac61x/6fGL MnZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739032775; x=1739637575; 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=PHdzv7+PANz1XyqKozB4I/EYUC6swY8LmKK++HWkyR0=; b=MB+P3inv12ipyoNIvkwHte8QOvmnyRS/jqYUUB9+C/+0B146zLCNCCgdnJCyz6sS93 2QtCWB+J0gXnAm4llEl6R9WogBc1Iksw67tyZhJgF+c/A+IaN8PlmmEiWQlzIgk75HjN 0lHrg+l8wBjQmu3I5mtOTFKHRnGR+phSXzy3YM1SpxHjzxd7yhsPMr/4CdwJBnPjWpgW PtMKPmX8D0iwXaM0cjDw9hHtzGhlzY8wRk0vU3PQ9LqLY/JG8R8g2m6pMC040zC+VvFS BMKU4QIUofALFDAgIVQyqhlQ++PYJeiQZkGgKCbBGahEmpk9S7fj9EkLBmdHU34ePJ3b SlOA== X-Gm-Message-State: AOJu0Ywb+N4vqbJLiRpGTQfz3R1j3sxv4MvdEF0IofGkUPps79jnqHKP +TT30gN2nm5D3+M4YxqHI/08cO6AwSivtRwCXTX9+LuXECt2wClgWvWV7hk8VNp5L4Qs3jlMJTe HvCI= X-Gm-Gg: ASbGncsOeU+K1mDMuXExvQaWMr64cufN3rB/g0JJO18mPPnayQzQWdSeWMwiAchhz9c S3ElGMGYq5CgAYNwJCX7vCpO+rU8j3cXoJd8NwtImal3p0RuENV3PoV9DzKbGGdWIqfg1wBUwDI 6a0zVSSy40T/JraRvDY5QRmSFddCe8a4dwwFJp/ybBO+SscMCp5UuEh1fBTigw8Ly4o4taHuyW3 COqkbC3x8RLIk484BdxRkpy9VLqLSHnW9XAIsSoghFyG/ic47lTpjypjwSpkBf+/YVFCnPc9wIm 2s3UIsNH2WguweBYgr+JgiMAPqyi+M8LlMU0Nv8VR9yOEbcP7FgfGC4qYVbbXsMD4g== X-Google-Smtp-Source: AGHT+IH6YpUMdG322bhbp1b6ekVP+kxaXrw7iSiny0srrOqCy4sWpckqu3Y/SBLQQuH4TYwy4uKzVg== X-Received: by 2002:a5d:5915:0:b0:38b:f4dc:4483 with SMTP id ffacd0b85a97d-38dc8fe80bcmr4396795f8f.29.1739032775508; Sat, 08 Feb 2025 08:39:35 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4390d964c7csm124581855e9.17.2025.02.08.08.39.34 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 08 Feb 2025 08:39:35 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Paolo Bonzini , qemu-arm@nongnu.org, Mark Cave-Ayland , =?utf-8?q?Alex_Benn=C3=A9?= =?utf-8?q?e?= , Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= Subject: [PATCH v6 4/7] hw/char/pl011: Trace FIFO enablement Date: Sat, 8 Feb 2025 17:39:08 +0100 Message-ID: <20250208163911.54522-5-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250208163911.54522-1-philmd@linaro.org> References: <20250208163911.54522-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 Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Peter Maydell --- hw/char/pl011.c | 4 +++- hw/char/trace-events | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index b9c9e5b5983..447f185e2d5 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -148,6 +148,7 @@ static bool pl011_loopback_enabled(PL011State *s) static bool pl011_is_fifo_enabled(PL011State *s) { + trace_pl011_fifo_is_enabled((s->lcr & LCR_FEN) != 0); return (s->lcr & LCR_FEN) != 0; } @@ -464,8 +465,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 3d07866be5c..dd635ac6012 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -63,6 +63,8 @@ pl011_read(uint32_t addr, uint32_t value, const char *regname) "addr 0x%03x valu pl011_read_fifo(int read_count) "FIFO read, read_count now %d" 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, int read_count, int r) "LCR 0x%08x read_count %d returning %d" +pl011_fifo_enable(bool enable) "enable:%u" +pl011_fifo_is_enabled(bool enabled) "enabled:%u" pl011_fifo_rx_put(uint32_t c, int read_count) "new char 0x%02x read_count now %d" 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 Sat Feb 8 16:39:09 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: 13966437 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 6731AC0219E for ; Sat, 8 Feb 2025 16:41:03 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgns0-000170-AF; Sat, 08 Feb 2025 11:39:52 -0500 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 1tgnrs-00014M-Lb for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:46 -0500 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgnrq-0008Ss-Ii for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:44 -0500 Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-438a39e659cso20144505e9.2 for ; Sat, 08 Feb 2025 08:39:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1739032780; x=1739637580; 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=k3jwnJ8U5C1FFKFcPCQMKp4F/bw0CDqtfmKmUBOfDPU=; b=PLCXSLcY1sDgcW6mxmLM6RZ4tYvUVioAUI0gOQNPAv6HZbFUNIn1N3Lrls9V1i9JHK HitLDG20y1l/SXuVE3hYS02dvMhfqPK4994PPYvDTAlNGfC1pYqdH7jrRQtfQXpSRm1f k8c/hR9qMZNZBa8NIaKHF1SdgVsXdQXiHUm09GD/f8v+6imdNrDcz3AgeVjzu7hugrdQ yhABqGyZtR9Ye6hIw+i719aw1Nudya1B+vDC8Pdl/zAozhCiamMv/jfLOCs6BAC68pnU IyYGy3wgq1DkQxxMXUjul9hl14UrrWH4+0WVic/JIIBD0GDYBxAoPrPLv1EUQnpG1c+u KJGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739032780; x=1739637580; 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=k3jwnJ8U5C1FFKFcPCQMKp4F/bw0CDqtfmKmUBOfDPU=; b=pMdDI3QXLTx0J0RRJOIrJ0ozspNuJF6P+lMTuIjWhxM68lFEBpWg1WkDR1z0Y+S53f IsC+LlNeI1K8LIKlZTWpYLrusVV1Ms+LwdiSP3vhCvH3It7zFcctfAq+RyCFtt3xuIhg +qZr2sUKFzNdcvmFMwd23d/OIq1ga+sHbvV9o02Tc5tvG30Ve5UeoYk20knUk7bjz/2k VhvpL63AkpPwTRzxmOUS7UWhFXmGgG8YrZkMAJj3n/RJhF7QeR+WUIlxLdsZfvYUCH2m umiZFboOen1B85RGQwVxiqXeoLcFMu5xgz+7ZpC5q8EAkIkHmCavdBgn1SGlcKt+0AUG aW6w== X-Gm-Message-State: AOJu0YxDh7z+tftNm3e3bSTU+jSKVF9Yx0OIzo9kmiCelbGYZmd79K7h 0KS7YGA/oA6vwSBt4AW6Y2DoaBCTDmtk3N7p3La6fNaiufpgSCsaVpUXrOqHN8iqWi0I9oRN+ZG 5n6Y= X-Gm-Gg: ASbGncuG9VIFYCQMAFAQMlNzNEDOYg/fcICdYgZNyPz2y+vCNS0BzZB6mq3CTmJfFmj xM+oxdpnKsycxI1rTld7xmtKoB8mPs0E3HRYfh5C+WcbQFUVxwgyq5Pf8Ad70PeLCQ7B2jHa0c4 f/E6vprDSbjnqlBQcxYPa5eiYzX9y8wOpMV5ll/gdzhiSbDBKtPVrHgBJjFMc8SzHSRvaYjUyiU p6YTmr5gsuaBiPtwRqPzx1+fpxpTHmsRE8rBVklRMulnuV6jmz4uSdG7y4V6lzwKI+OZsZwcsP9 JLTQ1XQSf5Jt5ZPb5APdqEFPPgDc1rDRZ8a1gEHW4hno434U2QPIakNC1iOR0qZH9A== X-Google-Smtp-Source: AGHT+IGiNbPF0hpneHG2b2A0Hn0xLt9FrKz3WmDdZusUAVuNNTx1ruYM+CySYBMFZZ2UaThcWdrCkA== X-Received: by 2002:a05:600c:4e0f:b0:436:1b7a:c0b4 with SMTP id 5b1f17b1804b1-4392497d53amr49853725e9.1.1739032780459; Sat, 08 Feb 2025 08:39:40 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38dc9ef8ac6sm4922432f8f.27.2025.02.08.08.39.39 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 08 Feb 2025 08:39:39 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Paolo Bonzini , qemu-arm@nongnu.org, Mark Cave-Ayland , =?utf-8?q?Alex_Benn=C3=A9?= =?utf-8?q?e?= , Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= Subject: [PATCH v6 5/7] hw/char/pl011: Consider TX FIFO overrun error Date: Sat, 8 Feb 2025 17:39:09 +0100 Message-ID: <20250208163911.54522-6-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250208163911.54522-1-philmd@linaro.org> References: <20250208163911.54522-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::334; envelope-from=philmd@linaro.org; helo=mail-wm1-x334.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 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 | 20 ++++++++++++++++++++ hw/char/trace-events | 2 ++ 2 files changed, 22 insertions(+) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 447f185e2d5..ef39ab666a2 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) @@ -158,6 +161,16 @@ 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) +{ + if (pl011_is_fifo_enabled(s)) { + trace_pl011_fifo_tx_is_full("FIFO", fifo8_is_full(&s->xmit_fifo)); + return fifo8_is_full(&s->xmit_fifo); + } + trace_pl011_fifo_tx_is_full("CHAR", !fifo8_is_empty(&s->xmit_fifo)); + return !fifo8_is_empty(&s->xmit_fifo); +} + static inline void pl011_reset_rx_fifo(PL011State *s) { s->read_count = 0; @@ -264,6 +277,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 dd635ac6012..8234f3afa13 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -67,9 +67,11 @@ pl011_fifo_enable(bool enable) "enable:%u" pl011_fifo_is_enabled(bool enabled) "enabled:%u" pl011_fifo_rx_put(uint32_t c, int read_count) "new char 0x%02x read_count now %d" 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 ")" # cmsdk-apb-uart.c From patchwork Sat Feb 8 16:39:10 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: 13966434 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 16B84C02198 for ; Sat, 8 Feb 2025 16:40:41 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgns1-00017Z-Dq; Sat, 08 Feb 2025 11:39:53 -0500 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 1tgnrx-00015C-29 for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:49 -0500 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgnrv-00006x-5Y for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:48 -0500 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-436341f575fso36228005e9.1 for ; Sat, 08 Feb 2025 08:39:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1739032785; x=1739637585; 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=81ffc0XjjE2CDrZU8HhaqibfPhqNj9LivXTF2X9Kxp8=; b=CckJVCJcrrsuDLl0kgh0hrnNu8/OvjV6v7THB1+IA4GPLmHXI4vH6kPqGcsfB1KGls IYSeOg1TGQwtKhITv1VHulLncCCc6Hms1asvZsF4xiWCDkcmLHLFTCfeDUtSY0GY58wy i4xxRLZbEq1CgHnU9PC+hRz8hHcwv6dX9Vk6CBFpLiRX9NqK/I+4kxMTtAsZo0GSamvj j5a54jNWHOwr5a7SKm7N5rw3LeTQpSXC0gUHLZNvu/cqZP76bDuvAI6UXQfyCQiqWOAG ZzdIP3Tmf7owZWFZnpoDxO03OCoBS43q7NGGM32gUIYatobMH5AnS53YPDOUIbuiL2/i u9ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739032785; x=1739637585; 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=81ffc0XjjE2CDrZU8HhaqibfPhqNj9LivXTF2X9Kxp8=; b=UXNvSUGJIQ28fVk0c8ibnxiJ2HG9wcWPfgRLtjmpqxcSdEjkG1i44N+T6BWIgI5e9d 9frdZe8oI/1tCOvM1vL4dwgB8tLlYwT0AdkIK3n6WkI94LYrxd7G7O7j6hyxqJmgYdQq kx7ldVybsSUBWO9/v19Wehvk79IxxDLLwLCMCT1Pb9fxvU0lD6BRRjMXxsmCRWiKScHr cNm51v355rfgyYBh9ZBLaN2Rc8vBTbigQXu3248vQ6JAQ/DTybCR+npjscminrnnOhtW 1+FhZTlDPdFDSL/kGU7cJZK90l6hX4fYyMmc0k1eyVoDcXNt7+HmD22y4FG4QNYtCeCI fPHA== X-Gm-Message-State: AOJu0YxG02pSaN97PfPg1gjUCmXp58RmootRfsPGkVBbPklj92yveBrd k7oiNIyDOo9P4kuaWUHzuOOBLMFTZPIgF86a68ZDB8xmRR1GdW+/V4uCzs7XLbJvNWyJPUPTV67 RF0I= X-Gm-Gg: ASbGnctp3gh6nAaU57YvnxdHVI4VYg/MbNoDmi0l+ja4zb/URX6NcRQa9rtmXRog9yg qn1Mu+xAm0wKqTi+TgS0Relq9h806AzKQ8N4ORT4797/HZDGufsEENPeIvq/xPXUCvCssalfJ+O tpy4HOOAkQwUcTyPn3v3TircL5fokJIArcOngiW9SxGiehyhE0u8VfP+Pqjvcpy+FG5N1WQ8FTl W2BiI43SqzLOw1Kndw/2GaLQtVSe/xHYFOT2DlDA3Ds87kQuJJ4XGMDxUCdaO6kbR0xDhSHbyE9 Vh6nZvttj3XqFKmMKSf8IIqWMz/gjrzEoKCxvoGi3MVW6hdeTHOsyG2Bn2pPILx3wQ== X-Google-Smtp-Source: AGHT+IG/X0VyA9+eIBjlpg23/gpiC6q5rDMExQc5IPCMWapruWrwiPy2YHvflwAE1tp+5k9gGRgdgA== X-Received: by 2002:a05:600c:3d06:b0:436:2238:97f6 with SMTP id 5b1f17b1804b1-4392f1b8e78mr17671635e9.1.1739032785361; Sat, 08 Feb 2025 08:39:45 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38dbde31d9bsm7546987f8f.94.2025.02.08.08.39.44 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 08 Feb 2025 08:39:44 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Paolo Bonzini , qemu-arm@nongnu.org, Mark Cave-Ayland , =?utf-8?q?Alex_Benn=C3=A9?= =?utf-8?q?e?= , Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= Subject: [PATCH v6 6/7] hw/char/pl011: Drain TX FIFO when no backend connected Date: Sat, 8 Feb 2025 17:39:10 +0100 Message-ID: <20250208163911.54522-7-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250208163911.54522-1-philmd@linaro.org> References: <20250208163911.54522-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::330; envelope-from=philmd@linaro.org; helo=mail-wm1-x330.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 ef39ab666a2..3c4264869df 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -240,6 +240,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(void *do_not_use, GIOCondition cond, void *opaque) { PL011State *s = opaque; @@ -250,6 +257,12 @@ static gboolean pl011_xmit(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; + } + data = fifo8_pop(&s->xmit_fifo); bytes_consumed = 1; diff --git a/hw/char/trace-events b/hw/char/trace-events index 8234f3afa13..7d1cba1b4f8 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -72,6 +72,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 ")" # cmsdk-apb-uart.c From patchwork Sat Feb 8 16:39:11 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: 13966436 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 B3EE0C02198 for ; Sat, 8 Feb 2025 16:41:02 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tgns5-0001DD-Uq; Sat, 08 Feb 2025 11:39:57 -0500 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 1tgns3-00019i-5f for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:55 -0500 Received: from mail-wm1-x32e.google.com ([2a00:1450:4864:20::32e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tgns1-0000JF-77 for qemu-devel@nongnu.org; Sat, 08 Feb 2025 11:39:54 -0500 Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-4361b0ec57aso29811455e9.0 for ; Sat, 08 Feb 2025 08:39:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1739032791; x=1739637591; 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=jH9Ymqij6X/GfoOzNSD/xDBEcCWv01J+bpak1JyU5gs=; b=B2uuuX1OyrMlAAe9XDZmfCWKlL1mSejNcoLOwlR0cXLSdWackCCdVMmsum0sR0kzhF 1iV4V8XIlIfF26D14fMXo8YZLPHIbqlsM7McLGS6k2ycmIPJP7P3vP86kTXftHpoXvGd WiDUFF26HkK0q1Wmv/rxiOWCA9/Nres+RRoBRUkZwYjhxG/eijcQP+KvdnTguwYFpoQT qC1z9eWCdiZLaW/yxQFStzR4fnmRg5TI3TUMljxs4CepMAM8uPy8LeQJy9JlFUM4PB8r bVpJssTz2dLRencvf/OWmYrkyKwAW1fphvxYuwNtOSTcxaK9f8YdVBzBgMJODv2gisD5 HP3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739032791; x=1739637591; 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=jH9Ymqij6X/GfoOzNSD/xDBEcCWv01J+bpak1JyU5gs=; b=jmL0t83q8cCam6PbEJ6hD4rtJ1zgCY3TCtGbxStSA6DRor4Pl4cnMYa4IxWlrQKA3E gCdFZOym0x+5/VrucpDmdjMJmFbGpYtgnZFrOyaRexeVrojV5BY00mtnjC/PjjZVmhBU SqLs+aX52MNEs70gdLHno8MeYxS/3tL8MqFO/eCp4S2X0OKNpuCb91YJh+kqyD2nEF7h izNVz6Gt0f0x19sYbnOBSuiMPLkI6mvkMUAVlQgS2fFY9QCSA/ECILzCpzz6MTEZ5u7W wx/vFEGQcn9II/FwbUUyJQ6wSKEAkIGpPKrYJA/HyIWKNB0ShVDRGnyqHoRB06hZuL4l 4wdw== X-Gm-Message-State: AOJu0YxLR2Hvz6nf7USxnDIYihp528C2XWJ6NiVsU5eS0E8FD/Lic1ID ylE069p93noqKUaa/JB59EqSyCcQW+x8bK5FU5WJGQkoGJ+dbHJ0ebVBnStFStIuNKF+PFovGoQ g1cE= X-Gm-Gg: ASbGncuTH/u9cMWXcMApX3ARJ3GVpgNjvrlF2I3lMio3kBebbEdaqnRvP6nTuAtFab1 LkzlBpyGWYQbIs5RwTQgI23qBubi15GfMoJiCKh3H5ARcvTxLaHqqGrkI9+z+LjWKE5QCdkQfSh nDikQiR2tukMZ2a3HfZgG2KhU8oO69/gQIcSDUqFX1kwHEP3d1oWQQgTfg34FyQOAHz8iW6H9Ux 0UR71BUgKoEJmnGiq5O0k1+oewnmIRzs86wb7ERFcv/yHGVNPbhoccBkZ/loQrkCMdrxEaA5NKb z/IdgmjMRZbvxo25qnwKxNcrWWMuQgltDm0Z8TiNcBYXdMZsj5tN/bCAlaawwiTxLA== X-Google-Smtp-Source: AGHT+IFDx2TnrORIfnq7ykrrFztI0awAHQvLJaf/Xc3aPE7Bg8TYqKnCdXrCzMx99dpIHY2+zbuFxw== X-Received: by 2002:a05:600c:5114:b0:434:ff25:199f with SMTP id 5b1f17b1804b1-439249bd37amr48708985e9.26.1739032791285; Sat, 08 Feb 2025 08:39:51 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4390d964c7csm124586685e9.17.2025.02.08.08.39.49 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 08 Feb 2025 08:39:50 -0800 (PST) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Paolo Bonzini , qemu-arm@nongnu.org, Mark Cave-Ayland , =?utf-8?q?Alex_Benn=C3=A9?= =?utf-8?q?e?= , Peter Maydell , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Mikko Rapeli Subject: [PATCH v6 7/7] hw/char/pl011: Implement TX FIFO Date: Sat, 8 Feb 2025 17:39:11 +0100 Message-ID: <20250208163911.54522-8-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250208163911.54522-1-philmd@linaro.org> References: <20250208163911.54522-1-philmd@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::32e; envelope-from=philmd@linaro.org; helo=mail-wm1-x32e.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 Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Peter Maydell --- hw/char/pl011.c | 39 +++++++++++++++++++++++++++++++-------- hw/char/trace-events | 1 + 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/hw/char/pl011.c b/hw/char/pl011.c index 3c4264869df..70eba224a9c 100644 --- a/hw/char/pl011.c +++ b/hw/char/pl011.c @@ -251,11 +251,15 @@ static gboolean pl011_xmit(void *do_not_use, GIOCondition cond, void *opaque) { PL011State *s = opaque; int bytes_consumed; - uint8_t data; + uint8_t buf[PL011_FIFO_DEPTH]; uint32_t count; 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. */ @@ -263,19 +267,29 @@ static gboolean pl011_xmit(void *do_not_use, GIOCondition cond, void *opaque) return G_SOURCE_REMOVE; } - data = 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, &data, 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; + } + + /* Pop the data we could transmit. */ + fifo8_drop(&s->xmit_fifo, bytes_consumed); s->int_level |= INT_TX; pl011_update(s); + if (!fifo8_is_empty(&s->xmit_fifo)) { + /* Reschedule another transmission if we couldn't transmit all. */ + return G_SOURCE_CONTINUE; + } + return G_SOURCE_REMOVE; } @@ -300,6 +314,10 @@ 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); + if (pl011_is_tx_fifo_full(s)) { + s->flags |= PL011_FLAG_TXFF; + } + pl011_xmit(NULL, G_IO_OUT, s); } @@ -651,6 +669,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, s); + } + s->ibrd &= IBRD_MASK; s->fbrd &= FBRD_MASK; diff --git a/hw/char/trace-events b/hw/char/trace-events index 7d1cba1b4f8..2d02c057483 100644 --- a/hw/char/trace-events +++ b/hw/char/trace-events @@ -69,6 +69,7 @@ pl011_fifo_rx_put(uint32_t c, int read_count) "new char 0x%02x read_count now %d 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"