blob: 2a6e2c00324122fc8e9acd51220c176b92600004 [file] [log] [blame]
Jorge Ramirez-Ortizf1751c02018-09-23 09:41:00 +02001/*
2 * Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Jorge Ramirez-Ortizf1751c02018-09-23 09:41:00 +02007#include <stdarg.h>
8#include <stdint.h>
9
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000010#include <platform_def.h>
11
12#include <arch_helpers.h>
13#include <common/debug.h>
14#include <lib/bakery_lock.h>
15
16#include "rcar_def.h"
17#include "rcar_private.h"
18#include "rcar_printf.h"
Jorge Ramirez-Ortizf1751c02018-09-23 09:41:00 +020019
20#define INDEX_TIMER_COUNT (4U)
21
22extern RCAR_INSTANTIATE_LOCK typedef struct log_head {
23 uint8_t head[4];
24 uint32_t index;
25 uint32_t size;
26 uint8_t res[4];
27} loghead_t;
28
29typedef struct log_map {
30 loghead_t header;
31 uint8_t log_data[RCAR_BL31_LOG_MAX];
32 uint8_t res_data[RCAR_LOG_RES_SIZE];
33} logmap_t;
34
35int32_t rcar_set_log_data(int32_t c)
36{
37 logmap_t *t_log;
38
39 t_log = (logmap_t *) RCAR_BL31_LOG_BASE;
40
41 rcar_lock_get();
42
43 /*
44 * If index is broken, then index and size initialize
45 */
46 if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
47 t_log->header.index = 0U;
48 t_log->header.size = 0U;
49 }
50 /*
51 * data store to log area then index and size renewal
52 */
53 t_log->log_data[t_log->header.index] = (uint8_t) c;
54 t_log->header.index++;
55 if (t_log->header.size < t_log->header.index) {
56 t_log->header.size = t_log->header.index;
57 }
58 if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
59 t_log->header.index = 0U;
60 }
61
62 rcar_lock_release();
63
64 return 1;
65}
66
67int32_t rcar_log_init(void)
68{
69
70 static const uint8_t const_header[] = "TLOG";
71 logmap_t *t_log;
72 int16_t init_flag = 0;
73
74 t_log = (logmap_t *) RCAR_BL31_LOG_BASE;
75 if (memcmp
76 ((const void *)t_log->header.head, (const void *)const_header,
77 sizeof(t_log->header.head)) != 0) {
78 /*
79 * Log header is not "TLOG", then log area initialize
80 */
81 init_flag = 1;
82 }
83 if (t_log->header.index >= (uint32_t) RCAR_BL31_LOG_MAX) {
84 /*
85 * index is broken, then log area initialize
86 */
87 init_flag = 1;
88 }
89 if (init_flag == 1) {
90 (void)memset((void *)t_log->log_data, 0,
91 (size_t) RCAR_BL31_LOG_MAX);
92 (void)memcpy((void *)t_log->header.head,
93 (const void *)const_header,
94 sizeof(t_log->header.head));
95 t_log->header.index = 0U;
96 t_log->header.size = 0U;
97#ifndef IMAGE_BL2
98 rcar_stack_generic_timer[INDEX_TIMER_COUNT] = 0U;
99#endif
100 }
101 rcar_lock_init();
102
103 return 1;
104}