Message ID | 20240719181041.49545-11-philmd@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/char/pl011: Implement TX (async) FIFO to avoid blocking the main loop | expand |
On Fri, 19 Jul 2024 at 19:11, Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > > Do not receive characters when UART or receiver are disabled. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > Reviewed-by: Richard Henderson <richard.henderson@linaro.org> > --- > hw/char/pl011.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/hw/char/pl011.c b/hw/char/pl011.c > index c76283dccf..0ce91c13d3 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) > @@ -481,9 +482,11 @@ static void pl011_write(void *opaque, hwaddr offset, > static int pl011_can_receive(void *opaque) > { > PL011State *s = (PL011State *)opaque; > - int r; > + int r = 0; > > - r = s->read_count < pl011_get_fifo_depth(s); > + if ((s->cr & CR_UARTEN) && (s->cr & CR_RXE)) { > + r = s->read_count < pl011_get_fifo_depth(s); > + } > trace_pl011_can_receive(s->lcr, s->read_count, r); > return r; I have a vague recollection of a previous conversation where we discussed whether tightening up the UART-enable checks would break existing only-tested-on-QEMU baremetal simple example code. But I can't find it in my email archive -- do you remember a discussion about this or am I misremembering? thanks -- PMM
diff --git a/hw/char/pl011.c b/hw/char/pl011.c index c76283dccf..0ce91c13d3 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) @@ -481,9 +482,11 @@ static void pl011_write(void *opaque, hwaddr offset, static int pl011_can_receive(void *opaque) { PL011State *s = (PL011State *)opaque; - int r; + int r = 0; - r = s->read_count < pl011_get_fifo_depth(s); + if ((s->cr & CR_UARTEN) && (s->cr & CR_RXE)) { + r = s->read_count < pl011_get_fifo_depth(s); + } trace_pl011_can_receive(s->lcr, s->read_count, r); return r; }