xref: /rk3399_ARM-atf/drivers/renesas/common/console/rcar_printf.c (revision 4bd8c929b4bc6e1731c2892b38d4a8c43e8e89dc)
1865e3474SBiju Das /*
2865e3474SBiju Das  * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved.
3865e3474SBiju Das  *
4865e3474SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5865e3474SBiju Das  */
6865e3474SBiju Das 
7865e3474SBiju Das #include <stdarg.h>
8865e3474SBiju Das #include <stdint.h>
9865e3474SBiju Das 
10865e3474SBiju Das #include <platform_def.h>
11865e3474SBiju Das 
12865e3474SBiju Das #include <arch_helpers.h>
13865e3474SBiju Das #include <common/debug.h>
14865e3474SBiju Das #include <lib/bakery_lock.h>
15865e3474SBiju Das 
16865e3474SBiju Das #include "rcar_def.h"
17865e3474SBiju Das #include "rcar_private.h"
18865e3474SBiju Das #include "rcar_printf.h"
19865e3474SBiju Das 
20865e3474SBiju Das #define INDEX_TIMER_COUNT	(4U)
21865e3474SBiju Das 
22865e3474SBiju Das #define RCAR_LOG_HEAD	(('T' << 0) | ('L' << 8) | ('O' << 16) | ('G' << 24))
23865e3474SBiju Das 
24865e3474SBiju Das /*
25865e3474SBiju Das  * The log is initialized and used before BL31 xlat tables are initialized,
26865e3474SBiju Das  * therefore the log memory is a device memory at that point. Make sure the
27*1b491eeaSElyes Haouas  * memory is correctly aligned and accessed only with up-to 32bit, aligned,
28865e3474SBiju Das  * writes.
29865e3474SBiju Das  */
30865e3474SBiju Das CASSERT((RCAR_BL31_LOG_BASE & 0x7) == 0, assert_bl31_log_base_unaligned);
31865e3474SBiju Das CASSERT((RCAR_BL31_LOG_MAX & 0x7) == 0, assert_bl31_log_max_unaligned);
32865e3474SBiju Das 
33865e3474SBiju Das extern RCAR_INSTANTIATE_LOCK typedef struct log_head {
34865e3474SBiju Das 	uint32_t head;
35865e3474SBiju Das 	uint32_t index;
36865e3474SBiju Das 	uint32_t size;
37865e3474SBiju Das 	uint32_t res;
38865e3474SBiju Das } loghead_t;
39865e3474SBiju Das 
40865e3474SBiju Das typedef struct log_map {
41865e3474SBiju Das 	loghead_t header;
42865e3474SBiju Das 	uint8_t log_data[RCAR_BL31_LOG_MAX];
43865e3474SBiju Das 	uint8_t res_data[RCAR_LOG_RES_SIZE];
44865e3474SBiju Das } logmap_t;
45865e3474SBiju Das 
rcar_set_log_data(int32_t c)46865e3474SBiju Das int32_t rcar_set_log_data(int32_t c)
47865e3474SBiju Das {
48865e3474SBiju Das 	logmap_t *t_log;
49865e3474SBiju Das 
50865e3474SBiju Das 	t_log = (logmap_t *) RCAR_BL31_LOG_BASE;
51865e3474SBiju Das 
52865e3474SBiju Das 	rcar_lock_get();
53865e3474SBiju Das 
54865e3474SBiju Das 	/*
55865e3474SBiju Das 	 * If index is broken, then index and size initialize
56865e3474SBiju Das 	 */
57865e3474SBiju Das 	if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
58865e3474SBiju Das 		t_log->header.index = 0U;
59865e3474SBiju Das 		t_log->header.size = 0U;
60865e3474SBiju Das 	}
61865e3474SBiju Das 	/*
62865e3474SBiju Das 	 * data store to log area then index and size renewal
63865e3474SBiju Das 	 */
64865e3474SBiju Das 	t_log->log_data[t_log->header.index] = (uint8_t) c;
65865e3474SBiju Das 	t_log->header.index++;
66865e3474SBiju Das 	if (t_log->header.size < t_log->header.index) {
67865e3474SBiju Das 		t_log->header.size = t_log->header.index;
68865e3474SBiju Das 	}
69865e3474SBiju Das 	if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
70865e3474SBiju Das 		t_log->header.index = 0U;
71865e3474SBiju Das 	}
72865e3474SBiju Das 
73865e3474SBiju Das 	rcar_lock_release();
74865e3474SBiju Das 
75865e3474SBiju Das 	return 1;
76865e3474SBiju Das }
77865e3474SBiju Das 
rcar_log_init(void)78865e3474SBiju Das int32_t rcar_log_init(void)
79865e3474SBiju Das {
80865e3474SBiju Das 	logmap_t *t_log = (logmap_t *)RCAR_BL31_LOG_BASE;
81865e3474SBiju Das 	uint32_t *log_data = (uint32_t *)t_log->log_data;
82865e3474SBiju Das 	int16_t init_flag = 0;
83865e3474SBiju Das 	int i;
84865e3474SBiju Das 
85865e3474SBiju Das 	if (t_log->header.head != RCAR_LOG_HEAD) {
86865e3474SBiju Das 		/*
87865e3474SBiju Das 		 * Log header is not "TLOG", then log area initialize
88865e3474SBiju Das 		 */
89865e3474SBiju Das 		init_flag = 1;
90865e3474SBiju Das 	}
91865e3474SBiju Das 	if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
92865e3474SBiju Das 		/*
93865e3474SBiju Das 		 * index is broken, then log area initialize
94865e3474SBiju Das 		 */
95865e3474SBiju Das 		init_flag = 1;
96865e3474SBiju Das 	}
97865e3474SBiju Das 	if (init_flag == 1) {
98865e3474SBiju Das 		for (i = 0; i < RCAR_BL31_LOG_MAX; i += 4)
99865e3474SBiju Das 			*log_data++ = 0;
100865e3474SBiju Das 
101865e3474SBiju Das 		t_log->header.head = RCAR_LOG_HEAD;
102865e3474SBiju Das 		t_log->header.index = 0U;
103865e3474SBiju Das 		t_log->header.size = 0U;
104865e3474SBiju Das 	}
105865e3474SBiju Das 	rcar_lock_init();
106865e3474SBiju Das 
107865e3474SBiju Das 	return 1;
108865e3474SBiju Das }
109