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