blob: 2940f5837cd402755edea46fa56db77ba0827f80 [file] [log] [blame]
Varun Wadekar3c959932016-03-03 13:09:08 -08001/*
2 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3 *
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>
32#include <debug.h>
33#include <memctrl_v2.h>
34#include <smmu.h>
35
36typedef struct smmu_regs {
37 uint32_t reg;
38 uint32_t val;
39} smmu_regs_t;
40
41#define mc_make_sid_override_cfg(name) \
42 { \
43 .reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_OVERRIDE_CFG_ ## name, \
44 .val = 0x00000000, \
45 }
46
47#define mc_make_sid_security_cfg(name) \
48 { \
49 .reg = TEGRA_MC_STREAMID_BASE + MC_STREAMID_SECURITY_CFG_ ## name, \
50 .val = 0x00000000, \
51 }
52
53#define smmu_make_gnsr0_sec_cfg(name) \
54 { \
55 .reg = TEGRA_SMMU_BASE + SMMU_GNSR0_ ## name, \
56 .val = 0x00000000, \
57 }
58
59/*
60 * On ARM-SMMU, conditional offset to access secure aliases of non-secure registers
61 * is 0x400. So, add it to register address
62 */
63#define smmu_make_gnsr0_nsec_cfg(name) \
64 { \
65 .reg = TEGRA_SMMU_BASE + 0x400 + SMMU_GNSR0_ ## name, \
66 .val = 0x00000000, \
67 }
68
69#define smmu_make_gnsr0_smr_cfg(n) \
70 { \
71 .reg = TEGRA_SMMU_BASE + SMMU_GNSR0_SMR ## n, \
72 .val = 0x00000000, \
73 }
74
75#define smmu_make_gnsr0_s2cr_cfg(n) \
76 { \
77 .reg = TEGRA_SMMU_BASE + SMMU_GNSR0_S2CR ## n, \
78 .val = 0x00000000, \
79 }
80
81#define smmu_make_gnsr1_cbar_cfg(n) \
82 { \
83 .reg = TEGRA_SMMU_BASE + (1 << PGSHIFT) + SMMU_GNSR1_CBAR ## n, \
84 .val = 0x00000000, \
85 }
86
87#define smmu_make_gnsr1_cba2r_cfg(n) \
88 { \
89 .reg = TEGRA_SMMU_BASE + (1 << PGSHIFT) + SMMU_GNSR1_CBA2R ## n, \
90 .val = 0x00000000, \
91 }
92
93#define make_smmu_cb_cfg(name, n) \
94 { \
95 .reg = TEGRA_SMMU_BASE + (CB_SIZE >> 1) + (n * (1 << PGSHIFT)) \
96 + SMMU_CBn_ ## name, \
97 .val = 0x00000000, \
98 }
99
100#define smmu_make_smrg_group(n) \
101 smmu_make_gnsr0_smr_cfg(n), \
102 smmu_make_gnsr0_s2cr_cfg(n), \
103 smmu_make_gnsr1_cbar_cfg(n), \
104 smmu_make_gnsr1_cba2r_cfg(n) /* don't put "," here. */
105
106#define smmu_make_cb_group(n) \
107 make_smmu_cb_cfg(SCTLR, n), \
108 make_smmu_cb_cfg(TCR2, n), \
109 make_smmu_cb_cfg(TTBR0_LO, n), \
110 make_smmu_cb_cfg(TTBR0_HI, n), \
111 make_smmu_cb_cfg(TCR, n), \
112 make_smmu_cb_cfg(PRRR_MAIR0, n),\
113 make_smmu_cb_cfg(FSR, n), \
114 make_smmu_cb_cfg(FAR_LO, n), \
115 make_smmu_cb_cfg(FAR_HI, n), \
116 make_smmu_cb_cfg(FSYNR0, n) /* don't put "," here. */
117
118#define smmu_bypass_cfg \
119 { \
120 .reg = TEGRA_MC_BASE + MC_SMMU_BYPASS_CONFIG, \
121 .val = 0x00000000, \
122 }
123
124#define _START_OF_TABLE_ \
125 { \
126 .reg = 0xCAFE05C7, \
127 .val = 0x00000000, \
128 }
129
130#define _END_OF_TABLE_ \
131 { \
132 .reg = 0xFFFFFFFF, \
133 .val = 0xFFFFFFFF, \
134 }
135
136static smmu_regs_t smmu_ctx_regs[] = {
137 _START_OF_TABLE_,
138 mc_make_sid_security_cfg(SCEW),
139 mc_make_sid_security_cfg(AFIR),
140 mc_make_sid_security_cfg(NVDISPLAYR1),
141 mc_make_sid_security_cfg(XUSB_DEVR),
142 mc_make_sid_security_cfg(VICSRD1),
143 mc_make_sid_security_cfg(NVENCSWR),
144 mc_make_sid_security_cfg(TSECSRDB),
145 mc_make_sid_security_cfg(AXISW),
146 mc_make_sid_security_cfg(SDMMCWAB),
147 mc_make_sid_security_cfg(AONDMAW),
148 mc_make_sid_security_cfg(GPUSWR2),
149 mc_make_sid_security_cfg(SATAW),
150 mc_make_sid_security_cfg(UFSHCW),
151 mc_make_sid_security_cfg(AFIW),
152 mc_make_sid_security_cfg(SDMMCR),
153 mc_make_sid_security_cfg(SCEDMAW),
154 mc_make_sid_security_cfg(UFSHCR),
155 mc_make_sid_security_cfg(SDMMCWAA),
156 mc_make_sid_security_cfg(APEDMAW),
157 mc_make_sid_security_cfg(SESWR),
158 mc_make_sid_security_cfg(MPCORER),
159 mc_make_sid_security_cfg(PTCR),
160 mc_make_sid_security_cfg(BPMPW),
161 mc_make_sid_security_cfg(ETRW),
162 mc_make_sid_security_cfg(GPUSRD),
163 mc_make_sid_security_cfg(VICSWR),
164 mc_make_sid_security_cfg(SCEDMAR),
165 mc_make_sid_security_cfg(HDAW),
166 mc_make_sid_security_cfg(ISPWA),
167 mc_make_sid_security_cfg(EQOSW),
168 mc_make_sid_security_cfg(XUSB_HOSTW),
169 mc_make_sid_security_cfg(TSECSWR),
170 mc_make_sid_security_cfg(SDMMCRAA),
171 mc_make_sid_security_cfg(APER),
172 mc_make_sid_security_cfg(VIW),
173 mc_make_sid_security_cfg(APEW),
174 mc_make_sid_security_cfg(AXISR),
175 mc_make_sid_security_cfg(SDMMCW),
176 mc_make_sid_security_cfg(BPMPDMAW),
177 mc_make_sid_security_cfg(ISPRA),
178 mc_make_sid_security_cfg(NVDECSWR),
179 mc_make_sid_security_cfg(XUSB_DEVW),
180 mc_make_sid_security_cfg(NVDECSRD),
181 mc_make_sid_security_cfg(MPCOREW),
182 mc_make_sid_security_cfg(NVDISPLAYR),
183 mc_make_sid_security_cfg(BPMPDMAR),
184 mc_make_sid_security_cfg(NVJPGSWR),
185 mc_make_sid_security_cfg(NVDECSRD1),
186 mc_make_sid_security_cfg(TSECSRD),
187 mc_make_sid_security_cfg(NVJPGSRD),
188 mc_make_sid_security_cfg(SDMMCWA),
189 mc_make_sid_security_cfg(SCER),
190 mc_make_sid_security_cfg(XUSB_HOSTR),
191 mc_make_sid_security_cfg(VICSRD),
192 mc_make_sid_security_cfg(AONDMAR),
193 mc_make_sid_security_cfg(AONW),
194 mc_make_sid_security_cfg(SDMMCRA),
195 mc_make_sid_security_cfg(HOST1XDMAR),
196 mc_make_sid_security_cfg(EQOSR),
197 mc_make_sid_security_cfg(SATAR),
198 mc_make_sid_security_cfg(BPMPR),
199 mc_make_sid_security_cfg(HDAR),
200 mc_make_sid_security_cfg(SDMMCRAB),
201 mc_make_sid_security_cfg(ETRR),
202 mc_make_sid_security_cfg(AONR),
203 mc_make_sid_security_cfg(APEDMAR),
204 mc_make_sid_security_cfg(SESRD),
205 mc_make_sid_security_cfg(NVENCSRD),
206 mc_make_sid_security_cfg(GPUSWR),
207 mc_make_sid_security_cfg(TSECSWRB),
208 mc_make_sid_security_cfg(ISPWB),
209 mc_make_sid_security_cfg(GPUSRD2),
210 mc_make_sid_override_cfg(APER),
211 mc_make_sid_override_cfg(VICSRD),
212 mc_make_sid_override_cfg(NVENCSRD),
213 mc_make_sid_override_cfg(NVJPGSWR),
214 mc_make_sid_override_cfg(AONW),
215 mc_make_sid_override_cfg(BPMPR),
216 mc_make_sid_override_cfg(BPMPW),
217 mc_make_sid_override_cfg(HDAW),
218 mc_make_sid_override_cfg(NVDISPLAYR1),
219 mc_make_sid_override_cfg(APEDMAR),
220 mc_make_sid_override_cfg(AFIR),
221 mc_make_sid_override_cfg(AXISR),
222 mc_make_sid_override_cfg(VICSRD1),
223 mc_make_sid_override_cfg(TSECSRD),
224 mc_make_sid_override_cfg(BPMPDMAW),
225 mc_make_sid_override_cfg(MPCOREW),
226 mc_make_sid_override_cfg(XUSB_HOSTR),
227 mc_make_sid_override_cfg(GPUSWR),
228 mc_make_sid_override_cfg(XUSB_DEVR),
229 mc_make_sid_override_cfg(UFSHCW),
230 mc_make_sid_override_cfg(XUSB_HOSTW),
231 mc_make_sid_override_cfg(SDMMCWAB),
232 mc_make_sid_override_cfg(SATAW),
233 mc_make_sid_override_cfg(SCEDMAR),
234 mc_make_sid_override_cfg(HOST1XDMAR),
235 mc_make_sid_override_cfg(SDMMCWA),
236 mc_make_sid_override_cfg(APEDMAW),
237 mc_make_sid_override_cfg(SESWR),
238 mc_make_sid_override_cfg(AXISW),
239 mc_make_sid_override_cfg(AONDMAW),
240 mc_make_sid_override_cfg(TSECSWRB),
241 mc_make_sid_override_cfg(MPCORER),
242 mc_make_sid_override_cfg(ISPWB),
243 mc_make_sid_override_cfg(AONR),
244 mc_make_sid_override_cfg(BPMPDMAR),
245 mc_make_sid_override_cfg(HDAR),
246 mc_make_sid_override_cfg(SDMMCRA),
247 mc_make_sid_override_cfg(ETRW),
248 mc_make_sid_override_cfg(GPUSWR2),
249 mc_make_sid_override_cfg(EQOSR),
250 mc_make_sid_override_cfg(TSECSWR),
251 mc_make_sid_override_cfg(ETRR),
252 mc_make_sid_override_cfg(NVDECSRD),
253 mc_make_sid_override_cfg(TSECSRDB),
254 mc_make_sid_override_cfg(SDMMCRAA),
255 mc_make_sid_override_cfg(NVDECSRD1),
256 mc_make_sid_override_cfg(SDMMCR),
257 mc_make_sid_override_cfg(NVJPGSRD),
258 mc_make_sid_override_cfg(SCEDMAW),
259 mc_make_sid_override_cfg(SDMMCWAA),
260 mc_make_sid_override_cfg(APEW),
261 mc_make_sid_override_cfg(AONDMAR),
262 mc_make_sid_override_cfg(PTCR),
263 mc_make_sid_override_cfg(SCER),
264 mc_make_sid_override_cfg(ISPRA),
265 mc_make_sid_override_cfg(ISPWA),
266 mc_make_sid_override_cfg(VICSWR),
267 mc_make_sid_override_cfg(SESRD),
268 mc_make_sid_override_cfg(SDMMCW),
269 mc_make_sid_override_cfg(SDMMCRAB),
270 mc_make_sid_override_cfg(EQOSW),
271 mc_make_sid_override_cfg(GPUSRD2),
272 mc_make_sid_override_cfg(SCEW),
273 mc_make_sid_override_cfg(GPUSRD),
274 mc_make_sid_override_cfg(NVDECSWR),
275 mc_make_sid_override_cfg(XUSB_DEVW),
276 mc_make_sid_override_cfg(SATAR),
277 mc_make_sid_override_cfg(NVDISPLAYR),
278 mc_make_sid_override_cfg(VIW),
279 mc_make_sid_override_cfg(UFSHCR),
280 mc_make_sid_override_cfg(NVENCSWR),
281 mc_make_sid_override_cfg(AFIW),
282 smmu_make_gnsr0_nsec_cfg(CR0),
283 smmu_make_gnsr0_sec_cfg(IDR0),
284 smmu_make_gnsr0_sec_cfg(IDR1),
285 smmu_make_gnsr0_sec_cfg(IDR2),
286 smmu_make_gnsr0_nsec_cfg(GFSR),
287 smmu_make_gnsr0_nsec_cfg(GFSYNR0),
288 smmu_make_gnsr0_nsec_cfg(GFSYNR1),
289 smmu_make_gnsr0_nsec_cfg(TLBGSTATUS),
290 smmu_make_gnsr0_nsec_cfg(PIDR2),
291 smmu_make_smrg_group(0),
292 smmu_make_smrg_group(1),
293 smmu_make_smrg_group(2),
294 smmu_make_smrg_group(3),
295 smmu_make_smrg_group(4),
296 smmu_make_smrg_group(5),
297 smmu_make_smrg_group(6),
298 smmu_make_smrg_group(7),
299 smmu_make_smrg_group(8),
300 smmu_make_smrg_group(9),
301 smmu_make_smrg_group(10),
302 smmu_make_smrg_group(11),
303 smmu_make_smrg_group(12),
304 smmu_make_smrg_group(13),
305 smmu_make_smrg_group(14),
306 smmu_make_smrg_group(15),
307 smmu_make_smrg_group(16),
308 smmu_make_smrg_group(17),
309 smmu_make_smrg_group(18),
310 smmu_make_smrg_group(19),
311 smmu_make_smrg_group(20),
312 smmu_make_smrg_group(21),
313 smmu_make_smrg_group(22),
314 smmu_make_smrg_group(23),
315 smmu_make_smrg_group(24),
316 smmu_make_smrg_group(25),
317 smmu_make_smrg_group(26),
318 smmu_make_smrg_group(27),
319 smmu_make_smrg_group(28),
320 smmu_make_smrg_group(29),
321 smmu_make_smrg_group(30),
322 smmu_make_smrg_group(31),
323 smmu_make_smrg_group(32),
324 smmu_make_smrg_group(33),
325 smmu_make_smrg_group(34),
326 smmu_make_smrg_group(35),
327 smmu_make_smrg_group(36),
328 smmu_make_smrg_group(37),
329 smmu_make_smrg_group(38),
330 smmu_make_smrg_group(39),
331 smmu_make_smrg_group(40),
332 smmu_make_smrg_group(41),
333 smmu_make_smrg_group(42),
334 smmu_make_smrg_group(43),
335 smmu_make_smrg_group(44),
336 smmu_make_smrg_group(45),
337 smmu_make_smrg_group(46),
338 smmu_make_smrg_group(47),
339 smmu_make_smrg_group(48),
340 smmu_make_smrg_group(49),
341 smmu_make_smrg_group(50),
342 smmu_make_smrg_group(51),
343 smmu_make_smrg_group(52),
344 smmu_make_smrg_group(53),
345 smmu_make_smrg_group(54),
346 smmu_make_smrg_group(55),
347 smmu_make_smrg_group(56),
348 smmu_make_smrg_group(57),
349 smmu_make_smrg_group(58),
350 smmu_make_smrg_group(59),
351 smmu_make_smrg_group(60),
352 smmu_make_smrg_group(61),
353 smmu_make_smrg_group(62),
354 smmu_make_smrg_group(63),
355 smmu_make_cb_group(0),
356 smmu_make_cb_group(1),
357 smmu_make_cb_group(2),
358 smmu_make_cb_group(3),
359 smmu_make_cb_group(4),
360 smmu_make_cb_group(5),
361 smmu_make_cb_group(6),
362 smmu_make_cb_group(7),
363 smmu_make_cb_group(8),
364 smmu_make_cb_group(9),
365 smmu_make_cb_group(10),
366 smmu_make_cb_group(11),
367 smmu_make_cb_group(12),
368 smmu_make_cb_group(13),
369 smmu_make_cb_group(14),
370 smmu_make_cb_group(15),
371 smmu_make_cb_group(16),
372 smmu_make_cb_group(17),
373 smmu_make_cb_group(18),
374 smmu_make_cb_group(19),
375 smmu_make_cb_group(20),
376 smmu_make_cb_group(21),
377 smmu_make_cb_group(22),
378 smmu_make_cb_group(23),
379 smmu_make_cb_group(24),
380 smmu_make_cb_group(25),
381 smmu_make_cb_group(26),
382 smmu_make_cb_group(27),
383 smmu_make_cb_group(28),
384 smmu_make_cb_group(29),
385 smmu_make_cb_group(30),
386 smmu_make_cb_group(31),
387 smmu_make_cb_group(32),
388 smmu_make_cb_group(33),
389 smmu_make_cb_group(34),
390 smmu_make_cb_group(35),
391 smmu_make_cb_group(36),
392 smmu_make_cb_group(37),
393 smmu_make_cb_group(38),
394 smmu_make_cb_group(39),
395 smmu_make_cb_group(40),
396 smmu_make_cb_group(41),
397 smmu_make_cb_group(42),
398 smmu_make_cb_group(43),
399 smmu_make_cb_group(44),
400 smmu_make_cb_group(45),
401 smmu_make_cb_group(46),
402 smmu_make_cb_group(47),
403 smmu_make_cb_group(48),
404 smmu_make_cb_group(49),
405 smmu_make_cb_group(50),
406 smmu_make_cb_group(51),
407 smmu_make_cb_group(52),
408 smmu_make_cb_group(53),
409 smmu_make_cb_group(54),
410 smmu_make_cb_group(55),
411 smmu_make_cb_group(56),
412 smmu_make_cb_group(57),
413 smmu_make_cb_group(58),
414 smmu_make_cb_group(59),
415 smmu_make_cb_group(60),
416 smmu_make_cb_group(61),
417 smmu_make_cb_group(62),
418 smmu_make_cb_group(63),
419 smmu_bypass_cfg, /* TBU settings */
420 _END_OF_TABLE_,
421};
422
423/*
424 * Save SMMU settings before "System Suspend"
425 */
426void tegra_smmu_save_context(void)
427{
428 uint32_t i;
429#if DEBUG
430 uint32_t reg_id1, pgshift, cb_size;
431
432 /* sanity check SMMU settings c*/
433 reg_id1 = mmio_read_32((TEGRA_SMMU_BASE + SMMU_GNSR0_IDR1));
434 pgshift = (reg_id1 & ID1_PAGESIZE) ? 16 : 12;
435 cb_size = (2 << pgshift) * \
436 (1 << (((reg_id1 >> ID1_NUMPAGENDXB_SHIFT) & ID1_NUMPAGENDXB_MASK) + 1));
437
438 assert(!((pgshift != PGSHIFT) || (cb_size != CB_SIZE)));
439#endif
440
441 /* index of _END_OF_TABLE_ */
442 smmu_ctx_regs[0].val = ARRAY_SIZE(smmu_ctx_regs) - 1;
443
444 /* save SMMU register values */
445 for (i = 1; i < ARRAY_SIZE(smmu_ctx_regs) - 1; i++)
446 smmu_ctx_regs[i].val = mmio_read_32(smmu_ctx_regs[i].reg);
447
448 /* save the SMMU table address */
449 mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV11_LO,
450 (uint32_t)(unsigned long)smmu_ctx_regs);
451 mmio_write_32(TEGRA_SCRATCH_BASE + SECURE_SCRATCH_RSV11_HI,
452 (uint32_t)(((unsigned long)smmu_ctx_regs) >> 32));
453}
454
455/*
456 * Init SMMU during boot or "System Suspend" exit
457 */
458void tegra_smmu_init(void)
459{
460 uint32_t val;
461
462 /* Program the SMMU pagesize */
463 val = tegra_smmu_read_32(SMMU_GSR0_SECURE_ACR);
464 val |= SMMU_GSR0_PGSIZE_64K;
465 tegra_smmu_write_32(SMMU_GSR0_SECURE_ACR, val);
466}