tegra234.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2022-2023, NVIDIA CORPORATION. All rights reserved.
  4. */
  5. #include <soc/tegra/mc.h>
  6. #include <dt-bindings/memory/tegra234-mc.h>
  7. #include <linux/interconnect.h>
  8. #include <linux/tegra-icc.h>
  9. #include <soc/tegra/bpmp.h>
  10. #include "mc.h"
  11. /*
  12. * MC Client entries are sorted in the increasing order of the
  13. * override and security register offsets.
  14. */
  15. static const struct tegra_mc_client tegra234_mc_clients[] = {
  16. {
  17. .id = TEGRA234_MEMORY_CLIENT_HDAR,
  18. .name = "hdar",
  19. .bpmp_id = TEGRA_ICC_BPMP_HDA,
  20. .type = TEGRA_ICC_ISO_AUDIO,
  21. .sid = TEGRA234_SID_HDA,
  22. .regs = {
  23. .sid = {
  24. .override = 0xa8,
  25. .security = 0xac,
  26. },
  27. },
  28. }, {
  29. .id = TEGRA234_MEMORY_CLIENT_NVENCSRD,
  30. .name = "nvencsrd",
  31. .bpmp_id = TEGRA_ICC_BPMP_NVENC,
  32. .type = TEGRA_ICC_NISO,
  33. .sid = TEGRA234_SID_NVENC,
  34. .regs = {
  35. .sid = {
  36. .override = 0xe0,
  37. .security = 0xe4,
  38. },
  39. },
  40. }, {
  41. .id = TEGRA234_MEMORY_CLIENT_PCIE6AR,
  42. .name = "pcie6ar",
  43. .bpmp_id = TEGRA_ICC_BPMP_PCIE_6,
  44. .type = TEGRA_ICC_NISO,
  45. .sid = TEGRA234_SID_PCIE6,
  46. .regs = {
  47. .sid = {
  48. .override = 0x140,
  49. .security = 0x144,
  50. },
  51. },
  52. }, {
  53. .id = TEGRA234_MEMORY_CLIENT_PCIE6AW,
  54. .name = "pcie6aw",
  55. .bpmp_id = TEGRA_ICC_BPMP_PCIE_6,
  56. .type = TEGRA_ICC_NISO,
  57. .sid = TEGRA234_SID_PCIE6,
  58. .regs = {
  59. .sid = {
  60. .override = 0x148,
  61. .security = 0x14c,
  62. },
  63. },
  64. }, {
  65. .id = TEGRA234_MEMORY_CLIENT_PCIE7AR,
  66. .name = "pcie7ar",
  67. .bpmp_id = TEGRA_ICC_BPMP_PCIE_7,
  68. .type = TEGRA_ICC_NISO,
  69. .sid = TEGRA234_SID_PCIE7,
  70. .regs = {
  71. .sid = {
  72. .override = 0x150,
  73. .security = 0x154,
  74. },
  75. },
  76. }, {
  77. .id = TEGRA234_MEMORY_CLIENT_NVENCSWR,
  78. .name = "nvencswr",
  79. .bpmp_id = TEGRA_ICC_BPMP_NVENC,
  80. .type = TEGRA_ICC_NISO,
  81. .sid = TEGRA234_SID_NVENC,
  82. .regs = {
  83. .sid = {
  84. .override = 0x158,
  85. .security = 0x15c,
  86. },
  87. },
  88. }, {
  89. .id = TEGRA234_MEMORY_CLIENT_DLA0RDB,
  90. .name = "dla0rdb",
  91. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  92. .type = TEGRA_ICC_NISO,
  93. .sid = TEGRA234_SID_NVDLA0,
  94. .regs = {
  95. .sid = {
  96. .override = 0x160,
  97. .security = 0x164,
  98. },
  99. },
  100. }, {
  101. .id = TEGRA234_MEMORY_CLIENT_DLA0RDB1,
  102. .name = "dla0rdb1",
  103. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  104. .type = TEGRA_ICC_NISO,
  105. .sid = TEGRA234_SID_NVDLA0,
  106. .regs = {
  107. .sid = {
  108. .override = 0x168,
  109. .security = 0x16c,
  110. },
  111. },
  112. }, {
  113. .id = TEGRA234_MEMORY_CLIENT_DLA0WRB,
  114. .name = "dla0wrb",
  115. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  116. .type = TEGRA_ICC_NISO,
  117. .sid = TEGRA234_SID_NVDLA0,
  118. .regs = {
  119. .sid = {
  120. .override = 0x170,
  121. .security = 0x174,
  122. },
  123. },
  124. }, {
  125. .id = TEGRA234_MEMORY_CLIENT_DLA1RDB,
  126. .name = "dla1rdb",
  127. .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
  128. .type = TEGRA_ICC_NISO,
  129. .sid = TEGRA234_SID_NVDLA1,
  130. .regs = {
  131. .sid = {
  132. .override = 0x178,
  133. .security = 0x17c,
  134. },
  135. },
  136. }, {
  137. .id = TEGRA234_MEMORY_CLIENT_PCIE7AW,
  138. .name = "pcie7aw",
  139. .bpmp_id = TEGRA_ICC_BPMP_PCIE_7,
  140. .type = TEGRA_ICC_NISO,
  141. .sid = TEGRA234_SID_PCIE7,
  142. .regs = {
  143. .sid = {
  144. .override = 0x180,
  145. .security = 0x184,
  146. },
  147. },
  148. }, {
  149. .id = TEGRA234_MEMORY_CLIENT_PCIE8AR,
  150. .name = "pcie8ar",
  151. .bpmp_id = TEGRA_ICC_BPMP_PCIE_8,
  152. .type = TEGRA_ICC_NISO,
  153. .sid = TEGRA234_SID_PCIE8,
  154. .regs = {
  155. .sid = {
  156. .override = 0x190,
  157. .security = 0x194,
  158. },
  159. },
  160. }, {
  161. .id = TEGRA234_MEMORY_CLIENT_HDAW,
  162. .name = "hdaw",
  163. .bpmp_id = TEGRA_ICC_BPMP_HDA,
  164. .type = TEGRA_ICC_ISO_AUDIO,
  165. .sid = TEGRA234_SID_HDA,
  166. .regs = {
  167. .sid = {
  168. .override = 0x1a8,
  169. .security = 0x1ac,
  170. },
  171. },
  172. }, {
  173. .id = TEGRA234_MEMORY_CLIENT_PCIE8AW,
  174. .name = "pcie8aw",
  175. .bpmp_id = TEGRA_ICC_BPMP_PCIE_8,
  176. .type = TEGRA_ICC_NISO,
  177. .sid = TEGRA234_SID_PCIE8,
  178. .regs = {
  179. .sid = {
  180. .override = 0x1d8,
  181. .security = 0x1dc,
  182. },
  183. },
  184. }, {
  185. .id = TEGRA234_MEMORY_CLIENT_PCIE9AR,
  186. .name = "pcie9ar",
  187. .bpmp_id = TEGRA_ICC_BPMP_PCIE_9,
  188. .type = TEGRA_ICC_NISO,
  189. .sid = TEGRA234_SID_PCIE9,
  190. .regs = {
  191. .sid = {
  192. .override = 0x1e0,
  193. .security = 0x1e4,
  194. },
  195. },
  196. }, {
  197. .id = TEGRA234_MEMORY_CLIENT_PCIE6AR1,
  198. .name = "pcie6ar1",
  199. .bpmp_id = TEGRA_ICC_BPMP_PCIE_6,
  200. .type = TEGRA_ICC_NISO,
  201. .sid = TEGRA234_SID_PCIE6,
  202. .regs = {
  203. .sid = {
  204. .override = 0x1e8,
  205. .security = 0x1ec,
  206. },
  207. },
  208. }, {
  209. .id = TEGRA234_MEMORY_CLIENT_PCIE9AW,
  210. .name = "pcie9aw",
  211. .bpmp_id = TEGRA_ICC_BPMP_PCIE_9,
  212. .type = TEGRA_ICC_NISO,
  213. .sid = TEGRA234_SID_PCIE9,
  214. .regs = {
  215. .sid = {
  216. .override = 0x1f0,
  217. .security = 0x1f4,
  218. },
  219. },
  220. }, {
  221. .id = TEGRA234_MEMORY_CLIENT_PCIE10AR,
  222. .name = "pcie10ar",
  223. .bpmp_id = TEGRA_ICC_BPMP_PCIE_10,
  224. .type = TEGRA_ICC_NISO,
  225. .sid = TEGRA234_SID_PCIE10,
  226. .regs = {
  227. .sid = {
  228. .override = 0x1f8,
  229. .security = 0x1fc,
  230. },
  231. },
  232. }, {
  233. .id = TEGRA234_MEMORY_CLIENT_PCIE10AW,
  234. .name = "pcie10aw",
  235. .bpmp_id = TEGRA_ICC_BPMP_PCIE_10,
  236. .type = TEGRA_ICC_NISO,
  237. .sid = TEGRA234_SID_PCIE10,
  238. .regs = {
  239. .sid = {
  240. .override = 0x200,
  241. .security = 0x204,
  242. },
  243. },
  244. }, {
  245. .id = TEGRA234_MEMORY_CLIENT_PCIE10AR1,
  246. .name = "pcie10ar1",
  247. .bpmp_id = TEGRA_ICC_BPMP_PCIE_10,
  248. .type = TEGRA_ICC_NISO,
  249. .sid = TEGRA234_SID_PCIE10,
  250. .regs = {
  251. .sid = {
  252. .override = 0x240,
  253. .security = 0x244,
  254. },
  255. },
  256. }, {
  257. .id = TEGRA234_MEMORY_CLIENT_PCIE7AR1,
  258. .name = "pcie7ar1",
  259. .bpmp_id = TEGRA_ICC_BPMP_PCIE_7,
  260. .type = TEGRA_ICC_NISO,
  261. .sid = TEGRA234_SID_PCIE7,
  262. .regs = {
  263. .sid = {
  264. .override = 0x248,
  265. .security = 0x24c,
  266. },
  267. },
  268. }, {
  269. .id = TEGRA234_MEMORY_CLIENT_MGBEARD,
  270. .name = "mgbeard",
  271. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  272. .type = TEGRA_ICC_NISO,
  273. .sid = TEGRA234_SID_MGBE,
  274. .regs = {
  275. .sid = {
  276. .override = 0x2c0,
  277. .security = 0x2c4,
  278. },
  279. },
  280. }, {
  281. .id = TEGRA234_MEMORY_CLIENT_MGBEBRD,
  282. .name = "mgbebrd",
  283. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  284. .type = TEGRA_ICC_NISO,
  285. .sid = TEGRA234_SID_MGBE_VF1,
  286. .regs = {
  287. .sid = {
  288. .override = 0x2c8,
  289. .security = 0x2cc,
  290. },
  291. },
  292. }, {
  293. .id = TEGRA234_MEMORY_CLIENT_MGBECRD,
  294. .name = "mgbecrd",
  295. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  296. .type = TEGRA_ICC_NISO,
  297. .sid = TEGRA234_SID_MGBE_VF2,
  298. .regs = {
  299. .sid = {
  300. .override = 0x2d0,
  301. .security = 0x2d4,
  302. },
  303. },
  304. }, {
  305. .id = TEGRA234_MEMORY_CLIENT_MGBEDRD,
  306. .name = "mgbedrd",
  307. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  308. .type = TEGRA_ICC_NISO,
  309. .sid = TEGRA234_SID_MGBE_VF3,
  310. .regs = {
  311. .sid = {
  312. .override = 0x2d8,
  313. .security = 0x2dc,
  314. },
  315. },
  316. }, {
  317. .id = TEGRA234_MEMORY_CLIENT_MGBEAWR,
  318. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  319. .type = TEGRA_ICC_NISO,
  320. .name = "mgbeawr",
  321. .sid = TEGRA234_SID_MGBE,
  322. .regs = {
  323. .sid = {
  324. .override = 0x2e0,
  325. .security = 0x2e4,
  326. },
  327. },
  328. }, {
  329. .id = TEGRA234_MEMORY_CLIENT_MGBEBWR,
  330. .name = "mgbebwr",
  331. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  332. .type = TEGRA_ICC_NISO,
  333. .sid = TEGRA234_SID_MGBE_VF1,
  334. .regs = {
  335. .sid = {
  336. .override = 0x2f8,
  337. .security = 0x2fc,
  338. },
  339. },
  340. }, {
  341. .id = TEGRA234_MEMORY_CLIENT_MGBECWR,
  342. .name = "mgbecwr",
  343. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  344. .type = TEGRA_ICC_NISO,
  345. .sid = TEGRA234_SID_MGBE_VF2,
  346. .regs = {
  347. .sid = {
  348. .override = 0x308,
  349. .security = 0x30c,
  350. },
  351. },
  352. }, {
  353. .id = TEGRA234_MEMORY_CLIENT_SDMMCRAB,
  354. .name = "sdmmcrab",
  355. .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4,
  356. .type = TEGRA_ICC_NISO,
  357. .sid = TEGRA234_SID_SDMMC4,
  358. .regs = {
  359. .sid = {
  360. .override = 0x318,
  361. .security = 0x31c,
  362. },
  363. },
  364. }, {
  365. .id = TEGRA234_MEMORY_CLIENT_MGBEDWR,
  366. .name = "mgbedwr",
  367. .bpmp_id = TEGRA_ICC_BPMP_EQOS,
  368. .type = TEGRA_ICC_NISO,
  369. .sid = TEGRA234_SID_MGBE_VF3,
  370. .regs = {
  371. .sid = {
  372. .override = 0x328,
  373. .security = 0x32c,
  374. },
  375. },
  376. }, {
  377. .id = TEGRA234_MEMORY_CLIENT_SDMMCWAB,
  378. .name = "sdmmcwab",
  379. .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4,
  380. .type = TEGRA_ICC_NISO,
  381. .sid = TEGRA234_SID_SDMMC4,
  382. .regs = {
  383. .sid = {
  384. .override = 0x338,
  385. .security = 0x33c,
  386. },
  387. },
  388. }, {
  389. .id = TEGRA234_MEMORY_CLIENT_VICSRD,
  390. .name = "vicsrd",
  391. .bpmp_id = TEGRA_ICC_BPMP_VIC,
  392. .type = TEGRA_ICC_NISO,
  393. .sid = TEGRA234_SID_VIC,
  394. .regs = {
  395. .sid = {
  396. .override = 0x360,
  397. .security = 0x364,
  398. },
  399. },
  400. }, {
  401. .id = TEGRA234_MEMORY_CLIENT_VICSWR,
  402. .name = "vicswr",
  403. .bpmp_id = TEGRA_ICC_BPMP_VIC,
  404. .type = TEGRA_ICC_NISO,
  405. .sid = TEGRA234_SID_VIC,
  406. .regs = {
  407. .sid = {
  408. .override = 0x368,
  409. .security = 0x36c,
  410. },
  411. },
  412. }, {
  413. .id = TEGRA234_MEMORY_CLIENT_DLA1RDB1,
  414. .name = "dla1rdb1",
  415. .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
  416. .type = TEGRA_ICC_NISO,
  417. .sid = TEGRA234_SID_NVDLA1,
  418. .regs = {
  419. .sid = {
  420. .override = 0x370,
  421. .security = 0x374,
  422. },
  423. },
  424. }, {
  425. .id = TEGRA234_MEMORY_CLIENT_DLA1WRB,
  426. .name = "dla1wrb",
  427. .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
  428. .type = TEGRA_ICC_NISO,
  429. .sid = TEGRA234_SID_NVDLA1,
  430. .regs = {
  431. .sid = {
  432. .override = 0x378,
  433. .security = 0x37c,
  434. },
  435. },
  436. }, {
  437. .id = TEGRA234_MEMORY_CLIENT_VI2W,
  438. .name = "vi2w",
  439. .bpmp_id = TEGRA_ICC_BPMP_VI2,
  440. .type = TEGRA_ICC_ISO_VI,
  441. .sid = TEGRA234_SID_ISO_VI2,
  442. .regs = {
  443. .sid = {
  444. .override = 0x380,
  445. .security = 0x384,
  446. },
  447. },
  448. }, {
  449. .id = TEGRA234_MEMORY_CLIENT_VI2FALR,
  450. .name = "vi2falr",
  451. .bpmp_id = TEGRA_ICC_BPMP_VI2FAL,
  452. .type = TEGRA_ICC_ISO_VIFAL,
  453. .sid = TEGRA234_SID_ISO_VI2FALC,
  454. .regs = {
  455. .sid = {
  456. .override = 0x388,
  457. .security = 0x38c,
  458. },
  459. },
  460. }, {
  461. .id = TEGRA234_MEMORY_CLIENT_VIW,
  462. .name = "viw",
  463. .bpmp_id = TEGRA_ICC_BPMP_VI,
  464. .type = TEGRA_ICC_ISO_VI,
  465. .sid = TEGRA234_SID_ISO_VI,
  466. .regs = {
  467. .sid = {
  468. .override = 0x390,
  469. .security = 0x394,
  470. },
  471. },
  472. }, {
  473. .id = TEGRA234_MEMORY_CLIENT_NVDECSRD,
  474. .name = "nvdecsrd",
  475. .bpmp_id = TEGRA_ICC_BPMP_NVDEC,
  476. .type = TEGRA_ICC_NISO,
  477. .sid = TEGRA234_SID_NVDEC,
  478. .regs = {
  479. .sid = {
  480. .override = 0x3c0,
  481. .security = 0x3c4,
  482. },
  483. },
  484. }, {
  485. .id = TEGRA234_MEMORY_CLIENT_NVDECSWR,
  486. .name = "nvdecswr",
  487. .bpmp_id = TEGRA_ICC_BPMP_NVDEC,
  488. .type = TEGRA_ICC_NISO,
  489. .sid = TEGRA234_SID_NVDEC,
  490. .regs = {
  491. .sid = {
  492. .override = 0x3c8,
  493. .security = 0x3cc,
  494. },
  495. },
  496. }, {
  497. .id = TEGRA234_MEMORY_CLIENT_APER,
  498. .name = "aper",
  499. .bpmp_id = TEGRA_ICC_BPMP_APE,
  500. .type = TEGRA_ICC_ISO_AUDIO,
  501. .sid = TEGRA234_SID_APE,
  502. .regs = {
  503. .sid = {
  504. .override = 0x3d0,
  505. .security = 0x3d4,
  506. },
  507. },
  508. }, {
  509. .id = TEGRA234_MEMORY_CLIENT_APEW,
  510. .name = "apew",
  511. .bpmp_id = TEGRA_ICC_BPMP_APE,
  512. .type = TEGRA_ICC_ISO_AUDIO,
  513. .sid = TEGRA234_SID_APE,
  514. .regs = {
  515. .sid = {
  516. .override = 0x3d8,
  517. .security = 0x3dc,
  518. },
  519. },
  520. }, {
  521. .id = TEGRA234_MEMORY_CLIENT_VI2FALW,
  522. .name = "vi2falw",
  523. .bpmp_id = TEGRA_ICC_BPMP_VI2FAL,
  524. .type = TEGRA_ICC_ISO_VIFAL,
  525. .sid = TEGRA234_SID_ISO_VI2FALC,
  526. .regs = {
  527. .sid = {
  528. .override = 0x3e0,
  529. .security = 0x3e4,
  530. },
  531. },
  532. }, {
  533. .id = TEGRA234_MEMORY_CLIENT_NVJPGSRD,
  534. .name = "nvjpgsrd",
  535. .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0,
  536. .type = TEGRA_ICC_NISO,
  537. .sid = TEGRA234_SID_NVJPG,
  538. .regs = {
  539. .sid = {
  540. .override = 0x3f0,
  541. .security = 0x3f4,
  542. },
  543. },
  544. }, {
  545. .id = TEGRA234_MEMORY_CLIENT_NVJPGSWR,
  546. .name = "nvjpgswr",
  547. .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0,
  548. .type = TEGRA_ICC_NISO,
  549. .sid = TEGRA234_SID_NVJPG,
  550. .regs = {
  551. .sid = {
  552. .override = 0x3f8,
  553. .security = 0x3fc,
  554. },
  555. },
  556. }, {
  557. .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR,
  558. .name = "nvdisplayr",
  559. .bpmp_id = TEGRA_ICC_BPMP_DISPLAY,
  560. .type = TEGRA_ICC_ISO_DISPLAY,
  561. .sid = TEGRA234_SID_ISO_NVDISPLAY,
  562. .regs = {
  563. .sid = {
  564. .override = 0x490,
  565. .security = 0x494,
  566. },
  567. },
  568. }, {
  569. .id = TEGRA234_MEMORY_CLIENT_BPMPR,
  570. .name = "bpmpr",
  571. .sid = TEGRA234_SID_BPMP,
  572. .regs = {
  573. .sid = {
  574. .override = 0x498,
  575. .security = 0x49c,
  576. },
  577. },
  578. }, {
  579. .id = TEGRA234_MEMORY_CLIENT_BPMPW,
  580. .name = "bpmpw",
  581. .sid = TEGRA234_SID_BPMP,
  582. .regs = {
  583. .sid = {
  584. .override = 0x4a0,
  585. .security = 0x4a4,
  586. },
  587. },
  588. }, {
  589. .id = TEGRA234_MEMORY_CLIENT_BPMPDMAR,
  590. .name = "bpmpdmar",
  591. .sid = TEGRA234_SID_BPMP,
  592. .regs = {
  593. .sid = {
  594. .override = 0x4a8,
  595. .security = 0x4ac,
  596. },
  597. },
  598. }, {
  599. .id = TEGRA234_MEMORY_CLIENT_BPMPDMAW,
  600. .name = "bpmpdmaw",
  601. .sid = TEGRA234_SID_BPMP,
  602. .regs = {
  603. .sid = {
  604. .override = 0x4b0,
  605. .security = 0x4b4,
  606. },
  607. },
  608. }, {
  609. .id = TEGRA234_MEMORY_CLIENT_APEDMAR,
  610. .name = "apedmar",
  611. .bpmp_id = TEGRA_ICC_BPMP_APEDMA,
  612. .type = TEGRA_ICC_ISO_AUDIO,
  613. .sid = TEGRA234_SID_APE,
  614. .regs = {
  615. .sid = {
  616. .override = 0x4f8,
  617. .security = 0x4fc,
  618. },
  619. },
  620. }, {
  621. .id = TEGRA234_MEMORY_CLIENT_APEDMAW,
  622. .name = "apedmaw",
  623. .bpmp_id = TEGRA_ICC_BPMP_APEDMA,
  624. .type = TEGRA_ICC_ISO_AUDIO,
  625. .sid = TEGRA234_SID_APE,
  626. .regs = {
  627. .sid = {
  628. .override = 0x500,
  629. .security = 0x504,
  630. },
  631. },
  632. }, {
  633. .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR1,
  634. .name = "nvdisplayr1",
  635. .bpmp_id = TEGRA_ICC_BPMP_DISPLAY,
  636. .type = TEGRA_ICC_ISO_DISPLAY,
  637. .sid = TEGRA234_SID_ISO_NVDISPLAY,
  638. .regs = {
  639. .sid = {
  640. .override = 0x508,
  641. .security = 0x50c,
  642. },
  643. },
  644. }, {
  645. .id = TEGRA234_MEMORY_CLIENT_VIFALR,
  646. .name = "vifalr",
  647. .bpmp_id = TEGRA_ICC_BPMP_VIFAL,
  648. .type = TEGRA_ICC_ISO_VIFAL,
  649. .sid = TEGRA234_SID_ISO_VIFALC,
  650. .regs = {
  651. .sid = {
  652. .override = 0x5e0,
  653. .security = 0x5e4,
  654. },
  655. },
  656. }, {
  657. .id = TEGRA234_MEMORY_CLIENT_VIFALW,
  658. .name = "vifalw",
  659. .bpmp_id = TEGRA_ICC_BPMP_VIFAL,
  660. .type = TEGRA_ICC_ISO_VIFAL,
  661. .sid = TEGRA234_SID_ISO_VIFALC,
  662. .regs = {
  663. .sid = {
  664. .override = 0x5e8,
  665. .security = 0x5ec,
  666. },
  667. },
  668. }, {
  669. .id = TEGRA234_MEMORY_CLIENT_DLA0RDA,
  670. .name = "dla0rda",
  671. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  672. .type = TEGRA_ICC_NISO,
  673. .sid = TEGRA234_SID_NVDLA0,
  674. .regs = {
  675. .sid = {
  676. .override = 0x5f0,
  677. .security = 0x5f4,
  678. },
  679. },
  680. }, {
  681. .id = TEGRA234_MEMORY_CLIENT_DLA0FALRDB,
  682. .name = "dla0falrdb",
  683. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  684. .type = TEGRA_ICC_NISO,
  685. .sid = TEGRA234_SID_NVDLA0,
  686. .regs = {
  687. .sid = {
  688. .override = 0x5f8,
  689. .security = 0x5fc,
  690. },
  691. },
  692. }, {
  693. .id = TEGRA234_MEMORY_CLIENT_DLA0WRA,
  694. .name = "dla0wra",
  695. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  696. .type = TEGRA_ICC_NISO,
  697. .sid = TEGRA234_SID_NVDLA0,
  698. .regs = {
  699. .sid = {
  700. .override = 0x600,
  701. .security = 0x604,
  702. },
  703. },
  704. }, {
  705. .id = TEGRA234_MEMORY_CLIENT_DLA0FALWRB,
  706. .name = "dla0falwrb",
  707. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  708. .type = TEGRA_ICC_NISO,
  709. .sid = TEGRA234_SID_NVDLA0,
  710. .regs = {
  711. .sid = {
  712. .override = 0x608,
  713. .security = 0x60c,
  714. },
  715. },
  716. }, {
  717. .id = TEGRA234_MEMORY_CLIENT_DLA1RDA,
  718. .name = "dla1rda",
  719. .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
  720. .type = TEGRA_ICC_NISO,
  721. .sid = TEGRA234_SID_NVDLA1,
  722. .regs = {
  723. .sid = {
  724. .override = 0x610,
  725. .security = 0x614,
  726. },
  727. },
  728. }, {
  729. .id = TEGRA234_MEMORY_CLIENT_DLA1FALRDB,
  730. .name = "dla1falrdb",
  731. .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
  732. .type = TEGRA_ICC_NISO,
  733. .sid = TEGRA234_SID_NVDLA1,
  734. .regs = {
  735. .sid = {
  736. .override = 0x618,
  737. .security = 0x61c,
  738. },
  739. },
  740. }, {
  741. .id = TEGRA234_MEMORY_CLIENT_DLA1WRA,
  742. .name = "dla1wra",
  743. .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
  744. .type = TEGRA_ICC_NISO,
  745. .sid = TEGRA234_SID_NVDLA1,
  746. .regs = {
  747. .sid = {
  748. .override = 0x620,
  749. .security = 0x624,
  750. },
  751. },
  752. }, {
  753. .id = TEGRA234_MEMORY_CLIENT_DLA1FALWRB,
  754. .name = "dla1falwrb",
  755. .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
  756. .type = TEGRA_ICC_NISO,
  757. .sid = TEGRA234_SID_NVDLA1,
  758. .regs = {
  759. .sid = {
  760. .override = 0x628,
  761. .security = 0x62c,
  762. },
  763. },
  764. }, {
  765. .id = TEGRA234_MEMORY_CLIENT_RCER,
  766. .name = "rcer",
  767. .bpmp_id = TEGRA_ICC_BPMP_RCE,
  768. .type = TEGRA_ICC_NISO,
  769. .sid = TEGRA234_SID_RCE,
  770. .regs = {
  771. .sid = {
  772. .override = 0x690,
  773. .security = 0x694,
  774. },
  775. },
  776. }, {
  777. .id = TEGRA234_MEMORY_CLIENT_RCEW,
  778. .name = "rcew",
  779. .bpmp_id = TEGRA_ICC_BPMP_RCE,
  780. .type = TEGRA_ICC_NISO,
  781. .sid = TEGRA234_SID_RCE,
  782. .regs = {
  783. .sid = {
  784. .override = 0x698,
  785. .security = 0x69c,
  786. },
  787. },
  788. }, {
  789. .id = TEGRA234_MEMORY_CLIENT_PCIE0R,
  790. .name = "pcie0r",
  791. .bpmp_id = TEGRA_ICC_BPMP_PCIE_0,
  792. .type = TEGRA_ICC_NISO,
  793. .sid = TEGRA234_SID_PCIE0,
  794. .regs = {
  795. .sid = {
  796. .override = 0x6c0,
  797. .security = 0x6c4,
  798. },
  799. },
  800. }, {
  801. .id = TEGRA234_MEMORY_CLIENT_PCIE0W,
  802. .name = "pcie0w",
  803. .bpmp_id = TEGRA_ICC_BPMP_PCIE_0,
  804. .type = TEGRA_ICC_NISO,
  805. .sid = TEGRA234_SID_PCIE0,
  806. .regs = {
  807. .sid = {
  808. .override = 0x6c8,
  809. .security = 0x6cc,
  810. },
  811. },
  812. }, {
  813. .id = TEGRA234_MEMORY_CLIENT_PCIE1R,
  814. .name = "pcie1r",
  815. .bpmp_id = TEGRA_ICC_BPMP_PCIE_1,
  816. .type = TEGRA_ICC_NISO,
  817. .sid = TEGRA234_SID_PCIE1,
  818. .regs = {
  819. .sid = {
  820. .override = 0x6d0,
  821. .security = 0x6d4,
  822. },
  823. },
  824. }, {
  825. .id = TEGRA234_MEMORY_CLIENT_PCIE1W,
  826. .name = "pcie1w",
  827. .bpmp_id = TEGRA_ICC_BPMP_PCIE_1,
  828. .type = TEGRA_ICC_NISO,
  829. .sid = TEGRA234_SID_PCIE1,
  830. .regs = {
  831. .sid = {
  832. .override = 0x6d8,
  833. .security = 0x6dc,
  834. },
  835. },
  836. }, {
  837. .id = TEGRA234_MEMORY_CLIENT_PCIE2AR,
  838. .name = "pcie2ar",
  839. .bpmp_id = TEGRA_ICC_BPMP_PCIE_2,
  840. .type = TEGRA_ICC_NISO,
  841. .sid = TEGRA234_SID_PCIE2,
  842. .regs = {
  843. .sid = {
  844. .override = 0x6e0,
  845. .security = 0x6e4,
  846. },
  847. },
  848. }, {
  849. .id = TEGRA234_MEMORY_CLIENT_PCIE2AW,
  850. .name = "pcie2aw",
  851. .bpmp_id = TEGRA_ICC_BPMP_PCIE_2,
  852. .type = TEGRA_ICC_NISO,
  853. .sid = TEGRA234_SID_PCIE2,
  854. .regs = {
  855. .sid = {
  856. .override = 0x6e8,
  857. .security = 0x6ec,
  858. },
  859. },
  860. }, {
  861. .id = TEGRA234_MEMORY_CLIENT_PCIE3R,
  862. .name = "pcie3r",
  863. .bpmp_id = TEGRA_ICC_BPMP_PCIE_3,
  864. .type = TEGRA_ICC_NISO,
  865. .sid = TEGRA234_SID_PCIE3,
  866. .regs = {
  867. .sid = {
  868. .override = 0x6f0,
  869. .security = 0x6f4,
  870. },
  871. },
  872. }, {
  873. .id = TEGRA234_MEMORY_CLIENT_PCIE3W,
  874. .name = "pcie3w",
  875. .bpmp_id = TEGRA_ICC_BPMP_PCIE_3,
  876. .type = TEGRA_ICC_NISO,
  877. .sid = TEGRA234_SID_PCIE3,
  878. .regs = {
  879. .sid = {
  880. .override = 0x6f8,
  881. .security = 0x6fc,
  882. },
  883. },
  884. }, {
  885. .id = TEGRA234_MEMORY_CLIENT_PCIE4R,
  886. .name = "pcie4r",
  887. .bpmp_id = TEGRA_ICC_BPMP_PCIE_4,
  888. .type = TEGRA_ICC_NISO,
  889. .sid = TEGRA234_SID_PCIE4,
  890. .regs = {
  891. .sid = {
  892. .override = 0x700,
  893. .security = 0x704,
  894. },
  895. },
  896. }, {
  897. .id = TEGRA234_MEMORY_CLIENT_PCIE4W,
  898. .name = "pcie4w",
  899. .bpmp_id = TEGRA_ICC_BPMP_PCIE_4,
  900. .type = TEGRA_ICC_NISO,
  901. .sid = TEGRA234_SID_PCIE4,
  902. .regs = {
  903. .sid = {
  904. .override = 0x708,
  905. .security = 0x70c,
  906. },
  907. },
  908. }, {
  909. .id = TEGRA234_MEMORY_CLIENT_PCIE5R,
  910. .name = "pcie5r",
  911. .bpmp_id = TEGRA_ICC_BPMP_PCIE_5,
  912. .type = TEGRA_ICC_NISO,
  913. .sid = TEGRA234_SID_PCIE5,
  914. .regs = {
  915. .sid = {
  916. .override = 0x710,
  917. .security = 0x714,
  918. },
  919. },
  920. }, {
  921. .id = TEGRA234_MEMORY_CLIENT_PCIE5W,
  922. .name = "pcie5w",
  923. .bpmp_id = TEGRA_ICC_BPMP_PCIE_5,
  924. .type = TEGRA_ICC_NISO,
  925. .sid = TEGRA234_SID_PCIE5,
  926. .regs = {
  927. .sid = {
  928. .override = 0x718,
  929. .security = 0x71c,
  930. },
  931. },
  932. }, {
  933. .id = TEGRA234_MEMORY_CLIENT_DLA0RDA1,
  934. .name = "dla0rda1",
  935. .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
  936. .type = TEGRA_ICC_NISO,
  937. .sid = TEGRA234_SID_NVDLA0,
  938. .regs = {
  939. .sid = {
  940. .override = 0x748,
  941. .security = 0x74c,
  942. },
  943. },
  944. }, {
  945. .id = TEGRA234_MEMORY_CLIENT_DLA1RDA1,
  946. .name = "dla1rda1",
  947. .sid = TEGRA234_SID_NVDLA1,
  948. .regs = {
  949. .sid = {
  950. .override = 0x750,
  951. .security = 0x754,
  952. },
  953. },
  954. }, {
  955. .id = TEGRA234_MEMORY_CLIENT_PCIE5R1,
  956. .name = "pcie5r1",
  957. .bpmp_id = TEGRA_ICC_BPMP_PCIE_5,
  958. .type = TEGRA_ICC_NISO,
  959. .sid = TEGRA234_SID_PCIE5,
  960. .regs = {
  961. .sid = {
  962. .override = 0x778,
  963. .security = 0x77c,
  964. },
  965. },
  966. }, {
  967. .id = TEGRA234_MEMORY_CLIENT_NVJPG1SRD,
  968. .name = "nvjpg1srd",
  969. .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1,
  970. .type = TEGRA_ICC_NISO,
  971. .sid = TEGRA234_SID_NVJPG1,
  972. .regs = {
  973. .sid = {
  974. .override = 0x918,
  975. .security = 0x91c,
  976. },
  977. },
  978. }, {
  979. .id = TEGRA234_MEMORY_CLIENT_NVJPG1SWR,
  980. .name = "nvjpg1swr",
  981. .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1,
  982. .type = TEGRA_ICC_NISO,
  983. .sid = TEGRA234_SID_NVJPG1,
  984. .regs = {
  985. .sid = {
  986. .override = 0x920,
  987. .security = 0x924,
  988. },
  989. },
  990. }, {
  991. .id = TEGRA_ICC_MC_CPU_CLUSTER0,
  992. .name = "sw_cluster0",
  993. .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER0,
  994. .type = TEGRA_ICC_NISO,
  995. }, {
  996. .id = TEGRA_ICC_MC_CPU_CLUSTER1,
  997. .name = "sw_cluster1",
  998. .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER1,
  999. .type = TEGRA_ICC_NISO,
  1000. }, {
  1001. .id = TEGRA_ICC_MC_CPU_CLUSTER2,
  1002. .name = "sw_cluster2",
  1003. .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER2,
  1004. .type = TEGRA_ICC_NISO,
  1005. }, {
  1006. .id = TEGRA234_MEMORY_CLIENT_NVL1R,
  1007. .name = "nvl1r",
  1008. .bpmp_id = TEGRA_ICC_BPMP_GPU,
  1009. .type = TEGRA_ICC_NISO,
  1010. }, {
  1011. .id = TEGRA234_MEMORY_CLIENT_NVL1W,
  1012. .name = "nvl1w",
  1013. .bpmp_id = TEGRA_ICC_BPMP_GPU,
  1014. .type = TEGRA_ICC_NISO,
  1015. },
  1016. };
  1017. /*
  1018. * tegra234_mc_icc_set() - Pass MC client info to the BPMP-FW
  1019. * @src: ICC node for Memory Controller's (MC) Client
  1020. * @dst: ICC node for Memory Controller (MC)
  1021. *
  1022. * Passing the current request info from the MC to the BPMP-FW where
  1023. * LA and PTSA registers are accessed and the final EMC freq is set
  1024. * based on client_id, type, latency and bandwidth.
  1025. * icc_set_bw() makes set_bw calls for both MC and EMC providers in
  1026. * sequence. Both the calls are protected by 'mutex_lock(&icc_lock)'.
  1027. * So, the data passed won't be updated by concurrent set calls from
  1028. * other clients.
  1029. */
  1030. static int tegra234_mc_icc_set(struct icc_node *src, struct icc_node *dst)
  1031. {
  1032. struct tegra_mc *mc = icc_provider_to_tegra_mc(dst->provider);
  1033. struct mrq_bwmgr_int_request bwmgr_req = { 0 };
  1034. struct mrq_bwmgr_int_response bwmgr_resp = { 0 };
  1035. const struct tegra_mc_client *pclient = src->data;
  1036. struct tegra_bpmp_message msg;
  1037. int ret;
  1038. /*
  1039. * Same Src and Dst node will happen during boot from icc_node_add().
  1040. * This can be used to pre-initialize and set bandwidth for all clients
  1041. * before their drivers are loaded. We are skipping this case as for us,
  1042. * the pre-initialization already happened in Bootloader(MB2) and BPMP-FW.
  1043. */
  1044. if (src->id == dst->id)
  1045. return 0;
  1046. if (!mc->bwmgr_mrq_supported)
  1047. return 0;
  1048. if (!mc->bpmp) {
  1049. dev_err(mc->dev, "BPMP reference NULL\n");
  1050. return -ENOENT;
  1051. }
  1052. if (pclient->type == TEGRA_ICC_NISO)
  1053. bwmgr_req.bwmgr_calc_set_req.niso_bw = src->avg_bw;
  1054. else
  1055. bwmgr_req.bwmgr_calc_set_req.iso_bw = src->avg_bw;
  1056. bwmgr_req.bwmgr_calc_set_req.client_id = pclient->bpmp_id;
  1057. bwmgr_req.cmd = CMD_BWMGR_INT_CALC_AND_SET;
  1058. bwmgr_req.bwmgr_calc_set_req.mc_floor = src->peak_bw;
  1059. bwmgr_req.bwmgr_calc_set_req.floor_unit = BWMGR_INT_UNIT_KBPS;
  1060. memset(&msg, 0, sizeof(msg));
  1061. msg.mrq = MRQ_BWMGR_INT;
  1062. msg.tx.data = &bwmgr_req;
  1063. msg.tx.size = sizeof(bwmgr_req);
  1064. msg.rx.data = &bwmgr_resp;
  1065. msg.rx.size = sizeof(bwmgr_resp);
  1066. if (pclient->bpmp_id >= TEGRA_ICC_BPMP_CPU_CLUSTER0 &&
  1067. pclient->bpmp_id <= TEGRA_ICC_BPMP_CPU_CLUSTER2)
  1068. msg.flags = TEGRA_BPMP_MESSAGE_RESET;
  1069. ret = tegra_bpmp_transfer(mc->bpmp, &msg);
  1070. if (ret < 0) {
  1071. dev_err(mc->dev, "BPMP transfer failed: %d\n", ret);
  1072. goto error;
  1073. }
  1074. if (msg.rx.ret < 0) {
  1075. pr_err("failed to set bandwidth for %u: %d\n",
  1076. bwmgr_req.bwmgr_calc_set_req.client_id, msg.rx.ret);
  1077. ret = -EINVAL;
  1078. }
  1079. error:
  1080. return ret;
  1081. }
  1082. static int tegra234_mc_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
  1083. u32 peak_bw, u32 *agg_avg, u32 *agg_peak)
  1084. {
  1085. struct icc_provider *p = node->provider;
  1086. struct tegra_mc *mc = icc_provider_to_tegra_mc(p);
  1087. if (!mc->bwmgr_mrq_supported)
  1088. return 0;
  1089. if (node->id == TEGRA_ICC_MC_CPU_CLUSTER0 ||
  1090. node->id == TEGRA_ICC_MC_CPU_CLUSTER1 ||
  1091. node->id == TEGRA_ICC_MC_CPU_CLUSTER2) {
  1092. if (mc)
  1093. peak_bw = peak_bw * mc->num_channels;
  1094. }
  1095. *agg_avg += avg_bw;
  1096. *agg_peak = max(*agg_peak, peak_bw);
  1097. return 0;
  1098. }
  1099. static int tegra234_mc_icc_get_init_bw(struct icc_node *node, u32 *avg, u32 *peak)
  1100. {
  1101. *avg = 0;
  1102. *peak = 0;
  1103. return 0;
  1104. }
  1105. static const struct tegra_mc_icc_ops tegra234_mc_icc_ops = {
  1106. .xlate = tegra_mc_icc_xlate,
  1107. .aggregate = tegra234_mc_icc_aggregate,
  1108. .get_bw = tegra234_mc_icc_get_init_bw,
  1109. .set = tegra234_mc_icc_set,
  1110. };
  1111. const struct tegra_mc_soc tegra234_mc_soc = {
  1112. .num_clients = ARRAY_SIZE(tegra234_mc_clients),
  1113. .clients = tegra234_mc_clients,
  1114. .num_address_bits = 40,
  1115. .num_channels = 16,
  1116. .client_id_mask = 0x1ff,
  1117. .intmask = MC_INT_DECERR_ROUTE_SANITY |
  1118. MC_INT_DECERR_GENERALIZED_CARVEOUT | MC_INT_DECERR_MTS |
  1119. MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
  1120. MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
  1121. .has_addr_hi_reg = true,
  1122. .ops = &tegra186_mc_ops,
  1123. .icc_ops = &tegra234_mc_icc_ops,
  1124. .ch_intmask = 0x0000ff00,
  1125. .global_intstatus_channel_shift = 8,
  1126. /*
  1127. * Additionally, there are lite carveouts but those are not currently
  1128. * supported.
  1129. */
  1130. .num_carveouts = 32,
  1131. };