From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Jones Subject: [kvm-unit-tests PATCH 18/18] arm/arm64: uart0_init: check /chosen/stdout-path Date: Thu, 5 Nov 2015 18:24:43 -0600 Message-ID: <1446769483-21586-19-git-send-email-drjones@redhat.com> References: <1446769483-21586-1-git-send-email-drjones@redhat.com> Cc: alex.bennee@linaro.org, cov@codeaurora.org To: pbonzini@redhat.com, kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:32777 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966072AbbKFAZi (ORCPT ); Thu, 5 Nov 2015 19:25:38 -0500 In-Reply-To: <1446769483-21586-1-git-send-email-drjones@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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 --- 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