rcar_gen3: console: Convert to multi-console API

Convert the R-Car Gen3 platform and both SCIF and Log drivers
to multi-console API.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Change-Id: I18556973937d150b60453f9150d54ee612571e35
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 <arch.h>
 #include <asm_macros.S>
+#include <console_macros.S>
+#include <drivers/renesas/rcar/console/console.h>
 
-	.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 <arch.h>
 #include <asm_macros.S>
+#include <console_macros.S>
+#include <drivers/renesas/rcar/console/console.h>
 
 #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' */
@@ -313,24 +301,11 @@
 	and	w2, w2, #~SCFSR_TEND_MASK
 	strh	w2, [x1, #SCIF_SCFSR]
 
-	ret
-endfunc console_core_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
+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
@@ -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 <stdint.h>
+
+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 <drivers/renesas/rcar/console/console.h>
+
+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)
+{
+}