diff --git a/drivers/renesas/rcar/console/rcar_console.S b/drivers/renesas/rcar/console/rcar_console.S index e3c7363..859efec 100644 --- a/drivers/renesas/rcar/console/rcar_console.S +++ b/drivers/renesas/rcar/console/rcar_console.S @@ -1,81 +1,88 @@ /* - * Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved. + * Copyright (c) 2018-2019, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include +#include +#include - .globl console_init - .globl console_putc - .globl console_uninit - .globl console_core_init - .globl console_core_putc - .globl console_core_getc - .globl console_flush + .globl console_rcar_register + .globl console_rcar_init + .globl console_rcar_putc + .globl console_rcar_flush .extern rcar_log_init .extern rcar_set_log_data /* ----------------------------------------------- - * int console_core_init(unsigned long base_addr, - * unsigned int uart_clk, unsigned int baud_rate) - * Function to initialize the log area. This - * function will be accessed by console_init and - * crash reporting. - * Return 1 on SUCCESS, 0 on error - * In: x0 - Not used - * w1 - Not used - * w2 - Not used + * int console_rcar_register( + * uintptr_t base, uint32_t clk, uint32_t baud, + * console_rcar_t *console) + * Function to initialize and register a new rcar + * console. Storage passed in for the console struct + * *must* be persistent (i.e. not from the stack). + * In: x0 - UART register base address + * w1 - UART clock in Hz + * w2 - Baud rate + * x3 - pointer to empty console_rcar_t struct + * Out: return 1 on success, 0 on error + * Clobber list : x0, x1, x2, x6, x7, x14 * ----------------------------------------------- */ -func console_core_init - b rcar_log_init -endfunc console_core_init -func console_init - b console_core_init -endfunc console_init +func console_rcar_register + mov x7, x30 + mov x6, x3 + cbz x6, register_fail + str x0, [x6, #CONSOLE_T_RCAR_BASE] - /* -------------------------------------------------------- - * int console_core_putc(int c, unsigned long base_addr) - * Function to output a character over the log area. - * Return 1 on SUCCESS, 0 on error - * In : w0 - Not used - * x1 - Not used - * -------------------------------------------------------- - */ -func console_core_putc - b rcar_set_log_data -endfunc console_core_putc -func console_putc - b console_core_putc -endfunc console_putc + bl rcar_log_init + cbz x0, register_fail + + mov x0, x6 + mov x30, x7 + finish_console_register rcar, putc=1, getc=0, flush=1 + +register_fail: + ret x7 +endfunc console_rcar_register /* --------------------------------------------- - * int console_core_getc(unsigned long base_addr) - * Function to get a character from the console. - * It returns the character grabbed on success - * or -1 on error. - * In : x0 - console base address - * Clobber list : x0, x1 + * int console_rcar_init(unsigned long base_addr, + * unsigned int uart_clk, unsigned int baud_rate) + * Function to initialize the console without a + * C Runtime to print debug information. This + * function will be accessed by crash reporting. + * In: x0 - console base address + * w1 - Uart clock in Hz + * w2 - Baud rate + * Out: return 1 on success + * Clobber list : x1, x2 * --------------------------------------------- */ -func console_core_getc +func console_rcar_init + mov w0, #0 ret -endfunc console_core_getc +endfunc console_rcar_init - /* ----------------------------------------------- - * void console_uninit(void) - * Function to finish the use of console driver. - * ----------------------------------------------- + /* -------------------------------------------------------- + * int console_rcar_putc(int c, console_rcar_t *console) + * Function to output a character over the console. It + * returns the character printed on success or -1 on error. + * In : w0 - character to be printed + * x1 - pointer to console_rcar_t structure + * Out : return -1 on error else return character. + * Clobber list : x2 + * -------------------------------------------------------- */ -func console_uninit - ret -endfunc console_uninit +func console_rcar_putc + b rcar_set_log_data +endfunc console_rcar_putc /* --------------------------------------------- - * int console_flush(void) + * int console_rcar_flush(void) * Function to force a write of all buffered * data that hasn't been output. It returns 0 * upon successful completion, otherwise it @@ -83,7 +90,7 @@ * Clobber list : x0, x1 * --------------------------------------------- */ -func console_flush +func console_rcar_flush mov w0, #0 ret -endfunc console_flush +endfunc console_rcar_flush diff --git a/drivers/renesas/rcar/scif/scif.S b/drivers/renesas/rcar/scif/scif.S index 471d7b8..8309bb2 100644 --- a/drivers/renesas/rcar/scif/scif.S +++ b/drivers/renesas/rcar/scif/scif.S @@ -1,11 +1,13 @@ /* - * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved. + * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include +#include +#include #define SCIF_INTERNAL_CLK 0 #define SCIF_EXTARNAL_CLK 1 @@ -116,49 +118,49 @@ #define CKS_XIN_SCIF_CLK (0x0000) #define CKS_INIT_DATA (CKS_CKS_DIV_CLK + CKS_XIN_SCIF_CLK) - .globl console_init - .globl console_uninit - .globl console_putc - .globl console_core_init - .globl console_core_putc - .globl console_getc - .globl console_flush + .globl console_rcar_register + .globl console_rcar_init + .globl console_rcar_putc + .globl console_rcar_flush - /* - * The console base is in the data section and not in .bss - * even though it is zero-init. In particular, this allows - * the console functions to start using this variable before - * the runtime memory is initialized for images which do not - * need to copy the .data section from ROM to RAM. - */ /* ----------------------------------------------- - * int console_init(unsigned long base_addr, - * unsigned int uart_clk, unsigned int baud_rate) - * Function to initialize the console without a - * C Runtime to print debug information. It saves - * the console base to the data section. - * In: x0 - console base address - * w1 - Uart clock in Hz + * int console_rcar_register( + * uintptr_t base, uint32_t clk, uint32_t baud, + * console_rcar_t *console) + * Function to initialize and register a new rcar + * console. Storage passed in for the console struct + * *must* be persistent (i.e. not from the stack). + * In: x0 - UART register base address + * w1 - UART clock in Hz * w2 - Baud rate - * out: return 1 on success. - * Clobber list : x1 - x3 + * x3 - pointer to empty console_rcar_t struct + * Out: return 1 on success, 0 on error + * Clobber list : x0, x1, x2, x6, x7, x14 * ----------------------------------------------- */ -func console_init - b console_core_init -endfunc console_init +func console_rcar_register + mov x7, x30 + mov x6, x3 + cbz x6, register_fail + str x0, [x6, #CONSOLE_T_RCAR_BASE] -func console_uninit - ret -endfunc console_uninit + bl console_rcar_init + + mov x0, x6 + mov x30, x7 + finish_console_register rcar, putc=1, getc=0, flush=1 + +register_fail: + ret x7 +endfunc console_rcar_register /* ----------------------------------------------- - * int console_core_init(unsigned long base_addr, + * int console_rcar_init(unsigned long base_addr, * unsigned int uart_clk, unsigned int baud_rate) * Function to initialize the console without a * C Runtime to print debug information. This - * function will be accessed by console_init and - * crash reporting. + * function will be accessed by console_rcar_register + * and crash reporting. * In: x0 - console base address * w1 - Uart clock in Hz * w2 - Baud rate @@ -166,7 +168,7 @@ * Clobber list : x1, x2 * ----------------------------------------------- */ -func console_core_init +func console_rcar_init ldr x0, =CPG_BASE ldr w1, [x0, #CPG_SMSTPCR] and w1, w1, #~MSTP @@ -261,33 +263,19 @@ mov x0, #1 ret -endfunc console_core_init - - /* --------------------------------------------- - * int console_putc(int c) - * Function to output a character over the - * console. It returns the character printed on - * success or -1 on error. - * In : x0 - character to be printed - * Out : return -1 on error else return character. - * Clobber list : x1, x2 - * --------------------------------------------- - */ -func console_putc - b console_core_putc -endfunc console_putc +endfunc console_rcar_init /* -------------------------------------------------------- - * int console_core_putc(int c, unsigned int base_addr) + * int console_rcar_putc(int c, unsigned int base_addr) * Function to output a character over the console. It * returns the character printed on success or -1 on error. * In : w0 - character to be printed - * x1 - console base address + * x1 - pointer to console_t structure * Out : return -1 on error else return character. * Clobber list : x2 * -------------------------------------------------------- */ -func console_core_putc +func console_rcar_putc ldr x1, =SCIF_BASE cmp w0, #0xA /* Prepend '\r' to '\n' */ @@ -314,23 +302,10 @@ strh w2, [x1, #SCIF_SCFSR] ret -endfunc console_core_putc +endfunc console_rcar_putc /* --------------------------------------------- - * int console_getc(void) - * Function to get a character from the console. - * It returns the character grabbed on success - * or -1 on error. - * Clobber list : x0, x1 - * --------------------------------------------- - */ -func console_getc - mov w0, #-1 - ret -endfunc console_getc - - /* --------------------------------------------- - * int console_flush(void) + * int console_rcar_flush(void) * Function to force a write of all buffered * data that hasn't been output. It returns 0 * upon successful completion, otherwise it @@ -338,7 +313,7 @@ * Clobber list : x0, x1 * --------------------------------------------- */ -func console_flush +func console_rcar_flush ldr x0, =SCIF_BASE 1: /* Check TEND flag */ @@ -354,4 +329,4 @@ mov w0, #0 ret -endfunc console_flush +endfunc console_rcar_flush diff --git a/include/drivers/renesas/rcar/console/console.h b/include/drivers/renesas/rcar/console/console.h new file mode 100644 index 0000000..5bc10b7 --- /dev/null +++ b/include/drivers/renesas/rcar/console/console.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef RCAR_PRINTF_H +#define RCAR_PRINTF_H + +#define CONSOLE_T_RCAR_BASE CONSOLE_T_DRVDATA + +#ifndef __ASSEMBLY__ + +#include + +typedef struct { + console_t console; + uintptr_t base; +} console_rcar_t; + +/* + * Initialize a new rcar console instance and register it with the console + * framework. The |console| pointer must point to storage that will be valid + * for the lifetime of the console, such as a global or static local variable. + * Its contents will be reinitialized from scratch. + */ +int console_rcar_register(uintptr_t baseaddr, uint32_t clock, uint32_t baud, + console_rcar_t *console); + +#endif /*__ASSEMBLY__*/ + +#endif /* RCAR_PRINTF_H */ diff --git a/plat/renesas/rcar/aarch64/plat_helpers.S b/plat/renesas/rcar/aarch64/plat_helpers.S index ae0d675..61dd622 100644 --- a/plat/renesas/rcar/aarch64/plat_helpers.S +++ b/plat/renesas/rcar/aarch64/plat_helpers.S @@ -1,6 +1,6 @@ /* * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. - * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved. + * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -20,7 +20,7 @@ .globl plat_crash_console_init .globl plat_crash_console_putc - .globl plat_crash_console_flush + .globl plat_crash_console_flush .globl plat_invalidate_icache .globl plat_report_exception .globl plat_secondary_reset @@ -28,6 +28,10 @@ .globl plat_my_core_pos .extern rcar_log_init + .extern console_rcar_init + .extern console_rcar_putc + .extern console_rcar_flush + #if IMAGE_BL2 #define INT_ID_MASK (0x3ff) .extern bl2_interrupt_error_type @@ -258,7 +262,7 @@ mov sp, x2 str x1, [sp, #-16]! str x30, [sp, #-16]! - bl console_core_init + bl console_rcar_init ldr x30, [sp], #16 ldr x1, [sp], #16 mov sp, x1 @@ -280,7 +284,7 @@ str x3, [sp, #-16]! str x4, [sp, #-16]! str x5, [sp, #-16]! - bl console_core_putc + bl console_rcar_putc ldr x5, [sp], #16 ldr x4, [sp], #16 ldr x3, [sp], #16 @@ -292,11 +296,10 @@ /* --------------------------------------------- * int plat_crash_console_flush() - * * --------------------------------------------- */ func plat_crash_console_flush - b console_flush + b console_rcar_flush endfunc plat_crash_console_flush /* -------------------------------------------------------------------- diff --git a/plat/renesas/rcar/bl2_plat_setup.c b/plat/renesas/rcar/bl2_plat_setup.c index a21d6ab..3c9b56f 100644 --- a/plat/renesas/rcar/bl2_plat_setup.c +++ b/plat/renesas/rcar/bl2_plat_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved. + * Copyright (c) 2018-2019, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -686,8 +686,7 @@ if (boot_cpu == MODEMR_BOOT_CPU_CA57 || boot_cpu == MODEMR_BOOT_CPU_CA53) { rcar_pfc_init(); - /* console configuration (platform specific) done in driver */ - console_init(0, 0, 0); + rcar_console_boot_init(); } plat_rcar_gic_driver_init(); diff --git a/plat/renesas/rcar/bl31_plat_setup.c b/plat/renesas/rcar/bl31_plat_setup.c index add3e34..4fff233 100644 --- a/plat/renesas/rcar/bl31_plat_setup.c +++ b/plat/renesas/rcar/bl31_plat_setup.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved. - * Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved. + * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -79,9 +79,7 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, u_register_t arg2, u_register_t arg3) { - /* dummy config: the actual console configuration (platform specific) - is done in the driver (scif.c) */ - console_init(1, 0, 0); + rcar_console_runtime_init(); NOTICE("BL3-1 : Rev.%s\n", version_of_renesas); diff --git a/plat/renesas/rcar/include/rcar_private.h b/plat/renesas/rcar/include/rcar_private.h index def3276..a76c023 100644 --- a/plat/renesas/rcar/include/rcar_private.h +++ b/plat/renesas/rcar/include/rcar_private.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved. + * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -99,4 +99,9 @@ void mstpcr_write(uint32_t mstpcr, uint32_t mstpsr, uint32_t target_bit); void cpg_write(uintptr_t regadr, uint32_t regval); +void rcar_console_boot_init(void); +void rcar_console_boot_end(void); +void rcar_console_runtime_init(void); +void rcar_console_runtime_end(void); + #endif /* RCAR_PRIVATE_H */ diff --git a/plat/renesas/rcar/platform.mk b/plat/renesas/rcar/platform.mk index 85cbe07..3b3ca19 100644 --- a/plat/renesas/rcar/platform.mk +++ b/plat/renesas/rcar/platform.mk @@ -1,5 +1,5 @@ # -# Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved. +# Copyright (c) 2018-2019, Renesas Electronics Corporation. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # @@ -12,6 +12,7 @@ GENERATE_COT := 1 BL2_AT_EL3 := 1 ENABLE_SVE_FOR_NS := 0 +MULTI_CONSOLE_API := 1 CRASH_REPORTING := 1 HANDLE_EA_EL3_FIRST := 1 diff --git a/plat/renesas/rcar/rcar_common.c b/plat/renesas/rcar/rcar_common.c index b83df8b..d24d71a 100644 --- a/plat/renesas/rcar/rcar_common.c +++ b/plat/renesas/rcar/rcar_common.c @@ -67,3 +67,38 @@ panic(); } + +#include + +static console_rcar_t rcar_boot_console; +static console_rcar_t rcar_runtime_console; + +void rcar_console_boot_init(void) +{ + int ret; + + ret = console_rcar_register(0, 0, 0, &rcar_boot_console); + if (!ret) + panic(); + + console_set_scope(&rcar_boot_console.console, CONSOLE_FLAG_BOOT); +} + +void rcar_console_boot_end(void) +{ +} + +void rcar_console_runtime_init(void) +{ + int ret; + + ret = console_rcar_register(1, 0, 0, &rcar_runtime_console); + if (!ret) + panic(); + + console_set_scope(&rcar_boot_console.console, CONSOLE_FLAG_RUNTIME); +} + +void rcar_console_runtime_end(void) +{ +}