xref: /rk3399_ARM-atf/plat/xilinx/common/plat_console.c (revision 09a02ce0bd37585a85f5b3e7f8dd6d7dc82e5f14)
139234622SPrasad Kummari /*
239234622SPrasad Kummari  * Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved.
339234622SPrasad Kummari  *
439234622SPrasad Kummari  * SPDX-License-Identifier: BSD-3-Clause
539234622SPrasad Kummari  */
639234622SPrasad Kummari 
739234622SPrasad Kummari #include <assert.h>
839234622SPrasad Kummari #include <errno.h>
939234622SPrasad Kummari #include <stdlib.h>
1039234622SPrasad Kummari #include <string.h>
1139234622SPrasad Kummari 
1239234622SPrasad Kummari #include <common/debug.h>
1339234622SPrasad Kummari #include <common/fdt_fixup.h>
1439234622SPrasad Kummari #include <common/fdt_wrappers.h>
1539234622SPrasad Kummari #include <drivers/arm/dcc.h>
1639234622SPrasad Kummari #include <drivers/arm/pl011.h>
1739234622SPrasad Kummari #include <drivers/cadence/cdns_uart.h>
1839234622SPrasad Kummari #include <drivers/console.h>
1939234622SPrasad Kummari #include <libfdt.h>
2039234622SPrasad Kummari #include <plat_console.h>
21e2d9dfe2SPrasad Kummari #include <plat_fdt.h>
2239234622SPrasad Kummari 
2339234622SPrasad Kummari #include <platform_def.h>
2439234622SPrasad Kummari #include <plat_private.h>
2539234622SPrasad Kummari 
26a542b9c1SPrasad Kummari static console_t boot_console;
2739234622SPrasad Kummari 
28*09a02ce0SPrasad Kummari #if (CONSOLE_IS(dtb) && defined(XILINX_OF_BOARD_DTB_ADDR)) && \
29*09a02ce0SPrasad Kummari 	(!defined(PLAT_zynqmp) || (defined(PLAT_zynqmp) && \
30*09a02ce0SPrasad Kummari 				   !IS_TFA_IN_OCM(BL31_BASE))) || defined(CONSOLE_RUNTIME)
314557ab69SPrasad Kummari /**
324557ab69SPrasad Kummari  * register_console() - Registers the runtime uart with console list.
334557ab69SPrasad Kummari  * @uart_base: UART base address
344557ab69SPrasad Kummari  * @clock: UART clock.
354557ab69SPrasad Kummari  * @baud_rate: UART buad rate
364557ab69SPrasad Kummari  * @console: Pointer to the console information structure.
374557ab69SPrasad Kummari  * @flags: console flags.
384557ab69SPrasad Kummari  */
394557ab69SPrasad Kummari static void register_console(uintptr_t uart_base, uint32_t clock,
404557ab69SPrasad Kummari 		uint32_t baud_rate, console_t *console,
414557ab69SPrasad Kummari 		uint32_t flags, uint8_t console_type)
424557ab69SPrasad Kummari {
434557ab69SPrasad Kummari 	int32_t rc = 0;
444557ab69SPrasad Kummari 
454557ab69SPrasad Kummari 	if (console_type == PLAT_XLNX_CONSOLE_TYPE_DEFAULT) {
464557ab69SPrasad Kummari #if defined(PLAT_zynqmp)
474557ab69SPrasad Kummari 		rc = console_cdns_register(uart_base,
484557ab69SPrasad Kummari 				clock,
494557ab69SPrasad Kummari 				baud_rate,
504557ab69SPrasad Kummari 				console);
514557ab69SPrasad Kummari #elif defined(PLAT_versal) || defined(PLAT_versal_net) || defined(PLAT_versal2)
524557ab69SPrasad Kummari 		rc = console_pl011_register(uart_base,
534557ab69SPrasad Kummari 				clock,
544557ab69SPrasad Kummari 				baud_rate,
554557ab69SPrasad Kummari 				console);
564557ab69SPrasad Kummari #endif
574557ab69SPrasad Kummari 	} else if (console_type == PLAT_XLNX_CONSOLE_TYPE_DEBUG) {
584557ab69SPrasad Kummari 		rc = console_dcc_register(console);
594557ab69SPrasad Kummari 	} else {
604557ab69SPrasad Kummari 		INFO("Invalid console type\n");
614557ab69SPrasad Kummari 	}
624557ab69SPrasad Kummari 
634557ab69SPrasad Kummari 	if (rc == 0) {
644557ab69SPrasad Kummari 		panic();
654557ab69SPrasad Kummari 	}
664557ab69SPrasad Kummari 
674557ab69SPrasad Kummari 	console_set_scope(console, flags);
684557ab69SPrasad Kummari }
694557ab69SPrasad Kummari #endif
704557ab69SPrasad Kummari 
714557ab69SPrasad Kummari 
72*09a02ce0SPrasad Kummari #if (CONSOLE_IS(dtb) && defined(XILINX_OF_BOARD_DTB_ADDR)) && \
73*09a02ce0SPrasad Kummari 	(!defined(PLAT_zynqmp) || (defined(PLAT_zynqmp) && \
74*09a02ce0SPrasad Kummari 				   !IS_TFA_IN_OCM(BL31_BASE)))
754557ab69SPrasad Kummari static console_t dt_console;
7639234622SPrasad Kummari /**
7739234622SPrasad Kummari  * get_baudrate() - Get the baudrate form DTB.
7839234622SPrasad Kummari  * @dtb: Address of the Device Tree Blob (DTB).
7939234622SPrasad Kummari  *
8039234622SPrasad Kummari  * Return: On success returns the baudrate; on failure returns an error.
8139234622SPrasad Kummari  */
8239234622SPrasad Kummari static int32_t get_baudrate(void *dtb)
8339234622SPrasad Kummari {
8439234622SPrasad Kummari 	int node;
8539234622SPrasad Kummari 	int32_t ret = 0;
8639234622SPrasad Kummari 	const char *prop, *path;
8739234622SPrasad Kummari 	char *end;
8839234622SPrasad Kummari 	int32_t baud_rate = 0;
8939234622SPrasad Kummari 
9039234622SPrasad Kummari 	node = fdt_path_offset(dtb, "/secure-chosen");
9139234622SPrasad Kummari 	if (node < 0) {
9239234622SPrasad Kummari 		node = fdt_path_offset(dtb, "/chosen");
9339234622SPrasad Kummari 		if (node < 0) {
9439234622SPrasad Kummari 			ret = -FDT_ERR_NOTFOUND;
9539234622SPrasad Kummari 			goto error;
9639234622SPrasad Kummari 		}
9739234622SPrasad Kummari 	}
9839234622SPrasad Kummari 
9939234622SPrasad Kummari 	prop = fdt_getprop(dtb, node, "stdout-path", NULL);
10039234622SPrasad Kummari 	if (prop == NULL) {
10139234622SPrasad Kummari 		ret = -FDT_ERR_NOTFOUND;
10239234622SPrasad Kummari 		goto error;
10339234622SPrasad Kummari 	}
10439234622SPrasad Kummari 
10539234622SPrasad Kummari 	/* Parse string serial0:115200n8 */
10639234622SPrasad Kummari 	path = strchr(prop, ':');
10739234622SPrasad Kummari 	if (!path) {
10839234622SPrasad Kummari 		ret = -FDT_ERR_NOTFOUND;
10939234622SPrasad Kummari 		goto error;
11039234622SPrasad Kummari 	} else {
11139234622SPrasad Kummari 
11239234622SPrasad Kummari 		baud_rate = strtoul(path + 1, &end, 10);
11339234622SPrasad Kummari 		if (baud_rate == 0 && end == path) {
11439234622SPrasad Kummari 			ERROR("Conversion error occurred: %d\n", baud_rate);
11539234622SPrasad Kummari 			ret = -FDT_ERR_NOTFOUND;
11639234622SPrasad Kummari 			goto error;
11739234622SPrasad Kummari 		}
11839234622SPrasad Kummari 		ret = baud_rate;
11939234622SPrasad Kummari 	}
12039234622SPrasad Kummari 
12139234622SPrasad Kummari error:
12239234622SPrasad Kummari 	return ret;
12339234622SPrasad Kummari }
12439234622SPrasad Kummari 
12539234622SPrasad Kummari /**
12639234622SPrasad Kummari  * get_node_status() - Get the DTB node status.
12739234622SPrasad Kummari  * @dtb: Address of the Device Tree Blob (DTB).
12839234622SPrasad Kummari  * @node: Node address in the device tree.
12939234622SPrasad Kummari  *
13039234622SPrasad Kummari  * Return: On success, it returns 1; on failure, it returns an 0.
13139234622SPrasad Kummari  */
13239234622SPrasad Kummari static uint32_t get_node_status(void *dtb, int node)
13339234622SPrasad Kummari {
13439234622SPrasad Kummari 	const char *status_cell;
13539234622SPrasad Kummari 	uint32_t status = 0;
13639234622SPrasad Kummari 
13739234622SPrasad Kummari 	status_cell = fdt_getprop(dtb, node, "status", NULL);
13839234622SPrasad Kummari 	if (!status_cell || strcmp(status_cell, "okay") == 0) {
13939234622SPrasad Kummari 		status = 1;
14039234622SPrasad Kummari 	} else {
14139234622SPrasad Kummari 		status = 0;
14239234622SPrasad Kummari 	}
14339234622SPrasad Kummari 
14439234622SPrasad Kummari 	return status;
14539234622SPrasad Kummari }
14639234622SPrasad Kummari 
14739234622SPrasad Kummari /**
14839234622SPrasad Kummari  * fdt_add_uart_info() - Add DTB information to a UART structure.
14939234622SPrasad Kummari  * @info: Pointer to the UART information structure.
15039234622SPrasad Kummari  * @node: Node address in the device tree.
15139234622SPrasad Kummari  * @dtb: Address of the Device Tree Blob(DTB).
15239234622SPrasad Kummari  *
15339234622SPrasad Kummari  * Return: On success, it returns 1; on failure, it returns an 0.
15439234622SPrasad Kummari  */
15539234622SPrasad Kummari static uint32_t fdt_add_uart_info(dt_uart_info_t *info, int node, void *dtb)
15639234622SPrasad Kummari {
15739234622SPrasad Kummari 	uintptr_t base_addr;
15839234622SPrasad Kummari 	const char *com;
1598eb6a1daSPrasad Kummari 	int32_t ret = 0;
16039234622SPrasad Kummari 
16139234622SPrasad Kummari 	com = fdt_getprop(dtb, node, "compatible", NULL);
16239234622SPrasad Kummari 	if (com != NULL) {
16339234622SPrasad Kummari 		strlcpy(info->compatible, com, sizeof(info->compatible));
16439234622SPrasad Kummari 	} else {
16539234622SPrasad Kummari 		ERROR("Compatible property not found in DTB node\n");
16639234622SPrasad Kummari 		ret  = -FDT_ERR_NOTFOUND;
16739234622SPrasad Kummari 		goto error;
16839234622SPrasad Kummari 	}
16939234622SPrasad Kummari 
170d989229bSPrasad Kummari 	info->status = get_node_status(dtb, node);
171d989229bSPrasad Kummari 	if (info->status == 0) {
172d989229bSPrasad Kummari 		ERROR("Uart node is disabled in DTB\n");
173d989229bSPrasad Kummari 		ret  = -FDT_ERR_NOTFOUND;
174d989229bSPrasad Kummari 		goto error;
175d989229bSPrasad Kummari 	}
176d989229bSPrasad Kummari 
177d989229bSPrasad Kummari 	if (strncmp(info->compatible, DT_UART_DCC_COMPAT, strlen(DT_UART_DCC_COMPAT)) != 0) {
17839234622SPrasad Kummari 		ret = fdt_get_reg_props_by_index(dtb, node, 0, &base_addr, NULL);
17939234622SPrasad Kummari 		if (ret >= 0) {
18039234622SPrasad Kummari 			info->base = base_addr;
18139234622SPrasad Kummari 		} else {
18239234622SPrasad Kummari 			ERROR("Failed to retrieve base address. Error code: %d\n", ret);
18339234622SPrasad Kummari 			ret  = -FDT_ERR_NOTFOUND;
18439234622SPrasad Kummari 			goto error;
18539234622SPrasad Kummari 		}
18639234622SPrasad Kummari 
18739234622SPrasad Kummari 		info->baud_rate = get_baudrate(dtb);
188d989229bSPrasad Kummari 	}
18939234622SPrasad Kummari 
19039234622SPrasad Kummari error:
19139234622SPrasad Kummari 	return ret;
19239234622SPrasad Kummari }
19339234622SPrasad Kummari 
19439234622SPrasad Kummari /**
19539234622SPrasad Kummari  * fdt_get_uart_info() - Get the uart information form DTB.
19639234622SPrasad Kummari  * @info: Pointer to the UART information structure.
19739234622SPrasad Kummari  *
19839234622SPrasad Kummari  * Return: On success, it returns 0; on failure, it returns an error+reason.
19939234622SPrasad Kummari  */
20039234622SPrasad Kummari static int fdt_get_uart_info(dt_uart_info_t *info)
20139234622SPrasad Kummari {
2028eb6a1daSPrasad Kummari 	int node = 0, ret = 0;
20339234622SPrasad Kummari 	void *dtb = (void *)XILINX_OF_BOARD_DTB_ADDR;
20439234622SPrasad Kummari 
205e2d9dfe2SPrasad Kummari 	ret = is_valid_dtb(dtb);
20639234622SPrasad Kummari 	if (ret < 0) {
20739234622SPrasad Kummari 		ERROR("Invalid Device Tree at %p: error %d\n", dtb, ret);
20839234622SPrasad Kummari 		goto error;
20939234622SPrasad Kummari 	}
21039234622SPrasad Kummari 
21139234622SPrasad Kummari 	node = fdt_get_stdout_node_offset(dtb);
21239234622SPrasad Kummari 	if (node < 0) {
21339234622SPrasad Kummari 		ERROR("DT get stdout node failed : %d\n", node);
21439234622SPrasad Kummari 		goto error;
21539234622SPrasad Kummari 	}
21639234622SPrasad Kummari 
21739234622SPrasad Kummari 	ret = fdt_add_uart_info(info, node, dtb);
21839234622SPrasad Kummari 	if (ret < 0) {
21939234622SPrasad Kummari 		ERROR("Failed to add DT UART info: %d\n", ret);
22039234622SPrasad Kummari 		goto error;
22139234622SPrasad Kummari 	}
22239234622SPrasad Kummari 
22339234622SPrasad Kummari error:
22439234622SPrasad Kummari 	return ret;
22539234622SPrasad Kummari }
22639234622SPrasad Kummari 
22739234622SPrasad Kummari /**
22839234622SPrasad Kummari  * check_fdt_uart_info() - Check early uart info with DTB uart info.
22939234622SPrasad Kummari  * @info: Pointer to the UART information structure.
23039234622SPrasad Kummari  *
23139234622SPrasad Kummari  * Return: On success, it returns 0; on failure, it returns an error+reason.
23239234622SPrasad Kummari  */
2338eb6a1daSPrasad Kummari static int32_t check_fdt_uart_info(dt_uart_info_t *info)
23439234622SPrasad Kummari {
2358eb6a1daSPrasad Kummari 	int32_t ret = 0;
23639234622SPrasad Kummari 
23739234622SPrasad Kummari 	if (info->status == 0) {
23839234622SPrasad Kummari 		ret = -ENODEV;
23939234622SPrasad Kummari 		goto error;
24039234622SPrasad Kummari 	}
24139234622SPrasad Kummari 
242a542b9c1SPrasad Kummari 	if ((info->base == boot_console.base) &&
24339234622SPrasad Kummari 	   (info->baud_rate == UART_BAUDRATE) && !CONSOLE_IS(dcc)) {
24439234622SPrasad Kummari 		ret = -ENODEV;
24539234622SPrasad Kummari 		goto error;
24639234622SPrasad Kummari 	}
24739234622SPrasad Kummari 
24839234622SPrasad Kummari error:
24939234622SPrasad Kummari 	return ret;
25039234622SPrasad Kummari }
25139234622SPrasad Kummari 
25239234622SPrasad Kummari /**
253a542b9c1SPrasad Kummari  * console_end() - Unregister the console_t instance form the console list.
254a542b9c1SPrasad Kummari  * @console: Pointer to the console information structure.
25539234622SPrasad Kummari  */
256a542b9c1SPrasad Kummari static void console_end(console_t *console)
25739234622SPrasad Kummari {
25839234622SPrasad Kummari 	if (CONSOLE_IS(dcc)) {
259238eb542SMaheedhar Bollapalli 		console_dcc_unregister(console);
26039234622SPrasad Kummari 	} else {
261a542b9c1SPrasad Kummari 		if (console != NULL) {
26239234622SPrasad Kummari 			console_flush();
263a542b9c1SPrasad Kummari 			(void)console_unregister(console);
264a542b9c1SPrasad Kummari 		}
26539234622SPrasad Kummari 	}
26639234622SPrasad Kummari }
26739234622SPrasad Kummari 
26839234622SPrasad Kummari /**
269d989229bSPrasad Kummari  * parse_uart_info() - Parse UART information from Device Tree Blob.
270d989229bSPrasad Kummari  * @uart_info: Pointer to the UART information structure.
271d989229bSPrasad Kummari  *
272d989229bSPrasad Kummari  * Return: On success, it returns 0; on failure, it returns an error+reason;
273d989229bSPrasad Kummari  */
274d989229bSPrasad Kummari static int32_t parse_uart_info(dt_uart_info_t *uart_info)
275d989229bSPrasad Kummari {
276d989229bSPrasad Kummari 	int32_t rc = fdt_get_uart_info(uart_info);
277d989229bSPrasad Kummari 
278d989229bSPrasad Kummari 	if (rc < 0) {
279d989229bSPrasad Kummari 		rc = -FDT_ERR_NOTFOUND;
280d989229bSPrasad Kummari 	}
281d989229bSPrasad Kummari 	return rc;
282d989229bSPrasad Kummari }
283d989229bSPrasad Kummari 
284d989229bSPrasad Kummari /**
285d989229bSPrasad Kummari  * handle_dt_console() - Registers the DT console
286d989229bSPrasad Kummari  * @uart_info: Pointer to the UART information structure.
287d989229bSPrasad Kummari  * @console: Pointer to the console information structure.
288d989229bSPrasad Kummari  * @clock: UART clock.
289d989229bSPrasad Kummari  * @end_console: Pointer to the console information structure.
290d989229bSPrasad Kummari  */
291d989229bSPrasad Kummari static void handle_dt_console(dt_uart_info_t *uart_info, console_t *console,
292d989229bSPrasad Kummari 		uint32_t clock, console_t *end_console)
293d989229bSPrasad Kummari {
294d989229bSPrasad Kummari 	register_console(uart_info->base, clock, uart_info->baud_rate,
295d989229bSPrasad Kummari 			console,  CONSOLE_FLAG_BOOT |
2964557ab69SPrasad Kummari 			CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_CRASH,
2974557ab69SPrasad Kummari 			PLAT_XLNX_CONSOLE_TYPE_DEFAULT);
298d989229bSPrasad Kummari 	console_end(end_console);
299d989229bSPrasad Kummari 	INFO("DTB console setup\n");
300d989229bSPrasad Kummari }
301d989229bSPrasad Kummari 
302d989229bSPrasad Kummari 
303d989229bSPrasad Kummari /**
304d989229bSPrasad Kummari  * handle_dcc_console() - Registers the DCC console
305d989229bSPrasad Kummari  * @console: Pointer to the console information structure.
306d989229bSPrasad Kummari  */
307d989229bSPrasad Kummari static void handle_dcc_console(console_t *console)
308d989229bSPrasad Kummari {
309238eb542SMaheedhar Bollapalli 	int32_t rc = console_dcc_register(console);
310d989229bSPrasad Kummari 
311d989229bSPrasad Kummari 	if (rc == 0) {
312d989229bSPrasad Kummari 		panic();
313d989229bSPrasad Kummari 	}
314d989229bSPrasad Kummari 	console_end(console);
315d989229bSPrasad Kummari }
316d989229bSPrasad Kummari 
317d989229bSPrasad Kummari /**
31800a68427SPrasad Kummari  * dt_console_init() - Initializes the DT console information.
31939234622SPrasad Kummari  * @uart_info: Pointer to the UART information structure.
320a542b9c1SPrasad Kummari  * @console: Pointer to the console information structure.
32139234622SPrasad Kummari  * @clock: UART clock.
32239234622SPrasad Kummari  *
32339234622SPrasad Kummari  * Return: On success, it returns 0; on failure, it returns an error+reason;
32439234622SPrasad Kummari  */
32500a68427SPrasad Kummari static int32_t dt_console_init(dt_uart_info_t *uart_info,
326a542b9c1SPrasad Kummari 			  console_t *console,
32739234622SPrasad Kummari 			  uint32_t clock)
32839234622SPrasad Kummari {
32939234622SPrasad Kummari 	int32_t rc = 0;
33039234622SPrasad Kummari 
33139234622SPrasad Kummari 	/* Parse UART information from Device Tree Blob (DTB) */
332d989229bSPrasad Kummari 	rc = parse_uart_info(uart_info);
33339234622SPrasad Kummari 	if (rc < 0) {
334d989229bSPrasad Kummari 		goto error;
335d989229bSPrasad Kummari 	}
336d989229bSPrasad Kummari 
337d989229bSPrasad Kummari 	rc = check_fdt_uart_info(uart_info);
338d989229bSPrasad Kummari 	if (rc < 0) {
3398eb6a1daSPrasad Kummari 		goto error;
34039234622SPrasad Kummari 	}
34139234622SPrasad Kummari 
3424557ab69SPrasad Kummari 	rc = check_fdt_uart_info(uart_info);
3434557ab69SPrasad Kummari 	if (rc < 0) {
3444557ab69SPrasad Kummari 		goto error;
3454557ab69SPrasad Kummari 	}
3464557ab69SPrasad Kummari 
34739234622SPrasad Kummari 	if (strncmp(uart_info->compatible, DT_UART_COMPAT,
34839234622SPrasad Kummari 		    strlen(DT_UART_COMPAT)) == 0) {
349d989229bSPrasad Kummari 		handle_dt_console(uart_info, &dt_console, clock, console);
35039234622SPrasad Kummari 	} else if (strncmp(uart_info->compatible, DT_UART_DCC_COMPAT,
35139234622SPrasad Kummari 			strlen(DT_UART_DCC_COMPAT)) == 0) {
352d989229bSPrasad Kummari 		handle_dcc_console(console);
35339234622SPrasad Kummari 	} else {
35439234622SPrasad Kummari 		WARN("BL31: No console device found in DT.\n");
35539234622SPrasad Kummari 	}
35639234622SPrasad Kummari 
3578eb6a1daSPrasad Kummari error:
35839234622SPrasad Kummari 	return rc;
35939234622SPrasad Kummari }
36039234622SPrasad Kummari #endif
36139234622SPrasad Kummari 
3624557ab69SPrasad Kummari #if defined(CONSOLE_RUNTIME)
3634557ab69SPrasad Kummari void console_runtime_init(void)
3644557ab69SPrasad Kummari {
3654557ab69SPrasad Kummari 	uint32_t uart_clk = get_uart_clk();
3664557ab69SPrasad Kummari 	static console_t runtime_console;
3674557ab69SPrasad Kummari 	uintptr_t rt_uart_base = 0;
3684557ab69SPrasad Kummari 	uint32_t buad_rate = 0;
3694557ab69SPrasad Kummari 
370*09a02ce0SPrasad Kummari #if (CONSOLE_IS(dtb) && defined(XILINX_OF_BOARD_DTB_ADDR)) && \
371*09a02ce0SPrasad Kummari 	(!defined(PLAT_zynqmp) || (defined(PLAT_zynqmp) && \
372*09a02ce0SPrasad Kummari 				   !IS_TFA_IN_OCM(BL31_BASE)))
3734557ab69SPrasad Kummari 	console_t *console = &dt_console;
3744557ab69SPrasad Kummari #else
3754557ab69SPrasad Kummari 	console_t *console = &boot_console;
3764557ab69SPrasad Kummari #endif
3774557ab69SPrasad Kummari 
3784557ab69SPrasad Kummari #if (RT_CONSOLE_IS(dtb) && defined(XILINX_OF_BOARD_DTB_ADDR)) && \
3794557ab69SPrasad Kummari 	(!defined(PLAT_zynqmp) || (defined(PLAT_zynqmp) && \
3804557ab69SPrasad Kummari 				   !IS_TFA_IN_OCM(BL31_BASE)))
381*09a02ce0SPrasad Kummari 	static dt_uart_info_t dt_info = {0};
3824557ab69SPrasad Kummari 	uint32_t rc = parse_uart_info(&dt_info);
3834557ab69SPrasad Kummari 
3844557ab69SPrasad Kummari 	if (rc < 0) {
3854557ab69SPrasad Kummari 		goto error;
3864557ab69SPrasad Kummari 	} else {
3874557ab69SPrasad Kummari 		rt_uart_base = dt_info.base;
3884557ab69SPrasad Kummari 		buad_rate = dt_info.baud_rate;
3894557ab69SPrasad Kummari 	}
3904557ab69SPrasad Kummari #elif defined(PLAT_zynqmp)
3914557ab69SPrasad Kummari 	if (RT_CONSOLE_IS(cadence) || (RT_CONSOLE_IS(cadence1))) {
3924557ab69SPrasad Kummari 		rt_uart_base = (uintptr_t)RT_UART_BASE;
3934557ab69SPrasad Kummari 		buad_rate = (uint32_t)UART_BAUDRATE;
3944557ab69SPrasad Kummari 	}
3954557ab69SPrasad Kummari #else
3964557ab69SPrasad Kummari 	if (RT_CONSOLE_IS(pl011) || (RT_CONSOLE_IS(pl011_1))) {
3974557ab69SPrasad Kummari 		rt_uart_base = (uintptr_t)RT_UART_BASE;
3984557ab69SPrasad Kummari 		buad_rate = (uint32_t)UART_BAUDRATE;
3994557ab69SPrasad Kummari 	}
4004557ab69SPrasad Kummari #endif
4014557ab69SPrasad Kummari 	/*skip console registration if runtime and boot console are same */
4024557ab69SPrasad Kummari 	if (console->base != rt_uart_base) {
4034557ab69SPrasad Kummari 		/* Remove runtime flag from boot console */
4044557ab69SPrasad Kummari 		console_set_scope(console, CONSOLE_FLAG_BOOT | CONSOLE_FLAG_CRASH);
4054557ab69SPrasad Kummari 
4064557ab69SPrasad Kummari 		register_console(rt_uart_base, uart_clk, buad_rate, &runtime_console,
4074557ab69SPrasad Kummari 				 CONSOLE_FLAG_RUNTIME, PLAT_XLNX_CONSOLE_TYPE_DEFAULT);
4084557ab69SPrasad Kummari 		INFO("Successfully initialized runtime console\n");
4094557ab69SPrasad Kummari 	}
4104557ab69SPrasad Kummari 
4114557ab69SPrasad Kummari #if (RT_CONSOLE_IS(dtb) && defined(XILINX_OF_BOARD_DTB_ADDR)) && \
4124557ab69SPrasad Kummari 	(!defined(PLAT_zynqmp) || (defined(PLAT_zynqmp) && \
4134557ab69SPrasad Kummari 				   !IS_TFA_IN_OCM(BL31_BASE)))
4144557ab69SPrasad Kummari error:
4154557ab69SPrasad Kummari 	if (rc < 0) {
4164557ab69SPrasad Kummari 		ERROR("Failed to parse uart info in runtime console\n");
4174557ab69SPrasad Kummari 	}
4184557ab69SPrasad Kummari #endif
4194557ab69SPrasad Kummari }
4204557ab69SPrasad Kummari #endif
4214557ab69SPrasad Kummari 
42239234622SPrasad Kummari void setup_console(void)
42339234622SPrasad Kummari {
4248eb6a1daSPrasad Kummari 	int32_t rc;
42539234622SPrasad Kummari 	uint32_t uart_clk = get_uart_clk();
42639234622SPrasad Kummari 
427*09a02ce0SPrasad Kummari #if (CONSOLE_IS(dtb) && defined(XILINX_OF_BOARD_DTB_ADDR)) && \
428*09a02ce0SPrasad Kummari 	(!defined(PLAT_zynqmp) || (defined(PLAT_zynqmp) && \
429*09a02ce0SPrasad Kummari 				   !IS_TFA_IN_OCM(BL31_BASE)))
430*09a02ce0SPrasad Kummari 
431*09a02ce0SPrasad Kummari 	static dt_uart_info_t uart_info = {0};
432*09a02ce0SPrasad Kummari 
433*09a02ce0SPrasad Kummari 	/* Initialize the DTB console using UART information from the DTB */
434*09a02ce0SPrasad Kummari 	rc = dt_console_init(&uart_info, &boot_console, uart_clk);
435*09a02ce0SPrasad Kummari 	if (rc < 0) {
436*09a02ce0SPrasad Kummari 		ERROR("Failed to initialize DT console: %d\n", rc);
437*09a02ce0SPrasad Kummari 	} else {
438*09a02ce0SPrasad Kummari 		goto cnslsetup;
439*09a02ce0SPrasad Kummari 	}
440*09a02ce0SPrasad Kummari #endif
441*09a02ce0SPrasad Kummari 
44239234622SPrasad Kummari #if defined(PLAT_zynqmp)
44339234622SPrasad Kummari 	if (CONSOLE_IS(cadence) || (CONSOLE_IS(cadence1))) {
44439234622SPrasad Kummari 		rc = console_cdns_register(UART_BASE,
44539234622SPrasad Kummari 					   uart_clk,
44639234622SPrasad Kummari 					   UART_BAUDRATE,
447a542b9c1SPrasad Kummari 					   &boot_console);
44839234622SPrasad Kummari 		if (rc == 0) {
44939234622SPrasad Kummari 			panic();
45039234622SPrasad Kummari 		}
45139234622SPrasad Kummari 
452a542b9c1SPrasad Kummari 		console_set_scope(&boot_console, CONSOLE_FLAG_BOOT |
45339234622SPrasad Kummari 				  CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_CRASH);
45439234622SPrasad Kummari 	}
45539234622SPrasad Kummari #else
45639234622SPrasad Kummari 	if (CONSOLE_IS(pl011) || (CONSOLE_IS(pl011_1))) {
45739234622SPrasad Kummari 		/* Initialize the console to provide early debug support */
45839234622SPrasad Kummari 		rc = console_pl011_register((uint32_t)UART_BASE,
45939234622SPrasad Kummari 					   uart_clk,
46039234622SPrasad Kummari 					   (uint32_t)UART_BAUDRATE,
461a542b9c1SPrasad Kummari 					   &boot_console);
46239234622SPrasad Kummari 		if (rc == 0) {
46339234622SPrasad Kummari 			panic();
46439234622SPrasad Kummari 		}
46539234622SPrasad Kummari 
466a542b9c1SPrasad Kummari 		console_set_scope(&boot_console, CONSOLE_FLAG_BOOT |
46739234622SPrasad Kummari 				  CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_CRASH);
46839234622SPrasad Kummari 	}
46939234622SPrasad Kummari #endif
47039234622SPrasad Kummari 	if (CONSOLE_IS(dcc)) {
47139234622SPrasad Kummari 		/* Initialize the dcc console for debug */
472238eb542SMaheedhar Bollapalli 		rc = console_dcc_register(&boot_console);
47339234622SPrasad Kummari 		if (rc == 0) {
47439234622SPrasad Kummari 			panic();
47539234622SPrasad Kummari 		}
47639234622SPrasad Kummari 	}
47739234622SPrasad Kummari 
478*09a02ce0SPrasad Kummari #if (CONSOLE_IS(dtb) && defined(XILINX_OF_BOARD_DTB_ADDR)) && \
479*09a02ce0SPrasad Kummari 	(!defined(PLAT_zynqmp) || (defined(PLAT_zynqmp) && \
480*09a02ce0SPrasad Kummari 				   !IS_TFA_IN_OCM(BL31_BASE)))
481*09a02ce0SPrasad Kummari cnslsetup:
48239234622SPrasad Kummari #endif
483*09a02ce0SPrasad Kummari 	INFO("BL31: Early console setup\n");
48439234622SPrasad Kummari }
485