tegra186.c 17 KB

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