tegra124.c 18 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  1. /*
  2. * Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. */
  8. #include <linux/of.h>
  9. #include <linux/mm.h>
  10. #include <asm/cacheflush.h>
  11. #include <dt-bindings/memory/tegra124-mc.h>
  12. #include "mc.h"
  13. #define MC_EMEM_ARB_CFG 0x90
  14. #define MC_EMEM_ARB_OUTSTANDING_REQ 0x94
  15. #define MC_EMEM_ARB_TIMING_RCD 0x98
  16. #define MC_EMEM_ARB_TIMING_RP 0x9c
  17. #define MC_EMEM_ARB_TIMING_RC 0xa0
  18. #define MC_EMEM_ARB_TIMING_RAS 0xa4
  19. #define MC_EMEM_ARB_TIMING_FAW 0xa8
  20. #define MC_EMEM_ARB_TIMING_RRD 0xac
  21. #define MC_EMEM_ARB_TIMING_RAP2PRE 0xb0
  22. #define MC_EMEM_ARB_TIMING_WAP2PRE 0xb4
  23. #define MC_EMEM_ARB_TIMING_R2R 0xb8
  24. #define MC_EMEM_ARB_TIMING_W2W 0xbc
  25. #define MC_EMEM_ARB_TIMING_R2W 0xc0
  26. #define MC_EMEM_ARB_TIMING_W2R 0xc4
  27. #define MC_EMEM_ARB_DA_TURNS 0xd0
  28. #define MC_EMEM_ARB_DA_COVERS 0xd4
  29. #define MC_EMEM_ARB_MISC0 0xd8
  30. #define MC_EMEM_ARB_MISC1 0xdc
  31. #define MC_EMEM_ARB_RING1_THROTTLE 0xe0
  32. static const unsigned long tegra124_mc_emem_regs[] = {
  33. MC_EMEM_ARB_CFG,
  34. MC_EMEM_ARB_OUTSTANDING_REQ,
  35. MC_EMEM_ARB_TIMING_RCD,
  36. MC_EMEM_ARB_TIMING_RP,
  37. MC_EMEM_ARB_TIMING_RC,
  38. MC_EMEM_ARB_TIMING_RAS,
  39. MC_EMEM_ARB_TIMING_FAW,
  40. MC_EMEM_ARB_TIMING_RRD,
  41. MC_EMEM_ARB_TIMING_RAP2PRE,
  42. MC_EMEM_ARB_TIMING_WAP2PRE,
  43. MC_EMEM_ARB_TIMING_R2R,
  44. MC_EMEM_ARB_TIMING_W2W,
  45. MC_EMEM_ARB_TIMING_R2W,
  46. MC_EMEM_ARB_TIMING_W2R,
  47. MC_EMEM_ARB_DA_TURNS,
  48. MC_EMEM_ARB_DA_COVERS,
  49. MC_EMEM_ARB_MISC0,
  50. MC_EMEM_ARB_MISC1,
  51. MC_EMEM_ARB_RING1_THROTTLE
  52. };
  53. static const struct tegra_mc_client tegra124_mc_clients[] = {
  54. {
  55. .id = 0x00,
  56. .name = "ptcr",
  57. .swgroup = TEGRA_SWGROUP_PTC,
  58. }, {
  59. .id = 0x01,
  60. .name = "display0a",
  61. .swgroup = TEGRA_SWGROUP_DC,
  62. .smmu = {
  63. .reg = 0x228,
  64. .bit = 1,
  65. },
  66. .la = {
  67. .reg = 0x2e8,
  68. .shift = 0,
  69. .mask = 0xff,
  70. .def = 0xc2,
  71. },
  72. }, {
  73. .id = 0x02,
  74. .name = "display0ab",
  75. .swgroup = TEGRA_SWGROUP_DCB,
  76. .smmu = {
  77. .reg = 0x228,
  78. .bit = 2,
  79. },
  80. .la = {
  81. .reg = 0x2f4,
  82. .shift = 0,
  83. .mask = 0xff,
  84. .def = 0xc6,
  85. },
  86. }, {
  87. .id = 0x03,
  88. .name = "display0b",
  89. .swgroup = TEGRA_SWGROUP_DC,
  90. .smmu = {
  91. .reg = 0x228,
  92. .bit = 3,
  93. },
  94. .la = {
  95. .reg = 0x2e8,
  96. .shift = 16,
  97. .mask = 0xff,
  98. .def = 0x50,
  99. },
  100. }, {
  101. .id = 0x04,
  102. .name = "display0bb",
  103. .swgroup = TEGRA_SWGROUP_DCB,
  104. .smmu = {
  105. .reg = 0x228,
  106. .bit = 4,
  107. },
  108. .la = {
  109. .reg = 0x2f4,
  110. .shift = 16,
  111. .mask = 0xff,
  112. .def = 0x50,
  113. },
  114. }, {
  115. .id = 0x05,
  116. .name = "display0c",
  117. .swgroup = TEGRA_SWGROUP_DC,
  118. .smmu = {
  119. .reg = 0x228,
  120. .bit = 5,
  121. },
  122. .la = {
  123. .reg = 0x2ec,
  124. .shift = 0,
  125. .mask = 0xff,
  126. .def = 0x50,
  127. },
  128. }, {
  129. .id = 0x06,
  130. .name = "display0cb",
  131. .swgroup = TEGRA_SWGROUP_DCB,
  132. .smmu = {
  133. .reg = 0x228,
  134. .bit = 6,
  135. },
  136. .la = {
  137. .reg = 0x2f8,
  138. .shift = 0,
  139. .mask = 0xff,
  140. .def = 0x50,
  141. },
  142. }, {
  143. .id = 0x0e,
  144. .name = "afir",
  145. .swgroup = TEGRA_SWGROUP_AFI,
  146. .smmu = {
  147. .reg = 0x228,
  148. .bit = 14,
  149. },
  150. .la = {
  151. .reg = 0x2e0,
  152. .shift = 0,
  153. .mask = 0xff,
  154. .def = 0x13,
  155. },
  156. }, {
  157. .id = 0x0f,
  158. .name = "avpcarm7r",
  159. .swgroup = TEGRA_SWGROUP_AVPC,
  160. .smmu = {
  161. .reg = 0x228,
  162. .bit = 15,
  163. },
  164. .la = {
  165. .reg = 0x2e4,
  166. .shift = 0,
  167. .mask = 0xff,
  168. .def = 0x04,
  169. },
  170. }, {
  171. .id = 0x10,
  172. .name = "displayhc",
  173. .swgroup = TEGRA_SWGROUP_DC,
  174. .smmu = {
  175. .reg = 0x228,
  176. .bit = 16,
  177. },
  178. .la = {
  179. .reg = 0x2f0,
  180. .shift = 0,
  181. .mask = 0xff,
  182. .def = 0x50,
  183. },
  184. }, {
  185. .id = 0x11,
  186. .name = "displayhcb",
  187. .swgroup = TEGRA_SWGROUP_DCB,
  188. .smmu = {
  189. .reg = 0x228,
  190. .bit = 17,
  191. },
  192. .la = {
  193. .reg = 0x2fc,
  194. .shift = 0,
  195. .mask = 0xff,
  196. .def = 0x50,
  197. },
  198. }, {
  199. .id = 0x15,
  200. .name = "hdar",
  201. .swgroup = TEGRA_SWGROUP_HDA,
  202. .smmu = {
  203. .reg = 0x228,
  204. .bit = 21,
  205. },
  206. .la = {
  207. .reg = 0x318,
  208. .shift = 0,
  209. .mask = 0xff,
  210. .def = 0x24,
  211. },
  212. }, {
  213. .id = 0x16,
  214. .name = "host1xdmar",
  215. .swgroup = TEGRA_SWGROUP_HC,
  216. .smmu = {
  217. .reg = 0x228,
  218. .bit = 22,
  219. },
  220. .la = {
  221. .reg = 0x310,
  222. .shift = 0,
  223. .mask = 0xff,
  224. .def = 0x1e,
  225. },
  226. }, {
  227. .id = 0x17,
  228. .name = "host1xr",
  229. .swgroup = TEGRA_SWGROUP_HC,
  230. .smmu = {
  231. .reg = 0x228,
  232. .bit = 23,
  233. },
  234. .la = {
  235. .reg = 0x310,
  236. .shift = 16,
  237. .mask = 0xff,
  238. .def = 0x50,
  239. },
  240. }, {
  241. .id = 0x1c,
  242. .name = "msencsrd",
  243. .swgroup = TEGRA_SWGROUP_MSENC,
  244. .smmu = {
  245. .reg = 0x228,
  246. .bit = 28,
  247. },
  248. .la = {
  249. .reg = 0x328,
  250. .shift = 0,
  251. .mask = 0xff,
  252. .def = 0x23,
  253. },
  254. }, {
  255. .id = 0x1d,
  256. .name = "ppcsahbdmar",
  257. .swgroup = TEGRA_SWGROUP_PPCS,
  258. .smmu = {
  259. .reg = 0x228,
  260. .bit = 29,
  261. },
  262. .la = {
  263. .reg = 0x344,
  264. .shift = 0,
  265. .mask = 0xff,
  266. .def = 0x49,
  267. },
  268. }, {
  269. .id = 0x1e,
  270. .name = "ppcsahbslvr",
  271. .swgroup = TEGRA_SWGROUP_PPCS,
  272. .smmu = {
  273. .reg = 0x228,
  274. .bit = 30,
  275. },
  276. .la = {
  277. .reg = 0x344,
  278. .shift = 16,
  279. .mask = 0xff,
  280. .def = 0x1a,
  281. },
  282. }, {
  283. .id = 0x1f,
  284. .name = "satar",
  285. .swgroup = TEGRA_SWGROUP_SATA,
  286. .smmu = {
  287. .reg = 0x228,
  288. .bit = 31,
  289. },
  290. .la = {
  291. .reg = 0x350,
  292. .shift = 0,
  293. .mask = 0xff,
  294. .def = 0x65,
  295. },
  296. }, {
  297. .id = 0x22,
  298. .name = "vdebsevr",
  299. .swgroup = TEGRA_SWGROUP_VDE,
  300. .smmu = {
  301. .reg = 0x22c,
  302. .bit = 2,
  303. },
  304. .la = {
  305. .reg = 0x354,
  306. .shift = 0,
  307. .mask = 0xff,
  308. .def = 0x4f,
  309. },
  310. }, {
  311. .id = 0x23,
  312. .name = "vdember",
  313. .swgroup = TEGRA_SWGROUP_VDE,
  314. .smmu = {
  315. .reg = 0x22c,
  316. .bit = 3,
  317. },
  318. .la = {
  319. .reg = 0x354,
  320. .shift = 16,
  321. .mask = 0xff,
  322. .def = 0x3d,
  323. },
  324. }, {
  325. .id = 0x24,
  326. .name = "vdemcer",
  327. .swgroup = TEGRA_SWGROUP_VDE,
  328. .smmu = {
  329. .reg = 0x22c,
  330. .bit = 4,
  331. },
  332. .la = {
  333. .reg = 0x358,
  334. .shift = 0,
  335. .mask = 0xff,
  336. .def = 0x66,
  337. },
  338. }, {
  339. .id = 0x25,
  340. .name = "vdetper",
  341. .swgroup = TEGRA_SWGROUP_VDE,
  342. .smmu = {
  343. .reg = 0x22c,
  344. .bit = 5,
  345. },
  346. .la = {
  347. .reg = 0x358,
  348. .shift = 16,
  349. .mask = 0xff,
  350. .def = 0xa5,
  351. },
  352. }, {
  353. .id = 0x26,
  354. .name = "mpcorelpr",
  355. .swgroup = TEGRA_SWGROUP_MPCORELP,
  356. .la = {
  357. .reg = 0x324,
  358. .shift = 0,
  359. .mask = 0xff,
  360. .def = 0x04,
  361. },
  362. }, {
  363. .id = 0x27,
  364. .name = "mpcorer",
  365. .swgroup = TEGRA_SWGROUP_MPCORE,
  366. .la = {
  367. .reg = 0x320,
  368. .shift = 0,
  369. .mask = 0xff,
  370. .def = 0x04,
  371. },
  372. }, {
  373. .id = 0x2b,
  374. .name = "msencswr",
  375. .swgroup = TEGRA_SWGROUP_MSENC,
  376. .smmu = {
  377. .reg = 0x22c,
  378. .bit = 11,
  379. },
  380. .la = {
  381. .reg = 0x328,
  382. .shift = 16,
  383. .mask = 0xff,
  384. .def = 0x80,
  385. },
  386. }, {
  387. .id = 0x31,
  388. .name = "afiw",
  389. .swgroup = TEGRA_SWGROUP_AFI,
  390. .smmu = {
  391. .reg = 0x22c,
  392. .bit = 17,
  393. },
  394. .la = {
  395. .reg = 0x2e0,
  396. .shift = 16,
  397. .mask = 0xff,
  398. .def = 0x80,
  399. },
  400. }, {
  401. .id = 0x32,
  402. .name = "avpcarm7w",
  403. .swgroup = TEGRA_SWGROUP_AVPC,
  404. .smmu = {
  405. .reg = 0x22c,
  406. .bit = 18,
  407. },
  408. .la = {
  409. .reg = 0x2e4,
  410. .shift = 16,
  411. .mask = 0xff,
  412. .def = 0x80,
  413. },
  414. }, {
  415. .id = 0x35,
  416. .name = "hdaw",
  417. .swgroup = TEGRA_SWGROUP_HDA,
  418. .smmu = {
  419. .reg = 0x22c,
  420. .bit = 21,
  421. },
  422. .la = {
  423. .reg = 0x318,
  424. .shift = 16,
  425. .mask = 0xff,
  426. .def = 0x80,
  427. },
  428. }, {
  429. .id = 0x36,
  430. .name = "host1xw",
  431. .swgroup = TEGRA_SWGROUP_HC,
  432. .smmu = {
  433. .reg = 0x22c,
  434. .bit = 22,
  435. },
  436. .la = {
  437. .reg = 0x314,
  438. .shift = 0,
  439. .mask = 0xff,
  440. .def = 0x80,
  441. },
  442. }, {
  443. .id = 0x38,
  444. .name = "mpcorelpw",
  445. .swgroup = TEGRA_SWGROUP_MPCORELP,
  446. .la = {
  447. .reg = 0x324,
  448. .shift = 16,
  449. .mask = 0xff,
  450. .def = 0x80,
  451. },
  452. }, {
  453. .id = 0x39,
  454. .name = "mpcorew",
  455. .swgroup = TEGRA_SWGROUP_MPCORE,
  456. .la = {
  457. .reg = 0x320,
  458. .shift = 16,
  459. .mask = 0xff,
  460. .def = 0x80,
  461. },
  462. }, {
  463. .id = 0x3b,
  464. .name = "ppcsahbdmaw",
  465. .swgroup = TEGRA_SWGROUP_PPCS,
  466. .smmu = {
  467. .reg = 0x22c,
  468. .bit = 27,
  469. },
  470. .la = {
  471. .reg = 0x348,
  472. .shift = 0,
  473. .mask = 0xff,
  474. .def = 0x80,
  475. },
  476. }, {
  477. .id = 0x3c,
  478. .name = "ppcsahbslvw",
  479. .swgroup = TEGRA_SWGROUP_PPCS,
  480. .smmu = {
  481. .reg = 0x22c,
  482. .bit = 28,
  483. },
  484. .la = {
  485. .reg = 0x348,
  486. .shift = 16,
  487. .mask = 0xff,
  488. .def = 0x80,
  489. },
  490. }, {
  491. .id = 0x3d,
  492. .name = "sataw",
  493. .swgroup = TEGRA_SWGROUP_SATA,
  494. .smmu = {
  495. .reg = 0x22c,
  496. .bit = 29,
  497. },
  498. .la = {
  499. .reg = 0x350,
  500. .shift = 16,
  501. .mask = 0xff,
  502. .def = 0x65,
  503. },
  504. }, {
  505. .id = 0x3e,
  506. .name = "vdebsevw",
  507. .swgroup = TEGRA_SWGROUP_VDE,
  508. .smmu = {
  509. .reg = 0x22c,
  510. .bit = 30,
  511. },
  512. .la = {
  513. .reg = 0x35c,
  514. .shift = 0,
  515. .mask = 0xff,
  516. .def = 0x80,
  517. },
  518. }, {
  519. .id = 0x3f,
  520. .name = "vdedbgw",
  521. .swgroup = TEGRA_SWGROUP_VDE,
  522. .smmu = {
  523. .reg = 0x22c,
  524. .bit = 31,
  525. },
  526. .la = {
  527. .reg = 0x35c,
  528. .shift = 16,
  529. .mask = 0xff,
  530. .def = 0x80,
  531. },
  532. }, {
  533. .id = 0x40,
  534. .name = "vdembew",
  535. .swgroup = TEGRA_SWGROUP_VDE,
  536. .smmu = {
  537. .reg = 0x230,
  538. .bit = 0,
  539. },
  540. .la = {
  541. .reg = 0x360,
  542. .shift = 0,
  543. .mask = 0xff,
  544. .def = 0x80,
  545. },
  546. }, {
  547. .id = 0x41,
  548. .name = "vdetpmw",
  549. .swgroup = TEGRA_SWGROUP_VDE,
  550. .smmu = {
  551. .reg = 0x230,
  552. .bit = 1,
  553. },
  554. .la = {
  555. .reg = 0x360,
  556. .shift = 16,
  557. .mask = 0xff,
  558. .def = 0x80,
  559. },
  560. }, {
  561. .id = 0x44,
  562. .name = "ispra",
  563. .swgroup = TEGRA_SWGROUP_ISP2,
  564. .smmu = {
  565. .reg = 0x230,
  566. .bit = 4,
  567. },
  568. .la = {
  569. .reg = 0x370,
  570. .shift = 0,
  571. .mask = 0xff,
  572. .def = 0x18,
  573. },
  574. }, {
  575. .id = 0x46,
  576. .name = "ispwa",
  577. .swgroup = TEGRA_SWGROUP_ISP2,
  578. .smmu = {
  579. .reg = 0x230,
  580. .bit = 6,
  581. },
  582. .la = {
  583. .reg = 0x374,
  584. .shift = 0,
  585. .mask = 0xff,
  586. .def = 0x80,
  587. },
  588. }, {
  589. .id = 0x47,
  590. .name = "ispwb",
  591. .swgroup = TEGRA_SWGROUP_ISP2,
  592. .smmu = {
  593. .reg = 0x230,
  594. .bit = 7,
  595. },
  596. .la = {
  597. .reg = 0x374,
  598. .shift = 16,
  599. .mask = 0xff,
  600. .def = 0x80,
  601. },
  602. }, {
  603. .id = 0x4a,
  604. .name = "xusb_hostr",
  605. .swgroup = TEGRA_SWGROUP_XUSB_HOST,
  606. .smmu = {
  607. .reg = 0x230,
  608. .bit = 10,
  609. },
  610. .la = {
  611. .reg = 0x37c,
  612. .shift = 0,
  613. .mask = 0xff,
  614. .def = 0x39,
  615. },
  616. }, {
  617. .id = 0x4b,
  618. .name = "xusb_hostw",
  619. .swgroup = TEGRA_SWGROUP_XUSB_HOST,
  620. .smmu = {
  621. .reg = 0x230,
  622. .bit = 11,
  623. },
  624. .la = {
  625. .reg = 0x37c,
  626. .shift = 16,
  627. .mask = 0xff,
  628. .def = 0x80,
  629. },
  630. }, {
  631. .id = 0x4c,
  632. .name = "xusb_devr",
  633. .swgroup = TEGRA_SWGROUP_XUSB_DEV,
  634. .smmu = {
  635. .reg = 0x230,
  636. .bit = 12,
  637. },
  638. .la = {
  639. .reg = 0x380,
  640. .shift = 0,
  641. .mask = 0xff,
  642. .def = 0x39,
  643. },
  644. }, {
  645. .id = 0x4d,
  646. .name = "xusb_devw",
  647. .swgroup = TEGRA_SWGROUP_XUSB_DEV,
  648. .smmu = {
  649. .reg = 0x230,
  650. .bit = 13,
  651. },
  652. .la = {
  653. .reg = 0x380,
  654. .shift = 16,
  655. .mask = 0xff,
  656. .def = 0x80,
  657. },
  658. }, {
  659. .id = 0x4e,
  660. .name = "isprab",
  661. .swgroup = TEGRA_SWGROUP_ISP2B,
  662. .smmu = {
  663. .reg = 0x230,
  664. .bit = 14,
  665. },
  666. .la = {
  667. .reg = 0x384,
  668. .shift = 0,
  669. .mask = 0xff,
  670. .def = 0x18,
  671. },
  672. }, {
  673. .id = 0x50,
  674. .name = "ispwab",
  675. .swgroup = TEGRA_SWGROUP_ISP2B,
  676. .smmu = {
  677. .reg = 0x230,
  678. .bit = 16,
  679. },
  680. .la = {
  681. .reg = 0x388,
  682. .shift = 0,
  683. .mask = 0xff,
  684. .def = 0x80,
  685. },
  686. }, {
  687. .id = 0x51,
  688. .name = "ispwbb",
  689. .swgroup = TEGRA_SWGROUP_ISP2B,
  690. .smmu = {
  691. .reg = 0x230,
  692. .bit = 17,
  693. },
  694. .la = {
  695. .reg = 0x388,
  696. .shift = 16,
  697. .mask = 0xff,
  698. .def = 0x80,
  699. },
  700. }, {
  701. .id = 0x54,
  702. .name = "tsecsrd",
  703. .swgroup = TEGRA_SWGROUP_TSEC,
  704. .smmu = {
  705. .reg = 0x230,
  706. .bit = 20,
  707. },
  708. .la = {
  709. .reg = 0x390,
  710. .shift = 0,
  711. .mask = 0xff,
  712. .def = 0x9b,
  713. },
  714. }, {
  715. .id = 0x55,
  716. .name = "tsecswr",
  717. .swgroup = TEGRA_SWGROUP_TSEC,
  718. .smmu = {
  719. .reg = 0x230,
  720. .bit = 21,
  721. },
  722. .la = {
  723. .reg = 0x390,
  724. .shift = 16,
  725. .mask = 0xff,
  726. .def = 0x80,
  727. },
  728. }, {
  729. .id = 0x56,
  730. .name = "a9avpscr",
  731. .swgroup = TEGRA_SWGROUP_A9AVP,
  732. .smmu = {
  733. .reg = 0x230,
  734. .bit = 22,
  735. },
  736. .la = {
  737. .reg = 0x3a4,
  738. .shift = 0,
  739. .mask = 0xff,
  740. .def = 0x04,
  741. },
  742. }, {
  743. .id = 0x57,
  744. .name = "a9avpscw",
  745. .swgroup = TEGRA_SWGROUP_A9AVP,
  746. .smmu = {
  747. .reg = 0x230,
  748. .bit = 23,
  749. },
  750. .la = {
  751. .reg = 0x3a4,
  752. .shift = 16,
  753. .mask = 0xff,
  754. .def = 0x80,
  755. },
  756. }, {
  757. .id = 0x58,
  758. .name = "gpusrd",
  759. .swgroup = TEGRA_SWGROUP_GPU,
  760. .smmu = {
  761. /* read-only */
  762. .reg = 0x230,
  763. .bit = 24,
  764. },
  765. .la = {
  766. .reg = 0x3c8,
  767. .shift = 0,
  768. .mask = 0xff,
  769. .def = 0x1a,
  770. },
  771. }, {
  772. .id = 0x59,
  773. .name = "gpuswr",
  774. .swgroup = TEGRA_SWGROUP_GPU,
  775. .smmu = {
  776. /* read-only */
  777. .reg = 0x230,
  778. .bit = 25,
  779. },
  780. .la = {
  781. .reg = 0x3c8,
  782. .shift = 16,
  783. .mask = 0xff,
  784. .def = 0x80,
  785. },
  786. }, {
  787. .id = 0x5a,
  788. .name = "displayt",
  789. .swgroup = TEGRA_SWGROUP_DC,
  790. .smmu = {
  791. .reg = 0x230,
  792. .bit = 26,
  793. },
  794. .la = {
  795. .reg = 0x2f0,
  796. .shift = 16,
  797. .mask = 0xff,
  798. .def = 0x50,
  799. },
  800. }, {
  801. .id = 0x60,
  802. .name = "sdmmcra",
  803. .swgroup = TEGRA_SWGROUP_SDMMC1A,
  804. .smmu = {
  805. .reg = 0x234,
  806. .bit = 0,
  807. },
  808. .la = {
  809. .reg = 0x3b8,
  810. .shift = 0,
  811. .mask = 0xff,
  812. .def = 0x49,
  813. },
  814. }, {
  815. .id = 0x61,
  816. .name = "sdmmcraa",
  817. .swgroup = TEGRA_SWGROUP_SDMMC2A,
  818. .smmu = {
  819. .reg = 0x234,
  820. .bit = 1,
  821. },
  822. .la = {
  823. .reg = 0x3bc,
  824. .shift = 0,
  825. .mask = 0xff,
  826. .def = 0x49,
  827. },
  828. }, {
  829. .id = 0x62,
  830. .name = "sdmmcr",
  831. .swgroup = TEGRA_SWGROUP_SDMMC3A,
  832. .smmu = {
  833. .reg = 0x234,
  834. .bit = 2,
  835. },
  836. .la = {
  837. .reg = 0x3c0,
  838. .shift = 0,
  839. .mask = 0xff,
  840. .def = 0x49,
  841. },
  842. }, {
  843. .id = 0x63,
  844. .swgroup = TEGRA_SWGROUP_SDMMC4A,
  845. .name = "sdmmcrab",
  846. .smmu = {
  847. .reg = 0x234,
  848. .bit = 3,
  849. },
  850. .la = {
  851. .reg = 0x3c4,
  852. .shift = 0,
  853. .mask = 0xff,
  854. .def = 0x49,
  855. },
  856. }, {
  857. .id = 0x64,
  858. .name = "sdmmcwa",
  859. .swgroup = TEGRA_SWGROUP_SDMMC1A,
  860. .smmu = {
  861. .reg = 0x234,
  862. .bit = 4,
  863. },
  864. .la = {
  865. .reg = 0x3b8,
  866. .shift = 16,
  867. .mask = 0xff,
  868. .def = 0x80,
  869. },
  870. }, {
  871. .id = 0x65,
  872. .name = "sdmmcwaa",
  873. .swgroup = TEGRA_SWGROUP_SDMMC2A,
  874. .smmu = {
  875. .reg = 0x234,
  876. .bit = 5,
  877. },
  878. .la = {
  879. .reg = 0x3bc,
  880. .shift = 16,
  881. .mask = 0xff,
  882. .def = 0x80,
  883. },
  884. }, {
  885. .id = 0x66,
  886. .name = "sdmmcw",
  887. .swgroup = TEGRA_SWGROUP_SDMMC3A,
  888. .smmu = {
  889. .reg = 0x234,
  890. .bit = 6,
  891. },
  892. .la = {
  893. .reg = 0x3c0,
  894. .shift = 16,
  895. .mask = 0xff,
  896. .def = 0x80,
  897. },
  898. }, {
  899. .id = 0x67,
  900. .name = "sdmmcwab",
  901. .swgroup = TEGRA_SWGROUP_SDMMC4A,
  902. .smmu = {
  903. .reg = 0x234,
  904. .bit = 7,
  905. },
  906. .la = {
  907. .reg = 0x3c4,
  908. .shift = 16,
  909. .mask = 0xff,
  910. .def = 0x80,
  911. },
  912. }, {
  913. .id = 0x6c,
  914. .name = "vicsrd",
  915. .swgroup = TEGRA_SWGROUP_VIC,
  916. .smmu = {
  917. .reg = 0x234,
  918. .bit = 12,
  919. },
  920. .la = {
  921. .reg = 0x394,
  922. .shift = 0,
  923. .mask = 0xff,
  924. .def = 0x1a,
  925. },
  926. }, {
  927. .id = 0x6d,
  928. .name = "vicswr",
  929. .swgroup = TEGRA_SWGROUP_VIC,
  930. .smmu = {
  931. .reg = 0x234,
  932. .bit = 13,
  933. },
  934. .la = {
  935. .reg = 0x394,
  936. .shift = 16,
  937. .mask = 0xff,
  938. .def = 0x80,
  939. },
  940. }, {
  941. .id = 0x72,
  942. .name = "viw",
  943. .swgroup = TEGRA_SWGROUP_VI,
  944. .smmu = {
  945. .reg = 0x234,
  946. .bit = 18,
  947. },
  948. .la = {
  949. .reg = 0x398,
  950. .shift = 0,
  951. .mask = 0xff,
  952. .def = 0x80,
  953. },
  954. }, {
  955. .id = 0x73,
  956. .name = "displayd",
  957. .swgroup = TEGRA_SWGROUP_DC,
  958. .smmu = {
  959. .reg = 0x234,
  960. .bit = 19,
  961. },
  962. .la = {
  963. .reg = 0x3c8,
  964. .shift = 0,
  965. .mask = 0xff,
  966. .def = 0x50,
  967. },
  968. },
  969. };
  970. static const struct tegra_smmu_swgroup tegra124_swgroups[] = {
  971. { .name = "dc", .swgroup = TEGRA_SWGROUP_DC, .reg = 0x240 },
  972. { .name = "dcb", .swgroup = TEGRA_SWGROUP_DCB, .reg = 0x244 },
  973. { .name = "afi", .swgroup = TEGRA_SWGROUP_AFI, .reg = 0x238 },
  974. { .name = "avpc", .swgroup = TEGRA_SWGROUP_AVPC, .reg = 0x23c },
  975. { .name = "hda", .swgroup = TEGRA_SWGROUP_HDA, .reg = 0x254 },
  976. { .name = "hc", .swgroup = TEGRA_SWGROUP_HC, .reg = 0x250 },
  977. { .name = "msenc", .swgroup = TEGRA_SWGROUP_MSENC, .reg = 0x264 },
  978. { .name = "ppcs", .swgroup = TEGRA_SWGROUP_PPCS, .reg = 0x270 },
  979. { .name = "sata", .swgroup = TEGRA_SWGROUP_SATA, .reg = 0x274 },
  980. { .name = "vde", .swgroup = TEGRA_SWGROUP_VDE, .reg = 0x27c },
  981. { .name = "isp2", .swgroup = TEGRA_SWGROUP_ISP2, .reg = 0x258 },
  982. { .name = "xusb_host", .swgroup = TEGRA_SWGROUP_XUSB_HOST, .reg = 0x288 },
  983. { .name = "xusb_dev", .swgroup = TEGRA_SWGROUP_XUSB_DEV, .reg = 0x28c },
  984. { .name = "isp2b", .swgroup = TEGRA_SWGROUP_ISP2B, .reg = 0xaa4 },
  985. { .name = "tsec", .swgroup = TEGRA_SWGROUP_TSEC, .reg = 0x294 },
  986. { .name = "a9avp", .swgroup = TEGRA_SWGROUP_A9AVP, .reg = 0x290 },
  987. { .name = "gpu", .swgroup = TEGRA_SWGROUP_GPU, .reg = 0xaac },
  988. { .name = "sdmmc1a", .swgroup = TEGRA_SWGROUP_SDMMC1A, .reg = 0xa94 },
  989. { .name = "sdmmc2a", .swgroup = TEGRA_SWGROUP_SDMMC2A, .reg = 0xa98 },
  990. { .name = "sdmmc3a", .swgroup = TEGRA_SWGROUP_SDMMC3A, .reg = 0xa9c },
  991. { .name = "sdmmc4a", .swgroup = TEGRA_SWGROUP_SDMMC4A, .reg = 0xaa0 },
  992. { .name = "vic", .swgroup = TEGRA_SWGROUP_VIC, .reg = 0x284 },
  993. { .name = "vi", .swgroup = TEGRA_SWGROUP_VI, .reg = 0x280 },
  994. };
  995. #ifdef CONFIG_ARCH_TEGRA_124_SOC
  996. static void tegra124_flush_dcache(struct page *page, unsigned long offset,
  997. size_t size)
  998. {
  999. phys_addr_t phys = page_to_phys(page) + offset;
  1000. void *virt = page_address(page) + offset;
  1001. __cpuc_flush_dcache_area(virt, size);
  1002. outer_flush_range(phys, phys + size);
  1003. }
  1004. static const struct tegra_smmu_ops tegra124_smmu_ops = {
  1005. .flush_dcache = tegra124_flush_dcache,
  1006. };
  1007. static const struct tegra_smmu_soc tegra124_smmu_soc = {
  1008. .clients = tegra124_mc_clients,
  1009. .num_clients = ARRAY_SIZE(tegra124_mc_clients),
  1010. .swgroups = tegra124_swgroups,
  1011. .num_swgroups = ARRAY_SIZE(tegra124_swgroups),
  1012. .supports_round_robin_arbitration = true,
  1013. .supports_request_limit = true,
  1014. .num_asids = 128,
  1015. .ops = &tegra124_smmu_ops,
  1016. };
  1017. const struct tegra_mc_soc tegra124_mc_soc = {
  1018. .clients = tegra124_mc_clients,
  1019. .num_clients = ARRAY_SIZE(tegra124_mc_clients),
  1020. .num_address_bits = 34,
  1021. .atom_size = 32,
  1022. .smmu = &tegra124_smmu_soc,
  1023. .emem_regs = tegra124_mc_emem_regs,
  1024. .num_emem_regs = ARRAY_SIZE(tegra124_mc_emem_regs),
  1025. };
  1026. #endif /* CONFIG_ARCH_TEGRA_124_SOC */
  1027. #ifdef CONFIG_ARCH_TEGRA_132_SOC
  1028. static void tegra132_flush_dcache(struct page *page, unsigned long offset,
  1029. size_t size)
  1030. {
  1031. void *virt = page_address(page) + offset;
  1032. __flush_dcache_area(virt, size);
  1033. }
  1034. static const struct tegra_smmu_ops tegra132_smmu_ops = {
  1035. .flush_dcache = tegra132_flush_dcache,
  1036. };
  1037. static const struct tegra_smmu_soc tegra132_smmu_soc = {
  1038. .clients = tegra124_mc_clients,
  1039. .num_clients = ARRAY_SIZE(tegra124_mc_clients),
  1040. .swgroups = tegra124_swgroups,
  1041. .num_swgroups = ARRAY_SIZE(tegra124_swgroups),
  1042. .supports_round_robin_arbitration = true,
  1043. .supports_request_limit = true,
  1044. .num_asids = 128,
  1045. .ops = &tegra132_smmu_ops,
  1046. };
  1047. const struct tegra_mc_soc tegra132_mc_soc = {
  1048. .clients = tegra124_mc_clients,
  1049. .num_clients = ARRAY_SIZE(tegra124_mc_clients),
  1050. .num_address_bits = 34,
  1051. .atom_size = 32,
  1052. .smmu = &tegra132_smmu_soc,
  1053. };
  1054. #endif /* CONFIG_ARCH_TEGRA_132_SOC */