From: Richard Henderson <richard.henderson@linaro.org>
To: "Philippe Mathieu-Daudé" <philmd@linaro.org>, qemu-devel@nongnu.org
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Evgeny Iakovlev" <eiakovlev@linux.microsoft.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Gavin Shan" <gshan@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
qemu-arm@nongnu.org, "Mikko Rapeli" <mikko.rapeli@linaro.org>
Subject: Re: [RFC PATCH v2 11/11] hw/char/pl011: Implement TX FIFO
Date: Fri, 14 Jul 2023 08:27:48 +0100 [thread overview]
Message-ID: <f9c35a6c-be32-7758-d78a-e63449f864b8@linaro.org> (raw)
In-Reply-To: <20230710175102.32429-12-philmd@linaro.org>
On 7/10/23 18:51, Philippe Mathieu-Daudé wrote:
> +static gboolean pl011_xmit(void *do_not_use, GIOCondition cond, void *opaque)
> +{
> + PL011State *s = opaque;
> + int ret;
> + const uint8_t *buf;
> + uint32_t buflen;
> + uint32_t count;
> + bool tx_enabled;
> +
> + if (!qemu_chr_fe_backend_connected(&s->chr)) {
> + /* Instant drain the fifo when there's no back-end */
> + return pl011_drain_tx(s);
> + }
> +
> + tx_enabled = s->cr & CR_UARTEN;
What happened to "Hello, World"? We ought to be consistent.
For actual modeling, I think you need TXE too.
Where does UARTFR get updated after successfully transmitting data?
> static void pl011_write_txdata(PL011State *s, const uint8_t *buf, int length)
> @@ -162,12 +218,32 @@ static void pl011_write_txdata(PL011State *s, const uint8_t *buf, int length)
> if (!(s->cr & CR_TXE)) {
> qemu_log_mask(LOG_GUEST_ERROR, "PL011 write data but TX disabled\n");
> }
> + if (!fifo8_is_empty(&s->xmit_fifo)) {
> + /*
> + * If the UART is disabled in the middle of transmission
> + * or reception, it completes the current character before
> + * stopping.
> + */
> + pl011_xmit(NULL, G_IO_OUT, s);
> + return;
> + }
Why is this in write_txdata? I would expect to find this with a write to UARTCR.
You appear to *not* be queuing data unless the fifo is empty.
> + if (length > fifo8_num_free(&s->xmit_fifo)) {
> + /*
> + * The FIFO contents remain valid because no more data is
> + * written when the FIFO is full, only the contents of the
> + * shift register are overwritten. The CPU must now read
> + * the data, to empty the FIFO.
> + */
> + trace_pl011_fifo_tx_overrun();
> + s->rsr |= RSR_OE;
> + return;
> + }
> +
> + trace_pl011_fifo_tx_put(length);
> + fifo8_push_all(&s->xmit_fifo, buf, length);
Since length will always be 1, probably we should just remove it.
> +static bool pl011_xmit_fifo_state_needed(void *opaque, int version_id)
> +{
> + PL011State* s = opaque;
> +
> + return pl011_is_fifo_enabled(s) && !fifo8_is_empty(&s->xmit_fifo);
> +}
Ok.
> static int pl011_post_load(void *opaque, int version_id)
> {
> PL011State* s = opaque;
> @@ -455,6 +538,11 @@ static int pl011_post_load(void *opaque, int version_id)
> s->read_pos = 0;
> }
>
> + if (pl011_xmit_fifo_state_needed(s, version_id)) {
> + /* Reschedule another transmission */
> + qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP, pl011_xmit, s);
> + }
Ok.
> @@ -473,6 +561,7 @@ static const VMStateDescription vmstate_pl011 = {
> VMSTATE_UINT32(int_enabled, PL011State),
> VMSTATE_UINT32(int_level, PL011State),
> VMSTATE_UINT32_ARRAY(read_fifo, PL011State, PL011_FIFO_DEPTH),
> + VMSTATE_FIFO8_TEST(xmit_fifo, PL011State, pl011_xmit_fifo_state_needed),
Not ok.
The new data should go in its own VMStateDescription, like vmstate_pl011_clock.
r~
next prev parent reply other threads:[~2023-07-14 7:28 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-10 17:50 [PATCH v2 00/11] hw/char/pl011: Implement TX (async) FIFO to avoid blocking the main loop Philippe Mathieu-Daudé
2023-07-10 17:50 ` [PATCH v2 01/11] hw/char/pl011: Restrict MemoryRegionOps implementation access sizes Philippe Mathieu-Daudé
2023-07-14 6:47 ` Richard Henderson
2023-07-10 17:50 ` [PATCH v2 02/11] hw/char/pl011: Display register name in trace events Philippe Mathieu-Daudé
2023-07-14 6:49 ` Richard Henderson
2023-07-10 17:50 ` [PATCH v2 03/11] hw/char/pl011: Remove duplicated PL011_INT_[RT]X definitions Philippe Mathieu-Daudé
2023-07-14 6:50 ` Richard Henderson
2023-07-10 17:50 ` [PATCH v2 04/11] hw/char/pl011: Replace magic values by register field definitions Philippe Mathieu-Daudé
2023-07-14 6:54 ` Richard Henderson
2023-07-10 17:50 ` [PATCH v2 05/11] hw/char/pl011: Split RX/TX path of pl011_reset_fifo() Philippe Mathieu-Daudé
2023-07-14 6:56 ` Richard Henderson
2023-07-10 17:50 ` [PATCH v2 06/11] hw/char/pl011: Extract pl011_write_txdata() from pl011_write() Philippe Mathieu-Daudé
2023-07-14 6:58 ` Richard Henderson
2023-10-12 13:07 ` Philippe Mathieu-Daudé
2023-10-12 14:25 ` Philippe Mathieu-Daudé
2023-07-10 17:50 ` [PATCH v2 07/11] hw/char/pl011: Extract pl011_read_rxdata() from pl011_read() Philippe Mathieu-Daudé
2023-07-14 7:00 ` Richard Henderson
2023-07-10 17:50 ` [PATCH v2 08/11] hw/char/pl011: Warn when using disabled transmitter Philippe Mathieu-Daudé
2023-07-14 7:01 ` Richard Henderson
2023-07-10 17:51 ` [PATCH v2 09/11] hw/char/pl011: Check if receiver is enabled Philippe Mathieu-Daudé
2023-07-14 7:03 ` Richard Henderson
2023-07-10 17:51 ` [PATCH v2 10/11] hw/char/pl011: Rename RX FIFO methods Philippe Mathieu-Daudé
2023-07-14 7:06 ` Richard Henderson
2023-07-10 17:51 ` [RFC PATCH v2 11/11] hw/char/pl011: Implement TX FIFO Philippe Mathieu-Daudé
2023-07-14 7:27 ` Richard Henderson [this message]
2023-10-13 14:05 ` Philippe Mathieu-Daudé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f9c35a6c-be32-7758-d78a-e63449f864b8@linaro.org \
--to=richard.henderson@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=eiakovlev@linux.microsoft.com \
--cc=gshan@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mikko.rapeli@linaro.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).