blob: ef0f8b52a4d11ac67369b64e62f67998118724ee [file] [log] [blame]
Ye Li62185922022-07-26 16:40:54 +08001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright 2022 NXP
4 */
5
Ye Li62185922022-07-26 16:40:54 +08006#include <log.h>
Peng Fan5dce3492024-09-19 12:01:35 +08007#include <div64.h>
8#include <hang.h>
Tom Rinidec7ea02024-05-20 13:35:03 -06009#include <linux/errno.h>
Ye Li62185922022-07-26 16:40:54 +080010#include <asm/io.h>
11#include <asm/types.h>
12#include <asm/arch/imx-regs.h>
13#include <asm/arch/sys_proto.h>
Peng Fand5c31832023-06-15 18:09:05 +080014#include <asm/mach-imx/ele_api.h>
Ye Li62185922022-07-26 16:40:54 +080015#include <asm/mach-imx/mu_hal.h>
16
17#define DID_NUM 16
18#define MBC_MAX_NUM 4
19#define MRC_MAX_NUM 2
20#define MBC_NUM(HWCFG) (((HWCFG) >> 16) & 0xF)
21#define MRC_NUM(HWCFG) (((HWCFG) >> 24) & 0x1F)
Peng Fand03686b2024-09-19 12:01:36 +080022#define MBC_BLK_NUM(GLBCFG) ((GLBCFG) & 0x3FF)
Ye Li62185922022-07-26 16:40:54 +080023
Peng Fan5dce3492024-09-19 12:01:35 +080024enum {
25 /* Order following ELE API Spec, not change */
26 TRDC_A,
27 TRDC_W,
28 TRDC_M,
29 TRDC_N,
30};
31
32/* Just make it easier to know what the parameter is */
33#define MBC(X) (X)
34#define MRC(X) (X)
35#define GLOBAL_ID(X) (X)
36#define MEM(X) (X)
37#define DOM(X) (X)
38/*
39 *0|SPR|SPW|SPX,0|SUR|SUW|SWX, 0|NPR|NPW|NPX, 0|NUR|NUW|NUX
40 */
41#define PERM(X) (X)
42
Ye Li62185922022-07-26 16:40:54 +080043struct mbc_mem_dom {
44 u32 mem_glbcfg[4];
45 u32 nse_blk_index;
46 u32 nse_blk_set;
47 u32 nse_blk_clr;
48 u32 nsr_blk_clr_all;
49 u32 memn_glbac[8];
50 /* The upper only existed in the beginning of each MBC */
51 u32 mem0_blk_cfg_w[64];
52 u32 mem0_blk_nse_w[16];
53 u32 mem1_blk_cfg_w[8];
54 u32 mem1_blk_nse_w[2];
55 u32 mem2_blk_cfg_w[8];
56 u32 mem2_blk_nse_w[2];
57 u32 mem3_blk_cfg_w[8];
58 u32 mem3_blk_nse_w[2];/*0x1F0, 0x1F4 */
59 u32 reserved[2];
60};
61
62struct mrc_rgn_dom {
63 u32 mrc_glbcfg[4];
64 u32 nse_rgn_indirect;
65 u32 nse_rgn_set;
66 u32 nse_rgn_clr;
67 u32 nse_rgn_clr_all;
68 u32 memn_glbac[8];
69 /* The upper only existed in the beginning of each MRC */
70 u32 rgn_desc_words[16][2]; /* 16 regions at max, 2 words per region */
71 u32 rgn_nse;
72 u32 reserved2[15];
73};
74
75struct mda_inst {
76 u32 mda_w[8];
77};
78
79struct trdc_mgr {
80 u32 trdc_cr;
81 u32 res0[59];
82 u32 trdc_hwcfg0;
83 u32 trdc_hwcfg1;
84 u32 res1[450];
85 struct mda_inst mda[8];
86 u32 res2[15808];
87};
88
89struct trdc_mbc {
90 struct mbc_mem_dom mem_dom[DID_NUM];
91};
92
93struct trdc_mrc {
94 struct mrc_rgn_dom mrc_dom[DID_NUM];
95};
96
97int trdc_mda_set_cpu(ulong trdc_reg, u32 mda_inst, u32 mda_reg, u8 sa, u8 dids,
98 u8 did, u8 pe, u8 pidm, u8 pid)
99{
100 struct trdc_mgr *trdc_base = (struct trdc_mgr *)trdc_reg;
101 u32 *mda_w = &trdc_base->mda[mda_inst].mda_w[mda_reg];
102 u32 val = readl(mda_w);
103
104 if (val & BIT(29)) /* non-cpu */
105 return -EINVAL;
106
107 val = BIT(31) | ((pid & 0x3f) << 16) | ((pidm & 0x3f) << 8) |
108 ((pe & 0x3) << 6) | ((sa & 0x3) << 14) | ((dids & 0x3) << 4) |
109 (did & 0xf);
110
111 writel(val, mda_w);
112
113 return 0;
114}
115
116int trdc_mda_set_noncpu(ulong trdc_reg, u32 mda_inst, u32 mda_reg,
117 bool did_bypass, u8 sa, u8 pa, u8 did)
118{
119 struct trdc_mgr *trdc_base = (struct trdc_mgr *)trdc_reg;
120 u32 *mda_w = &trdc_base->mda[mda_inst].mda_w[mda_reg];
121 u32 val = readl(mda_w);
122
123 if (!(val & BIT(29))) /* cpu */
124 return -EINVAL;
125
126 val = BIT(31) | ((sa & 0x3) << 6) | ((pa & 0x3) << 4) | (did & 0xf);
127 if (did_bypass)
128 val |= BIT(8);
129
130 writel(val, mda_w);
131
132 return 0;
133}
134
135static ulong trdc_get_mbc_base(ulong trdc_reg, u32 mbc_x)
136{
137 struct trdc_mgr *trdc_base = (struct trdc_mgr *)trdc_reg;
138 u32 mbc_num = MBC_NUM(trdc_base->trdc_hwcfg0);
139
140 if (mbc_x >= mbc_num)
141 return 0;
142
143 return trdc_reg + 0x10000 + 0x2000 * mbc_x;
144}
145
146static ulong trdc_get_mrc_base(ulong trdc_reg, u32 mrc_x)
147{
148 struct trdc_mgr *trdc_base = (struct trdc_mgr *)trdc_reg;
149 u32 mbc_num = MBC_NUM(trdc_base->trdc_hwcfg0);
150 u32 mrc_num = MRC_NUM(trdc_base->trdc_hwcfg0);
151
152 if (mrc_x >= mrc_num)
153 return 0;
154
155 return trdc_reg + 0x10000 + 0x2000 * mbc_num + 0x1000 * mrc_x;
156}
157
Peng Fand03686b2024-09-19 12:01:36 +0800158static u32 trdc_mbc_blk_num(ulong trdc_reg, u32 mbc_x, u32 mem_x)
159{
160 struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
161 struct mbc_mem_dom *mbc_dom;
162 u32 glbcfg;
163
164 if (mbc_base == 0)
165 return 0;
166
167 /* only first dom has the glbcfg */
168 mbc_dom = &mbc_base->mem_dom[0];
169 glbcfg = readl((uintptr_t)&mbc_dom->mem_glbcfg[mem_x]);
170
171 return MBC_BLK_NUM(glbcfg);
172}
173
Ye Li62185922022-07-26 16:40:54 +0800174int trdc_mbc_set_control(ulong trdc_reg, u32 mbc_x, u32 glbac_id, u32 glbac_val)
175{
176 struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
177 struct mbc_mem_dom *mbc_dom;
178
179 if (mbc_base == 0 || glbac_id >= 8)
180 return -EINVAL;
181
182 /* only first dom has the glbac */
183 mbc_dom = &mbc_base->mem_dom[0];
184
185 debug("mbc 0x%lx\n", (ulong)mbc_dom);
186
187 writel(glbac_val, &mbc_dom->memn_glbac[glbac_id]);
188
189 return 0;
190}
191
192int trdc_mbc_blk_config(ulong trdc_reg, u32 mbc_x, u32 dom_x, u32 mem_x,
193 u32 blk_x, bool sec_access, u32 glbac_id)
194{
195 struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
196 struct mbc_mem_dom *mbc_dom;
197 u32 *cfg_w, *nse_w;
198 u32 index, offset, val;
199
200 if (mbc_base == 0 || glbac_id >= 8)
201 return -EINVAL;
202
203 mbc_dom = &mbc_base->mem_dom[dom_x];
204
205 debug("mbc 0x%lx\n", (ulong)mbc_dom);
206
207 switch (mem_x) {
208 case 0:
209 cfg_w = &mbc_dom->mem0_blk_cfg_w[blk_x / 8];
210 nse_w = &mbc_dom->mem0_blk_nse_w[blk_x / 32];
211 break;
212 case 1:
213 cfg_w = &mbc_dom->mem1_blk_cfg_w[blk_x / 8];
214 nse_w = &mbc_dom->mem1_blk_nse_w[blk_x / 32];
215 break;
216 case 2:
217 cfg_w = &mbc_dom->mem2_blk_cfg_w[blk_x / 8];
218 nse_w = &mbc_dom->mem2_blk_nse_w[blk_x / 32];
219 break;
220 case 3:
221 cfg_w = &mbc_dom->mem3_blk_cfg_w[blk_x / 8];
222 nse_w = &mbc_dom->mem3_blk_nse_w[blk_x / 32];
223 break;
224 default:
225 return -EINVAL;
226 };
227
228 index = blk_x % 8;
229 offset = index * 4;
230
231 val = readl((void __iomem *)cfg_w);
232
233 val &= ~(0xFU << offset);
234
235 /* MBC0-3
Peng Fand5c31832023-06-15 18:09:05 +0800236 * Global 0, 0x7777 secure pri/user read/write/execute, ELE has already set it.
Ye Li62185922022-07-26 16:40:54 +0800237 * So select MBC0_MEMN_GLBAC0
238 */
239 if (sec_access) {
240 val |= ((0x0 | (glbac_id & 0x7)) << offset);
241 writel(val, (void __iomem *)cfg_w);
242 } else {
243 val |= ((0x8 | (glbac_id & 0x7)) << offset); /* nse bit set */
244 writel(val, (void __iomem *)cfg_w);
245 }
246
247 return 0;
248}
249
250int trdc_mrc_set_control(ulong trdc_reg, u32 mrc_x, u32 glbac_id, u32 glbac_val)
251{
252 struct trdc_mrc *mrc_base = (struct trdc_mrc *)trdc_get_mrc_base(trdc_reg, mrc_x);
253 struct mrc_rgn_dom *mrc_dom;
254
255 if (mrc_base == 0 || glbac_id >= 8)
256 return -EINVAL;
257
258 /* only first dom has the glbac */
259 mrc_dom = &mrc_base->mrc_dom[0];
260
261 debug("mrc_dom 0x%lx\n", (ulong)mrc_dom);
262
263 writel(glbac_val, &mrc_dom->memn_glbac[glbac_id]);
264
265 return 0;
266}
267
268int trdc_mrc_region_config(ulong trdc_reg, u32 mrc_x, u32 dom_x, u32 addr_start,
269 u32 addr_end, bool sec_access, u32 glbac_id)
270{
271 struct trdc_mrc *mrc_base = (struct trdc_mrc *)trdc_get_mrc_base(trdc_reg, mrc_x);
272 struct mrc_rgn_dom *mrc_dom;
273 u32 *desc_w;
274 u32 start, end;
275 u32 i, free = 8;
276 bool vld, hit = false;
277
278 if (mrc_base == 0 || glbac_id >= 8)
279 return -EINVAL;
280
281 mrc_dom = &mrc_base->mrc_dom[dom_x];
282
283 addr_start &= ~0x3fff;
284 addr_end &= ~0x3fff;
285
286 debug("mrc_dom 0x%lx\n", (ulong)mrc_dom);
287
288 for (i = 0; i < 8; i++) {
289 desc_w = &mrc_dom->rgn_desc_words[i][0];
290
291 debug("desc_w 0x%lx\n", (ulong)desc_w);
292
293 start = readl((void __iomem *)desc_w) & (~0x3fff);
294 end = readl((void __iomem *)(desc_w + 1));
295 vld = end & 0x1;
296 end = end & (~0x3fff);
297
298 if (start == 0 && end == 0 && !vld && free >= 8)
299 free = i;
300
301 /* Check all the region descriptors, even overlap */
302 if (addr_start >= end || addr_end <= start || !vld)
303 continue;
304
305 /* MRC0,1
Peng Fand5c31832023-06-15 18:09:05 +0800306 * Global 0, 0x7777 secure pri/user read/write/execute, ELE has already set it.
Ye Li62185922022-07-26 16:40:54 +0800307 * So select MRCx_MEMN_GLBAC0
308 */
309 if (sec_access) {
310 writel(start | (glbac_id & 0x7), (void __iomem *)desc_w);
311 writel(end | 0x1, (void __iomem *)(desc_w + 1));
312 } else {
313 writel(start | (glbac_id & 0x7), (void __iomem *)desc_w);
314 writel(end | 0x1 | 0x10, (void __iomem *)(desc_w + 1));
315 }
316
317 if (addr_start >= start && addr_end <= end)
318 hit = true;
319 }
320
321 if (!hit) {
322 if (free >= 8)
323 return -EFAULT;
324
325 desc_w = &mrc_dom->rgn_desc_words[free][0];
326
327 debug("free desc_w 0x%lx\n", (ulong)desc_w);
328 debug("[0x%x] [0x%x]\n", addr_start | (glbac_id & 0x7), addr_end | 0x1);
329
330 if (sec_access) {
331 writel(addr_start | (glbac_id & 0x7), (void __iomem *)desc_w);
332 writel(addr_end | 0x1, (void __iomem *)(desc_w + 1));
333 } else {
334 writel(addr_start | (glbac_id & 0x7), (void __iomem *)desc_w);
335 writel((addr_end | 0x1 | 0x10), (void __iomem *)(desc_w + 1));
336 }
337 }
338
339 return 0;
340}
341
342bool trdc_mrc_enabled(ulong trdc_base)
343{
344 return (!!(readl((void __iomem *)trdc_base) & 0x8000));
345}
346
347bool trdc_mbc_enabled(ulong trdc_base)
348{
349 return (!!(readl((void __iomem *)trdc_base) & 0x4000));
350}
351
352int release_rdc(u8 xrdc)
353{
354 ulong s_mu_base = 0x47520000UL;
Peng Fand5c31832023-06-15 18:09:05 +0800355 struct ele_msg msg;
Ye Li62185922022-07-26 16:40:54 +0800356 int ret;
357 u32 rdc_id;
358
359 switch (xrdc) {
360 case 0:
361 rdc_id = 0x74;
362 break;
363 case 1:
364 rdc_id = 0x78;
365 break;
366 case 2:
367 rdc_id = 0x82;
368 break;
369 case 3:
370 rdc_id = 0x86;
371 break;
372 default:
373 return -EINVAL;
374 }
375
Peng Fand5c31832023-06-15 18:09:05 +0800376 msg.version = ELE_VERSION;
377 msg.tag = ELE_CMD_TAG;
Ye Li62185922022-07-26 16:40:54 +0800378 msg.size = 2;
Ye Liebb2be52023-01-30 18:39:53 +0800379 msg.command = ELE_RELEASE_RDC_REQ;
Ye Li62185922022-07-26 16:40:54 +0800380 msg.data[0] = (rdc_id << 8) | 0x2; /* A55 */
381
382 mu_hal_init(s_mu_base);
383 mu_hal_sendmsg(s_mu_base, 0, *((u32 *)&msg));
384 mu_hal_sendmsg(s_mu_base, 1, msg.data[0]);
385
386 ret = mu_hal_receivemsg(s_mu_base, 0, (u32 *)&msg);
387 if (!ret) {
388 ret = mu_hal_receivemsg(s_mu_base, 1, &msg.data[0]);
389 if (!ret) {
390 if ((msg.data[0] & 0xff) == 0xd6)
391 return 0;
392 }
393
394 return -EIO;
395 }
396
397 return ret;
398}
399
400void trdc_early_init(void)
401{
402 int ret = 0, i;
Peng Fand03686b2024-09-19 12:01:36 +0800403 u32 blks;
Ye Li62185922022-07-26 16:40:54 +0800404
Peng Fan5dce3492024-09-19 12:01:35 +0800405 ret |= release_rdc(TRDC_A);
406 ret |= release_rdc(TRDC_M);
407 ret |= release_rdc(TRDC_W);
408 ret |= release_rdc(TRDC_N);
Ye Li62185922022-07-26 16:40:54 +0800409
Peng Fan5dce3492024-09-19 12:01:35 +0800410 if (ret) {
411 hang();
412 return;
413 }
414
415 /* Set OCRAM to RWX for secure, when OEM_CLOSE, the image is RX only */
416 trdc_mbc_set_control(TRDC_NIC_BASE, MBC(3), GLOBAL_ID(0), PERM(0x7700));
Ye Li62185922022-07-26 16:40:54 +0800417
Peng Fand03686b2024-09-19 12:01:36 +0800418 blks = trdc_mbc_blk_num(TRDC_NIC_BASE, MBC(3), MEM(0));
419 for (i = 0; i < blks; i++) {
Peng Fan5dce3492024-09-19 12:01:35 +0800420 trdc_mbc_blk_config(TRDC_NIC_BASE, MBC(3), DOM(3), MEM(0), i,
421 true, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800422
Peng Fan5dce3492024-09-19 12:01:35 +0800423 trdc_mbc_blk_config(TRDC_NIC_BASE, MBC(3), DOM(3), MEM(1), i,
424 true, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800425
Peng Fan5dce3492024-09-19 12:01:35 +0800426 trdc_mbc_blk_config(TRDC_NIC_BASE, MBC(3), DOM(0), MEM(0), i,
427 true, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800428
Peng Fan5dce3492024-09-19 12:01:35 +0800429 trdc_mbc_blk_config(TRDC_NIC_BASE, MBC(3), DOM(0), MEM(1), i,
430 true, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800431 }
432}
433
434void trdc_init(void)
435{
436 /* TRDC mega */
Peng Fan5dce3492024-09-19 12:01:35 +0800437 if (trdc_mrc_enabled(TRDC_NIC_BASE)) {
Ye Li62185922022-07-26 16:40:54 +0800438 /* DDR */
Peng Fan5dce3492024-09-19 12:01:35 +0800439 trdc_mrc_set_control(TRDC_NIC_BASE, MRC(0), GLOBAL_ID(0), PERM(0x7777));
Ye Li62185922022-07-26 16:40:54 +0800440
Peng Fand5c31832023-06-15 18:09:05 +0800441 /* ELE */
Peng Fan5dce3492024-09-19 12:01:35 +0800442 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(0), 0x80000000,
443 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800444
445 /* MTR */
Peng Fan5dce3492024-09-19 12:01:35 +0800446 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(1), 0x80000000,
447 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800448
449 /* M33 */
Peng Fan5dce3492024-09-19 12:01:35 +0800450 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(2), 0x80000000,
451 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800452
453 /* A55*/
Peng Fan5dce3492024-09-19 12:01:35 +0800454 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(3), 0x80000000,
455 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800456
457 /* For USDHC1 to DDR, USDHC1 is default force to non-secure */
Peng Fan5dce3492024-09-19 12:01:35 +0800458 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(5), 0x80000000,
459 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800460
461 /* For USDHC2 to DDR, USDHC2 is default force to non-secure */
Peng Fan5dce3492024-09-19 12:01:35 +0800462 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(6), 0x80000000,
463 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800464
465 /* eDMA */
Peng Fan5dce3492024-09-19 12:01:35 +0800466 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(7), 0x80000000,
467 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800468
469 /*CoreSight, TestPort*/
Peng Fan5dce3492024-09-19 12:01:35 +0800470 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(8), 0x80000000,
471 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800472
473 /* DAP */
Peng Fan5dce3492024-09-19 12:01:35 +0800474 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(9), 0x80000000,
475 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800476
477 /*SoC masters */
Peng Fan5dce3492024-09-19 12:01:35 +0800478 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(10), 0x80000000,
479 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800480
481 /*USB*/
Peng Fan5dce3492024-09-19 12:01:35 +0800482 trdc_mrc_region_config(TRDC_NIC_BASE, MRC(0), DOM(11), 0x80000000,
483 0xFFFFFFFF, false, GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800484 }
485}
486
487#if DEBUG
488int trdc_mbc_control_dump(ulong trdc_reg, u32 mbc_x, u32 glbac_id)
489{
490 struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
491 struct mbc_mem_dom *mbc_dom;
492
493 if (mbc_base == 0 || glbac_id >= 8)
494 return -EINVAL;
495
496 /* only first dom has the glbac */
497 mbc_dom = &mbc_base->mem_dom[0];
498
499 printf("mbc_dom %u glbac %u: 0x%x\n",
500 mbc_x, glbac_id, readl(&mbc_dom->memn_glbac[glbac_id]));
501
502 return 0;
503}
504
505int trdc_mbc_mem_dump(ulong trdc_reg, u32 mbc_x, u32 dom_x, u32 mem_x, u32 word)
506{
507 struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
508 struct mbc_mem_dom *mbc_dom;
509 u32 *cfg_w;
510
511 if (mbc_base == 0)
512 return -EINVAL;
513
514 mbc_dom = &mbc_base->mem_dom[dom_x];
515
516 switch (mem_x) {
517 case 0:
518 cfg_w = &mbc_dom->mem0_blk_cfg_w[word];
519 break;
520 case 1:
521 cfg_w = &mbc_dom->mem1_blk_cfg_w[word];
522 break;
523 case 2:
524 cfg_w = &mbc_dom->mem2_blk_cfg_w[word];
525 break;
526 case 3:
527 cfg_w = &mbc_dom->mem3_blk_cfg_w[word];
528 break;
529 default:
530 return -EINVAL;
531 };
532
533 printf("mbc_dom %u dom %u mem %u word %u: 0x%x\n",
534 mbc_x, dom_x, mem_x, word, readl((void __iomem *)cfg_w));
535
536 return 0;
537}
538
539int trdc_mrc_control_dump(ulong trdc_reg, u32 mrc_x, u32 glbac_id)
540{
541 struct trdc_mrc *mrc_base = (struct trdc_mrc *)trdc_get_mrc_base(trdc_reg, mrc_x);
542 struct mrc_rgn_dom *mrc_dom;
543
544 if (mrc_base == 0 || glbac_id >= 8)
545 return -EINVAL;
546
547 /* only first dom has the glbac */
548 mrc_dom = &mrc_base->mrc_dom[0];
549
550 printf("mrc_dom %u glbac %u: 0x%x\n",
551 mrc_x, glbac_id, readl(&mrc_dom->memn_glbac[glbac_id]));
552
553 return 0;
554}
555
556void trdc_dump(void)
557{
558 u32 i;
559
560 printf("TRDC AONMIX MBC\n");
561
Peng Fan5dce3492024-09-19 12:01:35 +0800562 trdc_mbc_control_dump(TRDC_AON_BASE, MBC(0), GLOBAL_ID(0));
563 trdc_mbc_control_dump(TRDC_AON_BASE, MBC(1), GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800564
565 for (i = 0; i < 11; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800566 trdc_mbc_mem_dump(TRDC_AON_BASE, MBC(0), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800567 for (i = 0; i < 1; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800568 trdc_mbc_mem_dump(TRDC_AON_BASE, MBC(0), DOM(3), MEM(1), i);
Ye Li62185922022-07-26 16:40:54 +0800569
570 for (i = 0; i < 4; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800571 trdc_mbc_mem_dump(TRDC_AON_BASE, MBC(1), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800572 for (i = 0; i < 4; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800573 trdc_mbc_mem_dump(TRDC_AON_BASE, MBC(1), DOM(3), MEM(1), i);
Ye Li62185922022-07-26 16:40:54 +0800574
575 printf("TRDC WAKEUP MBC\n");
576
Peng Fan5dce3492024-09-19 12:01:35 +0800577 trdc_mbc_control_dump(TRDC_WAKEUP_BASE, MBC(0), GLOBAL_ID(0));
578 trdc_mbc_control_dump(TRDC_WAKEUP_BASE, MBC(1), GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800579
580 for (i = 0; i < 15; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800581 trdc_mbc_mem_dump(TRDC_WAKEUP_BASE, MBC(0), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800582
Peng Fan5dce3492024-09-19 12:01:35 +0800583 trdc_mbc_mem_dump(TRDC_WAKEUP_BASE, MBC(0), DOM(3), MEM(1), 0);
584 trdc_mbc_mem_dump(TRDC_WAKEUP_BASE, 0, 3, 2, 0);
Ye Li62185922022-07-26 16:40:54 +0800585
586 for (i = 0; i < 2; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800587 trdc_mbc_mem_dump(TRDC_WAKEUP_BASE, MBC(1), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800588
Peng Fan5dce3492024-09-19 12:01:35 +0800589 trdc_mbc_mem_dump(TRDC_WAKEUP_BASE, MBC(1), DOM(3), MEM(1), 0);
590 trdc_mbc_mem_dump(TRDC_WAKEUP_BASE, 1, 3, 2, 0);
591 trdc_mbc_mem_dump(TRDC_WAKEUP_BASE, MBC(1), DOM(3), MEM(3), 0);
Ye Li62185922022-07-26 16:40:54 +0800592
593 printf("TRDC NICMIX MBC\n");
594
Peng Fan5dce3492024-09-19 12:01:35 +0800595 trdc_mbc_control_dump(TRDC_NIC_BASE, MBC(0), GLOBAL_ID(0));
596 trdc_mbc_control_dump(TRDC_NIC_BASE, MBC(1), GLOBAL_ID(0));
597 trdc_mbc_control_dump(TRDC_NIC_BASE, MBC(2), GLOBAL_ID(0));
598 trdc_mbc_control_dump(TRDC_NIC_BASE, MBC(3), GLOBAL_ID(0));
Ye Li62185922022-07-26 16:40:54 +0800599
600 for (i = 0; i < 7; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800601 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(0), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800602
603 for (i = 0; i < 2; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800604 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(0), DOM(3), MEM(1), i);
Ye Li62185922022-07-26 16:40:54 +0800605
606 for (i = 0; i < 5; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800607 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(0), DOM(3), MEM(2), i);
Ye Li62185922022-07-26 16:40:54 +0800608
609 for (i = 0; i < 6; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800610 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(0), DOM(3), MEM(3), i);
Ye Li62185922022-07-26 16:40:54 +0800611
612 for (i = 0; i < 1; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800613 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(1), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800614
615 for (i = 0; i < 1; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800616 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(1), DOM(3), MEM(1), i);
Ye Li62185922022-07-26 16:40:54 +0800617
618 for (i = 0; i < 3; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800619 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(1), DOM(3), MEM(2), i);
Ye Li62185922022-07-26 16:40:54 +0800620
621 for (i = 0; i < 3; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800622 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(1), DOM(3), MEM(3), i);
Ye Li62185922022-07-26 16:40:54 +0800623
624 for (i = 0; i < 2; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800625 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(2), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800626
627 for (i = 0; i < 2; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800628 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(2), DOM(3), MEM(1), i);
Ye Li62185922022-07-26 16:40:54 +0800629
630 for (i = 0; i < 5; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800631 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(3), DOM(3), MEM(0), i);
Ye Li62185922022-07-26 16:40:54 +0800632
633 for (i = 0; i < 5; i++)
Peng Fan5dce3492024-09-19 12:01:35 +0800634 trdc_mbc_mem_dump(TRDC_NIC_BASE, MBC(3), DOM(3), MEM(1), i);
Ye Li62185922022-07-26 16:40:54 +0800635}
636#endif