The AMBA IDs are supposed to be at the end of 0x2000 block, which the PL011 UART allocates. Current QEMU implementation puts those IDs at 0x1000 offset, which is wrong. The QEMU implementation also allocates only 0x1000 instead of 0x2000 of space.
The fix is tested to work with Linux's PL011 driver and U-Boot running in QEMU. Signed-off-by: Marek Vasut <marek.va...@gmail.com> --- hw/pl011.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/pl011.c b/hw/pl011.c index 1b05d76..49d4de0 100644 --- a/hw/pl011.c +++ b/hw/pl011.c @@ -60,8 +60,8 @@ static uint64_t pl011_read(void *opaque, target_phys_addr_t offset, pl011_state *s = (pl011_state *)opaque; uint32_t c; - if (offset >= 0xfe0 && offset < 0x1000) { - return s->id[(offset - 0xfe0) >> 2]; + if (offset >= 0x1fe0 && offset < 0x2000) { + return s->id[(offset - 0x1fe0) >> 2]; } switch (offset >> 2) { case 0: /* UARTDR */ @@ -260,7 +260,7 @@ static int pl011_init(SysBusDevice *dev, const unsigned char *id) { pl011_state *s = FROM_SYSBUS(pl011_state, dev); - memory_region_init_io(&s->iomem, &pl011_ops, s, "pl011", 0x1000); + memory_region_init_io(&s->iomem, &pl011_ops, s, "pl011", 0x2000); sysbus_init_mmio(dev, &s->iomem); sysbus_init_irq(dev, &s->irq); s->id = id; -- 1.7.7.3