qcs404.c 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2019 Linaro Ltd
  4. */
  5. #include <dt-bindings/interconnect/qcom,qcs404.h>
  6. #include <linux/clk.h>
  7. #include <linux/device.h>
  8. #include <linux/interconnect-provider.h>
  9. #include <linux/io.h>
  10. #include <linux/module.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/of_device.h>
  13. #include "smd-rpm.h"
  14. #include "icc-rpm.h"
  15. enum {
  16. QCS404_MASTER_AMPSS_M0 = 1,
  17. QCS404_MASTER_GRAPHICS_3D,
  18. QCS404_MASTER_MDP_PORT0,
  19. QCS404_SNOC_BIMC_1_MAS,
  20. QCS404_MASTER_TCU_0,
  21. QCS404_MASTER_SPDM,
  22. QCS404_MASTER_BLSP_1,
  23. QCS404_MASTER_BLSP_2,
  24. QCS404_MASTER_XM_USB_HS1,
  25. QCS404_MASTER_CRYPTO_CORE0,
  26. QCS404_MASTER_SDCC_1,
  27. QCS404_MASTER_SDCC_2,
  28. QCS404_SNOC_PNOC_MAS,
  29. QCS404_MASTER_QPIC,
  30. QCS404_MASTER_QDSS_BAM,
  31. QCS404_BIMC_SNOC_MAS,
  32. QCS404_PNOC_SNOC_MAS,
  33. QCS404_MASTER_QDSS_ETR,
  34. QCS404_MASTER_EMAC,
  35. QCS404_MASTER_PCIE,
  36. QCS404_MASTER_USB3,
  37. QCS404_PNOC_INT_0,
  38. QCS404_PNOC_INT_2,
  39. QCS404_PNOC_INT_3,
  40. QCS404_PNOC_SLV_0,
  41. QCS404_PNOC_SLV_1,
  42. QCS404_PNOC_SLV_2,
  43. QCS404_PNOC_SLV_3,
  44. QCS404_PNOC_SLV_4,
  45. QCS404_PNOC_SLV_6,
  46. QCS404_PNOC_SLV_7,
  47. QCS404_PNOC_SLV_8,
  48. QCS404_PNOC_SLV_9,
  49. QCS404_PNOC_SLV_10,
  50. QCS404_PNOC_SLV_11,
  51. QCS404_SNOC_QDSS_INT,
  52. QCS404_SNOC_INT_0,
  53. QCS404_SNOC_INT_1,
  54. QCS404_SNOC_INT_2,
  55. QCS404_SLAVE_EBI_CH0,
  56. QCS404_BIMC_SNOC_SLV,
  57. QCS404_SLAVE_SPDM_WRAPPER,
  58. QCS404_SLAVE_PDM,
  59. QCS404_SLAVE_PRNG,
  60. QCS404_SLAVE_TCSR,
  61. QCS404_SLAVE_SNOC_CFG,
  62. QCS404_SLAVE_MESSAGE_RAM,
  63. QCS404_SLAVE_DISPLAY_CFG,
  64. QCS404_SLAVE_GRAPHICS_3D_CFG,
  65. QCS404_SLAVE_BLSP_1,
  66. QCS404_SLAVE_TLMM_NORTH,
  67. QCS404_SLAVE_PCIE_1,
  68. QCS404_SLAVE_EMAC_CFG,
  69. QCS404_SLAVE_BLSP_2,
  70. QCS404_SLAVE_TLMM_EAST,
  71. QCS404_SLAVE_TCU,
  72. QCS404_SLAVE_PMIC_ARB,
  73. QCS404_SLAVE_SDCC_1,
  74. QCS404_SLAVE_SDCC_2,
  75. QCS404_SLAVE_TLMM_SOUTH,
  76. QCS404_SLAVE_USB_HS,
  77. QCS404_SLAVE_USB3,
  78. QCS404_SLAVE_CRYPTO_0_CFG,
  79. QCS404_PNOC_SNOC_SLV,
  80. QCS404_SLAVE_APPSS,
  81. QCS404_SLAVE_WCSS,
  82. QCS404_SNOC_BIMC_1_SLV,
  83. QCS404_SLAVE_OCIMEM,
  84. QCS404_SNOC_PNOC_SLV,
  85. QCS404_SLAVE_QDSS_STM,
  86. QCS404_SLAVE_CATS_128,
  87. QCS404_SLAVE_OCMEM_64,
  88. QCS404_SLAVE_LPASS,
  89. };
  90. static const u16 mas_apps_proc_links[] = {
  91. QCS404_SLAVE_EBI_CH0,
  92. QCS404_BIMC_SNOC_SLV
  93. };
  94. static struct qcom_icc_node mas_apps_proc = {
  95. .name = "mas_apps_proc",
  96. .id = QCS404_MASTER_AMPSS_M0,
  97. .buswidth = 8,
  98. .mas_rpm_id = 0,
  99. .slv_rpm_id = -1,
  100. .num_links = ARRAY_SIZE(mas_apps_proc_links),
  101. .links = mas_apps_proc_links,
  102. };
  103. static const u16 mas_oxili_links[] = {
  104. QCS404_SLAVE_EBI_CH0,
  105. QCS404_BIMC_SNOC_SLV
  106. };
  107. static struct qcom_icc_node mas_oxili = {
  108. .name = "mas_oxili",
  109. .id = QCS404_MASTER_GRAPHICS_3D,
  110. .buswidth = 8,
  111. .mas_rpm_id = -1,
  112. .slv_rpm_id = -1,
  113. .num_links = ARRAY_SIZE(mas_oxili_links),
  114. .links = mas_oxili_links,
  115. };
  116. static const u16 mas_mdp_links[] = {
  117. QCS404_SLAVE_EBI_CH0,
  118. QCS404_BIMC_SNOC_SLV
  119. };
  120. static struct qcom_icc_node mas_mdp = {
  121. .name = "mas_mdp",
  122. .id = QCS404_MASTER_MDP_PORT0,
  123. .buswidth = 8,
  124. .mas_rpm_id = -1,
  125. .slv_rpm_id = -1,
  126. .num_links = ARRAY_SIZE(mas_mdp_links),
  127. .links = mas_mdp_links,
  128. };
  129. static const u16 mas_snoc_bimc_1_links[] = {
  130. QCS404_SLAVE_EBI_CH0
  131. };
  132. static struct qcom_icc_node mas_snoc_bimc_1 = {
  133. .name = "mas_snoc_bimc_1",
  134. .id = QCS404_SNOC_BIMC_1_MAS,
  135. .buswidth = 8,
  136. .mas_rpm_id = 76,
  137. .slv_rpm_id = -1,
  138. .num_links = ARRAY_SIZE(mas_snoc_bimc_1_links),
  139. .links = mas_snoc_bimc_1_links,
  140. };
  141. static const u16 mas_tcu_0_links[] = {
  142. QCS404_SLAVE_EBI_CH0,
  143. QCS404_BIMC_SNOC_SLV
  144. };
  145. static struct qcom_icc_node mas_tcu_0 = {
  146. .name = "mas_tcu_0",
  147. .id = QCS404_MASTER_TCU_0,
  148. .buswidth = 8,
  149. .mas_rpm_id = -1,
  150. .slv_rpm_id = -1,
  151. .num_links = ARRAY_SIZE(mas_tcu_0_links),
  152. .links = mas_tcu_0_links,
  153. };
  154. static const u16 mas_spdm_links[] = {
  155. QCS404_PNOC_INT_3
  156. };
  157. static struct qcom_icc_node mas_spdm = {
  158. .name = "mas_spdm",
  159. .id = QCS404_MASTER_SPDM,
  160. .buswidth = 4,
  161. .mas_rpm_id = -1,
  162. .slv_rpm_id = -1,
  163. .num_links = ARRAY_SIZE(mas_spdm_links),
  164. .links = mas_spdm_links,
  165. };
  166. static const u16 mas_blsp_1_links[] = {
  167. QCS404_PNOC_INT_3
  168. };
  169. static struct qcom_icc_node mas_blsp_1 = {
  170. .name = "mas_blsp_1",
  171. .id = QCS404_MASTER_BLSP_1,
  172. .buswidth = 4,
  173. .mas_rpm_id = 41,
  174. .slv_rpm_id = -1,
  175. .num_links = ARRAY_SIZE(mas_blsp_1_links),
  176. .links = mas_blsp_1_links,
  177. };
  178. static const u16 mas_blsp_2_links[] = {
  179. QCS404_PNOC_INT_3
  180. };
  181. static struct qcom_icc_node mas_blsp_2 = {
  182. .name = "mas_blsp_2",
  183. .id = QCS404_MASTER_BLSP_2,
  184. .buswidth = 4,
  185. .mas_rpm_id = 39,
  186. .slv_rpm_id = -1,
  187. .num_links = ARRAY_SIZE(mas_blsp_2_links),
  188. .links = mas_blsp_2_links,
  189. };
  190. static const u16 mas_xi_usb_hs1_links[] = {
  191. QCS404_PNOC_INT_0
  192. };
  193. static struct qcom_icc_node mas_xi_usb_hs1 = {
  194. .name = "mas_xi_usb_hs1",
  195. .id = QCS404_MASTER_XM_USB_HS1,
  196. .buswidth = 8,
  197. .mas_rpm_id = 138,
  198. .slv_rpm_id = -1,
  199. .num_links = ARRAY_SIZE(mas_xi_usb_hs1_links),
  200. .links = mas_xi_usb_hs1_links,
  201. };
  202. static const u16 mas_crypto_links[] = {
  203. QCS404_PNOC_SNOC_SLV,
  204. QCS404_PNOC_INT_2
  205. };
  206. static struct qcom_icc_node mas_crypto = {
  207. .name = "mas_crypto",
  208. .id = QCS404_MASTER_CRYPTO_CORE0,
  209. .buswidth = 8,
  210. .mas_rpm_id = 23,
  211. .slv_rpm_id = -1,
  212. .num_links = ARRAY_SIZE(mas_crypto_links),
  213. .links = mas_crypto_links,
  214. };
  215. static const u16 mas_sdcc_1_links[] = {
  216. QCS404_PNOC_INT_0
  217. };
  218. static struct qcom_icc_node mas_sdcc_1 = {
  219. .name = "mas_sdcc_1",
  220. .id = QCS404_MASTER_SDCC_1,
  221. .buswidth = 8,
  222. .mas_rpm_id = 33,
  223. .slv_rpm_id = -1,
  224. .num_links = ARRAY_SIZE(mas_sdcc_1_links),
  225. .links = mas_sdcc_1_links,
  226. };
  227. static const u16 mas_sdcc_2_links[] = {
  228. QCS404_PNOC_INT_0
  229. };
  230. static struct qcom_icc_node mas_sdcc_2 = {
  231. .name = "mas_sdcc_2",
  232. .id = QCS404_MASTER_SDCC_2,
  233. .buswidth = 8,
  234. .mas_rpm_id = 35,
  235. .slv_rpm_id = -1,
  236. .num_links = ARRAY_SIZE(mas_sdcc_2_links),
  237. .links = mas_sdcc_2_links,
  238. };
  239. static const u16 mas_snoc_pcnoc_links[] = {
  240. QCS404_PNOC_INT_2
  241. };
  242. static struct qcom_icc_node mas_snoc_pcnoc = {
  243. .name = "mas_snoc_pcnoc",
  244. .id = QCS404_SNOC_PNOC_MAS,
  245. .buswidth = 8,
  246. .mas_rpm_id = 77,
  247. .slv_rpm_id = -1,
  248. .num_links = ARRAY_SIZE(mas_snoc_pcnoc_links),
  249. .links = mas_snoc_pcnoc_links,
  250. };
  251. static const u16 mas_qpic_links[] = {
  252. QCS404_PNOC_INT_0
  253. };
  254. static struct qcom_icc_node mas_qpic = {
  255. .name = "mas_qpic",
  256. .id = QCS404_MASTER_QPIC,
  257. .buswidth = 4,
  258. .mas_rpm_id = -1,
  259. .slv_rpm_id = -1,
  260. .num_links = ARRAY_SIZE(mas_qpic_links),
  261. .links = mas_qpic_links,
  262. };
  263. static const u16 mas_qdss_bam_links[] = {
  264. QCS404_SNOC_QDSS_INT
  265. };
  266. static struct qcom_icc_node mas_qdss_bam = {
  267. .name = "mas_qdss_bam",
  268. .id = QCS404_MASTER_QDSS_BAM,
  269. .buswidth = 4,
  270. .mas_rpm_id = -1,
  271. .slv_rpm_id = -1,
  272. .num_links = ARRAY_SIZE(mas_qdss_bam_links),
  273. .links = mas_qdss_bam_links,
  274. };
  275. static const u16 mas_bimc_snoc_links[] = {
  276. QCS404_SLAVE_OCMEM_64,
  277. QCS404_SLAVE_CATS_128,
  278. QCS404_SNOC_INT_0,
  279. QCS404_SNOC_INT_1
  280. };
  281. static struct qcom_icc_node mas_bimc_snoc = {
  282. .name = "mas_bimc_snoc",
  283. .id = QCS404_BIMC_SNOC_MAS,
  284. .buswidth = 8,
  285. .mas_rpm_id = 21,
  286. .slv_rpm_id = -1,
  287. .num_links = ARRAY_SIZE(mas_bimc_snoc_links),
  288. .links = mas_bimc_snoc_links,
  289. };
  290. static const u16 mas_pcnoc_snoc_links[] = {
  291. QCS404_SNOC_BIMC_1_SLV,
  292. QCS404_SNOC_INT_2,
  293. QCS404_SNOC_INT_0
  294. };
  295. static struct qcom_icc_node mas_pcnoc_snoc = {
  296. .name = "mas_pcnoc_snoc",
  297. .id = QCS404_PNOC_SNOC_MAS,
  298. .buswidth = 8,
  299. .mas_rpm_id = 29,
  300. .slv_rpm_id = -1,
  301. .num_links = ARRAY_SIZE(mas_pcnoc_snoc_links),
  302. .links = mas_pcnoc_snoc_links,
  303. };
  304. static const u16 mas_qdss_etr_links[] = {
  305. QCS404_SNOC_QDSS_INT
  306. };
  307. static struct qcom_icc_node mas_qdss_etr = {
  308. .name = "mas_qdss_etr",
  309. .id = QCS404_MASTER_QDSS_ETR,
  310. .buswidth = 8,
  311. .mas_rpm_id = -1,
  312. .slv_rpm_id = -1,
  313. .num_links = ARRAY_SIZE(mas_qdss_etr_links),
  314. .links = mas_qdss_etr_links,
  315. };
  316. static const u16 mas_emac_links[] = {
  317. QCS404_SNOC_BIMC_1_SLV,
  318. QCS404_SNOC_INT_1
  319. };
  320. static struct qcom_icc_node mas_emac = {
  321. .name = "mas_emac",
  322. .id = QCS404_MASTER_EMAC,
  323. .buswidth = 8,
  324. .mas_rpm_id = -1,
  325. .slv_rpm_id = -1,
  326. .num_links = ARRAY_SIZE(mas_emac_links),
  327. .links = mas_emac_links,
  328. };
  329. static const u16 mas_pcie_links[] = {
  330. QCS404_SNOC_BIMC_1_SLV,
  331. QCS404_SNOC_INT_1
  332. };
  333. static struct qcom_icc_node mas_pcie = {
  334. .name = "mas_pcie",
  335. .id = QCS404_MASTER_PCIE,
  336. .buswidth = 8,
  337. .mas_rpm_id = -1,
  338. .slv_rpm_id = -1,
  339. .num_links = ARRAY_SIZE(mas_pcie_links),
  340. .links = mas_pcie_links,
  341. };
  342. static const u16 mas_usb3_links[] = {
  343. QCS404_SNOC_BIMC_1_SLV,
  344. QCS404_SNOC_INT_1
  345. };
  346. static struct qcom_icc_node mas_usb3 = {
  347. .name = "mas_usb3",
  348. .id = QCS404_MASTER_USB3,
  349. .buswidth = 8,
  350. .mas_rpm_id = -1,
  351. .slv_rpm_id = -1,
  352. .num_links = ARRAY_SIZE(mas_usb3_links),
  353. .links = mas_usb3_links,
  354. };
  355. static const u16 pcnoc_int_0_links[] = {
  356. QCS404_PNOC_SNOC_SLV,
  357. QCS404_PNOC_INT_2
  358. };
  359. static struct qcom_icc_node pcnoc_int_0 = {
  360. .name = "pcnoc_int_0",
  361. .id = QCS404_PNOC_INT_0,
  362. .buswidth = 8,
  363. .mas_rpm_id = 85,
  364. .slv_rpm_id = 114,
  365. .num_links = ARRAY_SIZE(pcnoc_int_0_links),
  366. .links = pcnoc_int_0_links,
  367. };
  368. static const u16 pcnoc_int_2_links[] = {
  369. QCS404_PNOC_SLV_10,
  370. QCS404_SLAVE_TCU,
  371. QCS404_PNOC_SLV_11,
  372. QCS404_PNOC_SLV_2,
  373. QCS404_PNOC_SLV_3,
  374. QCS404_PNOC_SLV_0,
  375. QCS404_PNOC_SLV_1,
  376. QCS404_PNOC_SLV_6,
  377. QCS404_PNOC_SLV_7,
  378. QCS404_PNOC_SLV_4,
  379. QCS404_PNOC_SLV_8,
  380. QCS404_PNOC_SLV_9
  381. };
  382. static struct qcom_icc_node pcnoc_int_2 = {
  383. .name = "pcnoc_int_2",
  384. .id = QCS404_PNOC_INT_2,
  385. .buswidth = 8,
  386. .mas_rpm_id = 124,
  387. .slv_rpm_id = 184,
  388. .num_links = ARRAY_SIZE(pcnoc_int_2_links),
  389. .links = pcnoc_int_2_links,
  390. };
  391. static const u16 pcnoc_int_3_links[] = {
  392. QCS404_PNOC_SNOC_SLV
  393. };
  394. static struct qcom_icc_node pcnoc_int_3 = {
  395. .name = "pcnoc_int_3",
  396. .id = QCS404_PNOC_INT_3,
  397. .buswidth = 8,
  398. .mas_rpm_id = 125,
  399. .slv_rpm_id = 185,
  400. .num_links = ARRAY_SIZE(pcnoc_int_3_links),
  401. .links = pcnoc_int_3_links,
  402. };
  403. static const u16 pcnoc_s_0_links[] = {
  404. QCS404_SLAVE_PRNG,
  405. QCS404_SLAVE_SPDM_WRAPPER,
  406. QCS404_SLAVE_PDM
  407. };
  408. static struct qcom_icc_node pcnoc_s_0 = {
  409. .name = "pcnoc_s_0",
  410. .id = QCS404_PNOC_SLV_0,
  411. .buswidth = 4,
  412. .mas_rpm_id = 89,
  413. .slv_rpm_id = 118,
  414. .num_links = ARRAY_SIZE(pcnoc_s_0_links),
  415. .links = pcnoc_s_0_links,
  416. };
  417. static const u16 pcnoc_s_1_links[] = {
  418. QCS404_SLAVE_TCSR
  419. };
  420. static struct qcom_icc_node pcnoc_s_1 = {
  421. .name = "pcnoc_s_1",
  422. .id = QCS404_PNOC_SLV_1,
  423. .buswidth = 4,
  424. .mas_rpm_id = 90,
  425. .slv_rpm_id = 119,
  426. .num_links = ARRAY_SIZE(pcnoc_s_1_links),
  427. .links = pcnoc_s_1_links,
  428. };
  429. static const u16 pcnoc_s_2_links[] = {
  430. QCS404_SLAVE_GRAPHICS_3D_CFG
  431. };
  432. static struct qcom_icc_node pcnoc_s_2 = {
  433. .name = "pcnoc_s_2",
  434. .id = QCS404_PNOC_SLV_2,
  435. .buswidth = 4,
  436. .mas_rpm_id = -1,
  437. .slv_rpm_id = -1,
  438. .num_links = ARRAY_SIZE(pcnoc_s_2_links),
  439. .links = pcnoc_s_2_links,
  440. };
  441. static const u16 pcnoc_s_3_links[] = {
  442. QCS404_SLAVE_MESSAGE_RAM
  443. };
  444. static struct qcom_icc_node pcnoc_s_3 = {
  445. .name = "pcnoc_s_3",
  446. .id = QCS404_PNOC_SLV_3,
  447. .buswidth = 4,
  448. .mas_rpm_id = 92,
  449. .slv_rpm_id = 121,
  450. .num_links = ARRAY_SIZE(pcnoc_s_3_links),
  451. .links = pcnoc_s_3_links,
  452. };
  453. static const u16 pcnoc_s_4_links[] = {
  454. QCS404_SLAVE_SNOC_CFG
  455. };
  456. static struct qcom_icc_node pcnoc_s_4 = {
  457. .name = "pcnoc_s_4",
  458. .id = QCS404_PNOC_SLV_4,
  459. .buswidth = 4,
  460. .mas_rpm_id = 93,
  461. .slv_rpm_id = 122,
  462. .num_links = ARRAY_SIZE(pcnoc_s_4_links),
  463. .links = pcnoc_s_4_links,
  464. };
  465. static const u16 pcnoc_s_6_links[] = {
  466. QCS404_SLAVE_BLSP_1,
  467. QCS404_SLAVE_TLMM_NORTH,
  468. QCS404_SLAVE_EMAC_CFG
  469. };
  470. static struct qcom_icc_node pcnoc_s_6 = {
  471. .name = "pcnoc_s_6",
  472. .id = QCS404_PNOC_SLV_6,
  473. .buswidth = 4,
  474. .mas_rpm_id = 94,
  475. .slv_rpm_id = 123,
  476. .num_links = ARRAY_SIZE(pcnoc_s_6_links),
  477. .links = pcnoc_s_6_links,
  478. };
  479. static const u16 pcnoc_s_7_links[] = {
  480. QCS404_SLAVE_TLMM_SOUTH,
  481. QCS404_SLAVE_DISPLAY_CFG,
  482. QCS404_SLAVE_SDCC_1,
  483. QCS404_SLAVE_PCIE_1,
  484. QCS404_SLAVE_SDCC_2
  485. };
  486. static struct qcom_icc_node pcnoc_s_7 = {
  487. .name = "pcnoc_s_7",
  488. .id = QCS404_PNOC_SLV_7,
  489. .buswidth = 4,
  490. .mas_rpm_id = 95,
  491. .slv_rpm_id = 124,
  492. .num_links = ARRAY_SIZE(pcnoc_s_7_links),
  493. .links = pcnoc_s_7_links,
  494. };
  495. static const u16 pcnoc_s_8_links[] = {
  496. QCS404_SLAVE_CRYPTO_0_CFG
  497. };
  498. static struct qcom_icc_node pcnoc_s_8 = {
  499. .name = "pcnoc_s_8",
  500. .id = QCS404_PNOC_SLV_8,
  501. .buswidth = 4,
  502. .mas_rpm_id = 96,
  503. .slv_rpm_id = 125,
  504. .num_links = ARRAY_SIZE(pcnoc_s_8_links),
  505. .links = pcnoc_s_8_links,
  506. };
  507. static const u16 pcnoc_s_9_links[] = {
  508. QCS404_SLAVE_BLSP_2,
  509. QCS404_SLAVE_TLMM_EAST,
  510. QCS404_SLAVE_PMIC_ARB
  511. };
  512. static struct qcom_icc_node pcnoc_s_9 = {
  513. .name = "pcnoc_s_9",
  514. .id = QCS404_PNOC_SLV_9,
  515. .buswidth = 4,
  516. .mas_rpm_id = 97,
  517. .slv_rpm_id = 126,
  518. .num_links = ARRAY_SIZE(pcnoc_s_9_links),
  519. .links = pcnoc_s_9_links,
  520. };
  521. static const u16 pcnoc_s_10_links[] = {
  522. QCS404_SLAVE_USB_HS
  523. };
  524. static struct qcom_icc_node pcnoc_s_10 = {
  525. .name = "pcnoc_s_10",
  526. .id = QCS404_PNOC_SLV_10,
  527. .buswidth = 4,
  528. .mas_rpm_id = 157,
  529. .slv_rpm_id = -1,
  530. .num_links = ARRAY_SIZE(pcnoc_s_10_links),
  531. .links = pcnoc_s_10_links,
  532. };
  533. static const u16 pcnoc_s_11_links[] = {
  534. QCS404_SLAVE_USB3
  535. };
  536. static struct qcom_icc_node pcnoc_s_11 = {
  537. .name = "pcnoc_s_11",
  538. .id = QCS404_PNOC_SLV_11,
  539. .buswidth = 4,
  540. .mas_rpm_id = 158,
  541. .slv_rpm_id = 246,
  542. .num_links = ARRAY_SIZE(pcnoc_s_11_links),
  543. .links = pcnoc_s_11_links,
  544. };
  545. static const u16 qdss_int_links[] = {
  546. QCS404_SNOC_BIMC_1_SLV,
  547. QCS404_SNOC_INT_1
  548. };
  549. static struct qcom_icc_node qdss_int = {
  550. .name = "qdss_int",
  551. .id = QCS404_SNOC_QDSS_INT,
  552. .buswidth = 8,
  553. .mas_rpm_id = -1,
  554. .slv_rpm_id = -1,
  555. .num_links = ARRAY_SIZE(qdss_int_links),
  556. .links = qdss_int_links,
  557. };
  558. static const u16 snoc_int_0_links[] = {
  559. QCS404_SLAVE_LPASS,
  560. QCS404_SLAVE_APPSS,
  561. QCS404_SLAVE_WCSS
  562. };
  563. static struct qcom_icc_node snoc_int_0 = {
  564. .name = "snoc_int_0",
  565. .id = QCS404_SNOC_INT_0,
  566. .buswidth = 8,
  567. .mas_rpm_id = 99,
  568. .slv_rpm_id = 130,
  569. .num_links = ARRAY_SIZE(snoc_int_0_links),
  570. .links = snoc_int_0_links,
  571. };
  572. static const u16 snoc_int_1_links[] = {
  573. QCS404_SNOC_PNOC_SLV,
  574. QCS404_SNOC_INT_2
  575. };
  576. static struct qcom_icc_node snoc_int_1 = {
  577. .name = "snoc_int_1",
  578. .id = QCS404_SNOC_INT_1,
  579. .buswidth = 8,
  580. .mas_rpm_id = 100,
  581. .slv_rpm_id = 131,
  582. .num_links = ARRAY_SIZE(snoc_int_1_links),
  583. .links = snoc_int_1_links,
  584. };
  585. static const u16 snoc_int_2_links[] = {
  586. QCS404_SLAVE_QDSS_STM,
  587. QCS404_SLAVE_OCIMEM
  588. };
  589. static struct qcom_icc_node snoc_int_2 = {
  590. .name = "snoc_int_2",
  591. .id = QCS404_SNOC_INT_2,
  592. .buswidth = 8,
  593. .mas_rpm_id = 134,
  594. .slv_rpm_id = 197,
  595. .num_links = ARRAY_SIZE(snoc_int_2_links),
  596. .links = snoc_int_2_links,
  597. };
  598. static struct qcom_icc_node slv_ebi = {
  599. .name = "slv_ebi",
  600. .id = QCS404_SLAVE_EBI_CH0,
  601. .buswidth = 8,
  602. .mas_rpm_id = -1,
  603. .slv_rpm_id = 0,
  604. };
  605. static const u16 slv_bimc_snoc_links[] = {
  606. QCS404_BIMC_SNOC_MAS
  607. };
  608. static struct qcom_icc_node slv_bimc_snoc = {
  609. .name = "slv_bimc_snoc",
  610. .id = QCS404_BIMC_SNOC_SLV,
  611. .buswidth = 8,
  612. .mas_rpm_id = -1,
  613. .slv_rpm_id = 2,
  614. .num_links = ARRAY_SIZE(slv_bimc_snoc_links),
  615. .links = slv_bimc_snoc_links,
  616. };
  617. static struct qcom_icc_node slv_spdm = {
  618. .name = "slv_spdm",
  619. .id = QCS404_SLAVE_SPDM_WRAPPER,
  620. .buswidth = 4,
  621. .mas_rpm_id = -1,
  622. .slv_rpm_id = -1,
  623. };
  624. static struct qcom_icc_node slv_pdm = {
  625. .name = "slv_pdm",
  626. .id = QCS404_SLAVE_PDM,
  627. .buswidth = 4,
  628. .mas_rpm_id = -1,
  629. .slv_rpm_id = 41,
  630. };
  631. static struct qcom_icc_node slv_prng = {
  632. .name = "slv_prng",
  633. .id = QCS404_SLAVE_PRNG,
  634. .buswidth = 4,
  635. .mas_rpm_id = -1,
  636. .slv_rpm_id = 44,
  637. };
  638. static struct qcom_icc_node slv_tcsr = {
  639. .name = "slv_tcsr",
  640. .id = QCS404_SLAVE_TCSR,
  641. .buswidth = 4,
  642. .mas_rpm_id = -1,
  643. .slv_rpm_id = 50,
  644. };
  645. static struct qcom_icc_node slv_snoc_cfg = {
  646. .name = "slv_snoc_cfg",
  647. .id = QCS404_SLAVE_SNOC_CFG,
  648. .buswidth = 4,
  649. .mas_rpm_id = -1,
  650. .slv_rpm_id = 70,
  651. };
  652. static struct qcom_icc_node slv_message_ram = {
  653. .name = "slv_message_ram",
  654. .id = QCS404_SLAVE_MESSAGE_RAM,
  655. .buswidth = 4,
  656. .mas_rpm_id = -1,
  657. .slv_rpm_id = 55,
  658. };
  659. static struct qcom_icc_node slv_disp_ss_cfg = {
  660. .name = "slv_disp_ss_cfg",
  661. .id = QCS404_SLAVE_DISPLAY_CFG,
  662. .buswidth = 4,
  663. .mas_rpm_id = -1,
  664. .slv_rpm_id = -1,
  665. };
  666. static struct qcom_icc_node slv_gpu_cfg = {
  667. .name = "slv_gpu_cfg",
  668. .id = QCS404_SLAVE_GRAPHICS_3D_CFG,
  669. .buswidth = 4,
  670. .mas_rpm_id = -1,
  671. .slv_rpm_id = -1,
  672. };
  673. static struct qcom_icc_node slv_blsp_1 = {
  674. .name = "slv_blsp_1",
  675. .id = QCS404_SLAVE_BLSP_1,
  676. .buswidth = 4,
  677. .mas_rpm_id = -1,
  678. .slv_rpm_id = 39,
  679. };
  680. static struct qcom_icc_node slv_tlmm_north = {
  681. .name = "slv_tlmm_north",
  682. .id = QCS404_SLAVE_TLMM_NORTH,
  683. .buswidth = 4,
  684. .mas_rpm_id = -1,
  685. .slv_rpm_id = 214,
  686. };
  687. static struct qcom_icc_node slv_pcie = {
  688. .name = "slv_pcie",
  689. .id = QCS404_SLAVE_PCIE_1,
  690. .buswidth = 4,
  691. .mas_rpm_id = -1,
  692. .slv_rpm_id = -1,
  693. };
  694. static struct qcom_icc_node slv_ethernet = {
  695. .name = "slv_ethernet",
  696. .id = QCS404_SLAVE_EMAC_CFG,
  697. .buswidth = 4,
  698. .mas_rpm_id = -1,
  699. .slv_rpm_id = -1,
  700. };
  701. static struct qcom_icc_node slv_blsp_2 = {
  702. .name = "slv_blsp_2",
  703. .id = QCS404_SLAVE_BLSP_2,
  704. .buswidth = 4,
  705. .mas_rpm_id = -1,
  706. .slv_rpm_id = 37,
  707. };
  708. static struct qcom_icc_node slv_tlmm_east = {
  709. .name = "slv_tlmm_east",
  710. .id = QCS404_SLAVE_TLMM_EAST,
  711. .buswidth = 4,
  712. .mas_rpm_id = -1,
  713. .slv_rpm_id = 213,
  714. };
  715. static struct qcom_icc_node slv_tcu = {
  716. .name = "slv_tcu",
  717. .id = QCS404_SLAVE_TCU,
  718. .buswidth = 8,
  719. .mas_rpm_id = -1,
  720. .slv_rpm_id = -1,
  721. };
  722. static struct qcom_icc_node slv_pmic_arb = {
  723. .name = "slv_pmic_arb",
  724. .id = QCS404_SLAVE_PMIC_ARB,
  725. .buswidth = 4,
  726. .mas_rpm_id = -1,
  727. .slv_rpm_id = 59,
  728. };
  729. static struct qcom_icc_node slv_sdcc_1 = {
  730. .name = "slv_sdcc_1",
  731. .id = QCS404_SLAVE_SDCC_1,
  732. .buswidth = 4,
  733. .mas_rpm_id = -1,
  734. .slv_rpm_id = 31,
  735. };
  736. static struct qcom_icc_node slv_sdcc_2 = {
  737. .name = "slv_sdcc_2",
  738. .id = QCS404_SLAVE_SDCC_2,
  739. .buswidth = 4,
  740. .mas_rpm_id = -1,
  741. .slv_rpm_id = 33,
  742. };
  743. static struct qcom_icc_node slv_tlmm_south = {
  744. .name = "slv_tlmm_south",
  745. .id = QCS404_SLAVE_TLMM_SOUTH,
  746. .buswidth = 4,
  747. .mas_rpm_id = -1,
  748. .slv_rpm_id = -1,
  749. };
  750. static struct qcom_icc_node slv_usb_hs = {
  751. .name = "slv_usb_hs",
  752. .id = QCS404_SLAVE_USB_HS,
  753. .buswidth = 4,
  754. .mas_rpm_id = -1,
  755. .slv_rpm_id = 40,
  756. };
  757. static struct qcom_icc_node slv_usb3 = {
  758. .name = "slv_usb3",
  759. .id = QCS404_SLAVE_USB3,
  760. .buswidth = 4,
  761. .mas_rpm_id = -1,
  762. .slv_rpm_id = 22,
  763. };
  764. static struct qcom_icc_node slv_crypto_0_cfg = {
  765. .name = "slv_crypto_0_cfg",
  766. .id = QCS404_SLAVE_CRYPTO_0_CFG,
  767. .buswidth = 4,
  768. .mas_rpm_id = -1,
  769. .slv_rpm_id = 52,
  770. };
  771. static const u16 slv_pcnoc_snoc_links[] = {
  772. QCS404_PNOC_SNOC_MAS
  773. };
  774. static struct qcom_icc_node slv_pcnoc_snoc = {
  775. .name = "slv_pcnoc_snoc",
  776. .id = QCS404_PNOC_SNOC_SLV,
  777. .buswidth = 8,
  778. .mas_rpm_id = -1,
  779. .slv_rpm_id = 45,
  780. .num_links = ARRAY_SIZE(slv_pcnoc_snoc_links),
  781. .links = slv_pcnoc_snoc_links,
  782. };
  783. static struct qcom_icc_node slv_kpss_ahb = {
  784. .name = "slv_kpss_ahb",
  785. .id = QCS404_SLAVE_APPSS,
  786. .buswidth = 4,
  787. .mas_rpm_id = -1,
  788. .slv_rpm_id = -1,
  789. };
  790. static struct qcom_icc_node slv_wcss = {
  791. .name = "slv_wcss",
  792. .id = QCS404_SLAVE_WCSS,
  793. .buswidth = 4,
  794. .mas_rpm_id = -1,
  795. .slv_rpm_id = 23,
  796. };
  797. static const u16 slv_snoc_bimc_1_links[] = {
  798. QCS404_SNOC_BIMC_1_MAS
  799. };
  800. static struct qcom_icc_node slv_snoc_bimc_1 = {
  801. .name = "slv_snoc_bimc_1",
  802. .id = QCS404_SNOC_BIMC_1_SLV,
  803. .buswidth = 8,
  804. .mas_rpm_id = -1,
  805. .slv_rpm_id = 104,
  806. .num_links = ARRAY_SIZE(slv_snoc_bimc_1_links),
  807. .links = slv_snoc_bimc_1_links,
  808. };
  809. static struct qcom_icc_node slv_imem = {
  810. .name = "slv_imem",
  811. .id = QCS404_SLAVE_OCIMEM,
  812. .buswidth = 8,
  813. .mas_rpm_id = -1,
  814. .slv_rpm_id = 26,
  815. };
  816. static const u16 slv_snoc_pcnoc_links[] = {
  817. QCS404_SNOC_PNOC_MAS
  818. };
  819. static struct qcom_icc_node slv_snoc_pcnoc = {
  820. .name = "slv_snoc_pcnoc",
  821. .id = QCS404_SNOC_PNOC_SLV,
  822. .buswidth = 8,
  823. .mas_rpm_id = -1,
  824. .slv_rpm_id = 28,
  825. .num_links = ARRAY_SIZE(slv_snoc_pcnoc_links),
  826. .links = slv_snoc_pcnoc_links,
  827. };
  828. static struct qcom_icc_node slv_qdss_stm = {
  829. .name = "slv_qdss_stm",
  830. .id = QCS404_SLAVE_QDSS_STM,
  831. .buswidth = 4,
  832. .mas_rpm_id = -1,
  833. .slv_rpm_id = 30,
  834. };
  835. static struct qcom_icc_node slv_cats_0 = {
  836. .name = "slv_cats_0",
  837. .id = QCS404_SLAVE_CATS_128,
  838. .buswidth = 16,
  839. .mas_rpm_id = -1,
  840. .slv_rpm_id = -1,
  841. };
  842. static struct qcom_icc_node slv_cats_1 = {
  843. .name = "slv_cats_1",
  844. .id = QCS404_SLAVE_OCMEM_64,
  845. .buswidth = 8,
  846. .mas_rpm_id = -1,
  847. .slv_rpm_id = -1,
  848. };
  849. static struct qcom_icc_node slv_lpass = {
  850. .name = "slv_lpass",
  851. .id = QCS404_SLAVE_LPASS,
  852. .buswidth = 4,
  853. .mas_rpm_id = -1,
  854. .slv_rpm_id = -1,
  855. };
  856. static struct qcom_icc_node * const qcs404_bimc_nodes[] = {
  857. [MASTER_AMPSS_M0] = &mas_apps_proc,
  858. [MASTER_OXILI] = &mas_oxili,
  859. [MASTER_MDP_PORT0] = &mas_mdp,
  860. [MASTER_SNOC_BIMC_1] = &mas_snoc_bimc_1,
  861. [MASTER_TCU_0] = &mas_tcu_0,
  862. [SLAVE_EBI_CH0] = &slv_ebi,
  863. [SLAVE_BIMC_SNOC] = &slv_bimc_snoc,
  864. };
  865. static const struct qcom_icc_desc qcs404_bimc = {
  866. .nodes = qcs404_bimc_nodes,
  867. .num_nodes = ARRAY_SIZE(qcs404_bimc_nodes),
  868. };
  869. static struct qcom_icc_node * const qcs404_pcnoc_nodes[] = {
  870. [MASTER_SPDM] = &mas_spdm,
  871. [MASTER_BLSP_1] = &mas_blsp_1,
  872. [MASTER_BLSP_2] = &mas_blsp_2,
  873. [MASTER_XI_USB_HS1] = &mas_xi_usb_hs1,
  874. [MASTER_CRYPT0] = &mas_crypto,
  875. [MASTER_SDCC_1] = &mas_sdcc_1,
  876. [MASTER_SDCC_2] = &mas_sdcc_2,
  877. [MASTER_SNOC_PCNOC] = &mas_snoc_pcnoc,
  878. [MASTER_QPIC] = &mas_qpic,
  879. [PCNOC_INT_0] = &pcnoc_int_0,
  880. [PCNOC_INT_2] = &pcnoc_int_2,
  881. [PCNOC_INT_3] = &pcnoc_int_3,
  882. [PCNOC_S_0] = &pcnoc_s_0,
  883. [PCNOC_S_1] = &pcnoc_s_1,
  884. [PCNOC_S_2] = &pcnoc_s_2,
  885. [PCNOC_S_3] = &pcnoc_s_3,
  886. [PCNOC_S_4] = &pcnoc_s_4,
  887. [PCNOC_S_6] = &pcnoc_s_6,
  888. [PCNOC_S_7] = &pcnoc_s_7,
  889. [PCNOC_S_8] = &pcnoc_s_8,
  890. [PCNOC_S_9] = &pcnoc_s_9,
  891. [PCNOC_S_10] = &pcnoc_s_10,
  892. [PCNOC_S_11] = &pcnoc_s_11,
  893. [SLAVE_SPDM] = &slv_spdm,
  894. [SLAVE_PDM] = &slv_pdm,
  895. [SLAVE_PRNG] = &slv_prng,
  896. [SLAVE_TCSR] = &slv_tcsr,
  897. [SLAVE_SNOC_CFG] = &slv_snoc_cfg,
  898. [SLAVE_MESSAGE_RAM] = &slv_message_ram,
  899. [SLAVE_DISP_SS_CFG] = &slv_disp_ss_cfg,
  900. [SLAVE_GPU_CFG] = &slv_gpu_cfg,
  901. [SLAVE_BLSP_1] = &slv_blsp_1,
  902. [SLAVE_BLSP_2] = &slv_blsp_2,
  903. [SLAVE_TLMM_NORTH] = &slv_tlmm_north,
  904. [SLAVE_PCIE] = &slv_pcie,
  905. [SLAVE_ETHERNET] = &slv_ethernet,
  906. [SLAVE_TLMM_EAST] = &slv_tlmm_east,
  907. [SLAVE_TCU] = &slv_tcu,
  908. [SLAVE_PMIC_ARB] = &slv_pmic_arb,
  909. [SLAVE_SDCC_1] = &slv_sdcc_1,
  910. [SLAVE_SDCC_2] = &slv_sdcc_2,
  911. [SLAVE_TLMM_SOUTH] = &slv_tlmm_south,
  912. [SLAVE_USB_HS] = &slv_usb_hs,
  913. [SLAVE_USB3] = &slv_usb3,
  914. [SLAVE_CRYPTO_0_CFG] = &slv_crypto_0_cfg,
  915. [SLAVE_PCNOC_SNOC] = &slv_pcnoc_snoc,
  916. };
  917. static const struct qcom_icc_desc qcs404_pcnoc = {
  918. .nodes = qcs404_pcnoc_nodes,
  919. .num_nodes = ARRAY_SIZE(qcs404_pcnoc_nodes),
  920. };
  921. static struct qcom_icc_node * const qcs404_snoc_nodes[] = {
  922. [MASTER_QDSS_BAM] = &mas_qdss_bam,
  923. [MASTER_BIMC_SNOC] = &mas_bimc_snoc,
  924. [MASTER_PCNOC_SNOC] = &mas_pcnoc_snoc,
  925. [MASTER_QDSS_ETR] = &mas_qdss_etr,
  926. [MASTER_EMAC] = &mas_emac,
  927. [MASTER_PCIE] = &mas_pcie,
  928. [MASTER_USB3] = &mas_usb3,
  929. [QDSS_INT] = &qdss_int,
  930. [SNOC_INT_0] = &snoc_int_0,
  931. [SNOC_INT_1] = &snoc_int_1,
  932. [SNOC_INT_2] = &snoc_int_2,
  933. [SLAVE_KPSS_AHB] = &slv_kpss_ahb,
  934. [SLAVE_WCSS] = &slv_wcss,
  935. [SLAVE_SNOC_BIMC_1] = &slv_snoc_bimc_1,
  936. [SLAVE_IMEM] = &slv_imem,
  937. [SLAVE_SNOC_PCNOC] = &slv_snoc_pcnoc,
  938. [SLAVE_QDSS_STM] = &slv_qdss_stm,
  939. [SLAVE_CATS_0] = &slv_cats_0,
  940. [SLAVE_CATS_1] = &slv_cats_1,
  941. [SLAVE_LPASS] = &slv_lpass,
  942. };
  943. static const struct qcom_icc_desc qcs404_snoc = {
  944. .nodes = qcs404_snoc_nodes,
  945. .num_nodes = ARRAY_SIZE(qcs404_snoc_nodes),
  946. };
  947. static const struct of_device_id qcs404_noc_of_match[] = {
  948. { .compatible = "qcom,qcs404-bimc", .data = &qcs404_bimc },
  949. { .compatible = "qcom,qcs404-pcnoc", .data = &qcs404_pcnoc },
  950. { .compatible = "qcom,qcs404-snoc", .data = &qcs404_snoc },
  951. { },
  952. };
  953. MODULE_DEVICE_TABLE(of, qcs404_noc_of_match);
  954. static struct platform_driver qcs404_noc_driver = {
  955. .probe = qnoc_probe,
  956. .remove = qnoc_remove,
  957. .driver = {
  958. .name = "qnoc-qcs404",
  959. .of_match_table = qcs404_noc_of_match,
  960. },
  961. };
  962. module_platform_driver(qcs404_noc_driver);
  963. MODULE_DESCRIPTION("Qualcomm QCS404 NoC driver");
  964. MODULE_LICENSE("GPL v2");