[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 12/16] hw/char/pl011: Add transmit FIFO to PL011State
From: |
Philippe Mathieu-Daudé |
Subject: |
[PATCH v5 12/16] hw/char/pl011: Add transmit FIFO to PL011State |
Date: |
Fri, 19 Jul 2024 20:10:37 +0200 |
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 <alex.bennee@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
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 4fcaf3d7d3..e8d95961f6 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 c42c6d1ac2..6519340b50 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)
@@ -545,6 +547,24 @@ static const VMStateDescription vmstate_pl011_clock = {
}
};
+static bool pl011_xmit_fifo_state_needed(void *opaque)
+{
+ PL011State* s = opaque;
+
+ return (s->lcr & LCR_FEN) && !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;
@@ -599,7 +619,11 @@ static const VMStateDescription vmstate_pl011 = {
.subsections = (const VMStateDescription * const []) {
&vmstate_pl011_clock,
NULL
- }
+ },
+ .subsections = (const VMStateDescription * []) {
+ &vmstate_pl011_xmit_fifo,
+ NULL
+ },
};
static Property pl011_properties[] = {
@@ -614,6 +638,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++) {
@@ -626,6 +651,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);
@@ -669,6 +701,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,
};
--
2.41.0
- [PATCH v5 08/16] hw/char/pl011: Warn when using disabled transmitter, (continued)
- [PATCH v5 08/16] hw/char/pl011: Warn when using disabled transmitter, Philippe Mathieu-Daudé, 2024/07/19
- [PATCH v5 09/16] tests/qtest: Update tests using PL011 UART, Philippe Mathieu-Daudé, 2024/07/19
- [PATCH v5 10/16] hw/char/pl011: Check if receiver is enabled, Philippe Mathieu-Daudé, 2024/07/19
- [PATCH v5 13/16] hw/char/pl011: Introduce pl011_xmit() as GSource, Philippe Mathieu-Daudé, 2024/07/19
- [PATCH v5 11/16] hw/char/pl011: Rename RX FIFO methods, Philippe Mathieu-Daudé, 2024/07/19
- [RFC PATCH v5 16/16] hw/char/pl011: Implement TX FIFO, Philippe Mathieu-Daudé, 2024/07/19
- [PATCH v5 12/16] hw/char/pl011: Add transmit FIFO to PL011State,
Philippe Mathieu-Daudé <=
- [PATCH v5 15/16] hw/char/pl011: Drain TX FIFO when no backend connected, Philippe Mathieu-Daudé, 2024/07/19
- [PATCH v5 14/16] hw/char/pl011: Consider TX FIFO overrun error, Philippe Mathieu-Daudé, 2024/07/19