diff --git a/docs/firmware-design.md b/docs/firmware-design.md index 1f799b6448da7d455e6f4458262aae74a187b6a5..e92042d4de3b6473155ef54c175ced5e5b2d65cb 100644 --- a/docs/firmware-design.md +++ b/docs/firmware-design.md @@ -156,7 +156,7 @@ BL1 performs minimal architectural initialization as follows. BL1 enables issuing of snoop and DVM (Distributed Virtual Memory) requests from the CCI-400 slave interface corresponding to the cluster that includes the primary CPU. BL1 also initializes UART0 (PL011 console), which enables -access to the `printf` family of functions. The `CNTFRQ_EL0` register is +access to the `printf` family of functions in BL1. The `CNTFRQ_EL0` register is programmed with the base frequency of the system counter, which is retrieved from the first entry in the frequency modes table. The system level implementation of the generic timer is enabled through the memory mapped @@ -218,6 +218,8 @@ platform-specific mechanism. It calculates the limits of DRAM (main memory) to determine whether there is enough space to load the BL3-3 image. A platform defined base address is used to specify the load address for the BL3-1 image. It also defines the extents of memory available for use by the BL3-2 image. +BL2 also initializes UART0 (PL011 console), which enables access to the +`printf` family of functions in BL2 #### BL3-1 (EL3 Runtime Firmware) image load @@ -293,7 +295,8 @@ SMC handler routine. BL3-1 performs detailed platform initialization, which enables normal world software to function correctly. It also retrieves entrypoint information for the BL3-3 image loaded by BL2 from the platform defined memory address populated -by BL2. +by BL2. BL3-1 also initializes UART0 (PL011 console), which enables +access to the `printf` family of functions in BL3-1 * GICv2 initialization: diff --git a/drivers/console/console.c b/drivers/console/console.c index efe12014ea871c01d5f99efc4993ee995eb75861..1a684ff6dc9f1f8792307d94228337f91f5b7d8a 100644 --- a/drivers/console/console.c +++ b/drivers/console/console.c @@ -31,11 +31,19 @@ #include #include #include +#include -static unsigned long uart_base = PL011_BASE; +static unsigned long uart_base; void console_init(unsigned long base_addr) { + /* TODO: assert() internally calls printf() and will result in + * an infinite loop. This needs to be fixed with some kind of + * exception mechanism or early panic support. This also applies + * to the other assert() calls below. + */ + assert(base_addr); + /* Initialise internal base address variable */ uart_base = base_addr; @@ -60,6 +68,8 @@ void console_init(unsigned long base_addr) int console_putc(int c) { + assert(uart_base); + if (c == '\n') console_putc('\r'); @@ -71,6 +81,8 @@ int console_putc(int c) int console_getc(void) { + assert(uart_base); + while ((pl011_read_fr(uart_base) & PL011_UARTFR_RXFE) != 0) ; return pl011_read_dr(uart_base); diff --git a/plat/fvp/bl2_plat_setup.c b/plat/fvp/bl2_plat_setup.c index f0d6e448447e2a937a985841450bbcc36a66ddaf..4d57ed56204006f8d5a374b8c8498db81546a82a 100644 --- a/plat/fvp/bl2_plat_setup.c +++ b/plat/fvp/bl2_plat_setup.c @@ -33,6 +33,7 @@ #include #include #include +#include /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout @@ -110,6 +111,8 @@ void bl2_early_platform_setup(meminfo *mem_layout, /* Initialize the platform config for future decision making */ platform_config_setup(); + console_init(PL011_UART0_BASE); + return; } diff --git a/plat/fvp/bl31_plat_setup.c b/plat/fvp/bl31_plat_setup.c index 1b24687bcdd9bbc95d50db4919f45761e9e017b5..eb137e0d9434c36aa91c8a2156babb8251ac0620 100644 --- a/plat/fvp/bl31_plat_setup.c +++ b/plat/fvp/bl31_plat_setup.c @@ -32,6 +32,7 @@ #include #include #include +#include /******************************************************************************* * Declarations of linker defined symbols which will help us find the layout @@ -117,6 +118,8 @@ void bl31_early_platform_setup(bl31_args *from_bl2, /* Initialize the platform config for future decision making */ platform_config_setup(); + + console_init(PL011_UART0_BASE); } /*******************************************************************************