xref: /rk3399_ARM-atf/drivers/nxp/trdc/imx_trdc.c (revision 0e74b661adb652b599d0d531df7787a61ea22645)
1*29352910SJacky Bai /*
2*29352910SJacky Bai  * Copyright 2022-2023 NXP
3*29352910SJacky Bai  *
4*29352910SJacky Bai  * SPDX-License-Identifier: BSD-3-Clause
5*29352910SJacky Bai  */
6*29352910SJacky Bai 
7*29352910SJacky Bai #include <assert.h>
8*29352910SJacky Bai #include <errno.h>
9*29352910SJacky Bai #include <stdbool.h>
10*29352910SJacky Bai 
11*29352910SJacky Bai #include <common/bl_common.h>
12*29352910SJacky Bai #include <common/debug.h>
13*29352910SJacky Bai #include <drivers/nxp/trdc/imx_trdc.h>
14*29352910SJacky Bai #include <lib/mmio.h>
15*29352910SJacky Bai 
16*29352910SJacky Bai 
trdc_mda_set_cpu(uintptr_t trdc_base,uint32_t mda_inst,uint32_t mda_reg,uint8_t sa,uint8_t dids,uint8_t did,uint8_t pe,uint8_t pidm,uint8_t pid)17*29352910SJacky Bai int trdc_mda_set_cpu(uintptr_t trdc_base, uint32_t mda_inst,
18*29352910SJacky Bai 		     uint32_t mda_reg, uint8_t sa, uint8_t dids,
19*29352910SJacky Bai 		     uint8_t did, uint8_t pe, uint8_t pidm, uint8_t pid)
20*29352910SJacky Bai {
21*29352910SJacky Bai 	uint32_t val = mmio_read_32(trdc_base + MDAC_W_X(mda_inst, mda_reg));
22*29352910SJacky Bai 	/* invalid: config non-cpu master with cpu config format. */
23*29352910SJacky Bai 	if ((val & MDA_DFMT) != 0U) {
24*29352910SJacky Bai 		return -EINVAL;
25*29352910SJacky Bai 	}
26*29352910SJacky Bai 
27*29352910SJacky Bai 	val = MDA_VLD | MDA_DFMT0_DID(pid) | MDA_DFMT0_PIDM(pidm) | MDA_DFMT0_PE(pe) |
28*29352910SJacky Bai 	      MDA_DFMT0_SA(sa) | MDA_DFMT0_DIDS(dids) | MDA_DFMT0_DID(did);
29*29352910SJacky Bai 
30*29352910SJacky Bai 	mmio_write_32(trdc_base + MDAC_W_X(mda_inst, mda_reg), val);
31*29352910SJacky Bai 
32*29352910SJacky Bai 	return 0;
33*29352910SJacky Bai }
34*29352910SJacky Bai 
trdc_mda_set_noncpu(uintptr_t trdc_base,uint32_t mda_inst,bool did_bypass,uint8_t sa,uint8_t pa,uint8_t did)35*29352910SJacky Bai int trdc_mda_set_noncpu(uintptr_t trdc_base, uint32_t mda_inst,
36*29352910SJacky Bai 			bool did_bypass, uint8_t sa, uint8_t pa,
37*29352910SJacky Bai 			uint8_t did)
38*29352910SJacky Bai {
39*29352910SJacky Bai 	uint32_t val = mmio_read_32(trdc_base + MDAC_W_X(mda_inst, 0));
40*29352910SJacky Bai 
41*29352910SJacky Bai 	/* invalid: config cpu master with non-cpu config format. */
42*29352910SJacky Bai 	if ((val & MDA_DFMT) == 0U) {
43*29352910SJacky Bai 		return -EINVAL;
44*29352910SJacky Bai 	}
45*29352910SJacky Bai 
46*29352910SJacky Bai 	val = MDA_VLD | MDA_DFMT1_SA(sa) | MDA_DFMT1_PA(pa) | MDA_DFMT1_DID(did) |
47*29352910SJacky Bai 	      MDA_DFMT1_DIDB(did_bypass ? 1U : 0U);
48*29352910SJacky Bai 
49*29352910SJacky Bai 	mmio_write_32(trdc_base + MDAC_W_X(mda_inst, 0), val);
50*29352910SJacky Bai 
51*29352910SJacky Bai 	return 0;
52*29352910SJacky Bai }
53*29352910SJacky Bai 
trdc_get_mbc_base(uintptr_t trdc_reg,uint32_t mbc_x)54*29352910SJacky Bai static uintptr_t trdc_get_mbc_base(uintptr_t trdc_reg, uint32_t mbc_x)
55*29352910SJacky Bai {
56*29352910SJacky Bai 	struct trdc_mgr *trdc_base = (struct trdc_mgr *)trdc_reg;
57*29352910SJacky Bai 	uint32_t mbc_num = MBC_NUM(trdc_base->trdc_hwcfg0);
58*29352910SJacky Bai 
59*29352910SJacky Bai 	if (mbc_x >= mbc_num) {
60*29352910SJacky Bai 		return 0U;
61*29352910SJacky Bai 	}
62*29352910SJacky Bai 
63*29352910SJacky Bai 	return trdc_reg + 0x10000 + 0x2000 * mbc_x;
64*29352910SJacky Bai }
65*29352910SJacky Bai 
trdc_get_mrc_base(uintptr_t trdc_reg,uint32_t mrc_x)66*29352910SJacky Bai static uintptr_t trdc_get_mrc_base(uintptr_t trdc_reg, uint32_t mrc_x)
67*29352910SJacky Bai {
68*29352910SJacky Bai 	struct trdc_mgr *trdc_base = (struct trdc_mgr *)trdc_reg;
69*29352910SJacky Bai 	uint32_t mbc_num = MBC_NUM(trdc_base->trdc_hwcfg0);
70*29352910SJacky Bai 	uint32_t mrc_num = MRC_NUM(trdc_base->trdc_hwcfg0);
71*29352910SJacky Bai 
72*29352910SJacky Bai 	if (mrc_x >= mrc_num) {
73*29352910SJacky Bai 		return 0U;
74*29352910SJacky Bai 	}
75*29352910SJacky Bai 
76*29352910SJacky Bai 	return trdc_reg + 0x10000 + 0x2000 * mbc_num + 0x1000 * mrc_x;
77*29352910SJacky Bai }
78*29352910SJacky Bai 
trdc_mbc_blk_num(uintptr_t trdc_reg,uint32_t mbc_x,uint32_t mem_x)79*29352910SJacky Bai uint32_t trdc_mbc_blk_num(uintptr_t trdc_reg, uint32_t mbc_x, uint32_t mem_x)
80*29352910SJacky Bai {
81*29352910SJacky Bai 	uint32_t glbcfg;
82*29352910SJacky Bai 	struct mbc_mem_dom *mbc_dom;
83*29352910SJacky Bai 	struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
84*29352910SJacky Bai 
85*29352910SJacky Bai 	if (mbc_base == NULL) {
86*29352910SJacky Bai 		return 0;
87*29352910SJacky Bai 	}
88*29352910SJacky Bai 
89*29352910SJacky Bai 	/* only first dom has the glbcfg */
90*29352910SJacky Bai 	mbc_dom = &mbc_base->mem_dom[0];
91*29352910SJacky Bai 	glbcfg = mmio_read_32((uintptr_t)&mbc_dom->mem_glbcfg[mem_x]);
92*29352910SJacky Bai 
93*29352910SJacky Bai 	return MBC_BLK_NUM(glbcfg);
94*29352910SJacky Bai }
95*29352910SJacky Bai 
trdc_mrc_rgn_num(uintptr_t trdc_reg,uint32_t mrc_x)96*29352910SJacky Bai uint32_t trdc_mrc_rgn_num(uintptr_t trdc_reg, uint32_t mrc_x)
97*29352910SJacky Bai {
98*29352910SJacky Bai 	uint32_t glbcfg;
99*29352910SJacky Bai 	struct mrc_rgn_dom *mrc_dom;
100*29352910SJacky Bai 	struct trdc_mrc *mrc_base = (struct trdc_mrc *)trdc_get_mrc_base(trdc_reg, mrc_x);
101*29352910SJacky Bai 
102*29352910SJacky Bai 	if (mrc_base == NULL) {
103*29352910SJacky Bai 		return 0;
104*29352910SJacky Bai 	}
105*29352910SJacky Bai 
106*29352910SJacky Bai 	/* only first dom has the glbcfg */
107*29352910SJacky Bai 	mrc_dom = &mrc_base->mrc_dom[0];
108*29352910SJacky Bai 	glbcfg = mmio_read_32((uintptr_t)&mrc_dom->mrc_glbcfg[0]);
109*29352910SJacky Bai 
110*29352910SJacky Bai 	return MBC_BLK_NUM(glbcfg);
111*29352910SJacky Bai }
112*29352910SJacky Bai 
trdc_mbc_set_control(uintptr_t trdc_reg,uint32_t mbc_x,uint32_t glbac_id,uint32_t glbac_val)113*29352910SJacky Bai int trdc_mbc_set_control(uintptr_t trdc_reg, uint32_t mbc_x,
114*29352910SJacky Bai 			 uint32_t glbac_id, uint32_t glbac_val)
115*29352910SJacky Bai {
116*29352910SJacky Bai 	struct mbc_mem_dom *mbc_dom;
117*29352910SJacky Bai 	struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
118*29352910SJacky Bai 
119*29352910SJacky Bai 	if (mbc_base == NULL || glbac_id >= GLBAC_NUM) {
120*29352910SJacky Bai 		return -EINVAL;
121*29352910SJacky Bai 	}
122*29352910SJacky Bai 
123*29352910SJacky Bai 	/* only first dom has the glbac */
124*29352910SJacky Bai 	mbc_dom = &mbc_base->mem_dom[0];
125*29352910SJacky Bai 
126*29352910SJacky Bai 	mmio_write_32((uintptr_t)&mbc_dom->memn_glbac[glbac_id], glbac_val);
127*29352910SJacky Bai 
128*29352910SJacky Bai 	return 0;
129*29352910SJacky Bai }
130*29352910SJacky Bai 
trdc_mbc_blk_config(uintptr_t trdc_reg,uint32_t mbc_x,uint32_t dom_x,uint32_t mem_x,uint32_t blk_x,bool sec_access,uint32_t glbac_id)131*29352910SJacky Bai int trdc_mbc_blk_config(uintptr_t trdc_reg, uint32_t mbc_x,
132*29352910SJacky Bai 			uint32_t dom_x, uint32_t mem_x, uint32_t blk_x,
133*29352910SJacky Bai 			bool sec_access, uint32_t glbac_id)
134*29352910SJacky Bai {
135*29352910SJacky Bai 	uint32_t *cfg_w;
136*29352910SJacky Bai 	uint32_t index, offset, val;
137*29352910SJacky Bai 	struct mbc_mem_dom *mbc_dom;
138*29352910SJacky Bai 	struct trdc_mbc *mbc_base = (struct trdc_mbc *)trdc_get_mbc_base(trdc_reg, mbc_x);
139*29352910SJacky Bai 
140*29352910SJacky Bai 	if (mbc_base == NULL || glbac_id >= GLBAC_NUM) {
141*29352910SJacky Bai 		return -EINVAL;
142*29352910SJacky Bai 	}
143*29352910SJacky Bai 
144*29352910SJacky Bai 	mbc_dom = &mbc_base->mem_dom[dom_x];
145*29352910SJacky Bai 
146*29352910SJacky Bai 	switch (mem_x) {
147*29352910SJacky Bai 	case 0:
148*29352910SJacky Bai 		cfg_w = &mbc_dom->mem0_blk_cfg_w[blk_x / 8];
149*29352910SJacky Bai 		break;
150*29352910SJacky Bai 	case 1:
151*29352910SJacky Bai 		cfg_w = &mbc_dom->mem1_blk_cfg_w[blk_x / 8];
152*29352910SJacky Bai 		break;
153*29352910SJacky Bai 	case 2:
154*29352910SJacky Bai 		cfg_w = &mbc_dom->mem2_blk_cfg_w[blk_x / 8];
155*29352910SJacky Bai 		break;
156*29352910SJacky Bai 	case 3:
157*29352910SJacky Bai 		cfg_w = &mbc_dom->mem3_blk_cfg_w[blk_x / 8];
158*29352910SJacky Bai 		break;
159*29352910SJacky Bai 	default:
160*29352910SJacky Bai 		return -EINVAL;
161*29352910SJacky Bai 	};
162*29352910SJacky Bai 
163*29352910SJacky Bai 	index = blk_x % 8;
164*29352910SJacky Bai 	offset = index * 4;
165*29352910SJacky Bai 
166*29352910SJacky Bai 	val = mmio_read_32((uintptr_t)cfg_w);
167*29352910SJacky Bai 	val &= ~(0xF << offset);
168*29352910SJacky Bai 
169*29352910SJacky Bai 	/*
170*29352910SJacky Bai 	 * MBC0-3
171*29352910SJacky Bai 	 * Global 0, 0x7777 secure pri/user read/write/execute,
172*29352910SJacky Bai 	 * S400 has already set it. So select MBC0_MEMN_GLBAC0
173*29352910SJacky Bai 	 */
174*29352910SJacky Bai 	if (sec_access) {
175*29352910SJacky Bai 		val |= ((0x0 | (glbac_id & 0x7)) << offset);
176*29352910SJacky Bai 		mmio_write_32((uintptr_t)cfg_w, val);
177*29352910SJacky Bai 	} else {
178*29352910SJacky Bai 		/* nse bit set */
179*29352910SJacky Bai 		val |= ((0x8 | (glbac_id & 0x7)) << offset);
180*29352910SJacky Bai 		mmio_write_32((uintptr_t)cfg_w, val);
181*29352910SJacky Bai 	}
182*29352910SJacky Bai 
183*29352910SJacky Bai 	return 0;
184*29352910SJacky Bai }
185*29352910SJacky Bai 
trdc_mrc_set_control(uintptr_t trdc_reg,uint32_t mrc_x,uint32_t glbac_id,uint32_t glbac_val)186*29352910SJacky Bai int trdc_mrc_set_control(uintptr_t trdc_reg, uint32_t mrc_x,
187*29352910SJacky Bai 			 uint32_t glbac_id, uint32_t glbac_val)
188*29352910SJacky Bai {
189*29352910SJacky Bai 	struct mrc_rgn_dom *mrc_dom;
190*29352910SJacky Bai 	struct trdc_mrc *mrc_base = (struct trdc_mrc *)trdc_get_mrc_base(trdc_reg, mrc_x);
191*29352910SJacky Bai 
192*29352910SJacky Bai 	if (mrc_base == NULL || glbac_id >= GLBAC_NUM) {
193*29352910SJacky Bai 		return -EINVAL;
194*29352910SJacky Bai 	}
195*29352910SJacky Bai 
196*29352910SJacky Bai 	/* only first dom has the glbac */
197*29352910SJacky Bai 	mrc_dom = &mrc_base->mrc_dom[0];
198*29352910SJacky Bai 
199*29352910SJacky Bai 	mmio_write_32((uintptr_t)&mrc_dom->memn_glbac[glbac_id], glbac_val);
200*29352910SJacky Bai 
201*29352910SJacky Bai 	return 0;
202*29352910SJacky Bai }
203*29352910SJacky Bai 
trdc_mrc_rgn_config(uintptr_t trdc_reg,uint32_t mrc_x,uint32_t dom_x,uint32_t rgn_id,uint32_t addr_start,uint32_t addr_size,bool sec_access,uint32_t glbac_id)204*29352910SJacky Bai int trdc_mrc_rgn_config(uintptr_t trdc_reg, uint32_t mrc_x,
205*29352910SJacky Bai 			uint32_t dom_x, uint32_t rgn_id,
206*29352910SJacky Bai 			uint32_t addr_start, uint32_t addr_size,
207*29352910SJacky Bai 			bool sec_access, uint32_t glbac_id)
208*29352910SJacky Bai {
209*29352910SJacky Bai 	uint32_t *desc_w;
210*29352910SJacky Bai 	uint32_t addr_end;
211*29352910SJacky Bai 	struct mrc_rgn_dom *mrc_dom;
212*29352910SJacky Bai 	struct trdc_mrc *mrc_base = (struct trdc_mrc *)trdc_get_mrc_base(trdc_reg, mrc_x);
213*29352910SJacky Bai 
214*29352910SJacky Bai 	if (mrc_base == NULL || glbac_id >= GLBAC_NUM || rgn_id >= MRC_REG_ALL) {
215*29352910SJacky Bai 		return -EINVAL;
216*29352910SJacky Bai 	}
217*29352910SJacky Bai 
218*29352910SJacky Bai 	mrc_dom = &mrc_base->mrc_dom[dom_x];
219*29352910SJacky Bai 
220*29352910SJacky Bai 	addr_end = addr_start + addr_size - 1;
221*29352910SJacky Bai 	addr_start &= ~0x3fff;
222*29352910SJacky Bai 	addr_end &= ~0x3fff;
223*29352910SJacky Bai 
224*29352910SJacky Bai 	desc_w = &mrc_dom->rgn_desc_words[rgn_id][0];
225*29352910SJacky Bai 
226*29352910SJacky Bai 	if (sec_access) {
227*29352910SJacky Bai 		mmio_write_32((uintptr_t)desc_w, addr_start | (glbac_id & 0x7));
228*29352910SJacky Bai 		mmio_write_32((uintptr_t)(desc_w + 1), addr_end | 0x1);
229*29352910SJacky Bai 	} else {
230*29352910SJacky Bai 		mmio_write_32((uintptr_t)desc_w, addr_start | (glbac_id & 0x7));
231*29352910SJacky Bai 		mmio_write_32((uintptr_t)(desc_w + 1), (addr_end | 0x1 | 0x10));
232*29352910SJacky Bai 	}
233*29352910SJacky Bai 
234*29352910SJacky Bai 	return 0;
235*29352910SJacky Bai }
236*29352910SJacky Bai 
trdc_mrc_enabled(uintptr_t mrc_base)237*29352910SJacky Bai bool trdc_mrc_enabled(uintptr_t mrc_base)
238*29352910SJacky Bai {
239*29352910SJacky Bai 	return (mmio_read_32(mrc_base) & BIT(15));
240*29352910SJacky Bai }
241*29352910SJacky Bai 
trdc_mbc_enabled(uintptr_t mbc_base)242*29352910SJacky Bai bool trdc_mbc_enabled(uintptr_t mbc_base)
243*29352910SJacky Bai {
244*29352910SJacky Bai 	return (mmio_read_32(mbc_base) & BIT(14));
245*29352910SJacky Bai }
246*29352910SJacky Bai 
is_trdc_mgr_slot(uintptr_t trdc_base,uint8_t mbc_id,uint8_t mem_id,uint16_t blk_id)247*29352910SJacky Bai static bool is_trdc_mgr_slot(uintptr_t trdc_base, uint8_t mbc_id,
248*29352910SJacky Bai 			     uint8_t mem_id, uint16_t blk_id)
249*29352910SJacky Bai {
250*29352910SJacky Bai 	unsigned int i;
251*29352910SJacky Bai 
252*29352910SJacky Bai 	for (i = 0U; i < trdc_mgr_num; i++) {
253*29352910SJacky Bai 		if (trdc_mgr_blks[i].trdc_base == trdc_base) {
254*29352910SJacky Bai 			if (mbc_id == trdc_mgr_blks[i].mbc_id &&
255*29352910SJacky Bai 			    mem_id == trdc_mgr_blks[i].mbc_mem_id &&
256*29352910SJacky Bai 			   (blk_id == trdc_mgr_blks[i].blk_mgr ||
257*29352910SJacky Bai 			    blk_id == trdc_mgr_blks[i].blk_mc)) {
258*29352910SJacky Bai 				return true;
259*29352910SJacky Bai 			}
260*29352910SJacky Bai 		}
261*29352910SJacky Bai 	}
262*29352910SJacky Bai 
263*29352910SJacky Bai 	return false;
264*29352910SJacky Bai }
265*29352910SJacky Bai 
266*29352910SJacky Bai /*
267*29352910SJacky Bai  * config the TRDC MGR & MC's access policy. only the secure privilege
268*29352910SJacky Bai  * mode SW can access it.
269*29352910SJacky Bai  */
trdc_mgr_mbc_setup(struct trdc_mgr_info * mgr)270*29352910SJacky Bai void trdc_mgr_mbc_setup(struct trdc_mgr_info *mgr)
271*29352910SJacky Bai {
272*29352910SJacky Bai 	unsigned int i;
273*29352910SJacky Bai 
274*29352910SJacky Bai 	/*
275*29352910SJacky Bai 	 * If the MBC is global enabled, need to cconfigure the MBCs of
276*29352910SJacky Bai 	 * TRDC MGR & MC correctly.
277*29352910SJacky Bai 	 */
278*29352910SJacky Bai 	if (trdc_mbc_enabled(mgr->trdc_base)) {
279*29352910SJacky Bai 		/* ONLY secure privilige can access */
280*29352910SJacky Bai 		trdc_mbc_set_control(mgr->trdc_base, mgr->mbc_id, 7, 0x6000);
281*29352910SJacky Bai 		for (i = 0U; i < 16U; i++) {
282*29352910SJacky Bai 			trdc_mbc_blk_config(mgr->trdc_base, mgr->mbc_id, i,
283*29352910SJacky Bai 				mgr->mbc_mem_id, mgr->blk_mgr, true, 7);
284*29352910SJacky Bai 
285*29352910SJacky Bai 			trdc_mbc_blk_config(mgr->trdc_base, mgr->mbc_id, i,
286*29352910SJacky Bai 				mgr->mbc_mem_id, mgr->blk_mc, true, 7);
287*29352910SJacky Bai 		}
288*29352910SJacky Bai 	}
289*29352910SJacky Bai }
290*29352910SJacky Bai 
291*29352910SJacky Bai /*
292*29352910SJacky Bai  * Set up the TRDC access policy for all the resources under
293*29352910SJacky Bai  * the TRDC control.
294*29352910SJacky Bai  */
trdc_setup(struct trdc_config_info * cfg)295*29352910SJacky Bai void trdc_setup(struct trdc_config_info *cfg)
296*29352910SJacky Bai {
297*29352910SJacky Bai 	unsigned int i, j, num;
298*29352910SJacky Bai 	bool is_mgr;
299*29352910SJacky Bai 
300*29352910SJacky Bai 	/* config the MRCs */
301*29352910SJacky Bai 	if (trdc_mrc_enabled(cfg->trdc_base)) {
302*29352910SJacky Bai 		/* set global access policy */
303*29352910SJacky Bai 		for (i = 0U; i < cfg->num_mrc_glbac; i++) {
304*29352910SJacky Bai 			trdc_mrc_set_control(cfg->trdc_base,
305*29352910SJacky Bai 					     cfg->mrc_glbac[i].mbc_mrc_id,
306*29352910SJacky Bai 					     cfg->mrc_glbac[i].glbac_id,
307*29352910SJacky Bai 					     cfg->mrc_glbac[i].glbac_val);
308*29352910SJacky Bai 		}
309*29352910SJacky Bai 
310*29352910SJacky Bai 		/* set each MRC region access policy */
311*29352910SJacky Bai 		for (i = 0U; i < cfg->num_mrc_cfg; i++) {
312*29352910SJacky Bai 			trdc_mrc_rgn_config(cfg->trdc_base, cfg->mrc_cfg[i].mrc_id,
313*29352910SJacky Bai 					    cfg->mrc_cfg[i].dom_id,
314*29352910SJacky Bai 					    cfg->mrc_cfg[i].region_id,
315*29352910SJacky Bai 					    cfg->mrc_cfg[i].region_start,
316*29352910SJacky Bai 					    cfg->mrc_cfg[i].region_size,
317*29352910SJacky Bai 					    cfg->mrc_cfg[i].secure,
318*29352910SJacky Bai 					    cfg->mrc_cfg[i].glbac_id);
319*29352910SJacky Bai 		}
320*29352910SJacky Bai 	}
321*29352910SJacky Bai 
322*29352910SJacky Bai 	/* config the MBCs */
323*29352910SJacky Bai 	if (trdc_mbc_enabled(cfg->trdc_base)) {
324*29352910SJacky Bai 		/* set MBC global access policy */
325*29352910SJacky Bai 		for (i = 0U; i < cfg->num_mbc_glbac; i++) {
326*29352910SJacky Bai 			trdc_mbc_set_control(cfg->trdc_base,
327*29352910SJacky Bai 					     cfg->mbc_glbac[i].mbc_mrc_id,
328*29352910SJacky Bai 					     cfg->mbc_glbac[i].glbac_id,
329*29352910SJacky Bai 					     cfg->mbc_glbac[i].glbac_val);
330*29352910SJacky Bai 		}
331*29352910SJacky Bai 
332*29352910SJacky Bai 		for (i = 0U; i < cfg->num_mbc_cfg; i++) {
333*29352910SJacky Bai 			if (cfg->mbc_cfg[i].blk_id == MBC_BLK_ALL) {
334*29352910SJacky Bai 				num = trdc_mbc_blk_num(cfg->trdc_base,
335*29352910SJacky Bai 						       cfg->mbc_cfg[i].mbc_id,
336*29352910SJacky Bai 						       cfg->mbc_cfg[i].mem_id);
337*29352910SJacky Bai 
338*29352910SJacky Bai 				for (j = 0U; j < num; j++) {
339*29352910SJacky Bai 					/* Skip mgr and mc */
340*29352910SJacky Bai 					is_mgr = is_trdc_mgr_slot(cfg->trdc_base,
341*29352910SJacky Bai 								  cfg->mbc_cfg[i].mbc_id,
342*29352910SJacky Bai 								  cfg->mbc_cfg[i].mem_id, j);
343*29352910SJacky Bai 					if (is_mgr) {
344*29352910SJacky Bai 						continue;
345*29352910SJacky Bai 					}
346*29352910SJacky Bai 
347*29352910SJacky Bai 					trdc_mbc_blk_config(cfg->trdc_base,
348*29352910SJacky Bai 							    cfg->mbc_cfg[i].mbc_id,
349*29352910SJacky Bai 							    cfg->mbc_cfg[i].dom_id,
350*29352910SJacky Bai 							    cfg->mbc_cfg[i].mem_id, j,
351*29352910SJacky Bai 							    cfg->mbc_cfg[i].secure,
352*29352910SJacky Bai 							    cfg->mbc_cfg[i].glbac_id);
353*29352910SJacky Bai 				}
354*29352910SJacky Bai 			} else {
355*29352910SJacky Bai 				trdc_mbc_blk_config(cfg->trdc_base,
356*29352910SJacky Bai 						    cfg->mbc_cfg[i].mbc_id,
357*29352910SJacky Bai 						    cfg->mbc_cfg[i].dom_id,
358*29352910SJacky Bai 						    cfg->mbc_cfg[i].mem_id,
359*29352910SJacky Bai 						    cfg->mbc_cfg[i].blk_id,
360*29352910SJacky Bai 						    cfg->mbc_cfg[i].secure,
361*29352910SJacky Bai 						    cfg->mbc_cfg[i].glbac_id);
362*29352910SJacky Bai 			}
363*29352910SJacky Bai 		}
364*29352910SJacky Bai 	}
365*29352910SJacky Bai }
366