Arguably all of uart0_init() is unnecessary, as we're pretty sure that the address we initialize uart0_base to is correct. We go through the motions of finding the uart anyway though, because it's easy. It's also easy to check chosen/stdout-path first, so let's do that too. But, just to make all this stuff is a little less unnecessary, let's add a warning when we do actually find an address that doesn't match our initializer.
Signed-off-by: Andrew Jones <drjo...@redhat.com> --- lib/arm/io.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/arm/io.c b/lib/arm/io.c index 8b1501886736a..a08d394e4aa1c 100644 --- a/lib/arm/io.c +++ b/lib/arm/io.c @@ -19,12 +19,14 @@ extern void halt(int code); /* * Use this guess for the pl011 base in order to make an attempt at * having earlier printf support. We'll overwrite it with the real - * base address that we read from the device tree later. + * base address that we read from the device tree later. This is + * the address we expect QEMU's mach-virt machine type to put in + * its generated device tree. */ -#define QEMU_MACH_VIRT_PL011_BASE 0x09000000UL +#define UART_EARLY_BASE 0x09000000UL static struct spinlock uart_lock; -static volatile u8 *uart0_base = (u8 *)QEMU_MACH_VIRT_PL011_BASE; +static volatile u8 *uart0_base = (u8 *)UART_EARLY_BASE; static void uart0_init(void) { @@ -32,16 +34,32 @@ static void uart0_init(void) struct dt_pbus_reg base; int ret; - ret = dt_pbus_get_base_compatible(compatible, &base); - assert(ret == 0 || ret == -FDT_ERR_NOTFOUND); + ret = dt_get_default_console_node(); + assert(ret >= 0 || ret == -FDT_ERR_NOTFOUND); - if (ret) { - printf("%s: %s not found in the device tree, aborting...\n", - __func__, compatible); - abort(); + if (ret == -FDT_ERR_NOTFOUND) { + + ret = dt_pbus_get_base_compatible(compatible, &base); + assert(ret == 0 || ret == -FDT_ERR_NOTFOUND); + + if (ret) { + printf("%s: %s not found in the device tree, " + "aborting...\n", + __func__, compatible); + abort(); + } + + } else { + assert(dt_pbus_translate_node(ret, 0, &base) == 0); } uart0_base = ioremap(base.addr, base.size); + + if (uart0_base != (u8 *)UART_EARLY_BASE) { + printf("WARNING: early print support may not work. " + "Found uart at %p, but early base is %p.\n", + uart0_base, (u8 *)UART_EARLY_BASE); + } } void io_init(void) -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html