tegra186.c 17 KB

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