On 06/11/2015 01:24, Andrew Jones wrote: > 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 <drjones@xxxxxxxxxx> > --- > 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) > Applied, thanks. Paolo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html