tegra114.c 18 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
  4. */
  5. #include <linux/of.h>
  6. #include <linux/mm.h>
  7. #include <dt-bindings/memory/tegra114-mc.h>
  8. #include "mc.h"
  9. static const struct tegra_mc_client tegra114_mc_clients[] = {
  10. {
  11. .id = 0x00,
  12. .name = "ptcr",
  13. .swgroup = TEGRA_SWGROUP_PTC,
  14. .regs = {
  15. .la = {
  16. .reg = 0x34c,
  17. .shift = 0,
  18. .mask = 0xff,
  19. .def = 0x0,
  20. },
  21. },
  22. }, {
  23. .id = 0x01,
  24. .name = "display0a",
  25. .swgroup = TEGRA_SWGROUP_DC,
  26. .regs = {
  27. .smmu = {
  28. .reg = 0x228,
  29. .bit = 1,
  30. },
  31. .la = {
  32. .reg = 0x2e8,
  33. .shift = 0,
  34. .mask = 0xff,
  35. .def = 0x4e,
  36. },
  37. },
  38. }, {
  39. .id = 0x02,
  40. .name = "display0ab",
  41. .swgroup = TEGRA_SWGROUP_DCB,
  42. .regs = {
  43. .smmu = {
  44. .reg = 0x228,
  45. .bit = 2,
  46. },
  47. .la = {
  48. .reg = 0x2f4,
  49. .shift = 0,
  50. .mask = 0xff,
  51. .def = 0x4e,
  52. },
  53. },
  54. }, {
  55. .id = 0x03,
  56. .name = "display0b",
  57. .swgroup = TEGRA_SWGROUP_DC,
  58. .regs = {
  59. .smmu = {
  60. .reg = 0x228,
  61. .bit = 3,
  62. },
  63. .la = {
  64. .reg = 0x2e8,
  65. .shift = 16,
  66. .mask = 0xff,
  67. .def = 0x4e,
  68. },
  69. },
  70. }, {
  71. .id = 0x04,
  72. .name = "display0bb",
  73. .swgroup = TEGRA_SWGROUP_DCB,
  74. .regs = {
  75. .smmu = {
  76. .reg = 0x228,
  77. .bit = 4,
  78. },
  79. .la = {
  80. .reg = 0x2f4,
  81. .shift = 16,
  82. .mask = 0xff,
  83. .def = 0x4e,
  84. },
  85. },
  86. }, {
  87. .id = 0x05,
  88. .name = "display0c",
  89. .swgroup = TEGRA_SWGROUP_DC,
  90. .regs = {
  91. .smmu = {
  92. .reg = 0x228,
  93. .bit = 5,
  94. },
  95. .la = {
  96. .reg = 0x2ec,
  97. .shift = 0,
  98. .mask = 0xff,
  99. .def = 0x4e,
  100. },
  101. },
  102. }, {
  103. .id = 0x06,
  104. .name = "display0cb",
  105. .swgroup = TEGRA_SWGROUP_DCB,
  106. .regs = {
  107. .smmu = {
  108. .reg = 0x228,
  109. .bit = 6,
  110. },
  111. .la = {
  112. .reg = 0x2f8,
  113. .shift = 0,
  114. .mask = 0xff,
  115. .def = 0x4e,
  116. },
  117. },
  118. }, {
  119. .id = 0x09,
  120. .name = "eppup",
  121. .swgroup = TEGRA_SWGROUP_EPP,
  122. .regs = {
  123. .smmu = {
  124. .reg = 0x228,
  125. .bit = 9,
  126. },
  127. .la = {
  128. .reg = 0x300,
  129. .shift = 0,
  130. .mask = 0xff,
  131. .def = 0x33,
  132. },
  133. },
  134. }, {
  135. .id = 0x0a,
  136. .name = "g2pr",
  137. .swgroup = TEGRA_SWGROUP_G2,
  138. .regs = {
  139. .smmu = {
  140. .reg = 0x228,
  141. .bit = 10,
  142. },
  143. .la = {
  144. .reg = 0x308,
  145. .shift = 0,
  146. .mask = 0xff,
  147. .def = 0x09,
  148. },
  149. },
  150. }, {
  151. .id = 0x0b,
  152. .name = "g2sr",
  153. .swgroup = TEGRA_SWGROUP_G2,
  154. .regs = {
  155. .smmu = {
  156. .reg = 0x228,
  157. .bit = 11,
  158. },
  159. .la = {
  160. .reg = 0x308,
  161. .shift = 16,
  162. .mask = 0xff,
  163. .def = 0x09,
  164. },
  165. },
  166. }, {
  167. .id = 0x0f,
  168. .name = "avpcarm7r",
  169. .swgroup = TEGRA_SWGROUP_AVPC,
  170. .regs = {
  171. .smmu = {
  172. .reg = 0x228,
  173. .bit = 15,
  174. },
  175. .la = {
  176. .reg = 0x2e4,
  177. .shift = 0,
  178. .mask = 0xff,
  179. .def = 0x04,
  180. },
  181. },
  182. }, {
  183. .id = 0x10,
  184. .name = "displayhc",
  185. .swgroup = TEGRA_SWGROUP_DC,
  186. .regs = {
  187. .smmu = {
  188. .reg = 0x228,
  189. .bit = 16,
  190. },
  191. .la = {
  192. .reg = 0x2f0,
  193. .shift = 0,
  194. .mask = 0xff,
  195. .def = 0x68,
  196. },
  197. },
  198. }, {
  199. .id = 0x11,
  200. .name = "displayhcb",
  201. .swgroup = TEGRA_SWGROUP_DCB,
  202. .regs = {
  203. .smmu = {
  204. .reg = 0x228,
  205. .bit = 17,
  206. },
  207. .la = {
  208. .reg = 0x2fc,
  209. .shift = 0,
  210. .mask = 0xff,
  211. .def = 0x68,
  212. },
  213. },
  214. }, {
  215. .id = 0x12,
  216. .name = "fdcdrd",
  217. .swgroup = TEGRA_SWGROUP_NV,
  218. .regs = {
  219. .smmu = {
  220. .reg = 0x228,
  221. .bit = 18,
  222. },
  223. .la = {
  224. .reg = 0x334,
  225. .shift = 0,
  226. .mask = 0xff,
  227. .def = 0x0c,
  228. },
  229. },
  230. }, {
  231. .id = 0x13,
  232. .name = "fdcdrd2",
  233. .swgroup = TEGRA_SWGROUP_NV,
  234. .regs = {
  235. .smmu = {
  236. .reg = 0x228,
  237. .bit = 19,
  238. },
  239. .la = {
  240. .reg = 0x33c,
  241. .shift = 0,
  242. .mask = 0xff,
  243. .def = 0x0c,
  244. },
  245. },
  246. }, {
  247. .id = 0x14,
  248. .name = "g2dr",
  249. .swgroup = TEGRA_SWGROUP_G2,
  250. .regs = {
  251. .smmu = {
  252. .reg = 0x228,
  253. .bit = 20,
  254. },
  255. .la = {
  256. .reg = 0x30c,
  257. .shift = 0,
  258. .mask = 0xff,
  259. .def = 0x0a,
  260. },
  261. },
  262. }, {
  263. .id = 0x15,
  264. .name = "hdar",
  265. .swgroup = TEGRA_SWGROUP_HDA,
  266. .regs = {
  267. .smmu = {
  268. .reg = 0x228,
  269. .bit = 21,
  270. },
  271. .la = {
  272. .reg = 0x318,
  273. .shift = 0,
  274. .mask = 0xff,
  275. .def = 0xff,
  276. },
  277. },
  278. }, {
  279. .id = 0x16,
  280. .name = "host1xdmar",
  281. .swgroup = TEGRA_SWGROUP_HC,
  282. .regs = {
  283. .smmu = {
  284. .reg = 0x228,
  285. .bit = 22,
  286. },
  287. .la = {
  288. .reg = 0x310,
  289. .shift = 0,
  290. .mask = 0xff,
  291. .def = 0x10,
  292. },
  293. },
  294. }, {
  295. .id = 0x17,
  296. .name = "host1xr",
  297. .swgroup = TEGRA_SWGROUP_HC,
  298. .regs = {
  299. .smmu = {
  300. .reg = 0x228,
  301. .bit = 23,
  302. },
  303. .la = {
  304. .reg = 0x310,
  305. .shift = 16,
  306. .mask = 0xff,
  307. .def = 0xa5,
  308. },
  309. },
  310. }, {
  311. .id = 0x18,
  312. .name = "idxsrd",
  313. .swgroup = TEGRA_SWGROUP_NV,
  314. .regs = {
  315. .smmu = {
  316. .reg = 0x228,
  317. .bit = 24,
  318. },
  319. .la = {
  320. .reg = 0x334,
  321. .shift = 16,
  322. .mask = 0xff,
  323. .def = 0x0b,
  324. },
  325. },
  326. }, {
  327. .id = 0x1c,
  328. .name = "msencsrd",
  329. .swgroup = TEGRA_SWGROUP_MSENC,
  330. .regs = {
  331. .smmu = {
  332. .reg = 0x228,
  333. .bit = 28,
  334. },
  335. .la = {
  336. .reg = 0x328,
  337. .shift = 0,
  338. .mask = 0xff,
  339. .def = 0x80,
  340. },
  341. },
  342. }, {
  343. .id = 0x1d,
  344. .name = "ppcsahbdmar",
  345. .swgroup = TEGRA_SWGROUP_PPCS,
  346. .regs = {
  347. .smmu = {
  348. .reg = 0x228,
  349. .bit = 29,
  350. },
  351. .la = {
  352. .reg = 0x344,
  353. .shift = 0,
  354. .mask = 0xff,
  355. .def = 0x50,
  356. },
  357. },
  358. }, {
  359. .id = 0x1e,
  360. .name = "ppcsahbslvr",
  361. .swgroup = TEGRA_SWGROUP_PPCS,
  362. .regs = {
  363. .smmu = {
  364. .reg = 0x228,
  365. .bit = 30,
  366. },
  367. .la = {
  368. .reg = 0x344,
  369. .shift = 16,
  370. .mask = 0xff,
  371. .def = 0xe8,
  372. },
  373. },
  374. }, {
  375. .id = 0x20,
  376. .name = "texl2srd",
  377. .swgroup = TEGRA_SWGROUP_NV,
  378. .regs = {
  379. .smmu = {
  380. .reg = 0x22c,
  381. .bit = 0,
  382. },
  383. .la = {
  384. .reg = 0x338,
  385. .shift = 0,
  386. .mask = 0xff,
  387. .def = 0x0c,
  388. },
  389. },
  390. }, {
  391. .id = 0x22,
  392. .name = "vdebsevr",
  393. .swgroup = TEGRA_SWGROUP_VDE,
  394. .regs = {
  395. .smmu = {
  396. .reg = 0x22c,
  397. .bit = 2,
  398. },
  399. .la = {
  400. .reg = 0x354,
  401. .shift = 0,
  402. .mask = 0xff,
  403. .def = 0xff,
  404. },
  405. },
  406. }, {
  407. .id = 0x23,
  408. .name = "vdember",
  409. .swgroup = TEGRA_SWGROUP_VDE,
  410. .regs = {
  411. .smmu = {
  412. .reg = 0x22c,
  413. .bit = 3,
  414. },
  415. .la = {
  416. .reg = 0x354,
  417. .shift = 16,
  418. .mask = 0xff,
  419. .def = 0xff,
  420. },
  421. },
  422. }, {
  423. .id = 0x24,
  424. .name = "vdemcer",
  425. .swgroup = TEGRA_SWGROUP_VDE,
  426. .regs = {
  427. .smmu = {
  428. .reg = 0x22c,
  429. .bit = 4,
  430. },
  431. .la = {
  432. .reg = 0x358,
  433. .shift = 0,
  434. .mask = 0xff,
  435. .def = 0xb8,
  436. },
  437. },
  438. }, {
  439. .id = 0x25,
  440. .name = "vdetper",
  441. .swgroup = TEGRA_SWGROUP_VDE,
  442. .regs = {
  443. .smmu = {
  444. .reg = 0x22c,
  445. .bit = 5,
  446. },
  447. .la = {
  448. .reg = 0x358,
  449. .shift = 16,
  450. .mask = 0xff,
  451. .def = 0xee,
  452. },
  453. },
  454. }, {
  455. .id = 0x26,
  456. .name = "mpcorelpr",
  457. .swgroup = TEGRA_SWGROUP_MPCORELP,
  458. .regs = {
  459. .la = {
  460. .reg = 0x324,
  461. .shift = 0,
  462. .mask = 0xff,
  463. .def = 0x04,
  464. },
  465. },
  466. }, {
  467. .id = 0x27,
  468. .name = "mpcorer",
  469. .swgroup = TEGRA_SWGROUP_MPCORE,
  470. .regs = {
  471. .la = {
  472. .reg = 0x320,
  473. .shift = 0,
  474. .mask = 0xff,
  475. .def = 0x04,
  476. },
  477. },
  478. }, {
  479. .id = 0x28,
  480. .name = "eppu",
  481. .swgroup = TEGRA_SWGROUP_EPP,
  482. .regs = {
  483. .smmu = {
  484. .reg = 0x22c,
  485. .bit = 8,
  486. },
  487. .la = {
  488. .reg = 0x300,
  489. .shift = 16,
  490. .mask = 0xff,
  491. .def = 0x33,
  492. },
  493. },
  494. }, {
  495. .id = 0x29,
  496. .name = "eppv",
  497. .swgroup = TEGRA_SWGROUP_EPP,
  498. .regs = {
  499. .smmu = {
  500. .reg = 0x22c,
  501. .bit = 9,
  502. },
  503. .la = {
  504. .reg = 0x304,
  505. .shift = 0,
  506. .mask = 0xff,
  507. .def = 0x6c,
  508. },
  509. },
  510. }, {
  511. .id = 0x2a,
  512. .name = "eppy",
  513. .swgroup = TEGRA_SWGROUP_EPP,
  514. .regs = {
  515. .smmu = {
  516. .reg = 0x22c,
  517. .bit = 10,
  518. },
  519. .la = {
  520. .reg = 0x304,
  521. .shift = 16,
  522. .mask = 0xff,
  523. .def = 0x6c,
  524. },
  525. },
  526. }, {
  527. .id = 0x2b,
  528. .name = "msencswr",
  529. .swgroup = TEGRA_SWGROUP_MSENC,
  530. .regs = {
  531. .smmu = {
  532. .reg = 0x22c,
  533. .bit = 11,
  534. },
  535. .la = {
  536. .reg = 0x328,
  537. .shift = 16,
  538. .mask = 0xff,
  539. .def = 0x80,
  540. },
  541. },
  542. }, {
  543. .id = 0x2c,
  544. .name = "viwsb",
  545. .swgroup = TEGRA_SWGROUP_VI,
  546. .regs = {
  547. .smmu = {
  548. .reg = 0x22c,
  549. .bit = 12,
  550. },
  551. .la = {
  552. .reg = 0x364,
  553. .shift = 0,
  554. .mask = 0xff,
  555. .def = 0x47,
  556. },
  557. },
  558. }, {
  559. .id = 0x2d,
  560. .name = "viwu",
  561. .swgroup = TEGRA_SWGROUP_VI,
  562. .regs = {
  563. .smmu = {
  564. .reg = 0x22c,
  565. .bit = 13,
  566. },
  567. .la = {
  568. .reg = 0x368,
  569. .shift = 0,
  570. .mask = 0xff,
  571. .def = 0xff,
  572. },
  573. },
  574. }, {
  575. .id = 0x2e,
  576. .name = "viwv",
  577. .swgroup = TEGRA_SWGROUP_VI,
  578. .regs = {
  579. .smmu = {
  580. .reg = 0x22c,
  581. .bit = 14,
  582. },
  583. .la = {
  584. .reg = 0x368,
  585. .shift = 16,
  586. .mask = 0xff,
  587. .def = 0xff,
  588. },
  589. },
  590. }, {
  591. .id = 0x2f,
  592. .name = "viwy",
  593. .swgroup = TEGRA_SWGROUP_VI,
  594. .regs = {
  595. .smmu = {
  596. .reg = 0x22c,
  597. .bit = 15,
  598. },
  599. .la = {
  600. .reg = 0x36c,
  601. .shift = 0,
  602. .mask = 0xff,
  603. .def = 0x47,
  604. },
  605. },
  606. }, {
  607. .id = 0x30,
  608. .name = "g2dw",
  609. .swgroup = TEGRA_SWGROUP_G2,
  610. .regs = {
  611. .smmu = {
  612. .reg = 0x22c,
  613. .bit = 16,
  614. },
  615. .la = {
  616. .reg = 0x30c,
  617. .shift = 16,
  618. .mask = 0xff,
  619. .def = 0x9,
  620. },
  621. },
  622. }, {
  623. .id = 0x32,
  624. .name = "avpcarm7w",
  625. .swgroup = TEGRA_SWGROUP_AVPC,
  626. .regs = {
  627. .smmu = {
  628. .reg = 0x22c,
  629. .bit = 18,
  630. },
  631. .la = {
  632. .reg = 0x2e4,
  633. .shift = 16,
  634. .mask = 0xff,
  635. .def = 0x0e,
  636. },
  637. },
  638. }, {
  639. .id = 0x33,
  640. .name = "fdcdwr",
  641. .swgroup = TEGRA_SWGROUP_NV,
  642. .regs = {
  643. .smmu = {
  644. .reg = 0x22c,
  645. .bit = 19,
  646. },
  647. .la = {
  648. .reg = 0x338,
  649. .shift = 16,
  650. .mask = 0xff,
  651. .def = 0x10,
  652. },
  653. },
  654. }, {
  655. .id = 0x34,
  656. .name = "fdcdwr2",
  657. .swgroup = TEGRA_SWGROUP_NV,
  658. .regs = {
  659. .smmu = {
  660. .reg = 0x22c,
  661. .bit = 20,
  662. },
  663. .la = {
  664. .reg = 0x340,
  665. .shift = 0,
  666. .mask = 0xff,
  667. .def = 0x10,
  668. },
  669. },
  670. }, {
  671. .id = 0x35,
  672. .name = "hdaw",
  673. .swgroup = TEGRA_SWGROUP_HDA,
  674. .regs = {
  675. .smmu = {
  676. .reg = 0x22c,
  677. .bit = 21,
  678. },
  679. .la = {
  680. .reg = 0x318,
  681. .shift = 16,
  682. .mask = 0xff,
  683. .def = 0xff,
  684. },
  685. },
  686. }, {
  687. .id = 0x36,
  688. .name = "host1xw",
  689. .swgroup = TEGRA_SWGROUP_HC,
  690. .regs = {
  691. .smmu = {
  692. .reg = 0x22c,
  693. .bit = 22,
  694. },
  695. .la = {
  696. .reg = 0x314,
  697. .shift = 0,
  698. .mask = 0xff,
  699. .def = 0x25,
  700. },
  701. },
  702. }, {
  703. .id = 0x37,
  704. .name = "ispw",
  705. .swgroup = TEGRA_SWGROUP_ISP,
  706. .regs = {
  707. .smmu = {
  708. .reg = 0x22c,
  709. .bit = 23,
  710. },
  711. .la = {
  712. .reg = 0x31c,
  713. .shift = 0,
  714. .mask = 0xff,
  715. .def = 0xff,
  716. },
  717. },
  718. }, {
  719. .id = 0x38,
  720. .name = "mpcorelpw",
  721. .swgroup = TEGRA_SWGROUP_MPCORELP,
  722. .regs = {
  723. .la = {
  724. .reg = 0x324,
  725. .shift = 16,
  726. .mask = 0xff,
  727. .def = 0x80,
  728. },
  729. },
  730. }, {
  731. .id = 0x39,
  732. .name = "mpcorew",
  733. .swgroup = TEGRA_SWGROUP_MPCORE,
  734. .regs = {
  735. .la = {
  736. .reg = 0x320,
  737. .shift = 16,
  738. .mask = 0xff,
  739. .def = 0x0e,
  740. },
  741. },
  742. }, {
  743. .id = 0x3b,
  744. .name = "ppcsahbdmaw",
  745. .swgroup = TEGRA_SWGROUP_PPCS,
  746. .regs = {
  747. .smmu = {
  748. .reg = 0x22c,
  749. .bit = 27,
  750. },
  751. .la = {
  752. .reg = 0x348,
  753. .shift = 0,
  754. .mask = 0xff,
  755. .def = 0xa5,
  756. },
  757. },
  758. }, {
  759. .id = 0x3c,
  760. .name = "ppcsahbslvw",
  761. .swgroup = TEGRA_SWGROUP_PPCS,
  762. .regs = {
  763. .smmu = {
  764. .reg = 0x22c,
  765. .bit = 28,
  766. },
  767. .la = {
  768. .reg = 0x348,
  769. .shift = 16,
  770. .mask = 0xff,
  771. .def = 0xe8,
  772. },
  773. },
  774. }, {
  775. .id = 0x3e,
  776. .name = "vdebsevw",
  777. .swgroup = TEGRA_SWGROUP_VDE,
  778. .regs = {
  779. .smmu = {
  780. .reg = 0x22c,
  781. .bit = 30,
  782. },
  783. .la = {
  784. .reg = 0x35c,
  785. .shift = 0,
  786. .mask = 0xff,
  787. .def = 0xff,
  788. },
  789. },
  790. }, {
  791. .id = 0x3f,
  792. .name = "vdedbgw",
  793. .swgroup = TEGRA_SWGROUP_VDE,
  794. .regs = {
  795. .smmu = {
  796. .reg = 0x22c,
  797. .bit = 31,
  798. },
  799. .la = {
  800. .reg = 0x35c,
  801. .shift = 16,
  802. .mask = 0xff,
  803. .def = 0xff,
  804. },
  805. },
  806. }, {
  807. .id = 0x40,
  808. .name = "vdembew",
  809. .swgroup = TEGRA_SWGROUP_VDE,
  810. .regs = {
  811. .smmu = {
  812. .reg = 0x230,
  813. .bit = 0,
  814. },
  815. .la = {
  816. .reg = 0x360,
  817. .shift = 0,
  818. .mask = 0xff,
  819. .def = 0x89,
  820. },
  821. },
  822. }, {
  823. .id = 0x41,
  824. .name = "vdetpmw",
  825. .swgroup = TEGRA_SWGROUP_VDE,
  826. .regs = {
  827. .smmu = {
  828. .reg = 0x230,
  829. .bit = 1,
  830. },
  831. .la = {
  832. .reg = 0x360,
  833. .shift = 16,
  834. .mask = 0xff,
  835. .def = 0x59,
  836. },
  837. },
  838. }, {
  839. .id = 0x4a,
  840. .name = "xusb_hostr",
  841. .swgroup = TEGRA_SWGROUP_XUSB_HOST,
  842. .regs = {
  843. .smmu = {
  844. .reg = 0x230,
  845. .bit = 10,
  846. },
  847. .la = {
  848. .reg = 0x37c,
  849. .shift = 0,
  850. .mask = 0xff,
  851. .def = 0xa5,
  852. },
  853. },
  854. }, {
  855. .id = 0x4b,
  856. .name = "xusb_hostw",
  857. .swgroup = TEGRA_SWGROUP_XUSB_HOST,
  858. .regs = {
  859. .smmu = {
  860. .reg = 0x230,
  861. .bit = 11,
  862. },
  863. .la = {
  864. .reg = 0x37c,
  865. .shift = 16,
  866. .mask = 0xff,
  867. .def = 0xa5,
  868. },
  869. },
  870. }, {
  871. .id = 0x4c,
  872. .name = "xusb_devr",
  873. .swgroup = TEGRA_SWGROUP_XUSB_DEV,
  874. .regs = {
  875. .smmu = {
  876. .reg = 0x230,
  877. .bit = 12,
  878. },
  879. .la = {
  880. .reg = 0x380,
  881. .shift = 0,
  882. .mask = 0xff,
  883. .def = 0xa5,
  884. },
  885. },
  886. }, {
  887. .id = 0x4d,
  888. .name = "xusb_devw",
  889. .swgroup = TEGRA_SWGROUP_XUSB_DEV,
  890. .regs = {
  891. .smmu = {
  892. .reg = 0x230,
  893. .bit = 13,
  894. },
  895. .la = {
  896. .reg = 0x380,
  897. .shift = 16,
  898. .mask = 0xff,
  899. .def = 0xa5,
  900. },
  901. },
  902. }, {
  903. .id = 0x4e,
  904. .name = "fdcdwr3",
  905. .swgroup = TEGRA_SWGROUP_NV,
  906. .regs = {
  907. .smmu = {
  908. .reg = 0x230,
  909. .bit = 14,
  910. },
  911. .la = {
  912. .reg = 0x388,
  913. .shift = 0,
  914. .mask = 0xff,
  915. .def = 0x10,
  916. },
  917. },
  918. }, {
  919. .id = 0x4f,
  920. .name = "fdcdrd3",
  921. .swgroup = TEGRA_SWGROUP_NV,
  922. .regs = {
  923. .smmu = {
  924. .reg = 0x230,
  925. .bit = 15,
  926. },
  927. .la = {
  928. .reg = 0x384,
  929. .shift = 0,
  930. .mask = 0xff,
  931. .def = 0x0c,
  932. },
  933. },
  934. }, {
  935. .id = 0x50,
  936. .name = "fdcwr4",
  937. .swgroup = TEGRA_SWGROUP_NV,
  938. .regs = {
  939. .smmu = {
  940. .reg = 0x230,
  941. .bit = 16,
  942. },
  943. .la = {
  944. .reg = 0x388,
  945. .shift = 16,
  946. .mask = 0xff,
  947. .def = 0x10,
  948. },
  949. },
  950. }, {
  951. .id = 0x51,
  952. .name = "fdcrd4",
  953. .swgroup = TEGRA_SWGROUP_NV,
  954. .regs = {
  955. .smmu = {
  956. .reg = 0x230,
  957. .bit = 17,
  958. },
  959. .la = {
  960. .reg = 0x384,
  961. .shift = 16,
  962. .mask = 0xff,
  963. .def = 0x0c,
  964. },
  965. },
  966. }, {
  967. .id = 0x52,
  968. .name = "emucifr",
  969. .swgroup = TEGRA_SWGROUP_EMUCIF,
  970. .regs = {
  971. .la = {
  972. .reg = 0x38c,
  973. .shift = 0,
  974. .mask = 0xff,
  975. .def = 0x04,
  976. },
  977. },
  978. }, {
  979. .id = 0x53,
  980. .name = "emucifw",
  981. .swgroup = TEGRA_SWGROUP_EMUCIF,
  982. .regs = {
  983. .la = {
  984. .reg = 0x38c,
  985. .shift = 16,
  986. .mask = 0xff,
  987. .def = 0x0e,
  988. },
  989. },
  990. }, {
  991. .id = 0x54,
  992. .name = "tsecsrd",
  993. .swgroup = TEGRA_SWGROUP_TSEC,
  994. .regs = {
  995. .smmu = {
  996. .reg = 0x230,
  997. .bit = 20,
  998. },
  999. .la = {
  1000. .reg = 0x390,
  1001. .shift = 0,
  1002. .mask = 0xff,
  1003. .def = 0x50,
  1004. },
  1005. },
  1006. }, {
  1007. .id = 0x55,
  1008. .name = "tsecswr",
  1009. .swgroup = TEGRA_SWGROUP_TSEC,
  1010. .regs = {
  1011. .smmu = {
  1012. .reg = 0x230,
  1013. .bit = 21,
  1014. },
  1015. .la = {
  1016. .reg = 0x390,
  1017. .shift = 16,
  1018. .mask = 0xff,
  1019. .def = 0x50,
  1020. },
  1021. },
  1022. },
  1023. };
  1024. static const struct tegra_smmu_swgroup tegra114_swgroups[] = {
  1025. { .name = "dc", .swgroup = TEGRA_SWGROUP_DC, .reg = 0x240 },
  1026. { .name = "dcb", .swgroup = TEGRA_SWGROUP_DCB, .reg = 0x244 },
  1027. { .name = "epp", .swgroup = TEGRA_SWGROUP_EPP, .reg = 0x248 },
  1028. { .name = "g2", .swgroup = TEGRA_SWGROUP_G2, .reg = 0x24c },
  1029. { .name = "avpc", .swgroup = TEGRA_SWGROUP_AVPC, .reg = 0x23c },
  1030. { .name = "nv", .swgroup = TEGRA_SWGROUP_NV, .reg = 0x268 },
  1031. { .name = "hda", .swgroup = TEGRA_SWGROUP_HDA, .reg = 0x254 },
  1032. { .name = "hc", .swgroup = TEGRA_SWGROUP_HC, .reg = 0x250 },
  1033. { .name = "msenc", .swgroup = TEGRA_SWGROUP_MSENC, .reg = 0x264 },
  1034. { .name = "ppcs", .swgroup = TEGRA_SWGROUP_PPCS, .reg = 0x270 },
  1035. { .name = "vde", .swgroup = TEGRA_SWGROUP_VDE, .reg = 0x27c },
  1036. { .name = "vi", .swgroup = TEGRA_SWGROUP_VI, .reg = 0x280 },
  1037. { .name = "isp", .swgroup = TEGRA_SWGROUP_ISP, .reg = 0x258 },
  1038. { .name = "xusb_host", .swgroup = TEGRA_SWGROUP_XUSB_HOST, .reg = 0x288 },
  1039. { .name = "xusb_dev", .swgroup = TEGRA_SWGROUP_XUSB_DEV, .reg = 0x28c },
  1040. { .name = "tsec", .swgroup = TEGRA_SWGROUP_TSEC, .reg = 0x294 },
  1041. };
  1042. static const unsigned int tegra114_group_drm[] = {
  1043. TEGRA_SWGROUP_DC,
  1044. TEGRA_SWGROUP_DCB,
  1045. TEGRA_SWGROUP_G2,
  1046. TEGRA_SWGROUP_NV,
  1047. };
  1048. static const struct tegra_smmu_group_soc tegra114_groups[] = {
  1049. {
  1050. .name = "drm",
  1051. .swgroups = tegra114_group_drm,
  1052. .num_swgroups = ARRAY_SIZE(tegra114_group_drm),
  1053. },
  1054. };
  1055. static const struct tegra_smmu_soc tegra114_smmu_soc = {
  1056. .clients = tegra114_mc_clients,
  1057. .num_clients = ARRAY_SIZE(tegra114_mc_clients),
  1058. .swgroups = tegra114_swgroups,
  1059. .num_swgroups = ARRAY_SIZE(tegra114_swgroups),
  1060. .groups = tegra114_groups,
  1061. .num_groups = ARRAY_SIZE(tegra114_groups),
  1062. .supports_round_robin_arbitration = false,
  1063. .supports_request_limit = false,
  1064. .num_tlb_lines = 32,
  1065. .num_asids = 4,
  1066. };
  1067. #define TEGRA114_MC_RESET(_name, _control, _status, _bit) \
  1068. { \
  1069. .name = #_name, \
  1070. .id = TEGRA114_MC_RESET_##_name, \
  1071. .control = _control, \
  1072. .status = _status, \
  1073. .bit = _bit, \
  1074. }
  1075. static const struct tegra_mc_reset tegra114_mc_resets[] = {
  1076. TEGRA114_MC_RESET(AVPC, 0x200, 0x204, 1),
  1077. TEGRA114_MC_RESET(DC, 0x200, 0x204, 2),
  1078. TEGRA114_MC_RESET(DCB, 0x200, 0x204, 3),
  1079. TEGRA114_MC_RESET(EPP, 0x200, 0x204, 4),
  1080. TEGRA114_MC_RESET(2D, 0x200, 0x204, 5),
  1081. TEGRA114_MC_RESET(HC, 0x200, 0x204, 6),
  1082. TEGRA114_MC_RESET(HDA, 0x200, 0x204, 7),
  1083. TEGRA114_MC_RESET(ISP, 0x200, 0x204, 8),
  1084. TEGRA114_MC_RESET(MPCORE, 0x200, 0x204, 9),
  1085. TEGRA114_MC_RESET(MPCORELP, 0x200, 0x204, 10),
  1086. TEGRA114_MC_RESET(MPE, 0x200, 0x204, 11),
  1087. TEGRA114_MC_RESET(3D, 0x200, 0x204, 12),
  1088. TEGRA114_MC_RESET(3D2, 0x200, 0x204, 13),
  1089. TEGRA114_MC_RESET(PPCS, 0x200, 0x204, 14),
  1090. TEGRA114_MC_RESET(VDE, 0x200, 0x204, 16),
  1091. TEGRA114_MC_RESET(VI, 0x200, 0x204, 17),
  1092. };
  1093. const struct tegra_mc_soc tegra114_mc_soc = {
  1094. .clients = tegra114_mc_clients,
  1095. .num_clients = ARRAY_SIZE(tegra114_mc_clients),
  1096. .num_address_bits = 32,
  1097. .atom_size = 32,
  1098. .client_id_mask = 0x7f,
  1099. .smmu = &tegra114_smmu_soc,
  1100. .intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION |
  1101. MC_INT_DECERR_EMEM,
  1102. .reset_ops = &tegra_mc_reset_ops_common,
  1103. .resets = tegra114_mc_resets,
  1104. .num_resets = ARRAY_SIZE(tegra114_mc_resets),
  1105. .ops = &tegra30_mc_ops,
  1106. };