xref: /rk3399_ARM-atf/drivers/renesas/common/console/rcar_printf.c (revision 865e34741b02b3a9ddf9f652f2649407f33debb0)
1*865e3474SBiju Das /*
2*865e3474SBiju Das  * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved.
3*865e3474SBiju Das  *
4*865e3474SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5*865e3474SBiju Das  */
6*865e3474SBiju Das 
7*865e3474SBiju Das #include <stdarg.h>
8*865e3474SBiju Das #include <stdint.h>
9*865e3474SBiju Das 
10*865e3474SBiju Das #include <platform_def.h>
11*865e3474SBiju Das 
12*865e3474SBiju Das #include <arch_helpers.h>
13*865e3474SBiju Das #include <common/debug.h>
14*865e3474SBiju Das #include <lib/bakery_lock.h>
15*865e3474SBiju Das 
16*865e3474SBiju Das #include "rcar_def.h"
17*865e3474SBiju Das #include "rcar_private.h"
18*865e3474SBiju Das #include "rcar_printf.h"
19*865e3474SBiju Das 
20*865e3474SBiju Das #define INDEX_TIMER_COUNT	(4U)
21*865e3474SBiju Das 
22*865e3474SBiju Das #define RCAR_LOG_HEAD	(('T' << 0) | ('L' << 8) | ('O' << 16) | ('G' << 24))
23*865e3474SBiju Das 
24*865e3474SBiju Das /*
25*865e3474SBiju Das  * The log is initialized and used before BL31 xlat tables are initialized,
26*865e3474SBiju Das  * therefore the log memory is a device memory at that point. Make sure the
27*865e3474SBiju Das  * memory is correclty aligned and accessed only with up-to 32bit, aligned,
28*865e3474SBiju Das  * writes.
29*865e3474SBiju Das  */
30*865e3474SBiju Das CASSERT((RCAR_BL31_LOG_BASE & 0x7) == 0, assert_bl31_log_base_unaligned);
31*865e3474SBiju Das CASSERT((RCAR_BL31_LOG_MAX & 0x7) == 0, assert_bl31_log_max_unaligned);
32*865e3474SBiju Das 
33*865e3474SBiju Das extern RCAR_INSTANTIATE_LOCK typedef struct log_head {
34*865e3474SBiju Das 	uint32_t head;
35*865e3474SBiju Das 	uint32_t index;
36*865e3474SBiju Das 	uint32_t size;
37*865e3474SBiju Das 	uint32_t res;
38*865e3474SBiju Das } loghead_t;
39*865e3474SBiju Das 
40*865e3474SBiju Das typedef struct log_map {
41*865e3474SBiju Das 	loghead_t header;
42*865e3474SBiju Das 	uint8_t log_data[RCAR_BL31_LOG_MAX];
43*865e3474SBiju Das 	uint8_t res_data[RCAR_LOG_RES_SIZE];
44*865e3474SBiju Das } logmap_t;
45*865e3474SBiju Das 
46*865e3474SBiju Das int32_t rcar_set_log_data(int32_t c)
47*865e3474SBiju Das {
48*865e3474SBiju Das 	logmap_t *t_log;
49*865e3474SBiju Das 
50*865e3474SBiju Das 	t_log = (logmap_t *) RCAR_BL31_LOG_BASE;
51*865e3474SBiju Das 
52*865e3474SBiju Das 	rcar_lock_get();
53*865e3474SBiju Das 
54*865e3474SBiju Das 	/*
55*865e3474SBiju Das 	 * If index is broken, then index and size initialize
56*865e3474SBiju Das 	 */
57*865e3474SBiju Das 	if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
58*865e3474SBiju Das 		t_log->header.index = 0U;
59*865e3474SBiju Das 		t_log->header.size = 0U;
60*865e3474SBiju Das 	}
61*865e3474SBiju Das 	/*
62*865e3474SBiju Das 	 * data store to log area then index and size renewal
63*865e3474SBiju Das 	 */
64*865e3474SBiju Das 	t_log->log_data[t_log->header.index] = (uint8_t) c;
65*865e3474SBiju Das 	t_log->header.index++;
66*865e3474SBiju Das 	if (t_log->header.size < t_log->header.index) {
67*865e3474SBiju Das 		t_log->header.size = t_log->header.index;
68*865e3474SBiju Das 	}
69*865e3474SBiju Das 	if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
70*865e3474SBiju Das 		t_log->header.index = 0U;
71*865e3474SBiju Das 	}
72*865e3474SBiju Das 
73*865e3474SBiju Das 	rcar_lock_release();
74*865e3474SBiju Das 
75*865e3474SBiju Das 	return 1;
76*865e3474SBiju Das }
77*865e3474SBiju Das 
78*865e3474SBiju Das int32_t rcar_log_init(void)
79*865e3474SBiju Das {
80*865e3474SBiju Das 	logmap_t *t_log = (logmap_t *)RCAR_BL31_LOG_BASE;
81*865e3474SBiju Das 	uint32_t *log_data = (uint32_t *)t_log->log_data;
82*865e3474SBiju Das 	int16_t init_flag = 0;
83*865e3474SBiju Das 	int i;
84*865e3474SBiju Das 
85*865e3474SBiju Das 	if (t_log->header.head != RCAR_LOG_HEAD) {
86*865e3474SBiju Das 		/*
87*865e3474SBiju Das 		 * Log header is not "TLOG", then log area initialize
88*865e3474SBiju Das 		 */
89*865e3474SBiju Das 		init_flag = 1;
90*865e3474SBiju Das 	}
91*865e3474SBiju Das 	if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
92*865e3474SBiju Das 		/*
93*865e3474SBiju Das 		 * index is broken, then log area initialize
94*865e3474SBiju Das 		 */
95*865e3474SBiju Das 		init_flag = 1;
96*865e3474SBiju Das 	}
97*865e3474SBiju Das 	if (init_flag == 1) {
98*865e3474SBiju Das 		for (i = 0; i < RCAR_BL31_LOG_MAX; i += 4)
99*865e3474SBiju Das 			*log_data++ = 0;
100*865e3474SBiju Das 
101*865e3474SBiju Das 		t_log->header.head = RCAR_LOG_HEAD;
102*865e3474SBiju Das 		t_log->header.index = 0U;
103*865e3474SBiju Das 		t_log->header.size = 0U;
104*865e3474SBiju Das 	}
105*865e3474SBiju Das 	rcar_lock_init();
106*865e3474SBiju Das 
107*865e3474SBiju Das 	return 1;
108*865e3474SBiju Das }
109