mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-28 20:41:52 -06:00
hw/char/pl011: Extract pl011_read_rxdata() from pl011_read()
To keep MemoryRegionOps read/write handlers with similar logic, factor pl011_read_txdata() out of pl011_read(), similar to what the previous commit did to pl011_write(). No functional change intended. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20240719181041.49545-8-philmd@linaro.org>
This commit is contained in:
parent
bd6051b7cf
commit
dee8284b6f
1 changed files with 24 additions and 17 deletions
|
@ -235,31 +235,38 @@ static void pl011_write_txdata(PL011State *s, uint8_t data)
|
||||||
pl011_update(s);
|
pl011_update(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t pl011_read_rxdata(PL011State *s)
|
||||||
|
{
|
||||||
|
uint32_t c;
|
||||||
|
|
||||||
|
s->flags &= ~PL011_FLAG_RXFF;
|
||||||
|
c = s->read_fifo[s->read_pos];
|
||||||
|
if (s->read_count > 0) {
|
||||||
|
s->read_count--;
|
||||||
|
s->read_pos = (s->read_pos + 1) & (pl011_get_fifo_depth(s) - 1);
|
||||||
|
}
|
||||||
|
if (s->read_count == 0) {
|
||||||
|
s->flags |= PL011_FLAG_RXFE;
|
||||||
|
}
|
||||||
|
if (s->read_count == s->read_trigger - 1) {
|
||||||
|
s->int_level &= ~INT_RX;
|
||||||
|
}
|
||||||
|
trace_pl011_read_fifo(s->read_count);
|
||||||
|
s->rsr = c >> 8;
|
||||||
|
pl011_update(s);
|
||||||
|
qemu_chr_fe_accept_input(&s->chr);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
static uint64_t pl011_read(void *opaque, hwaddr offset,
|
static uint64_t pl011_read(void *opaque, hwaddr offset,
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
PL011State *s = (PL011State *)opaque;
|
PL011State *s = (PL011State *)opaque;
|
||||||
uint32_t c;
|
|
||||||
uint64_t r;
|
uint64_t r;
|
||||||
|
|
||||||
switch (offset >> 2) {
|
switch (offset >> 2) {
|
||||||
case 0: /* UARTDR */
|
case 0: /* UARTDR */
|
||||||
s->flags &= ~PL011_FLAG_RXFF;
|
r = pl011_read_rxdata(s);
|
||||||
c = s->read_fifo[s->read_pos];
|
|
||||||
if (s->read_count > 0) {
|
|
||||||
s->read_count--;
|
|
||||||
s->read_pos = (s->read_pos + 1) & (pl011_get_fifo_depth(s) - 1);
|
|
||||||
}
|
|
||||||
if (s->read_count == 0) {
|
|
||||||
s->flags |= PL011_FLAG_RXFE;
|
|
||||||
}
|
|
||||||
if (s->read_count == s->read_trigger - 1)
|
|
||||||
s->int_level &= ~ INT_RX;
|
|
||||||
trace_pl011_read_fifo(s->read_count);
|
|
||||||
s->rsr = c >> 8;
|
|
||||||
pl011_update(s);
|
|
||||||
qemu_chr_fe_accept_input(&s->chr);
|
|
||||||
r = c;
|
|
||||||
break;
|
break;
|
||||||
case 1: /* UARTRSR */
|
case 1: /* UARTRSR */
|
||||||
r = s->rsr;
|
r = s->rsr;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue