blob: 6c7e94d10f8bfd1701440f10855946dfe9be0956 [file] [log] [blame]
Varun Wadekar3c959932016-03-03 13:09:08 -08001/*
Pritesh Raithatha9eb5db52017-01-02 19:42:31 +05302 * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
Varun Wadekar3c959932016-03-03 13:09:08 -08003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of ARM nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include <assert.h>
Varun Wadekar66ff0122016-04-26 11:34:54 -070032#include <bl_common.h>
Varun Wadekar3c959932016-03-03 13:09:08 -080033#include <debug.h>
34#include <memctrl_v2.h>
Varun Wadekar93bed2a2016-03-18 13:07:33 -070035#include <platform_def.h>
Varun Wadekar3c959932016-03-03 13:09:08 -080036#include <smmu.h>
Varun Wadekar93bed2a2016-03-18 13:07:33 -070037#include <string.h>
38#include <tegra_private.h>
Varun Wadekar3c959932016-03-03 13:09:08 -080039
40typedef struct smmu_regs {
41 uint32_t reg;
42 uint32_t val;
43} smmu_regs_t;
44
45#define mc_make_sid_override_cfg(name) \
46 { \
47 .reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_CFG_ ## name, \
48 .val = 0x00000000, \
49 }
50
51#define mc_make_sid_security_cfg(name) \
52 { \
Pritesh Raithatha9eb5db52017-01-02 19:42:31 +053053 .reg = TEGRA_MC_STREAMID_BASE + \
54 MC_STREAMID_OVERRIDE_TO_SECURITY_CFG( \
55 MC_STREAMID_OVERRIDE_CFG_ ## name), \
Varun Wadekar3c959932016-03-03 13:09:08 -080056 .val = 0x00000000, \
57 }
58
59#define smmu_make_gnsr0_sec_cfg(name) \
60 { \
61 .reg = TEGRA_SMMU_BASE + SMMU_GNSR0_ ## name, \
62 .val = 0x00000000, \
63 }
64
65/*
66 * On ARM-SMMU, conditional offset to access secure aliases of non-secure registers
67 * is 0x400. So, add it to register address
68 */
69#define smmu_make_gnsr0_nsec_cfg(name) \
70 { \
71 .reg = TEGRA_SMMU_BASE + 0x400 + SMMU_GNSR0_ ## name, \
72 .val = 0x00000000, \
73 }
74
75#define smmu_make_gnsr0_smr_cfg(n) \
76 { \
77 .reg = TEGRA_SMMU_BASE + SMMU_GNSR0_SMR ## n, \
78 .val = 0x00000000, \
79 }
80
81#define smmu_make_gnsr0_s2cr_cfg(n) \
82 { \
83 .reg = TEGRA_SMMU_BASE + SMMU_GNSR0_S2CR ## n, \
84 .val = 0x00000000, \
85 }
86
87#define smmu_make_gnsr1_cbar_cfg(n) \
88 { \
89 .reg = TEGRA_SMMU_BASE + (1 << PGSHIFT) + SMMU_GNSR1_CBAR ## n, \
90 .val = 0x00000000, \
91 }
92
93#define smmu_make_gnsr1_cba2r_cfg(n) \
94 { \
95 .reg = TEGRA_SMMU_BASE + (1 << PGSHIFT) + SMMU_GNSR1_CBA2R ## n, \
96 .val = 0x00000000, \
97 }
98
99#define make_smmu_cb_cfg(name, n) \
100 { \
101 .reg = TEGRA_SMMU_BASE + (CB_SIZE >> 1) + (n * (1 << PGSHIFT)) \
102 + SMMU_CBn_ ## name, \
103 .val = 0x00000000, \
104 }
105
106#define smmu_make_smrg_group(n) \
107 smmu_make_gnsr0_smr_cfg(n), \
108 smmu_make_gnsr0_s2cr_cfg(n), \
109 smmu_make_gnsr1_cbar_cfg(n), \
110 smmu_make_gnsr1_cba2r_cfg(n) /* don't put "," here. */
111
112#define smmu_make_cb_group(n) \
113 make_smmu_cb_cfg(SCTLR, n), \
114 make_smmu_cb_cfg(TCR2, n), \
115 make_smmu_cb_cfg(TTBR0_LO, n), \
116 make_smmu_cb_cfg(TTBR0_HI, n), \
117 make_smmu_cb_cfg(TCR, n), \
118 make_smmu_cb_cfg(PRRR_MAIR0, n),\
119 make_smmu_cb_cfg(FSR, n), \
120 make_smmu_cb_cfg(FAR_LO, n), \
121 make_smmu_cb_cfg(FAR_HI, n), \
122 make_smmu_cb_cfg(FSYNR0, n) /* don't put "," here. */
123
124#define smmu_bypass_cfg \
125 { \
126 .reg = TEGRA_MC_BASE + MC_SMMU_BYPASS_CONFIG, \
127 .val = 0x00000000, \
128 }
129
130#define _START_OF_TABLE_ \
131 { \
132 .reg = 0xCAFE05C7, \
133 .val = 0x00000000, \
134 }
135
136#define _END_OF_TABLE_ \
137 { \
138 .reg = 0xFFFFFFFF, \
139 .val = 0xFFFFFFFF, \
140 }
141
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700142static __attribute__((aligned(16))) smmu_regs_t smmu_ctx_regs[] = {
Varun Wadekar3c959932016-03-03 13:09:08 -0800143 _START_OF_TABLE_,
144 mc_make_sid_security_cfg(SCEW),
145 mc_make_sid_security_cfg(AFIR),
146 mc_make_sid_security_cfg(NVDISPLAYR1),
147 mc_make_sid_security_cfg(XUSB_DEVR),
148 mc_make_sid_security_cfg(VICSRD1),
149 mc_make_sid_security_cfg(NVENCSWR),
150 mc_make_sid_security_cfg(TSECSRDB),
151 mc_make_sid_security_cfg(AXISW),
152 mc_make_sid_security_cfg(SDMMCWAB),
153 mc_make_sid_security_cfg(AONDMAW),
154 mc_make_sid_security_cfg(GPUSWR2),
155 mc_make_sid_security_cfg(SATAW),
156 mc_make_sid_security_cfg(UFSHCW),
157 mc_make_sid_security_cfg(AFIW),
158 mc_make_sid_security_cfg(SDMMCR),
159 mc_make_sid_security_cfg(SCEDMAW),
160 mc_make_sid_security_cfg(UFSHCR),
161 mc_make_sid_security_cfg(SDMMCWAA),
162 mc_make_sid_security_cfg(APEDMAW),
163 mc_make_sid_security_cfg(SESWR),
164 mc_make_sid_security_cfg(MPCORER),
165 mc_make_sid_security_cfg(PTCR),
166 mc_make_sid_security_cfg(BPMPW),
167 mc_make_sid_security_cfg(ETRW),
168 mc_make_sid_security_cfg(GPUSRD),
169 mc_make_sid_security_cfg(VICSWR),
170 mc_make_sid_security_cfg(SCEDMAR),
171 mc_make_sid_security_cfg(HDAW),
172 mc_make_sid_security_cfg(ISPWA),
173 mc_make_sid_security_cfg(EQOSW),
174 mc_make_sid_security_cfg(XUSB_HOSTW),
175 mc_make_sid_security_cfg(TSECSWR),
176 mc_make_sid_security_cfg(SDMMCRAA),
177 mc_make_sid_security_cfg(APER),
178 mc_make_sid_security_cfg(VIW),
179 mc_make_sid_security_cfg(APEW),
180 mc_make_sid_security_cfg(AXISR),
181 mc_make_sid_security_cfg(SDMMCW),
182 mc_make_sid_security_cfg(BPMPDMAW),
183 mc_make_sid_security_cfg(ISPRA),
184 mc_make_sid_security_cfg(NVDECSWR),
185 mc_make_sid_security_cfg(XUSB_DEVW),
186 mc_make_sid_security_cfg(NVDECSRD),
187 mc_make_sid_security_cfg(MPCOREW),
188 mc_make_sid_security_cfg(NVDISPLAYR),
189 mc_make_sid_security_cfg(BPMPDMAR),
190 mc_make_sid_security_cfg(NVJPGSWR),
191 mc_make_sid_security_cfg(NVDECSRD1),
192 mc_make_sid_security_cfg(TSECSRD),
193 mc_make_sid_security_cfg(NVJPGSRD),
194 mc_make_sid_security_cfg(SDMMCWA),
195 mc_make_sid_security_cfg(SCER),
196 mc_make_sid_security_cfg(XUSB_HOSTR),
197 mc_make_sid_security_cfg(VICSRD),
198 mc_make_sid_security_cfg(AONDMAR),
199 mc_make_sid_security_cfg(AONW),
200 mc_make_sid_security_cfg(SDMMCRA),
201 mc_make_sid_security_cfg(HOST1XDMAR),
202 mc_make_sid_security_cfg(EQOSR),
203 mc_make_sid_security_cfg(SATAR),
204 mc_make_sid_security_cfg(BPMPR),
205 mc_make_sid_security_cfg(HDAR),
206 mc_make_sid_security_cfg(SDMMCRAB),
207 mc_make_sid_security_cfg(ETRR),
208 mc_make_sid_security_cfg(AONR),
209 mc_make_sid_security_cfg(APEDMAR),
210 mc_make_sid_security_cfg(SESRD),
211 mc_make_sid_security_cfg(NVENCSRD),
212 mc_make_sid_security_cfg(GPUSWR),
213 mc_make_sid_security_cfg(TSECSWRB),
214 mc_make_sid_security_cfg(ISPWB),
215 mc_make_sid_security_cfg(GPUSRD2),
216 mc_make_sid_override_cfg(APER),
217 mc_make_sid_override_cfg(VICSRD),
218 mc_make_sid_override_cfg(NVENCSRD),
219 mc_make_sid_override_cfg(NVJPGSWR),
220 mc_make_sid_override_cfg(AONW),
221 mc_make_sid_override_cfg(BPMPR),
222 mc_make_sid_override_cfg(BPMPW),
223 mc_make_sid_override_cfg(HDAW),
224 mc_make_sid_override_cfg(NVDISPLAYR1),
225 mc_make_sid_override_cfg(APEDMAR),
226 mc_make_sid_override_cfg(AFIR),
227 mc_make_sid_override_cfg(AXISR),
228 mc_make_sid_override_cfg(VICSRD1),
229 mc_make_sid_override_cfg(TSECSRD),
230 mc_make_sid_override_cfg(BPMPDMAW),
231 mc_make_sid_override_cfg(MPCOREW),
232 mc_make_sid_override_cfg(XUSB_HOSTR),
233 mc_make_sid_override_cfg(GPUSWR),
234 mc_make_sid_override_cfg(XUSB_DEVR),
235 mc_make_sid_override_cfg(UFSHCW),
236 mc_make_sid_override_cfg(XUSB_HOSTW),
237 mc_make_sid_override_cfg(SDMMCWAB),
238 mc_make_sid_override_cfg(SATAW),
239 mc_make_sid_override_cfg(SCEDMAR),
240 mc_make_sid_override_cfg(HOST1XDMAR),
241 mc_make_sid_override_cfg(SDMMCWA),
242 mc_make_sid_override_cfg(APEDMAW),
243 mc_make_sid_override_cfg(SESWR),
244 mc_make_sid_override_cfg(AXISW),
245 mc_make_sid_override_cfg(AONDMAW),
246 mc_make_sid_override_cfg(TSECSWRB),
247 mc_make_sid_override_cfg(MPCORER),
248 mc_make_sid_override_cfg(ISPWB),
249 mc_make_sid_override_cfg(AONR),
250 mc_make_sid_override_cfg(BPMPDMAR),
251 mc_make_sid_override_cfg(HDAR),
252 mc_make_sid_override_cfg(SDMMCRA),
253 mc_make_sid_override_cfg(ETRW),
254 mc_make_sid_override_cfg(GPUSWR2),
255 mc_make_sid_override_cfg(EQOSR),
256 mc_make_sid_override_cfg(TSECSWR),
257 mc_make_sid_override_cfg(ETRR),
258 mc_make_sid_override_cfg(NVDECSRD),
259 mc_make_sid_override_cfg(TSECSRDB),
260 mc_make_sid_override_cfg(SDMMCRAA),
261 mc_make_sid_override_cfg(NVDECSRD1),
262 mc_make_sid_override_cfg(SDMMCR),
263 mc_make_sid_override_cfg(NVJPGSRD),
264 mc_make_sid_override_cfg(SCEDMAW),
265 mc_make_sid_override_cfg(SDMMCWAA),
266 mc_make_sid_override_cfg(APEW),
267 mc_make_sid_override_cfg(AONDMAR),
268 mc_make_sid_override_cfg(PTCR),
269 mc_make_sid_override_cfg(SCER),
270 mc_make_sid_override_cfg(ISPRA),
271 mc_make_sid_override_cfg(ISPWA),
272 mc_make_sid_override_cfg(VICSWR),
273 mc_make_sid_override_cfg(SESRD),
274 mc_make_sid_override_cfg(SDMMCW),
275 mc_make_sid_override_cfg(SDMMCRAB),
276 mc_make_sid_override_cfg(EQOSW),
277 mc_make_sid_override_cfg(GPUSRD2),
278 mc_make_sid_override_cfg(SCEW),
279 mc_make_sid_override_cfg(GPUSRD),
280 mc_make_sid_override_cfg(NVDECSWR),
281 mc_make_sid_override_cfg(XUSB_DEVW),
282 mc_make_sid_override_cfg(SATAR),
283 mc_make_sid_override_cfg(NVDISPLAYR),
284 mc_make_sid_override_cfg(VIW),
285 mc_make_sid_override_cfg(UFSHCR),
286 mc_make_sid_override_cfg(NVENCSWR),
287 mc_make_sid_override_cfg(AFIW),
288 smmu_make_gnsr0_nsec_cfg(CR0),
289 smmu_make_gnsr0_sec_cfg(IDR0),
290 smmu_make_gnsr0_sec_cfg(IDR1),
291 smmu_make_gnsr0_sec_cfg(IDR2),
292 smmu_make_gnsr0_nsec_cfg(GFSR),
293 smmu_make_gnsr0_nsec_cfg(GFSYNR0),
294 smmu_make_gnsr0_nsec_cfg(GFSYNR1),
295 smmu_make_gnsr0_nsec_cfg(TLBGSTATUS),
296 smmu_make_gnsr0_nsec_cfg(PIDR2),
297 smmu_make_smrg_group(0),
298 smmu_make_smrg_group(1),
299 smmu_make_smrg_group(2),
300 smmu_make_smrg_group(3),
301 smmu_make_smrg_group(4),
302 smmu_make_smrg_group(5),
303 smmu_make_smrg_group(6),
304 smmu_make_smrg_group(7),
305 smmu_make_smrg_group(8),
306 smmu_make_smrg_group(9),
307 smmu_make_smrg_group(10),
308 smmu_make_smrg_group(11),
309 smmu_make_smrg_group(12),
310 smmu_make_smrg_group(13),
311 smmu_make_smrg_group(14),
312 smmu_make_smrg_group(15),
313 smmu_make_smrg_group(16),
314 smmu_make_smrg_group(17),
315 smmu_make_smrg_group(18),
316 smmu_make_smrg_group(19),
317 smmu_make_smrg_group(20),
318 smmu_make_smrg_group(21),
319 smmu_make_smrg_group(22),
320 smmu_make_smrg_group(23),
321 smmu_make_smrg_group(24),
322 smmu_make_smrg_group(25),
323 smmu_make_smrg_group(26),
324 smmu_make_smrg_group(27),
325 smmu_make_smrg_group(28),
326 smmu_make_smrg_group(29),
327 smmu_make_smrg_group(30),
328 smmu_make_smrg_group(31),
329 smmu_make_smrg_group(32),
330 smmu_make_smrg_group(33),
331 smmu_make_smrg_group(34),
332 smmu_make_smrg_group(35),
333 smmu_make_smrg_group(36),
334 smmu_make_smrg_group(37),
335 smmu_make_smrg_group(38),
336 smmu_make_smrg_group(39),
337 smmu_make_smrg_group(40),
338 smmu_make_smrg_group(41),
339 smmu_make_smrg_group(42),
340 smmu_make_smrg_group(43),
341 smmu_make_smrg_group(44),
342 smmu_make_smrg_group(45),
343 smmu_make_smrg_group(46),
344 smmu_make_smrg_group(47),
345 smmu_make_smrg_group(48),
346 smmu_make_smrg_group(49),
347 smmu_make_smrg_group(50),
348 smmu_make_smrg_group(51),
349 smmu_make_smrg_group(52),
350 smmu_make_smrg_group(53),
351 smmu_make_smrg_group(54),
352 smmu_make_smrg_group(55),
353 smmu_make_smrg_group(56),
354 smmu_make_smrg_group(57),
355 smmu_make_smrg_group(58),
356 smmu_make_smrg_group(59),
357 smmu_make_smrg_group(60),
358 smmu_make_smrg_group(61),
359 smmu_make_smrg_group(62),
360 smmu_make_smrg_group(63),
361 smmu_make_cb_group(0),
362 smmu_make_cb_group(1),
363 smmu_make_cb_group(2),
364 smmu_make_cb_group(3),
365 smmu_make_cb_group(4),
366 smmu_make_cb_group(5),
367 smmu_make_cb_group(6),
368 smmu_make_cb_group(7),
369 smmu_make_cb_group(8),
370 smmu_make_cb_group(9),
371 smmu_make_cb_group(10),
372 smmu_make_cb_group(11),
373 smmu_make_cb_group(12),
374 smmu_make_cb_group(13),
375 smmu_make_cb_group(14),
376 smmu_make_cb_group(15),
377 smmu_make_cb_group(16),
378 smmu_make_cb_group(17),
379 smmu_make_cb_group(18),
380 smmu_make_cb_group(19),
381 smmu_make_cb_group(20),
382 smmu_make_cb_group(21),
383 smmu_make_cb_group(22),
384 smmu_make_cb_group(23),
385 smmu_make_cb_group(24),
386 smmu_make_cb_group(25),
387 smmu_make_cb_group(26),
388 smmu_make_cb_group(27),
389 smmu_make_cb_group(28),
390 smmu_make_cb_group(29),
391 smmu_make_cb_group(30),
392 smmu_make_cb_group(31),
393 smmu_make_cb_group(32),
394 smmu_make_cb_group(33),
395 smmu_make_cb_group(34),
396 smmu_make_cb_group(35),
397 smmu_make_cb_group(36),
398 smmu_make_cb_group(37),
399 smmu_make_cb_group(38),
400 smmu_make_cb_group(39),
401 smmu_make_cb_group(40),
402 smmu_make_cb_group(41),
403 smmu_make_cb_group(42),
404 smmu_make_cb_group(43),
405 smmu_make_cb_group(44),
406 smmu_make_cb_group(45),
407 smmu_make_cb_group(46),
408 smmu_make_cb_group(47),
409 smmu_make_cb_group(48),
410 smmu_make_cb_group(49),
411 smmu_make_cb_group(50),
412 smmu_make_cb_group(51),
413 smmu_make_cb_group(52),
414 smmu_make_cb_group(53),
415 smmu_make_cb_group(54),
416 smmu_make_cb_group(55),
417 smmu_make_cb_group(56),
418 smmu_make_cb_group(57),
419 smmu_make_cb_group(58),
420 smmu_make_cb_group(59),
421 smmu_make_cb_group(60),
422 smmu_make_cb_group(61),
423 smmu_make_cb_group(62),
424 smmu_make_cb_group(63),
425 smmu_bypass_cfg, /* TBU settings */
426 _END_OF_TABLE_,
427};
428
429/*
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700430 * Save SMMU settings before "System Suspend" to TZDRAM
Varun Wadekar3c959932016-03-03 13:09:08 -0800431 */
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700432void tegra_smmu_save_context(uint64_t smmu_ctx_addr)
Varun Wadekar3c959932016-03-03 13:09:08 -0800433{
434 uint32_t i;
435#if DEBUG
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700436 plat_params_from_bl2_t *params_from_bl2 = bl31_get_plat_params();
437 uint64_t tzdram_base = params_from_bl2->tzdram_base;
438 uint64_t tzdram_end = tzdram_base + params_from_bl2->tzdram_size;
Varun Wadekar3c959932016-03-03 13:09:08 -0800439 uint32_t reg_id1, pgshift, cb_size;
440
441 /* sanity check SMMU settings c*/
442 reg_id1 = mmio_read_32((TEGRA_SMMU_BASE + SMMU_GNSR0_IDR1));
443 pgshift = (reg_id1 & ID1_PAGESIZE) ? 16 : 12;
444 cb_size = (2 << pgshift) * \
445 (1 << (((reg_id1 >> ID1_NUMPAGENDXB_SHIFT) & ID1_NUMPAGENDXB_MASK) + 1));
446
447 assert(!((pgshift != PGSHIFT) || (cb_size != CB_SIZE)));
448#endif
449
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700450 assert((smmu_ctx_addr >= tzdram_base) && (smmu_ctx_addr <= tzdram_end));
451
Varun Wadekar3c959932016-03-03 13:09:08 -0800452 /* index of _END_OF_TABLE_ */
453 smmu_ctx_regs[0].val = ARRAY_SIZE(smmu_ctx_regs) - 1;
454
455 /* save SMMU register values */
456 for (i = 1; i < ARRAY_SIZE(smmu_ctx_regs) - 1; i++)
457 smmu_ctx_regs[i].val = mmio_read_32(smmu_ctx_regs[i].reg);
458
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700459 /* Save SMMU config settings */
460 memcpy16((void *)(uintptr_t)smmu_ctx_addr, (void *)smmu_ctx_regs,
461 sizeof(smmu_ctx_regs));
462
Varun Wadekar3c959932016-03-03 13:09:08 -0800463 /* save the SMMU table address */
464 mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV11_LO,
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700465 (uint32_t)smmu_ctx_addr);
Varun Wadekar3c959932016-03-03 13:09:08 -0800466 mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV11_HI,
Varun Wadekar93bed2a2016-03-18 13:07:33 -0700467 (uint32_t)(smmu_ctx_addr >> 32));
Varun Wadekar3c959932016-03-03 13:09:08 -0800468}
469
Varun Wadekarea709c32016-04-20 17:14:15 -0700470#define SMMU_NUM_CONTEXTS 64
471#define SMMU_CONTEXT_BANK_MAX_IDX 64
472
Varun Wadekar3c959932016-03-03 13:09:08 -0800473/*
474 * Init SMMU during boot or "System Suspend" exit
475 */
476void tegra_smmu_init(void)
477{
Varun Wadekarea709c32016-04-20 17:14:15 -0700478 uint32_t val, i, ctx_base;
Varun Wadekar3c959932016-03-03 13:09:08 -0800479
Varun Wadekarea709c32016-04-20 17:14:15 -0700480 /* Program the SMMU pagesize and reset CACHE_LOCK bit */
Varun Wadekar3c959932016-03-03 13:09:08 -0800481 val = tegra_smmu_read_32(SMMU_GSR0_SECURE_ACR);
482 val |= SMMU_GSR0_PGSIZE_64K;
Varun Wadekarea709c32016-04-20 17:14:15 -0700483 val &= ~SMMU_ACR_CACHE_LOCK_ENABLE_BIT;
484 tegra_smmu_write_32(SMMU_GSR0_SECURE_ACR, val);
485
486 /* reset CACHE LOCK bit for NS Aux. Config. Register */
487 val = tegra_smmu_read_32(SMMU_GNSR_ACR);
488 val &= ~SMMU_ACR_CACHE_LOCK_ENABLE_BIT;
489 tegra_smmu_write_32(SMMU_GNSR_ACR, val);
490
491 /* disable TCU prefetch for all contexts */
492 ctx_base = (SMMU_GSR0_PGSIZE_64K * SMMU_NUM_CONTEXTS) + SMMU_CBn_ACTLR;
493 for (i = 0; i < SMMU_CONTEXT_BANK_MAX_IDX; i++) {
494 val = tegra_smmu_read_32(ctx_base + (SMMU_GSR0_PGSIZE_64K * i));
495 val &= ~SMMU_CBn_ACTLR_CPRE_BIT;
496 tegra_smmu_write_32(ctx_base + (SMMU_GSR0_PGSIZE_64K * i), val);
497 }
498
499 /* set CACHE LOCK bit for NS Aux. Config. Register */
500 val = tegra_smmu_read_32(SMMU_GNSR_ACR);
501 val |= SMMU_ACR_CACHE_LOCK_ENABLE_BIT;
502 tegra_smmu_write_32(SMMU_GNSR_ACR, val);
503
504 /* set CACHE LOCK bit for S Aux. Config. Register */
505 val = tegra_smmu_read_32(SMMU_GSR0_SECURE_ACR);
506 val |= SMMU_ACR_CACHE_LOCK_ENABLE_BIT;
Varun Wadekar3c959932016-03-03 13:09:08 -0800507 tegra_smmu_write_32(SMMU_GSR0_SECURE_ACR, val);
508}