blob: 119b26c7e8f71212440f7f041b53369152adf2e2 [file] [log] [blame]
Mark Dykese7810b52020-06-03 15:46:55 -05001/*
2 * Copyright (c) 2020, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <debug.h>
8#include <drivers/arm/private_timer.h>
9#include <events.h>
10#include "fifo3d.h"
11#include <libfdt.h>
12
13#include <power_management.h>
14#include <sdei.h>
15#include <tftf_lib.h>
16#include <timer.h>
17
18#include <plat_topology.h>
19#include <platform.h>
20
21#ifdef SMC_FUZZ_TMALLOC
22#define GENMALLOC(x) malloc((x))
23#define GENFREE(x) free((x))
24#else
25#define GENMALLOC(x) smcmalloc((x), mmod)
26#define GENFREE(x) smcfree((x), mmod)
27#endif
28
29/*
30 * Push function name string into raw data structure
31 */
32void push_3dfifo_fname(struct fifo3d *f3d, char *fname)
33{
34 strlcpy(f3d->fnamefifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1],
35 fname, MAX_NAME_CHARS);
36}
37
38/*
39 * Push bias value into raw data structure
40 */
41void push_3dfifo_bias(struct fifo3d *f3d, int bias)
42{
43 f3d->biasfifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1] = bias;
44}
45
46/*
47 * Create new column and/or row for raw data structure for newly
48 * found node from device tree
49 */
50void push_3dfifo_col(struct fifo3d *f3d, char *entry, struct memmod *mmod)
51{
52 char ***tnnfifo;
53 char ***tfnamefifo;
54 int **tbiasfifo;
55
56 if (f3d->col == f3d->curr_col) {
57 f3d->col++;
58 f3d->curr_col++;
59 int *trow;
60 trow = GENMALLOC(f3d->col * sizeof(int));
61
62 /*
63 * return if error found
64 */
65 if (mmod->memerror != 0) {
66 return;
67 }
68
69 for (unsigned int i = 0U; (int)i < f3d->col - 1; i++) {
70 trow[i] = f3d->row[i];
71 }
72 if (f3d->col > 1) {
73 GENFREE(f3d->row);
74 }
75 f3d->row = trow;
76 f3d->row[f3d->col - 1] = 1;
77
78 /*
79 * Create new raw data memory
80 */
81 tnnfifo = GENMALLOC(f3d->col * sizeof(char **));
82 tfnamefifo = GENMALLOC(f3d->col * sizeof(char **));
83 tbiasfifo = GENMALLOC((f3d->col) * sizeof(int *));
84 for (unsigned int i = 0U; (int)i < f3d->col; i++) {
85 tnnfifo[i] = GENMALLOC(f3d->row[i] * sizeof(char *));
86 tfnamefifo[i] = GENMALLOC(f3d->row[i] * sizeof(char *));
87 tbiasfifo[i] = GENMALLOC((f3d->row[i]) * sizeof(int));
88 for (unsigned int j = 0U; (int)j < f3d->row[i]; j++) {
89 tnnfifo[i][j] = GENMALLOC(1 * sizeof(char[MAX_NAME_CHARS]));
90 tfnamefifo[i][j] =
91 GENMALLOC(1 * sizeof(char[MAX_NAME_CHARS]));
92 if (!((j == f3d->row[f3d->col - 1] - 1) &&
93 (i == (f3d->col - 1)))) {
94 strlcpy(tnnfifo[i][j], f3d->nnfifo[i][j], MAX_NAME_CHARS);
95 strlcpy(tfnamefifo[i][j],
96 f3d->fnamefifo[i][j], MAX_NAME_CHARS);
97 tbiasfifo[i][j] = f3d->biasfifo[i][j];
98 }
99 }
100 }
101
102 /*
103 * Copy data from old raw data to new memory location
104 */
105 strlcpy(tnnfifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1], entry,
106 MAX_NAME_CHARS);
107 strlcpy(tfnamefifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1],
108 "none", MAX_NAME_CHARS);
109 tbiasfifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1] = 0;
110
111 /*
112 * Free the old raw data structres
113 */
114 for (unsigned int i = 0U; (int)i < f3d->col - 1; i++) {
115 for (unsigned int j = 0U; (int)j < f3d->row[i]; j++) {
116 GENFREE(f3d->nnfifo[i][j]);
117 GENFREE(f3d->fnamefifo[i][j]);
118 }
119 GENFREE(f3d->nnfifo[i]);
120 GENFREE(f3d->fnamefifo[i]);
121 GENFREE(f3d->biasfifo[i]);
122 }
123 if (f3d->col > 1) {
124 GENFREE(f3d->nnfifo);
125 GENFREE(f3d->fnamefifo);
126 GENFREE(f3d->biasfifo);
127 }
128
129 /*
130 * Point to new data
131 */
132 f3d->nnfifo = tnnfifo;
133 f3d->fnamefifo = tfnamefifo;
134 f3d->biasfifo = tbiasfifo;
135 }
136 if (f3d->col != f3d->curr_col) {
137 /*
138 * Adding new node to raw data
139 */
140 f3d->col++;
141 f3d->row[f3d->col - 1]++;
142
143 /*
144 * Create new raw data memory
145 */
146 tnnfifo = GENMALLOC(f3d->col * sizeof(char **));
147 tfnamefifo = GENMALLOC(f3d->col * sizeof(char **));
148 tbiasfifo = GENMALLOC((f3d->col) * sizeof(int *));
149 for (unsigned int i = 0U; (int)i < f3d->col; i++) {
150 tnnfifo[i] = GENMALLOC(f3d->row[i] * sizeof(char *));
151 tfnamefifo[i] = GENMALLOC(f3d->row[i] * sizeof(char *));
152 tbiasfifo[i] = GENMALLOC((f3d->row[i]) * sizeof(int));
153 for (unsigned int j = 0U; (int)j < f3d->row[i]; j++) {
154 tnnfifo[i][j] = GENMALLOC(1 * sizeof(char[MAX_NAME_CHARS]));
155 tfnamefifo[i][j] =
156 GENMALLOC(1 * sizeof(char[MAX_NAME_CHARS]));
157 if (!((j == f3d->row[f3d->col - 1] - 1) &&
158 (i == (f3d->col - 1)))) {
159 strlcpy(tnnfifo[i][j], f3d->nnfifo[i][j], MAX_NAME_CHARS);
160 strlcpy(tfnamefifo[i][j],
161 f3d->fnamefifo[i][j], MAX_NAME_CHARS);
162 tbiasfifo[i][j] = f3d->biasfifo[i][j];
163 }
164 }
165 }
166
167 /*
168 * Copy data from old raw data to new memory location
169 */
170 strlcpy(tnnfifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1], entry,
171 MAX_NAME_CHARS);
172 strlcpy(tfnamefifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1],
173 "none", MAX_NAME_CHARS);
174 tbiasfifo[f3d->col - 1][f3d->row[f3d->col - 1] - 1] = 0;
175
176 /*
177 * Free the old raw data structres
178 */
179 for (unsigned int i = 0U; (int)i < f3d->col; i++) {
180 for (unsigned int j = 0U; (int)j < f3d->row[i]; j++) {
181 if (!((i == f3d->col - 1) &&
182 (j == f3d->row[i] - 1))) {
183 GENFREE(f3d->nnfifo[i][j]);
184 GENFREE(f3d->fnamefifo[i][j]);
185 }
186 }
187 GENFREE(f3d->nnfifo[i]);
188 GENFREE(f3d->fnamefifo[i]);
189 GENFREE(f3d->biasfifo[i]);
190 }
191 GENFREE(f3d->nnfifo);
192 GENFREE(f3d->fnamefifo);
193 GENFREE(f3d->biasfifo);
194
195 /*
196 * Point to new data
197 */
198 f3d->nnfifo = tnnfifo;
199 f3d->fnamefifo = tfnamefifo;
200 f3d->biasfifo = tbiasfifo;
201 }
202}