1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (C) 2017-2021 NVIDIA CORPORATION. All rights reserved.
4 */
5
6 #include <linux/io.h>
7 #include <linux/iommu.h>
8 #include <linux/module.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/of_device.h>
11 #include <linux/platform_device.h>
12
13 #include <soc/tegra/mc.h>
14
15 #if defined(CONFIG_ARCH_TEGRA_186_SOC)
16 #include <dt-bindings/memory/tegra186-mc.h>
17 #endif
18
19 #include "mc.h"
20
21 #define MC_SID_STREAMID_OVERRIDE_MASK GENMASK(7, 0)
22 #define MC_SID_STREAMID_SECURITY_WRITE_ACCESS_DISABLED BIT(16)
23 #define MC_SID_STREAMID_SECURITY_OVERRIDE BIT(8)
24
tegra186_mc_probe(struct tegra_mc * mc)25 static int tegra186_mc_probe(struct tegra_mc *mc)
26 {
27 struct platform_device *pdev = to_platform_device(mc->dev);
28 unsigned int i;
29 char name[8];
30 int err;
31
32 mc->bcast_ch_regs = devm_platform_ioremap_resource_byname(pdev, "broadcast");
33 if (IS_ERR(mc->bcast_ch_regs)) {
34 if (PTR_ERR(mc->bcast_ch_regs) == -EINVAL) {
35 dev_warn(&pdev->dev,
36 "Broadcast channel is missing, please update your device-tree\n");
37 mc->bcast_ch_regs = NULL;
38 goto populate;
39 }
40
41 return PTR_ERR(mc->bcast_ch_regs);
42 }
43
44 mc->ch_regs = devm_kcalloc(mc->dev, mc->soc->num_channels, sizeof(*mc->ch_regs),
45 GFP_KERNEL);
46 if (!mc->ch_regs)
47 return -ENOMEM;
48
49 for (i = 0; i < mc->soc->num_channels; i++) {
50 snprintf(name, sizeof(name), "ch%u", i);
51
52 mc->ch_regs[i] = devm_platform_ioremap_resource_byname(pdev, name);
53 if (IS_ERR(mc->ch_regs[i]))
54 return PTR_ERR(mc->ch_regs[i]);
55 }
56
57 populate:
58 err = of_platform_populate(mc->dev->of_node, NULL, NULL, mc->dev);
59 if (err < 0)
60 return err;
61
62 return 0;
63 }
64
tegra186_mc_remove(struct tegra_mc * mc)65 static void tegra186_mc_remove(struct tegra_mc *mc)
66 {
67 of_platform_depopulate(mc->dev);
68 }
69
70 #if IS_ENABLED(CONFIG_IOMMU_API)
tegra186_mc_client_sid_override(struct tegra_mc * mc,const struct tegra_mc_client * client,unsigned int sid)71 static void tegra186_mc_client_sid_override(struct tegra_mc *mc,
72 const struct tegra_mc_client *client,
73 unsigned int sid)
74 {
75 u32 value, old;
76
77 value = readl(mc->regs + client->regs.sid.security);
78 if ((value & MC_SID_STREAMID_SECURITY_OVERRIDE) == 0) {
79 /*
80 * If the secure firmware has locked this down the override
81 * for this memory client, there's nothing we can do here.
82 */
83 if (value & MC_SID_STREAMID_SECURITY_WRITE_ACCESS_DISABLED)
84 return;
85
86 /*
87 * Otherwise, try to set the override itself. Typically the
88 * secure firmware will never have set this configuration.
89 * Instead, it will either have disabled write access to
90 * this field, or it will already have set an explicit
91 * override itself.
92 */
93 WARN_ON((value & MC_SID_STREAMID_SECURITY_OVERRIDE) == 0);
94
95 value |= MC_SID_STREAMID_SECURITY_OVERRIDE;
96 writel(value, mc->regs + client->regs.sid.security);
97 }
98
99 value = readl(mc->regs + client->regs.sid.override);
100 old = value & MC_SID_STREAMID_OVERRIDE_MASK;
101
102 if (old != sid) {
103 dev_dbg(mc->dev, "overriding SID %x for %s with %x\n", old,
104 client->name, sid);
105 writel(sid, mc->regs + client->regs.sid.override);
106 }
107 }
108 #endif
109
tegra186_mc_probe_device(struct tegra_mc * mc,struct device * dev)110 static int tegra186_mc_probe_device(struct tegra_mc *mc, struct device *dev)
111 {
112 #if IS_ENABLED(CONFIG_IOMMU_API)
113 struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
114 struct of_phandle_args args;
115 unsigned int i, index = 0;
116
117 while (!of_parse_phandle_with_args(dev->of_node, "interconnects", "#interconnect-cells",
118 index, &args)) {
119 if (args.np == mc->dev->of_node && args.args_count != 0) {
120 for (i = 0; i < mc->soc->num_clients; i++) {
121 const struct tegra_mc_client *client = &mc->soc->clients[i];
122
123 if (client->id == args.args[0]) {
124 u32 sid = fwspec->ids[0] & MC_SID_STREAMID_OVERRIDE_MASK;
125
126 tegra186_mc_client_sid_override(mc, client, sid);
127 }
128 }
129 }
130
131 index++;
132 }
133 #endif
134
135 return 0;
136 }
137
138 const struct tegra_mc_ops tegra186_mc_ops = {
139 .probe = tegra186_mc_probe,
140 .remove = tegra186_mc_remove,
141 .probe_device = tegra186_mc_probe_device,
142 .handle_irq = tegra30_mc_handle_irq,
143 };
144
145 #if defined(CONFIG_ARCH_TEGRA_186_SOC)
146 static const struct tegra_mc_client tegra186_mc_clients[] = {
147 {
148 .id = TEGRA186_MEMORY_CLIENT_PTCR,
149 .name = "ptcr",
150 .sid = TEGRA186_SID_PASSTHROUGH,
151 .regs = {
152 .sid = {
153 .override = 0x000,
154 .security = 0x004,
155 },
156 },
157 }, {
158 .id = TEGRA186_MEMORY_CLIENT_AFIR,
159 .name = "afir",
160 .sid = TEGRA186_SID_AFI,
161 .regs = {
162 .sid = {
163 .override = 0x070,
164 .security = 0x074,
165 },
166 },
167 }, {
168 .id = TEGRA186_MEMORY_CLIENT_HDAR,
169 .name = "hdar",
170 .sid = TEGRA186_SID_HDA,
171 .regs = {
172 .sid = {
173 .override = 0x0a8,
174 .security = 0x0ac,
175 },
176 },
177 }, {
178 .id = TEGRA186_MEMORY_CLIENT_HOST1XDMAR,
179 .name = "host1xdmar",
180 .sid = TEGRA186_SID_HOST1X,
181 .regs = {
182 .sid = {
183 .override = 0x0b0,
184 .security = 0x0b4,
185 },
186 },
187 }, {
188 .id = TEGRA186_MEMORY_CLIENT_NVENCSRD,
189 .name = "nvencsrd",
190 .sid = TEGRA186_SID_NVENC,
191 .regs = {
192 .sid = {
193 .override = 0x0e0,
194 .security = 0x0e4,
195 },
196 },
197 }, {
198 .id = TEGRA186_MEMORY_CLIENT_SATAR,
199 .name = "satar",
200 .sid = TEGRA186_SID_SATA,
201 .regs = {
202 .sid = {
203 .override = 0x0f8,
204 .security = 0x0fc,
205 },
206 },
207 }, {
208 .id = TEGRA186_MEMORY_CLIENT_MPCORER,
209 .name = "mpcorer",
210 .sid = TEGRA186_SID_PASSTHROUGH,
211 .regs = {
212 .sid = {
213 .override = 0x138,
214 .security = 0x13c,
215 },
216 },
217 }, {
218 .id = TEGRA186_MEMORY_CLIENT_NVENCSWR,
219 .name = "nvencswr",
220 .sid = TEGRA186_SID_NVENC,
221 .regs = {
222 .sid = {
223 .override = 0x158,
224 .security = 0x15c,
225 },
226 },
227 }, {
228 .id = TEGRA186_MEMORY_CLIENT_AFIW,
229 .name = "afiw",
230 .sid = TEGRA186_SID_AFI,
231 .regs = {
232 .sid = {
233 .override = 0x188,
234 .security = 0x18c,
235 },
236 },
237 }, {
238 .id = TEGRA186_MEMORY_CLIENT_HDAW,
239 .name = "hdaw",
240 .sid = TEGRA186_SID_HDA,
241 .regs = {
242 .sid = {
243 .override = 0x1a8,
244 .security = 0x1ac,
245 },
246 },
247 }, {
248 .id = TEGRA186_MEMORY_CLIENT_MPCOREW,
249 .name = "mpcorew",
250 .sid = TEGRA186_SID_PASSTHROUGH,
251 .regs = {
252 .sid = {
253 .override = 0x1c8,
254 .security = 0x1cc,
255 },
256 },
257 }, {
258 .id = TEGRA186_MEMORY_CLIENT_SATAW,
259 .name = "sataw",
260 .sid = TEGRA186_SID_SATA,
261 .regs = {
262 .sid = {
263 .override = 0x1e8,
264 .security = 0x1ec,
265 },
266 },
267 }, {
268 .id = TEGRA186_MEMORY_CLIENT_ISPRA,
269 .name = "ispra",
270 .sid = TEGRA186_SID_ISP,
271 .regs = {
272 .sid = {
273 .override = 0x220,
274 .security = 0x224,
275 },
276 },
277 }, {
278 .id = TEGRA186_MEMORY_CLIENT_ISPWA,
279 .name = "ispwa",
280 .sid = TEGRA186_SID_ISP,
281 .regs = {
282 .sid = {
283 .override = 0x230,
284 .security = 0x234,
285 },
286 },
287 }, {
288 .id = TEGRA186_MEMORY_CLIENT_ISPWB,
289 .name = "ispwb",
290 .sid = TEGRA186_SID_ISP,
291 .regs = {
292 .sid = {
293 .override = 0x238,
294 .security = 0x23c,
295 },
296 },
297 }, {
298 .id = TEGRA186_MEMORY_CLIENT_XUSB_HOSTR,
299 .name = "xusb_hostr",
300 .sid = TEGRA186_SID_XUSB_HOST,
301 .regs = {
302 .sid = {
303 .override = 0x250,
304 .security = 0x254,
305 },
306 },
307 }, {
308 .id = TEGRA186_MEMORY_CLIENT_XUSB_HOSTW,
309 .name = "xusb_hostw",
310 .sid = TEGRA186_SID_XUSB_HOST,
311 .regs = {
312 .sid = {
313 .override = 0x258,
314 .security = 0x25c,
315 },
316 },
317 }, {
318 .id = TEGRA186_MEMORY_CLIENT_XUSB_DEVR,
319 .name = "xusb_devr",
320 .sid = TEGRA186_SID_XUSB_DEV,
321 .regs = {
322 .sid = {
323 .override = 0x260,
324 .security = 0x264,
325 },
326 },
327 }, {
328 .id = TEGRA186_MEMORY_CLIENT_XUSB_DEVW,
329 .name = "xusb_devw",
330 .sid = TEGRA186_SID_XUSB_DEV,
331 .regs = {
332 .sid = {
333 .override = 0x268,
334 .security = 0x26c,
335 },
336 },
337 }, {
338 .id = TEGRA186_MEMORY_CLIENT_TSECSRD,
339 .name = "tsecsrd",
340 .sid = TEGRA186_SID_TSEC,
341 .regs = {
342 .sid = {
343 .override = 0x2a0,
344 .security = 0x2a4,
345 },
346 },
347 }, {
348 .id = TEGRA186_MEMORY_CLIENT_TSECSWR,
349 .name = "tsecswr",
350 .sid = TEGRA186_SID_TSEC,
351 .regs = {
352 .sid = {
353 .override = 0x2a8,
354 .security = 0x2ac,
355 },
356 },
357 }, {
358 .id = TEGRA186_MEMORY_CLIENT_GPUSRD,
359 .name = "gpusrd",
360 .sid = TEGRA186_SID_GPU,
361 .regs = {
362 .sid = {
363 .override = 0x2c0,
364 .security = 0x2c4,
365 },
366 },
367 }, {
368 .id = TEGRA186_MEMORY_CLIENT_GPUSWR,
369 .name = "gpuswr",
370 .sid = TEGRA186_SID_GPU,
371 .regs = {
372 .sid = {
373 .override = 0x2c8,
374 .security = 0x2cc,
375 },
376 },
377 }, {
378 .id = TEGRA186_MEMORY_CLIENT_SDMMCRA,
379 .name = "sdmmcra",
380 .sid = TEGRA186_SID_SDMMC1,
381 .regs = {
382 .sid = {
383 .override = 0x300,
384 .security = 0x304,
385 },
386 },
387 }, {
388 .id = TEGRA186_MEMORY_CLIENT_SDMMCRAA,
389 .name = "sdmmcraa",
390 .sid = TEGRA186_SID_SDMMC2,
391 .regs = {
392 .sid = {
393 .override = 0x308,
394 .security = 0x30c,
395 },
396 },
397 }, {
398 .id = TEGRA186_MEMORY_CLIENT_SDMMCR,
399 .name = "sdmmcr",
400 .sid = TEGRA186_SID_SDMMC3,
401 .regs = {
402 .sid = {
403 .override = 0x310,
404 .security = 0x314,
405 },
406 },
407 }, {
408 .id = TEGRA186_MEMORY_CLIENT_SDMMCRAB,
409 .name = "sdmmcrab",
410 .sid = TEGRA186_SID_SDMMC4,
411 .regs = {
412 .sid = {
413 .override = 0x318,
414 .security = 0x31c,
415 },
416 },
417 }, {
418 .id = TEGRA186_MEMORY_CLIENT_SDMMCWA,
419 .name = "sdmmcwa",
420 .sid = TEGRA186_SID_SDMMC1,
421 .regs = {
422 .sid = {
423 .override = 0x320,
424 .security = 0x324,
425 },
426 },
427 }, {
428 .id = TEGRA186_MEMORY_CLIENT_SDMMCWAA,
429 .name = "sdmmcwaa",
430 .sid = TEGRA186_SID_SDMMC2,
431 .regs = {
432 .sid = {
433 .override = 0x328,
434 .security = 0x32c,
435 },
436 },
437 }, {
438 .id = TEGRA186_MEMORY_CLIENT_SDMMCW,
439 .name = "sdmmcw",
440 .sid = TEGRA186_SID_SDMMC3,
441 .regs = {
442 .sid = {
443 .override = 0x330,
444 .security = 0x334,
445 },
446 },
447 }, {
448 .id = TEGRA186_MEMORY_CLIENT_SDMMCWAB,
449 .name = "sdmmcwab",
450 .sid = TEGRA186_SID_SDMMC4,
451 .regs = {
452 .sid = {
453 .override = 0x338,
454 .security = 0x33c,
455 },
456 },
457 }, {
458 .id = TEGRA186_MEMORY_CLIENT_VICSRD,
459 .name = "vicsrd",
460 .sid = TEGRA186_SID_VIC,
461 .regs = {
462 .sid = {
463 .override = 0x360,
464 .security = 0x364,
465 },
466 },
467 }, {
468 .id = TEGRA186_MEMORY_CLIENT_VICSWR,
469 .name = "vicswr",
470 .sid = TEGRA186_SID_VIC,
471 .regs = {
472 .sid = {
473 .override = 0x368,
474 .security = 0x36c,
475 },
476 },
477 }, {
478 .id = TEGRA186_MEMORY_CLIENT_VIW,
479 .name = "viw",
480 .sid = TEGRA186_SID_VI,
481 .regs = {
482 .sid = {
483 .override = 0x390,
484 .security = 0x394,
485 },
486 },
487 }, {
488 .id = TEGRA186_MEMORY_CLIENT_NVDECSRD,
489 .name = "nvdecsrd",
490 .sid = TEGRA186_SID_NVDEC,
491 .regs = {
492 .sid = {
493 .override = 0x3c0,
494 .security = 0x3c4,
495 },
496 },
497 }, {
498 .id = TEGRA186_MEMORY_CLIENT_NVDECSWR,
499 .name = "nvdecswr",
500 .sid = TEGRA186_SID_NVDEC,
501 .regs = {
502 .sid = {
503 .override = 0x3c8,
504 .security = 0x3cc,
505 },
506 },
507 }, {
508 .id = TEGRA186_MEMORY_CLIENT_APER,
509 .name = "aper",
510 .sid = TEGRA186_SID_APE,
511 .regs = {
512 .sid = {
513 .override = 0x3d0,
514 .security = 0x3d4,
515 },
516 },
517 }, {
518 .id = TEGRA186_MEMORY_CLIENT_APEW,
519 .name = "apew",
520 .sid = TEGRA186_SID_APE,
521 .regs = {
522 .sid = {
523 .override = 0x3d8,
524 .security = 0x3dc,
525 },
526 },
527 }, {
528 .id = TEGRA186_MEMORY_CLIENT_NVJPGSRD,
529 .name = "nvjpgsrd",
530 .sid = TEGRA186_SID_NVJPG,
531 .regs = {
532 .sid = {
533 .override = 0x3f0,
534 .security = 0x3f4,
535 },
536 },
537 }, {
538 .id = TEGRA186_MEMORY_CLIENT_NVJPGSWR,
539 .name = "nvjpgswr",
540 .sid = TEGRA186_SID_NVJPG,
541 .regs = {
542 .sid = {
543 .override = 0x3f8,
544 .security = 0x3fc,
545 },
546 },
547 }, {
548 .id = TEGRA186_MEMORY_CLIENT_SESRD,
549 .name = "sesrd",
550 .sid = TEGRA186_SID_SE,
551 .regs = {
552 .sid = {
553 .override = 0x400,
554 .security = 0x404,
555 },
556 },
557 }, {
558 .id = TEGRA186_MEMORY_CLIENT_SESWR,
559 .name = "seswr",
560 .sid = TEGRA186_SID_SE,
561 .regs = {
562 .sid = {
563 .override = 0x408,
564 .security = 0x40c,
565 },
566 },
567 }, {
568 .id = TEGRA186_MEMORY_CLIENT_ETRR,
569 .name = "etrr",
570 .sid = TEGRA186_SID_ETR,
571 .regs = {
572 .sid = {
573 .override = 0x420,
574 .security = 0x424,
575 },
576 },
577 }, {
578 .id = TEGRA186_MEMORY_CLIENT_ETRW,
579 .name = "etrw",
580 .sid = TEGRA186_SID_ETR,
581 .regs = {
582 .sid = {
583 .override = 0x428,
584 .security = 0x42c,
585 },
586 },
587 }, {
588 .id = TEGRA186_MEMORY_CLIENT_TSECSRDB,
589 .name = "tsecsrdb",
590 .sid = TEGRA186_SID_TSECB,
591 .regs = {
592 .sid = {
593 .override = 0x430,
594 .security = 0x434,
595 },
596 },
597 }, {
598 .id = TEGRA186_MEMORY_CLIENT_TSECSWRB,
599 .name = "tsecswrb",
600 .sid = TEGRA186_SID_TSECB,
601 .regs = {
602 .sid = {
603 .override = 0x438,
604 .security = 0x43c,
605 },
606 },
607 }, {
608 .id = TEGRA186_MEMORY_CLIENT_GPUSRD2,
609 .name = "gpusrd2",
610 .sid = TEGRA186_SID_GPU,
611 .regs = {
612 .sid = {
613 .override = 0x440,
614 .security = 0x444,
615 },
616 },
617 }, {
618 .id = TEGRA186_MEMORY_CLIENT_GPUSWR2,
619 .name = "gpuswr2",
620 .sid = TEGRA186_SID_GPU,
621 .regs = {
622 .sid = {
623 .override = 0x448,
624 .security = 0x44c,
625 },
626 },
627 }, {
628 .id = TEGRA186_MEMORY_CLIENT_AXISR,
629 .name = "axisr",
630 .sid = TEGRA186_SID_GPCDMA_0,
631 .regs = {
632 .sid = {
633 .override = 0x460,
634 .security = 0x464,
635 },
636 },
637 }, {
638 .id = TEGRA186_MEMORY_CLIENT_AXISW,
639 .name = "axisw",
640 .sid = TEGRA186_SID_GPCDMA_0,
641 .regs = {
642 .sid = {
643 .override = 0x468,
644 .security = 0x46c,
645 },
646 },
647 }, {
648 .id = TEGRA186_MEMORY_CLIENT_EQOSR,
649 .name = "eqosr",
650 .sid = TEGRA186_SID_EQOS,
651 .regs = {
652 .sid = {
653 .override = 0x470,
654 .security = 0x474,
655 },
656 },
657 }, {
658 .id = TEGRA186_MEMORY_CLIENT_EQOSW,
659 .name = "eqosw",
660 .sid = TEGRA186_SID_EQOS,
661 .regs = {
662 .sid = {
663 .override = 0x478,
664 .security = 0x47c,
665 },
666 },
667 }, {
668 .id = TEGRA186_MEMORY_CLIENT_UFSHCR,
669 .name = "ufshcr",
670 .sid = TEGRA186_SID_UFSHC,
671 .regs = {
672 .sid = {
673 .override = 0x480,
674 .security = 0x484,
675 },
676 },
677 }, {
678 .id = TEGRA186_MEMORY_CLIENT_UFSHCW,
679 .name = "ufshcw",
680 .sid = TEGRA186_SID_UFSHC,
681 .regs = {
682 .sid = {
683 .override = 0x488,
684 .security = 0x48c,
685 },
686 },
687 }, {
688 .id = TEGRA186_MEMORY_CLIENT_NVDISPLAYR,
689 .name = "nvdisplayr",
690 .sid = TEGRA186_SID_NVDISPLAY,
691 .regs = {
692 .sid = {
693 .override = 0x490,
694 .security = 0x494,
695 },
696 },
697 }, {
698 .id = TEGRA186_MEMORY_CLIENT_BPMPR,
699 .name = "bpmpr",
700 .sid = TEGRA186_SID_BPMP,
701 .regs = {
702 .sid = {
703 .override = 0x498,
704 .security = 0x49c,
705 },
706 },
707 }, {
708 .id = TEGRA186_MEMORY_CLIENT_BPMPW,
709 .name = "bpmpw",
710 .sid = TEGRA186_SID_BPMP,
711 .regs = {
712 .sid = {
713 .override = 0x4a0,
714 .security = 0x4a4,
715 },
716 },
717 }, {
718 .id = TEGRA186_MEMORY_CLIENT_BPMPDMAR,
719 .name = "bpmpdmar",
720 .sid = TEGRA186_SID_BPMP,
721 .regs = {
722 .sid = {
723 .override = 0x4a8,
724 .security = 0x4ac,
725 },
726 },
727 }, {
728 .id = TEGRA186_MEMORY_CLIENT_BPMPDMAW,
729 .name = "bpmpdmaw",
730 .sid = TEGRA186_SID_BPMP,
731 .regs = {
732 .sid = {
733 .override = 0x4b0,
734 .security = 0x4b4,
735 },
736 },
737 }, {
738 .id = TEGRA186_MEMORY_CLIENT_AONR,
739 .name = "aonr",
740 .sid = TEGRA186_SID_AON,
741 .regs = {
742 .sid = {
743 .override = 0x4b8,
744 .security = 0x4bc,
745 },
746 },
747 }, {
748 .id = TEGRA186_MEMORY_CLIENT_AONW,
749 .name = "aonw",
750 .sid = TEGRA186_SID_AON,
751 .regs = {
752 .sid = {
753 .override = 0x4c0,
754 .security = 0x4c4,
755 },
756 },
757 }, {
758 .id = TEGRA186_MEMORY_CLIENT_AONDMAR,
759 .name = "aondmar",
760 .sid = TEGRA186_SID_AON,
761 .regs = {
762 .sid = {
763 .override = 0x4c8,
764 .security = 0x4cc,
765 },
766 },
767 }, {
768 .id = TEGRA186_MEMORY_CLIENT_AONDMAW,
769 .name = "aondmaw",
770 .sid = TEGRA186_SID_AON,
771 .regs = {
772 .sid = {
773 .override = 0x4d0,
774 .security = 0x4d4,
775 },
776 },
777 }, {
778 .id = TEGRA186_MEMORY_CLIENT_SCER,
779 .name = "scer",
780 .sid = TEGRA186_SID_SCE,
781 .regs = {
782 .sid = {
783 .override = 0x4d8,
784 .security = 0x4dc,
785 },
786 },
787 }, {
788 .id = TEGRA186_MEMORY_CLIENT_SCEW,
789 .name = "scew",
790 .sid = TEGRA186_SID_SCE,
791 .regs = {
792 .sid = {
793 .override = 0x4e0,
794 .security = 0x4e4,
795 },
796 },
797 }, {
798 .id = TEGRA186_MEMORY_CLIENT_SCEDMAR,
799 .name = "scedmar",
800 .sid = TEGRA186_SID_SCE,
801 .regs = {
802 .sid = {
803 .override = 0x4e8,
804 .security = 0x4ec,
805 },
806 },
807 }, {
808 .id = TEGRA186_MEMORY_CLIENT_SCEDMAW,
809 .name = "scedmaw",
810 .sid = TEGRA186_SID_SCE,
811 .regs = {
812 .sid = {
813 .override = 0x4f0,
814 .security = 0x4f4,
815 },
816 },
817 }, {
818 .id = TEGRA186_MEMORY_CLIENT_APEDMAR,
819 .name = "apedmar",
820 .sid = TEGRA186_SID_APE,
821 .regs = {
822 .sid = {
823 .override = 0x4f8,
824 .security = 0x4fc,
825 },
826 },
827 }, {
828 .id = TEGRA186_MEMORY_CLIENT_APEDMAW,
829 .name = "apedmaw",
830 .sid = TEGRA186_SID_APE,
831 .regs = {
832 .sid = {
833 .override = 0x500,
834 .security = 0x504,
835 },
836 },
837 }, {
838 .id = TEGRA186_MEMORY_CLIENT_NVDISPLAYR1,
839 .name = "nvdisplayr1",
840 .sid = TEGRA186_SID_NVDISPLAY,
841 .regs = {
842 .sid = {
843 .override = 0x508,
844 .security = 0x50c,
845 },
846 },
847 }, {
848 .id = TEGRA186_MEMORY_CLIENT_VICSRD1,
849 .name = "vicsrd1",
850 .sid = TEGRA186_SID_VIC,
851 .regs = {
852 .sid = {
853 .override = 0x510,
854 .security = 0x514,
855 },
856 },
857 }, {
858 .id = TEGRA186_MEMORY_CLIENT_NVDECSRD1,
859 .name = "nvdecsrd1",
860 .sid = TEGRA186_SID_NVDEC,
861 .regs = {
862 .sid = {
863 .override = 0x518,
864 .security = 0x51c,
865 },
866 },
867 },
868 };
869
870 const struct tegra_mc_soc tegra186_mc_soc = {
871 .num_clients = ARRAY_SIZE(tegra186_mc_clients),
872 .clients = tegra186_mc_clients,
873 .num_address_bits = 40,
874 .num_channels = 4,
875 .client_id_mask = 0xff,
876 .intmask = MC_INT_DECERR_GENERALIZED_CARVEOUT | MC_INT_DECERR_MTS |
877 MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
878 MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
879 .ops = &tegra186_mc_ops,
880 .ch_intmask = 0x0000000f,
881 .global_intstatus_channel_shift = 0,
882 };
883 #endif
884