qcs404.c 26 KB

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