qdu1000.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. */
  6. #include <linux/device.h>
  7. #include <linux/interconnect.h>
  8. #include <linux/interconnect-provider.h>
  9. #include <linux/mod_devicetable.h>
  10. #include <linux/module.h>
  11. #include <linux/platform_device.h>
  12. #include <dt-bindings/interconnect/qcom,qdu1000-rpmh.h>
  13. #include "bcm-voter.h"
  14. #include "icc-common.h"
  15. #include "icc-rpmh.h"
  16. #include "qdu1000.h"
  17. static struct qcom_icc_node qup0_core_master = {
  18. .name = "qup0_core_master",
  19. .id = QDU1000_MASTER_QUP_CORE_0,
  20. .channels = 1,
  21. .buswidth = 4,
  22. .num_links = 1,
  23. .links = { QDU1000_SLAVE_QUP_CORE_0 },
  24. };
  25. static struct qcom_icc_node qup1_core_master = {
  26. .name = "qup1_core_master",
  27. .id = QDU1000_MASTER_QUP_CORE_1,
  28. .channels = 1,
  29. .buswidth = 4,
  30. .num_links = 1,
  31. .links = { QDU1000_SLAVE_QUP_CORE_1 },
  32. };
  33. static struct qcom_icc_node alm_sys_tcu = {
  34. .name = "alm_sys_tcu",
  35. .id = QDU1000_MASTER_SYS_TCU,
  36. .channels = 1,
  37. .buswidth = 8,
  38. .num_links = 2,
  39. .links = { QDU1000_SLAVE_GEM_NOC_CNOC, QDU1000_SLAVE_LLCC },
  40. };
  41. static struct qcom_icc_node chm_apps = {
  42. .name = "chm_apps",
  43. .id = QDU1000_MASTER_APPSS_PROC,
  44. .channels = 1,
  45. .buswidth = 16,
  46. .num_links = 4,
  47. .links = { QDU1000_SLAVE_GEM_NOC_CNOC, QDU1000_SLAVE_LLCC,
  48. QDU1000_SLAVE_GEMNOC_MODEM_CNOC, QDU1000_SLAVE_MEM_NOC_PCIE_SNOC
  49. },
  50. };
  51. static struct qcom_icc_node qnm_ecpri_dma = {
  52. .name = "qnm_ecpri_dma",
  53. .id = QDU1000_MASTER_GEMNOC_ECPRI_DMA,
  54. .channels = 2,
  55. .buswidth = 32,
  56. .num_links = 2,
  57. .links = { QDU1000_SLAVE_GEM_NOC_CNOC, QDU1000_SLAVE_LLCC },
  58. };
  59. static struct qcom_icc_node qnm_fec_2_gemnoc = {
  60. .name = "qnm_fec_2_gemnoc",
  61. .id = QDU1000_MASTER_FEC_2_GEMNOC,
  62. .channels = 2,
  63. .buswidth = 32,
  64. .num_links = 2,
  65. .links = { QDU1000_SLAVE_GEM_NOC_CNOC, QDU1000_SLAVE_LLCC },
  66. };
  67. static struct qcom_icc_node qnm_pcie = {
  68. .name = "qnm_pcie",
  69. .id = QDU1000_MASTER_ANOC_PCIE_GEM_NOC,
  70. .channels = 1,
  71. .buswidth = 64,
  72. .num_links = 3,
  73. .links = { QDU1000_SLAVE_GEM_NOC_CNOC, QDU1000_SLAVE_LLCC,
  74. QDU1000_SLAVE_GEMNOC_MODEM_CNOC
  75. },
  76. };
  77. static struct qcom_icc_node qnm_snoc_gc = {
  78. .name = "qnm_snoc_gc",
  79. .id = QDU1000_MASTER_SNOC_GC_MEM_NOC,
  80. .channels = 1,
  81. .buswidth = 8,
  82. .num_links = 1,
  83. .links = { QDU1000_SLAVE_LLCC },
  84. };
  85. static struct qcom_icc_node qnm_snoc_sf = {
  86. .name = "qnm_snoc_sf",
  87. .id = QDU1000_MASTER_SNOC_SF_MEM_NOC,
  88. .channels = 1,
  89. .buswidth = 16,
  90. .num_links = 4,
  91. .links = { QDU1000_SLAVE_GEM_NOC_CNOC, QDU1000_SLAVE_LLCC,
  92. QDU1000_SLAVE_GEMNOC_MODEM_CNOC, QDU1000_SLAVE_MEM_NOC_PCIE_SNOC
  93. },
  94. };
  95. static struct qcom_icc_node qxm_mdsp = {
  96. .name = "qxm_mdsp",
  97. .id = QDU1000_MASTER_MSS_PROC,
  98. .channels = 1,
  99. .buswidth = 16,
  100. .num_links = 3,
  101. .links = { QDU1000_SLAVE_GEM_NOC_CNOC, QDU1000_SLAVE_LLCC,
  102. QDU1000_SLAVE_MEM_NOC_PCIE_SNOC
  103. },
  104. };
  105. static struct qcom_icc_node llcc_mc = {
  106. .name = "llcc_mc",
  107. .id = QDU1000_MASTER_LLCC,
  108. .channels = 8,
  109. .buswidth = 4,
  110. .num_links = 1,
  111. .links = { QDU1000_SLAVE_EBI1 },
  112. };
  113. static struct qcom_icc_node qhm_gic = {
  114. .name = "qhm_gic",
  115. .id = QDU1000_MASTER_GIC_AHB,
  116. .channels = 1,
  117. .buswidth = 4,
  118. .num_links = 1,
  119. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_SF },
  120. };
  121. static struct qcom_icc_node qhm_qdss_bam = {
  122. .name = "qhm_qdss_bam",
  123. .id = QDU1000_MASTER_QDSS_BAM,
  124. .channels = 1,
  125. .buswidth = 4,
  126. .num_links = 1,
  127. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_SF },
  128. };
  129. static struct qcom_icc_node qhm_qpic = {
  130. .name = "qhm_qpic",
  131. .id = QDU1000_MASTER_QPIC,
  132. .channels = 1,
  133. .buswidth = 4,
  134. .num_links = 1,
  135. .links = { QDU1000_SLAVE_A1NOC_SNOC },
  136. };
  137. static struct qcom_icc_node qhm_qspi = {
  138. .name = "qhm_qspi",
  139. .id = QDU1000_MASTER_QSPI_0,
  140. .channels = 1,
  141. .buswidth = 4,
  142. .num_links = 1,
  143. .links = { QDU1000_SLAVE_A1NOC_SNOC },
  144. };
  145. static struct qcom_icc_node qhm_qup0 = {
  146. .name = "qhm_qup0",
  147. .id = QDU1000_MASTER_QUP_0,
  148. .channels = 1,
  149. .buswidth = 4,
  150. .num_links = 1,
  151. .links = { QDU1000_SLAVE_A1NOC_SNOC },
  152. };
  153. static struct qcom_icc_node qhm_qup1 = {
  154. .name = "qhm_qup1",
  155. .id = QDU1000_MASTER_QUP_1,
  156. .channels = 1,
  157. .buswidth = 4,
  158. .num_links = 1,
  159. .links = { QDU1000_SLAVE_A1NOC_SNOC },
  160. };
  161. static struct qcom_icc_node qhm_system_noc_cfg = {
  162. .name = "qhm_system_noc_cfg",
  163. .id = QDU1000_MASTER_SNOC_CFG,
  164. .channels = 1,
  165. .buswidth = 4,
  166. .num_links = 1,
  167. .links = { QDU1000_SLAVE_SERVICE_SNOC },
  168. };
  169. static struct qcom_icc_node qnm_aggre_noc = {
  170. .name = "qnm_aggre_noc",
  171. .id = QDU1000_MASTER_ANOC_SNOC,
  172. .channels = 1,
  173. .buswidth = 8,
  174. .num_links = 1,
  175. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_SF },
  176. };
  177. static struct qcom_icc_node qnm_aggre_noc_gsi = {
  178. .name = "qnm_aggre_noc_gsi",
  179. .id = QDU1000_MASTER_ANOC_GSI,
  180. .channels = 1,
  181. .buswidth = 8,
  182. .num_links = 1,
  183. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_GC },
  184. };
  185. static struct qcom_icc_node qnm_gemnoc_cnoc = {
  186. .name = "qnm_gemnoc_cnoc",
  187. .id = QDU1000_MASTER_GEM_NOC_CNOC,
  188. .channels = 1,
  189. .buswidth = 16,
  190. .num_links = 36,
  191. .links = { QDU1000_SLAVE_AHB2PHY_SOUTH, QDU1000_SLAVE_AHB2PHY_NORTH,
  192. QDU1000_SLAVE_AHB2PHY_EAST, QDU1000_SLAVE_AOSS,
  193. QDU1000_SLAVE_CLK_CTL, QDU1000_SLAVE_RBCPR_CX_CFG,
  194. QDU1000_SLAVE_RBCPR_MX_CFG, QDU1000_SLAVE_CRYPTO_0_CFG,
  195. QDU1000_SLAVE_ECPRI_CFG, QDU1000_SLAVE_IMEM_CFG,
  196. QDU1000_SLAVE_IPC_ROUTER_CFG, QDU1000_SLAVE_CNOC_MSS,
  197. QDU1000_SLAVE_PCIE_CFG, QDU1000_SLAVE_PDM,
  198. QDU1000_SLAVE_PIMEM_CFG, QDU1000_SLAVE_PRNG,
  199. QDU1000_SLAVE_QDSS_CFG, QDU1000_SLAVE_QPIC,
  200. QDU1000_SLAVE_QSPI_0, QDU1000_SLAVE_QUP_0,
  201. QDU1000_SLAVE_QUP_1, QDU1000_SLAVE_SDCC_2,
  202. QDU1000_SLAVE_SMBUS_CFG, QDU1000_SLAVE_SNOC_CFG,
  203. QDU1000_SLAVE_TCSR, QDU1000_SLAVE_TLMM,
  204. QDU1000_SLAVE_TME_CFG, QDU1000_SLAVE_TSC_CFG,
  205. QDU1000_SLAVE_USB3_0, QDU1000_SLAVE_VSENSE_CTRL_CFG,
  206. QDU1000_SLAVE_DDRSS_CFG, QDU1000_SLAVE_IMEM,
  207. QDU1000_SLAVE_PIMEM, QDU1000_SLAVE_ETHERNET_SS,
  208. QDU1000_SLAVE_QDSS_STM, QDU1000_SLAVE_TCU
  209. },
  210. };
  211. static struct qcom_icc_node qnm_gemnoc_modem_slave = {
  212. .name = "qnm_gemnoc_modem_slave",
  213. .id = QDU1000_MASTER_GEMNOC_MODEM_CNOC,
  214. .channels = 1,
  215. .buswidth = 16,
  216. .num_links = 1,
  217. .links = { QDU1000_SLAVE_MODEM_OFFLINE },
  218. };
  219. static struct qcom_icc_node qnm_gemnoc_pcie = {
  220. .name = "qnm_gemnoc_pcie",
  221. .id = QDU1000_MASTER_GEM_NOC_PCIE_SNOC,
  222. .channels = 1,
  223. .buswidth = 16,
  224. .num_links = 1,
  225. .links = { QDU1000_SLAVE_PCIE_0 },
  226. };
  227. static struct qcom_icc_node qxm_crypto = {
  228. .name = "qxm_crypto",
  229. .id = QDU1000_MASTER_CRYPTO,
  230. .channels = 1,
  231. .buswidth = 8,
  232. .num_links = 1,
  233. .links = { QDU1000_SLAVE_A1NOC_SNOC },
  234. };
  235. static struct qcom_icc_node qxm_ecpri_gsi = {
  236. .name = "qxm_ecpri_gsi",
  237. .id = QDU1000_MASTER_ECPRI_GSI,
  238. .channels = 1,
  239. .buswidth = 8,
  240. .num_links = 2,
  241. .links = { QDU1000_SLAVE_ANOC_SNOC_GSI, QDU1000_SLAVE_PCIE_0 },
  242. };
  243. static struct qcom_icc_node qxm_pimem = {
  244. .name = "qxm_pimem",
  245. .id = QDU1000_MASTER_PIMEM,
  246. .channels = 1,
  247. .buswidth = 8,
  248. .num_links = 1,
  249. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_GC },
  250. };
  251. static struct qcom_icc_node xm_ecpri_dma = {
  252. .name = "xm_ecpri_dma",
  253. .id = QDU1000_MASTER_SNOC_ECPRI_DMA,
  254. .channels = 2,
  255. .buswidth = 32,
  256. .num_links = 2,
  257. .links = { QDU1000_SLAVE_ECPRI_GEMNOC, QDU1000_SLAVE_PCIE_0 },
  258. };
  259. static struct qcom_icc_node xm_gic = {
  260. .name = "xm_gic",
  261. .id = QDU1000_MASTER_GIC,
  262. .channels = 1,
  263. .buswidth = 8,
  264. .num_links = 1,
  265. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_GC },
  266. };
  267. static struct qcom_icc_node xm_pcie = {
  268. .name = "xm_pcie",
  269. .id = QDU1000_MASTER_PCIE,
  270. .channels = 1,
  271. .buswidth = 64,
  272. .num_links = 1,
  273. .links = { QDU1000_SLAVE_ANOC_PCIE_GEM_NOC },
  274. };
  275. static struct qcom_icc_node xm_qdss_etr0 = {
  276. .name = "xm_qdss_etr0",
  277. .id = QDU1000_MASTER_QDSS_ETR,
  278. .channels = 1,
  279. .buswidth = 8,
  280. .num_links = 1,
  281. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_SF },
  282. };
  283. static struct qcom_icc_node xm_qdss_etr1 = {
  284. .name = "xm_qdss_etr1",
  285. .id = QDU1000_MASTER_QDSS_ETR_1,
  286. .channels = 1,
  287. .buswidth = 8,
  288. .num_links = 1,
  289. .links = { QDU1000_SLAVE_SNOC_GEM_NOC_SF },
  290. };
  291. static struct qcom_icc_node xm_sdc = {
  292. .name = "xm_sdc",
  293. .id = QDU1000_MASTER_SDCC_1,
  294. .channels = 1,
  295. .buswidth = 8,
  296. .num_links = 1,
  297. .links = { QDU1000_SLAVE_A1NOC_SNOC },
  298. };
  299. static struct qcom_icc_node xm_usb3 = {
  300. .name = "xm_usb3",
  301. .id = QDU1000_MASTER_USB3,
  302. .channels = 1,
  303. .buswidth = 8,
  304. .num_links = 1,
  305. .links = { QDU1000_SLAVE_A1NOC_SNOC },
  306. };
  307. static struct qcom_icc_node qup0_core_slave = {
  308. .name = "qup0_core_slave",
  309. .id = QDU1000_SLAVE_QUP_CORE_0,
  310. .channels = 1,
  311. .buswidth = 4,
  312. .num_links = 0,
  313. };
  314. static struct qcom_icc_node qup1_core_slave = {
  315. .name = "qup1_core_slave",
  316. .id = QDU1000_SLAVE_QUP_CORE_1,
  317. .channels = 1,
  318. .buswidth = 4,
  319. .num_links = 0,
  320. };
  321. static struct qcom_icc_node qns_gem_noc_cnoc = {
  322. .name = "qns_gem_noc_cnoc",
  323. .id = QDU1000_SLAVE_GEM_NOC_CNOC,
  324. .channels = 1,
  325. .buswidth = 16,
  326. .num_links = 1,
  327. .links = { QDU1000_MASTER_GEM_NOC_CNOC },
  328. };
  329. static struct qcom_icc_node qns_llcc = {
  330. .name = "qns_llcc",
  331. .id = QDU1000_SLAVE_LLCC,
  332. .channels = 8,
  333. .buswidth = 16,
  334. .num_links = 1,
  335. .links = { QDU1000_MASTER_LLCC },
  336. };
  337. static struct qcom_icc_node qns_modem_slave = {
  338. .name = "qns_modem_slave",
  339. .id = QDU1000_SLAVE_GEMNOC_MODEM_CNOC,
  340. .channels = 1,
  341. .buswidth = 16,
  342. .num_links = 1,
  343. .links = { QDU1000_MASTER_GEMNOC_MODEM_CNOC },
  344. };
  345. static struct qcom_icc_node qns_pcie = {
  346. .name = "qns_pcie",
  347. .id = QDU1000_SLAVE_MEM_NOC_PCIE_SNOC,
  348. .channels = 1,
  349. .buswidth = 16,
  350. .num_links = 1,
  351. .links = { QDU1000_MASTER_GEM_NOC_PCIE_SNOC },
  352. };
  353. static struct qcom_icc_node ebi = {
  354. .name = "ebi",
  355. .id = QDU1000_SLAVE_EBI1,
  356. .channels = 8,
  357. .buswidth = 4,
  358. .num_links = 0,
  359. };
  360. static struct qcom_icc_node qhs_ahb2phy0_south = {
  361. .name = "qhs_ahb2phy0_south",
  362. .id = QDU1000_SLAVE_AHB2PHY_SOUTH,
  363. .channels = 1,
  364. .buswidth = 4,
  365. .num_links = 0,
  366. };
  367. static struct qcom_icc_node qhs_ahb2phy1_north = {
  368. .name = "qhs_ahb2phy1_north",
  369. .id = QDU1000_SLAVE_AHB2PHY_NORTH,
  370. .channels = 1,
  371. .buswidth = 4,
  372. .num_links = 0,
  373. };
  374. static struct qcom_icc_node qhs_ahb2phy2_east = {
  375. .name = "qhs_ahb2phy2_east",
  376. .id = QDU1000_SLAVE_AHB2PHY_EAST,
  377. .channels = 1,
  378. .buswidth = 4,
  379. .num_links = 0,
  380. };
  381. static struct qcom_icc_node qhs_aoss = {
  382. .name = "qhs_aoss",
  383. .id = QDU1000_SLAVE_AOSS,
  384. .channels = 1,
  385. .buswidth = 4,
  386. .num_links = 0,
  387. };
  388. static struct qcom_icc_node qhs_clk_ctl = {
  389. .name = "qhs_clk_ctl",
  390. .id = QDU1000_SLAVE_CLK_CTL,
  391. .channels = 1,
  392. .buswidth = 4,
  393. .num_links = 0,
  394. };
  395. static struct qcom_icc_node qhs_cpr_cx = {
  396. .name = "qhs_cpr_cx",
  397. .id = QDU1000_SLAVE_RBCPR_CX_CFG,
  398. .channels = 1,
  399. .buswidth = 4,
  400. .num_links = 0,
  401. };
  402. static struct qcom_icc_node qhs_cpr_mx = {
  403. .name = "qhs_cpr_mx",
  404. .id = QDU1000_SLAVE_RBCPR_MX_CFG,
  405. .channels = 1,
  406. .buswidth = 4,
  407. .num_links = 0,
  408. };
  409. static struct qcom_icc_node qhs_crypto_cfg = {
  410. .name = "qhs_crypto_cfg",
  411. .id = QDU1000_SLAVE_CRYPTO_0_CFG,
  412. .channels = 1,
  413. .buswidth = 4,
  414. .num_links = 0,
  415. };
  416. static struct qcom_icc_node qhs_ecpri_cfg = {
  417. .name = "qhs_ecpri_cfg",
  418. .id = QDU1000_SLAVE_ECPRI_CFG,
  419. .channels = 1,
  420. .buswidth = 4,
  421. .num_links = 0,
  422. };
  423. static struct qcom_icc_node qhs_imem_cfg = {
  424. .name = "qhs_imem_cfg",
  425. .id = QDU1000_SLAVE_IMEM_CFG,
  426. .channels = 1,
  427. .buswidth = 4,
  428. .num_links = 0,
  429. };
  430. static struct qcom_icc_node qhs_ipc_router = {
  431. .name = "qhs_ipc_router",
  432. .id = QDU1000_SLAVE_IPC_ROUTER_CFG,
  433. .channels = 1,
  434. .buswidth = 4,
  435. .num_links = 0,
  436. };
  437. static struct qcom_icc_node qhs_mss_cfg = {
  438. .name = "qhs_mss_cfg",
  439. .id = QDU1000_SLAVE_CNOC_MSS,
  440. .channels = 1,
  441. .buswidth = 4,
  442. .num_links = 0,
  443. };
  444. static struct qcom_icc_node qhs_pcie_cfg = {
  445. .name = "qhs_pcie_cfg",
  446. .id = QDU1000_SLAVE_PCIE_CFG,
  447. .channels = 1,
  448. .buswidth = 4,
  449. .num_links = 0,
  450. };
  451. static struct qcom_icc_node qhs_pdm = {
  452. .name = "qhs_pdm",
  453. .id = QDU1000_SLAVE_PDM,
  454. .channels = 1,
  455. .buswidth = 4,
  456. .num_links = 0,
  457. };
  458. static struct qcom_icc_node qhs_pimem_cfg = {
  459. .name = "qhs_pimem_cfg",
  460. .id = QDU1000_SLAVE_PIMEM_CFG,
  461. .channels = 1,
  462. .buswidth = 4,
  463. .num_links = 0,
  464. };
  465. static struct qcom_icc_node qhs_prng = {
  466. .name = "qhs_prng",
  467. .id = QDU1000_SLAVE_PRNG,
  468. .channels = 1,
  469. .buswidth = 4,
  470. .num_links = 0,
  471. };
  472. static struct qcom_icc_node qhs_qdss_cfg = {
  473. .name = "qhs_qdss_cfg",
  474. .id = QDU1000_SLAVE_QDSS_CFG,
  475. .channels = 1,
  476. .buswidth = 4,
  477. .num_links = 0,
  478. };
  479. static struct qcom_icc_node qhs_qpic = {
  480. .name = "qhs_qpic",
  481. .id = QDU1000_SLAVE_QPIC,
  482. .channels = 1,
  483. .buswidth = 4,
  484. .num_links = 0,
  485. };
  486. static struct qcom_icc_node qhs_qspi = {
  487. .name = "qhs_qspi",
  488. .id = QDU1000_SLAVE_QSPI_0,
  489. .channels = 1,
  490. .buswidth = 4,
  491. .num_links = 0,
  492. };
  493. static struct qcom_icc_node qhs_qup0 = {
  494. .name = "qhs_qup0",
  495. .id = QDU1000_SLAVE_QUP_0,
  496. .channels = 1,
  497. .buswidth = 4,
  498. .num_links = 0,
  499. };
  500. static struct qcom_icc_node qhs_qup1 = {
  501. .name = "qhs_qup1",
  502. .id = QDU1000_SLAVE_QUP_1,
  503. .channels = 1,
  504. .buswidth = 4,
  505. .num_links = 0,
  506. };
  507. static struct qcom_icc_node qhs_sdc2 = {
  508. .name = "qhs_sdc2",
  509. .id = QDU1000_SLAVE_SDCC_2,
  510. .channels = 1,
  511. .buswidth = 4,
  512. .num_links = 0,
  513. };
  514. static struct qcom_icc_node qhs_smbus_cfg = {
  515. .name = "qhs_smbus_cfg",
  516. .id = QDU1000_SLAVE_SMBUS_CFG,
  517. .channels = 1,
  518. .buswidth = 4,
  519. .num_links = 0,
  520. };
  521. static struct qcom_icc_node qhs_system_noc_cfg = {
  522. .name = "qhs_system_noc_cfg",
  523. .id = QDU1000_SLAVE_SNOC_CFG,
  524. .channels = 1,
  525. .buswidth = 4,
  526. .num_links = 1,
  527. .links = { QDU1000_MASTER_SNOC_CFG },
  528. };
  529. static struct qcom_icc_node qhs_tcsr = {
  530. .name = "qhs_tcsr",
  531. .id = QDU1000_SLAVE_TCSR,
  532. .channels = 1,
  533. .buswidth = 4,
  534. .num_links = 0,
  535. };
  536. static struct qcom_icc_node qhs_tlmm = {
  537. .name = "qhs_tlmm",
  538. .id = QDU1000_SLAVE_TLMM,
  539. .channels = 1,
  540. .buswidth = 4,
  541. .num_links = 0,
  542. };
  543. static struct qcom_icc_node qhs_tme_cfg = {
  544. .name = "qhs_tme_cfg",
  545. .id = QDU1000_SLAVE_TME_CFG,
  546. .channels = 1,
  547. .buswidth = 4,
  548. .num_links = 0,
  549. };
  550. static struct qcom_icc_node qhs_tsc_cfg = {
  551. .name = "qhs_tsc_cfg",
  552. .id = QDU1000_SLAVE_TSC_CFG,
  553. .channels = 1,
  554. .buswidth = 4,
  555. .num_links = 0,
  556. };
  557. static struct qcom_icc_node qhs_usb3 = {
  558. .name = "qhs_usb3",
  559. .id = QDU1000_SLAVE_USB3_0,
  560. .channels = 1,
  561. .buswidth = 4,
  562. .num_links = 0,
  563. };
  564. static struct qcom_icc_node qhs_vsense_ctrl_cfg = {
  565. .name = "qhs_vsense_ctrl_cfg",
  566. .id = QDU1000_SLAVE_VSENSE_CTRL_CFG,
  567. .channels = 1,
  568. .buswidth = 4,
  569. .num_links = 0,
  570. };
  571. static struct qcom_icc_node qns_a1noc_snoc = {
  572. .name = "qns_a1noc_snoc",
  573. .id = QDU1000_SLAVE_A1NOC_SNOC,
  574. .channels = 1,
  575. .buswidth = 8,
  576. .num_links = 1,
  577. .links = { QDU1000_MASTER_ANOC_SNOC },
  578. };
  579. static struct qcom_icc_node qns_anoc_snoc_gsi = {
  580. .name = "qns_anoc_snoc_gsi",
  581. .id = QDU1000_SLAVE_ANOC_SNOC_GSI,
  582. .channels = 1,
  583. .buswidth = 8,
  584. .num_links = 1,
  585. .links = { QDU1000_MASTER_ANOC_GSI },
  586. };
  587. static struct qcom_icc_node qns_ddrss_cfg = {
  588. .name = "qns_ddrss_cfg",
  589. .id = QDU1000_SLAVE_DDRSS_CFG,
  590. .channels = 1,
  591. .buswidth = 4,
  592. .num_links = 0,
  593. };
  594. static struct qcom_icc_node qns_ecpri_gemnoc = {
  595. .name = "qns_ecpri_gemnoc",
  596. .id = QDU1000_SLAVE_ECPRI_GEMNOC,
  597. .channels = 2,
  598. .buswidth = 32,
  599. .num_links = 1,
  600. .links = { QDU1000_MASTER_GEMNOC_ECPRI_DMA },
  601. };
  602. static struct qcom_icc_node qns_gemnoc_gc = {
  603. .name = "qns_gemnoc_gc",
  604. .id = QDU1000_SLAVE_SNOC_GEM_NOC_GC,
  605. .channels = 1,
  606. .buswidth = 8,
  607. .num_links = 1,
  608. .links = { QDU1000_MASTER_SNOC_GC_MEM_NOC },
  609. };
  610. static struct qcom_icc_node qns_gemnoc_sf = {
  611. .name = "qns_gemnoc_sf",
  612. .id = QDU1000_SLAVE_SNOC_GEM_NOC_SF,
  613. .channels = 1,
  614. .buswidth = 16,
  615. .num_links = 1,
  616. .links = { QDU1000_MASTER_SNOC_SF_MEM_NOC },
  617. };
  618. static struct qcom_icc_node qns_modem = {
  619. .name = "qns_modem",
  620. .id = QDU1000_SLAVE_MODEM_OFFLINE,
  621. .channels = 1,
  622. .buswidth = 32,
  623. .num_links = 0,
  624. };
  625. static struct qcom_icc_node qns_pcie_gemnoc = {
  626. .name = "qns_pcie_gemnoc",
  627. .id = QDU1000_SLAVE_ANOC_PCIE_GEM_NOC,
  628. .channels = 1,
  629. .buswidth = 64,
  630. .num_links = 1,
  631. .links = { QDU1000_MASTER_ANOC_PCIE_GEM_NOC },
  632. };
  633. static struct qcom_icc_node qxs_imem = {
  634. .name = "qxs_imem",
  635. .id = QDU1000_SLAVE_IMEM,
  636. .channels = 1,
  637. .buswidth = 8,
  638. .num_links = 0,
  639. };
  640. static struct qcom_icc_node qxs_pimem = {
  641. .name = "qxs_pimem",
  642. .id = QDU1000_SLAVE_PIMEM,
  643. .channels = 1,
  644. .buswidth = 8,
  645. .num_links = 0,
  646. };
  647. static struct qcom_icc_node srvc_system_noc = {
  648. .name = "srvc_system_noc",
  649. .id = QDU1000_SLAVE_SERVICE_SNOC,
  650. .channels = 1,
  651. .buswidth = 4,
  652. .num_links = 0,
  653. };
  654. static struct qcom_icc_node xs_ethernet_ss = {
  655. .name = "xs_ethernet_ss",
  656. .id = QDU1000_SLAVE_ETHERNET_SS,
  657. .channels = 1,
  658. .buswidth = 32,
  659. .num_links = 0,
  660. };
  661. static struct qcom_icc_node xs_pcie = {
  662. .name = "xs_pcie",
  663. .id = QDU1000_SLAVE_PCIE_0,
  664. .channels = 1,
  665. .buswidth = 64,
  666. .num_links = 0,
  667. };
  668. static struct qcom_icc_node xs_qdss_stm = {
  669. .name = "xs_qdss_stm",
  670. .id = QDU1000_SLAVE_QDSS_STM,
  671. .channels = 1,
  672. .buswidth = 4,
  673. .num_links = 0,
  674. };
  675. static struct qcom_icc_node xs_sys_tcu_cfg = {
  676. .name = "xs_sys_tcu_cfg",
  677. .id = QDU1000_SLAVE_TCU,
  678. .channels = 1,
  679. .buswidth = 8,
  680. .num_links = 0,
  681. };
  682. static struct qcom_icc_bcm bcm_acv = {
  683. .name = "ACV",
  684. .enable_mask = BIT(3),
  685. .num_nodes = 1,
  686. .nodes = { &ebi },
  687. };
  688. static struct qcom_icc_bcm bcm_ce0 = {
  689. .name = "CE0",
  690. .num_nodes = 1,
  691. .nodes = { &qxm_crypto },
  692. };
  693. static struct qcom_icc_bcm bcm_cn0 = {
  694. .name = "CN0",
  695. .num_nodes = 44,
  696. .nodes = { &qhm_qpic, &qhm_qspi,
  697. &qnm_gemnoc_cnoc, &qnm_gemnoc_modem_slave,
  698. &qnm_gemnoc_pcie, &xm_sdc,
  699. &xm_usb3, &qhs_ahb2phy0_south,
  700. &qhs_ahb2phy1_north, &qhs_ahb2phy2_east,
  701. &qhs_aoss, &qhs_clk_ctl,
  702. &qhs_cpr_cx, &qhs_cpr_mx,
  703. &qhs_crypto_cfg, &qhs_ecpri_cfg,
  704. &qhs_imem_cfg, &qhs_ipc_router,
  705. &qhs_mss_cfg, &qhs_pcie_cfg,
  706. &qhs_pdm, &qhs_pimem_cfg,
  707. &qhs_prng, &qhs_qdss_cfg,
  708. &qhs_qpic, &qhs_qspi,
  709. &qhs_qup0, &qhs_qup1,
  710. &qhs_sdc2, &qhs_smbus_cfg,
  711. &qhs_system_noc_cfg, &qhs_tcsr,
  712. &qhs_tlmm, &qhs_tme_cfg,
  713. &qhs_tsc_cfg, &qhs_usb3,
  714. &qhs_vsense_ctrl_cfg, &qns_ddrss_cfg,
  715. &qns_modem, &qxs_imem,
  716. &qxs_pimem, &xs_ethernet_ss,
  717. &xs_qdss_stm, &xs_sys_tcu_cfg
  718. },
  719. };
  720. static struct qcom_icc_bcm bcm_mc0 = {
  721. .name = "MC0",
  722. .num_nodes = 1,
  723. .nodes = { &ebi },
  724. };
  725. static struct qcom_icc_bcm bcm_qup0 = {
  726. .name = "QUP0",
  727. .num_nodes = 2,
  728. .nodes = { &qup0_core_slave, &qup1_core_slave },
  729. };
  730. static struct qcom_icc_bcm bcm_sh0 = {
  731. .name = "SH0",
  732. .num_nodes = 1,
  733. .nodes = { &qns_llcc },
  734. };
  735. static struct qcom_icc_bcm bcm_sh1 = {
  736. .name = "SH1",
  737. .num_nodes = 11,
  738. .nodes = { &alm_sys_tcu, &chm_apps,
  739. &qnm_ecpri_dma, &qnm_fec_2_gemnoc,
  740. &qnm_pcie, &qnm_snoc_gc,
  741. &qnm_snoc_sf, &qxm_mdsp,
  742. &qns_gem_noc_cnoc, &qns_modem_slave,
  743. &qns_pcie
  744. },
  745. };
  746. static struct qcom_icc_bcm bcm_sn0 = {
  747. .name = "SN0",
  748. .num_nodes = 1,
  749. .nodes = { &qns_gemnoc_sf },
  750. };
  751. static struct qcom_icc_bcm bcm_sn1 = {
  752. .name = "SN1",
  753. .num_nodes = 6,
  754. .nodes = { &qhm_gic, &qxm_pimem,
  755. &xm_gic, &xm_qdss_etr0,
  756. &xm_qdss_etr1, &qns_gemnoc_gc
  757. },
  758. };
  759. static struct qcom_icc_bcm bcm_sn2 = {
  760. .name = "SN2",
  761. .num_nodes = 5,
  762. .nodes = { &qnm_aggre_noc, &qxm_ecpri_gsi,
  763. &xm_ecpri_dma, &qns_anoc_snoc_gsi,
  764. &qns_ecpri_gemnoc
  765. },
  766. };
  767. static struct qcom_icc_bcm bcm_sn7 = {
  768. .name = "SN7",
  769. .num_nodes = 2,
  770. .nodes = { &qns_pcie_gemnoc, &xs_pcie },
  771. };
  772. static struct qcom_icc_bcm * const clk_virt_bcms[] = {
  773. &bcm_qup0,
  774. };
  775. static struct qcom_icc_node * const clk_virt_nodes[] = {
  776. [MASTER_QUP_CORE_0] = &qup0_core_master,
  777. [MASTER_QUP_CORE_1] = &qup1_core_master,
  778. [SLAVE_QUP_CORE_0] = &qup0_core_slave,
  779. [SLAVE_QUP_CORE_1] = &qup1_core_slave,
  780. };
  781. static const struct qcom_icc_desc qdu1000_clk_virt = {
  782. .nodes = clk_virt_nodes,
  783. .num_nodes = ARRAY_SIZE(clk_virt_nodes),
  784. .bcms = clk_virt_bcms,
  785. .num_bcms = ARRAY_SIZE(clk_virt_bcms),
  786. };
  787. static struct qcom_icc_bcm * const gem_noc_bcms[] = {
  788. &bcm_sh0,
  789. &bcm_sh1,
  790. };
  791. static struct qcom_icc_node * const gem_noc_nodes[] = {
  792. [MASTER_SYS_TCU] = &alm_sys_tcu,
  793. [MASTER_APPSS_PROC] = &chm_apps,
  794. [MASTER_GEMNOC_ECPRI_DMA] = &qnm_ecpri_dma,
  795. [MASTER_FEC_2_GEMNOC] = &qnm_fec_2_gemnoc,
  796. [MASTER_ANOC_PCIE_GEM_NOC] = &qnm_pcie,
  797. [MASTER_SNOC_GC_MEM_NOC] = &qnm_snoc_gc,
  798. [MASTER_SNOC_SF_MEM_NOC] = &qnm_snoc_sf,
  799. [MASTER_MSS_PROC] = &qxm_mdsp,
  800. [SLAVE_GEM_NOC_CNOC] = &qns_gem_noc_cnoc,
  801. [SLAVE_LLCC] = &qns_llcc,
  802. [SLAVE_GEMNOC_MODEM_CNOC] = &qns_modem_slave,
  803. [SLAVE_MEM_NOC_PCIE_SNOC] = &qns_pcie,
  804. };
  805. static const struct qcom_icc_desc qdu1000_gem_noc = {
  806. .nodes = gem_noc_nodes,
  807. .num_nodes = ARRAY_SIZE(gem_noc_nodes),
  808. .bcms = gem_noc_bcms,
  809. .num_bcms = ARRAY_SIZE(gem_noc_bcms),
  810. };
  811. static struct qcom_icc_bcm * const mc_virt_bcms[] = {
  812. &bcm_acv,
  813. &bcm_mc0,
  814. };
  815. static struct qcom_icc_node * const mc_virt_nodes[] = {
  816. [MASTER_LLCC] = &llcc_mc,
  817. [SLAVE_EBI1] = &ebi,
  818. };
  819. static const struct qcom_icc_desc qdu1000_mc_virt = {
  820. .nodes = mc_virt_nodes,
  821. .num_nodes = ARRAY_SIZE(mc_virt_nodes),
  822. .bcms = mc_virt_bcms,
  823. .num_bcms = ARRAY_SIZE(mc_virt_bcms),
  824. };
  825. static struct qcom_icc_bcm * const system_noc_bcms[] = {
  826. &bcm_ce0,
  827. &bcm_cn0,
  828. &bcm_sn0,
  829. &bcm_sn1,
  830. &bcm_sn2,
  831. &bcm_sn7,
  832. };
  833. static struct qcom_icc_node * const system_noc_nodes[] = {
  834. [MASTER_GIC_AHB] = &qhm_gic,
  835. [MASTER_QDSS_BAM] = &qhm_qdss_bam,
  836. [MASTER_QPIC] = &qhm_qpic,
  837. [MASTER_QSPI_0] = &qhm_qspi,
  838. [MASTER_QUP_0] = &qhm_qup0,
  839. [MASTER_QUP_1] = &qhm_qup1,
  840. [MASTER_SNOC_CFG] = &qhm_system_noc_cfg,
  841. [MASTER_ANOC_SNOC] = &qnm_aggre_noc,
  842. [MASTER_ANOC_GSI] = &qnm_aggre_noc_gsi,
  843. [MASTER_GEM_NOC_CNOC] = &qnm_gemnoc_cnoc,
  844. [MASTER_GEMNOC_MODEM_CNOC] = &qnm_gemnoc_modem_slave,
  845. [MASTER_GEM_NOC_PCIE_SNOC] = &qnm_gemnoc_pcie,
  846. [MASTER_CRYPTO] = &qxm_crypto,
  847. [MASTER_ECPRI_GSI] = &qxm_ecpri_gsi,
  848. [MASTER_PIMEM] = &qxm_pimem,
  849. [MASTER_SNOC_ECPRI_DMA] = &xm_ecpri_dma,
  850. [MASTER_GIC] = &xm_gic,
  851. [MASTER_PCIE] = &xm_pcie,
  852. [MASTER_QDSS_ETR] = &xm_qdss_etr0,
  853. [MASTER_QDSS_ETR_1] = &xm_qdss_etr1,
  854. [MASTER_SDCC_1] = &xm_sdc,
  855. [MASTER_USB3] = &xm_usb3,
  856. [SLAVE_AHB2PHY_SOUTH] = &qhs_ahb2phy0_south,
  857. [SLAVE_AHB2PHY_NORTH] = &qhs_ahb2phy1_north,
  858. [SLAVE_AHB2PHY_EAST] = &qhs_ahb2phy2_east,
  859. [SLAVE_AOSS] = &qhs_aoss,
  860. [SLAVE_CLK_CTL] = &qhs_clk_ctl,
  861. [SLAVE_RBCPR_CX_CFG] = &qhs_cpr_cx,
  862. [SLAVE_RBCPR_MX_CFG] = &qhs_cpr_mx,
  863. [SLAVE_CRYPTO_0_CFG] = &qhs_crypto_cfg,
  864. [SLAVE_ECPRI_CFG] = &qhs_ecpri_cfg,
  865. [SLAVE_IMEM_CFG] = &qhs_imem_cfg,
  866. [SLAVE_IPC_ROUTER_CFG] = &qhs_ipc_router,
  867. [SLAVE_CNOC_MSS] = &qhs_mss_cfg,
  868. [SLAVE_PCIE_CFG] = &qhs_pcie_cfg,
  869. [SLAVE_PDM] = &qhs_pdm,
  870. [SLAVE_PIMEM_CFG] = &qhs_pimem_cfg,
  871. [SLAVE_PRNG] = &qhs_prng,
  872. [SLAVE_QDSS_CFG] = &qhs_qdss_cfg,
  873. [SLAVE_QPIC] = &qhs_qpic,
  874. [SLAVE_QSPI_0] = &qhs_qspi,
  875. [SLAVE_QUP_0] = &qhs_qup0,
  876. [SLAVE_QUP_1] = &qhs_qup1,
  877. [SLAVE_SDCC_2] = &qhs_sdc2,
  878. [SLAVE_SMBUS_CFG] = &qhs_smbus_cfg,
  879. [SLAVE_SNOC_CFG] = &qhs_system_noc_cfg,
  880. [SLAVE_TCSR] = &qhs_tcsr,
  881. [SLAVE_TLMM] = &qhs_tlmm,
  882. [SLAVE_TME_CFG] = &qhs_tme_cfg,
  883. [SLAVE_TSC_CFG] = &qhs_tsc_cfg,
  884. [SLAVE_USB3_0] = &qhs_usb3,
  885. [SLAVE_VSENSE_CTRL_CFG] = &qhs_vsense_ctrl_cfg,
  886. [SLAVE_A1NOC_SNOC] = &qns_a1noc_snoc,
  887. [SLAVE_ANOC_SNOC_GSI] = &qns_anoc_snoc_gsi,
  888. [SLAVE_DDRSS_CFG] = &qns_ddrss_cfg,
  889. [SLAVE_ECPRI_GEMNOC] = &qns_ecpri_gemnoc,
  890. [SLAVE_SNOC_GEM_NOC_GC] = &qns_gemnoc_gc,
  891. [SLAVE_SNOC_GEM_NOC_SF] = &qns_gemnoc_sf,
  892. [SLAVE_MODEM_OFFLINE] = &qns_modem,
  893. [SLAVE_ANOC_PCIE_GEM_NOC] = &qns_pcie_gemnoc,
  894. [SLAVE_IMEM] = &qxs_imem,
  895. [SLAVE_PIMEM] = &qxs_pimem,
  896. [SLAVE_SERVICE_SNOC] = &srvc_system_noc,
  897. [SLAVE_ETHERNET_SS] = &xs_ethernet_ss,
  898. [SLAVE_PCIE_0] = &xs_pcie,
  899. [SLAVE_QDSS_STM] = &xs_qdss_stm,
  900. [SLAVE_TCU] = &xs_sys_tcu_cfg,
  901. };
  902. static const struct qcom_icc_desc qdu1000_system_noc = {
  903. .nodes = system_noc_nodes,
  904. .num_nodes = ARRAY_SIZE(system_noc_nodes),
  905. .bcms = system_noc_bcms,
  906. .num_bcms = ARRAY_SIZE(system_noc_bcms),
  907. };
  908. static int qnoc_probe(struct platform_device *pdev)
  909. {
  910. int ret;
  911. ret = qcom_icc_rpmh_probe(pdev);
  912. if (ret)
  913. dev_err(&pdev->dev, "failed to register ICC provider\n");
  914. return ret;
  915. }
  916. static const struct of_device_id qnoc_of_match[] = {
  917. { .compatible = "qcom,qdu1000-clk-virt",
  918. .data = &qdu1000_clk_virt
  919. },
  920. { .compatible = "qcom,qdu1000-gem-noc",
  921. .data = &qdu1000_gem_noc
  922. },
  923. { .compatible = "qcom,qdu1000-mc-virt",
  924. .data = &qdu1000_mc_virt
  925. },
  926. { .compatible = "qcom,qdu1000-system-noc",
  927. .data = &qdu1000_system_noc
  928. },
  929. { }
  930. };
  931. MODULE_DEVICE_TABLE(of, qnoc_of_match);
  932. static struct platform_driver qnoc_driver = {
  933. .probe = qnoc_probe,
  934. .remove_new = qcom_icc_rpmh_remove,
  935. .driver = {
  936. .name = "qnoc-qdu1000",
  937. .of_match_table = qnoc_of_match,
  938. },
  939. };
  940. static int __init qnoc_driver_init(void)
  941. {
  942. return platform_driver_register(&qnoc_driver);
  943. }
  944. core_initcall(qnoc_driver_init);
  945. static void __exit qnoc_driver_exit(void)
  946. {
  947. platform_driver_unregister(&qnoc_driver);
  948. }
  949. module_exit(qnoc_driver_exit);
  950. MODULE_DESCRIPTION("QDU1000 NoC driver");
  951. MODULE_LICENSE("GPL");