Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2019 Linaro Ltd
0004  */
0005 
0006 #include <dt-bindings/interconnect/qcom,qcs404.h>
0007 #include <linux/clk.h>
0008 #include <linux/device.h>
0009 #include <linux/interconnect-provider.h>
0010 #include <linux/io.h>
0011 #include <linux/module.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/of_device.h>
0014 
0015 
0016 #include "smd-rpm.h"
0017 #include "icc-rpm.h"
0018 
0019 enum {
0020     QCS404_MASTER_AMPSS_M0 = 1,
0021     QCS404_MASTER_GRAPHICS_3D,
0022     QCS404_MASTER_MDP_PORT0,
0023     QCS404_SNOC_BIMC_1_MAS,
0024     QCS404_MASTER_TCU_0,
0025     QCS404_MASTER_SPDM,
0026     QCS404_MASTER_BLSP_1,
0027     QCS404_MASTER_BLSP_2,
0028     QCS404_MASTER_XM_USB_HS1,
0029     QCS404_MASTER_CRYPTO_CORE0,
0030     QCS404_MASTER_SDCC_1,
0031     QCS404_MASTER_SDCC_2,
0032     QCS404_SNOC_PNOC_MAS,
0033     QCS404_MASTER_QPIC,
0034     QCS404_MASTER_QDSS_BAM,
0035     QCS404_BIMC_SNOC_MAS,
0036     QCS404_PNOC_SNOC_MAS,
0037     QCS404_MASTER_QDSS_ETR,
0038     QCS404_MASTER_EMAC,
0039     QCS404_MASTER_PCIE,
0040     QCS404_MASTER_USB3,
0041     QCS404_PNOC_INT_0,
0042     QCS404_PNOC_INT_2,
0043     QCS404_PNOC_INT_3,
0044     QCS404_PNOC_SLV_0,
0045     QCS404_PNOC_SLV_1,
0046     QCS404_PNOC_SLV_2,
0047     QCS404_PNOC_SLV_3,
0048     QCS404_PNOC_SLV_4,
0049     QCS404_PNOC_SLV_6,
0050     QCS404_PNOC_SLV_7,
0051     QCS404_PNOC_SLV_8,
0052     QCS404_PNOC_SLV_9,
0053     QCS404_PNOC_SLV_10,
0054     QCS404_PNOC_SLV_11,
0055     QCS404_SNOC_QDSS_INT,
0056     QCS404_SNOC_INT_0,
0057     QCS404_SNOC_INT_1,
0058     QCS404_SNOC_INT_2,
0059     QCS404_SLAVE_EBI_CH0,
0060     QCS404_BIMC_SNOC_SLV,
0061     QCS404_SLAVE_SPDM_WRAPPER,
0062     QCS404_SLAVE_PDM,
0063     QCS404_SLAVE_PRNG,
0064     QCS404_SLAVE_TCSR,
0065     QCS404_SLAVE_SNOC_CFG,
0066     QCS404_SLAVE_MESSAGE_RAM,
0067     QCS404_SLAVE_DISPLAY_CFG,
0068     QCS404_SLAVE_GRAPHICS_3D_CFG,
0069     QCS404_SLAVE_BLSP_1,
0070     QCS404_SLAVE_TLMM_NORTH,
0071     QCS404_SLAVE_PCIE_1,
0072     QCS404_SLAVE_EMAC_CFG,
0073     QCS404_SLAVE_BLSP_2,
0074     QCS404_SLAVE_TLMM_EAST,
0075     QCS404_SLAVE_TCU,
0076     QCS404_SLAVE_PMIC_ARB,
0077     QCS404_SLAVE_SDCC_1,
0078     QCS404_SLAVE_SDCC_2,
0079     QCS404_SLAVE_TLMM_SOUTH,
0080     QCS404_SLAVE_USB_HS,
0081     QCS404_SLAVE_USB3,
0082     QCS404_SLAVE_CRYPTO_0_CFG,
0083     QCS404_PNOC_SNOC_SLV,
0084     QCS404_SLAVE_APPSS,
0085     QCS404_SLAVE_WCSS,
0086     QCS404_SNOC_BIMC_1_SLV,
0087     QCS404_SLAVE_OCIMEM,
0088     QCS404_SNOC_PNOC_SLV,
0089     QCS404_SLAVE_QDSS_STM,
0090     QCS404_SLAVE_CATS_128,
0091     QCS404_SLAVE_OCMEM_64,
0092     QCS404_SLAVE_LPASS,
0093 };
0094 
0095 static const u16 mas_apps_proc_links[] = {
0096     QCS404_SLAVE_EBI_CH0,
0097     QCS404_BIMC_SNOC_SLV
0098 };
0099 
0100 static struct qcom_icc_node mas_apps_proc = {
0101     .name = "mas_apps_proc",
0102     .id = QCS404_MASTER_AMPSS_M0,
0103     .buswidth = 8,
0104     .mas_rpm_id = 0,
0105     .slv_rpm_id = -1,
0106     .num_links = ARRAY_SIZE(mas_apps_proc_links),
0107     .links = mas_apps_proc_links,
0108 };
0109 
0110 static const u16 mas_oxili_links[] = {
0111     QCS404_SLAVE_EBI_CH0,
0112     QCS404_BIMC_SNOC_SLV
0113 };
0114 
0115 static struct qcom_icc_node mas_oxili = {
0116     .name = "mas_oxili",
0117     .id = QCS404_MASTER_GRAPHICS_3D,
0118     .buswidth = 8,
0119     .mas_rpm_id = -1,
0120     .slv_rpm_id = -1,
0121     .num_links = ARRAY_SIZE(mas_oxili_links),
0122     .links = mas_oxili_links,
0123 };
0124 
0125 static const u16 mas_mdp_links[] = {
0126     QCS404_SLAVE_EBI_CH0,
0127     QCS404_BIMC_SNOC_SLV
0128 };
0129 
0130 static struct qcom_icc_node mas_mdp = {
0131     .name = "mas_mdp",
0132     .id = QCS404_MASTER_MDP_PORT0,
0133     .buswidth = 8,
0134     .mas_rpm_id = -1,
0135     .slv_rpm_id = -1,
0136     .num_links = ARRAY_SIZE(mas_mdp_links),
0137     .links = mas_mdp_links,
0138 };
0139 
0140 static const u16 mas_snoc_bimc_1_links[] = {
0141     QCS404_SLAVE_EBI_CH0
0142 };
0143 
0144 static struct qcom_icc_node mas_snoc_bimc_1 = {
0145     .name = "mas_snoc_bimc_1",
0146     .id = QCS404_SNOC_BIMC_1_MAS,
0147     .buswidth = 8,
0148     .mas_rpm_id = 76,
0149     .slv_rpm_id = -1,
0150     .num_links = ARRAY_SIZE(mas_snoc_bimc_1_links),
0151     .links = mas_snoc_bimc_1_links,
0152 };
0153 
0154 static const u16 mas_tcu_0_links[] = {
0155     QCS404_SLAVE_EBI_CH0,
0156     QCS404_BIMC_SNOC_SLV
0157 };
0158 
0159 static struct qcom_icc_node mas_tcu_0 = {
0160     .name = "mas_tcu_0",
0161     .id = QCS404_MASTER_TCU_0,
0162     .buswidth = 8,
0163     .mas_rpm_id = -1,
0164     .slv_rpm_id = -1,
0165     .num_links = ARRAY_SIZE(mas_tcu_0_links),
0166     .links = mas_tcu_0_links,
0167 };
0168 
0169 static const u16 mas_spdm_links[] = {
0170     QCS404_PNOC_INT_3
0171 };
0172 
0173 static struct qcom_icc_node mas_spdm = {
0174     .name = "mas_spdm",
0175     .id = QCS404_MASTER_SPDM,
0176     .buswidth = 4,
0177     .mas_rpm_id = -1,
0178     .slv_rpm_id = -1,
0179     .num_links = ARRAY_SIZE(mas_spdm_links),
0180     .links = mas_spdm_links,
0181 };
0182 
0183 static const u16 mas_blsp_1_links[] = {
0184     QCS404_PNOC_INT_3
0185 };
0186 
0187 static struct qcom_icc_node mas_blsp_1 = {
0188     .name = "mas_blsp_1",
0189     .id = QCS404_MASTER_BLSP_1,
0190     .buswidth = 4,
0191     .mas_rpm_id = 41,
0192     .slv_rpm_id = -1,
0193     .num_links = ARRAY_SIZE(mas_blsp_1_links),
0194     .links = mas_blsp_1_links,
0195 };
0196 
0197 static const u16 mas_blsp_2_links[] = {
0198     QCS404_PNOC_INT_3
0199 };
0200 
0201 static struct qcom_icc_node mas_blsp_2 = {
0202     .name = "mas_blsp_2",
0203     .id = QCS404_MASTER_BLSP_2,
0204     .buswidth = 4,
0205     .mas_rpm_id = 39,
0206     .slv_rpm_id = -1,
0207     .num_links = ARRAY_SIZE(mas_blsp_2_links),
0208     .links = mas_blsp_2_links,
0209 };
0210 
0211 static const u16 mas_xi_usb_hs1_links[] = {
0212     QCS404_PNOC_INT_0
0213 };
0214 
0215 static struct qcom_icc_node mas_xi_usb_hs1 = {
0216     .name = "mas_xi_usb_hs1",
0217     .id = QCS404_MASTER_XM_USB_HS1,
0218     .buswidth = 8,
0219     .mas_rpm_id = 138,
0220     .slv_rpm_id = -1,
0221     .num_links = ARRAY_SIZE(mas_xi_usb_hs1_links),
0222     .links = mas_xi_usb_hs1_links,
0223 };
0224 
0225 static const u16 mas_crypto_links[] = {
0226     QCS404_PNOC_SNOC_SLV,
0227     QCS404_PNOC_INT_2
0228 };
0229 
0230 static struct qcom_icc_node mas_crypto = {
0231     .name = "mas_crypto",
0232     .id = QCS404_MASTER_CRYPTO_CORE0,
0233     .buswidth = 8,
0234     .mas_rpm_id = 23,
0235     .slv_rpm_id = -1,
0236     .num_links = ARRAY_SIZE(mas_crypto_links),
0237     .links = mas_crypto_links,
0238 };
0239 
0240 static const u16 mas_sdcc_1_links[] = {
0241     QCS404_PNOC_INT_0
0242 };
0243 
0244 static struct qcom_icc_node mas_sdcc_1 = {
0245     .name = "mas_sdcc_1",
0246     .id = QCS404_MASTER_SDCC_1,
0247     .buswidth = 8,
0248     .mas_rpm_id = 33,
0249     .slv_rpm_id = -1,
0250     .num_links = ARRAY_SIZE(mas_sdcc_1_links),
0251     .links = mas_sdcc_1_links,
0252 };
0253 
0254 static const u16 mas_sdcc_2_links[] = {
0255     QCS404_PNOC_INT_0
0256 };
0257 
0258 static struct qcom_icc_node mas_sdcc_2 = {
0259     .name = "mas_sdcc_2",
0260     .id = QCS404_MASTER_SDCC_2,
0261     .buswidth = 8,
0262     .mas_rpm_id = 35,
0263     .slv_rpm_id = -1,
0264     .num_links = ARRAY_SIZE(mas_sdcc_2_links),
0265     .links = mas_sdcc_2_links,
0266 };
0267 
0268 static const u16 mas_snoc_pcnoc_links[] = {
0269     QCS404_PNOC_INT_2
0270 };
0271 
0272 static struct qcom_icc_node mas_snoc_pcnoc = {
0273     .name = "mas_snoc_pcnoc",
0274     .id = QCS404_SNOC_PNOC_MAS,
0275     .buswidth = 8,
0276     .mas_rpm_id = 77,
0277     .slv_rpm_id = -1,
0278     .num_links = ARRAY_SIZE(mas_snoc_pcnoc_links),
0279     .links = mas_snoc_pcnoc_links,
0280 };
0281 
0282 static const u16 mas_qpic_links[] = {
0283     QCS404_PNOC_INT_0
0284 };
0285 
0286 static struct qcom_icc_node mas_qpic = {
0287     .name = "mas_qpic",
0288     .id = QCS404_MASTER_QPIC,
0289     .buswidth = 4,
0290     .mas_rpm_id = -1,
0291     .slv_rpm_id = -1,
0292     .num_links = ARRAY_SIZE(mas_qpic_links),
0293     .links = mas_qpic_links,
0294 };
0295 
0296 static const u16 mas_qdss_bam_links[] = {
0297     QCS404_SNOC_QDSS_INT
0298 };
0299 
0300 static struct qcom_icc_node mas_qdss_bam = {
0301     .name = "mas_qdss_bam",
0302     .id = QCS404_MASTER_QDSS_BAM,
0303     .buswidth = 4,
0304     .mas_rpm_id = -1,
0305     .slv_rpm_id = -1,
0306     .num_links = ARRAY_SIZE(mas_qdss_bam_links),
0307     .links = mas_qdss_bam_links,
0308 };
0309 
0310 static const u16 mas_bimc_snoc_links[] = {
0311     QCS404_SLAVE_OCMEM_64,
0312     QCS404_SLAVE_CATS_128,
0313     QCS404_SNOC_INT_0,
0314     QCS404_SNOC_INT_1
0315 };
0316 
0317 static struct qcom_icc_node mas_bimc_snoc = {
0318     .name = "mas_bimc_snoc",
0319     .id = QCS404_BIMC_SNOC_MAS,
0320     .buswidth = 8,
0321     .mas_rpm_id = 21,
0322     .slv_rpm_id = -1,
0323     .num_links = ARRAY_SIZE(mas_bimc_snoc_links),
0324     .links = mas_bimc_snoc_links,
0325 };
0326 
0327 static const u16 mas_pcnoc_snoc_links[] = {
0328     QCS404_SNOC_BIMC_1_SLV,
0329     QCS404_SNOC_INT_2,
0330     QCS404_SNOC_INT_0
0331 };
0332 
0333 static struct qcom_icc_node mas_pcnoc_snoc = {
0334     .name = "mas_pcnoc_snoc",
0335     .id = QCS404_PNOC_SNOC_MAS,
0336     .buswidth = 8,
0337     .mas_rpm_id = 29,
0338     .slv_rpm_id = -1,
0339     .num_links = ARRAY_SIZE(mas_pcnoc_snoc_links),
0340     .links = mas_pcnoc_snoc_links,
0341 };
0342 
0343 static const u16 mas_qdss_etr_links[] = {
0344     QCS404_SNOC_QDSS_INT
0345 };
0346 
0347 static struct qcom_icc_node mas_qdss_etr = {
0348     .name = "mas_qdss_etr",
0349     .id = QCS404_MASTER_QDSS_ETR,
0350     .buswidth = 8,
0351     .mas_rpm_id = -1,
0352     .slv_rpm_id = -1,
0353     .num_links = ARRAY_SIZE(mas_qdss_etr_links),
0354     .links = mas_qdss_etr_links,
0355 };
0356 
0357 static const u16 mas_emac_links[] = {
0358     QCS404_SNOC_BIMC_1_SLV,
0359     QCS404_SNOC_INT_1
0360 };
0361 
0362 static struct qcom_icc_node mas_emac = {
0363     .name = "mas_emac",
0364     .id = QCS404_MASTER_EMAC,
0365     .buswidth = 8,
0366     .mas_rpm_id = -1,
0367     .slv_rpm_id = -1,
0368     .num_links = ARRAY_SIZE(mas_emac_links),
0369     .links = mas_emac_links,
0370 };
0371 
0372 static const u16 mas_pcie_links[] = {
0373     QCS404_SNOC_BIMC_1_SLV,
0374     QCS404_SNOC_INT_1
0375 };
0376 
0377 static struct qcom_icc_node mas_pcie = {
0378     .name = "mas_pcie",
0379     .id = QCS404_MASTER_PCIE,
0380     .buswidth = 8,
0381     .mas_rpm_id = -1,
0382     .slv_rpm_id = -1,
0383     .num_links = ARRAY_SIZE(mas_pcie_links),
0384     .links = mas_pcie_links,
0385 };
0386 
0387 static const u16 mas_usb3_links[] = {
0388     QCS404_SNOC_BIMC_1_SLV,
0389     QCS404_SNOC_INT_1
0390 };
0391 
0392 static struct qcom_icc_node mas_usb3 = {
0393     .name = "mas_usb3",
0394     .id = QCS404_MASTER_USB3,
0395     .buswidth = 8,
0396     .mas_rpm_id = -1,
0397     .slv_rpm_id = -1,
0398     .num_links = ARRAY_SIZE(mas_usb3_links),
0399     .links = mas_usb3_links,
0400 };
0401 
0402 static const u16 pcnoc_int_0_links[] = {
0403     QCS404_PNOC_SNOC_SLV,
0404     QCS404_PNOC_INT_2
0405 };
0406 
0407 static struct qcom_icc_node pcnoc_int_0 = {
0408     .name = "pcnoc_int_0",
0409     .id = QCS404_PNOC_INT_0,
0410     .buswidth = 8,
0411     .mas_rpm_id = 85,
0412     .slv_rpm_id = 114,
0413     .num_links = ARRAY_SIZE(pcnoc_int_0_links),
0414     .links = pcnoc_int_0_links,
0415 };
0416 
0417 static const u16 pcnoc_int_2_links[] = {
0418     QCS404_PNOC_SLV_10,
0419     QCS404_SLAVE_TCU,
0420     QCS404_PNOC_SLV_11,
0421     QCS404_PNOC_SLV_2,
0422     QCS404_PNOC_SLV_3,
0423     QCS404_PNOC_SLV_0,
0424     QCS404_PNOC_SLV_1,
0425     QCS404_PNOC_SLV_6,
0426     QCS404_PNOC_SLV_7,
0427     QCS404_PNOC_SLV_4,
0428     QCS404_PNOC_SLV_8,
0429     QCS404_PNOC_SLV_9
0430 };
0431 
0432 static struct qcom_icc_node pcnoc_int_2 = {
0433     .name = "pcnoc_int_2",
0434     .id = QCS404_PNOC_INT_2,
0435     .buswidth = 8,
0436     .mas_rpm_id = 124,
0437     .slv_rpm_id = 184,
0438     .num_links = ARRAY_SIZE(pcnoc_int_2_links),
0439     .links = pcnoc_int_2_links,
0440 };
0441 
0442 static const u16 pcnoc_int_3_links[] = {
0443     QCS404_PNOC_SNOC_SLV
0444 };
0445 
0446 static struct qcom_icc_node pcnoc_int_3 = {
0447     .name = "pcnoc_int_3",
0448     .id = QCS404_PNOC_INT_3,
0449     .buswidth = 8,
0450     .mas_rpm_id = 125,
0451     .slv_rpm_id = 185,
0452     .num_links = ARRAY_SIZE(pcnoc_int_3_links),
0453     .links = pcnoc_int_3_links,
0454 };
0455 
0456 static const u16 pcnoc_s_0_links[] = {
0457     QCS404_SLAVE_PRNG,
0458     QCS404_SLAVE_SPDM_WRAPPER,
0459     QCS404_SLAVE_PDM
0460 };
0461 
0462 static struct qcom_icc_node pcnoc_s_0 = {
0463     .name = "pcnoc_s_0",
0464     .id = QCS404_PNOC_SLV_0,
0465     .buswidth = 4,
0466     .mas_rpm_id = 89,
0467     .slv_rpm_id = 118,
0468     .num_links = ARRAY_SIZE(pcnoc_s_0_links),
0469     .links = pcnoc_s_0_links,
0470 };
0471 
0472 static const u16 pcnoc_s_1_links[] = {
0473     QCS404_SLAVE_TCSR
0474 };
0475 
0476 static struct qcom_icc_node pcnoc_s_1 = {
0477     .name = "pcnoc_s_1",
0478     .id = QCS404_PNOC_SLV_1,
0479     .buswidth = 4,
0480     .mas_rpm_id = 90,
0481     .slv_rpm_id = 119,
0482     .num_links = ARRAY_SIZE(pcnoc_s_1_links),
0483     .links = pcnoc_s_1_links,
0484 };
0485 
0486 static const u16 pcnoc_s_2_links[] = {
0487     QCS404_SLAVE_GRAPHICS_3D_CFG
0488 };
0489 
0490 static struct qcom_icc_node pcnoc_s_2 = {
0491     .name = "pcnoc_s_2",
0492     .id = QCS404_PNOC_SLV_2,
0493     .buswidth = 4,
0494     .mas_rpm_id = -1,
0495     .slv_rpm_id = -1,
0496     .num_links = ARRAY_SIZE(pcnoc_s_2_links),
0497     .links = pcnoc_s_2_links,
0498 };
0499 
0500 static const u16 pcnoc_s_3_links[] = {
0501     QCS404_SLAVE_MESSAGE_RAM
0502 };
0503 
0504 static struct qcom_icc_node pcnoc_s_3 = {
0505     .name = "pcnoc_s_3",
0506     .id = QCS404_PNOC_SLV_3,
0507     .buswidth = 4,
0508     .mas_rpm_id = 92,
0509     .slv_rpm_id = 121,
0510     .num_links = ARRAY_SIZE(pcnoc_s_3_links),
0511     .links = pcnoc_s_3_links,
0512 };
0513 
0514 static const u16 pcnoc_s_4_links[] = {
0515     QCS404_SLAVE_SNOC_CFG
0516 };
0517 
0518 static struct qcom_icc_node pcnoc_s_4 = {
0519     .name = "pcnoc_s_4",
0520     .id = QCS404_PNOC_SLV_4,
0521     .buswidth = 4,
0522     .mas_rpm_id = 93,
0523     .slv_rpm_id = 122,
0524     .num_links = ARRAY_SIZE(pcnoc_s_4_links),
0525     .links = pcnoc_s_4_links,
0526 };
0527 
0528 static const u16 pcnoc_s_6_links[] = {
0529     QCS404_SLAVE_BLSP_1,
0530     QCS404_SLAVE_TLMM_NORTH,
0531     QCS404_SLAVE_EMAC_CFG
0532 };
0533 
0534 static struct qcom_icc_node pcnoc_s_6 = {
0535     .name = "pcnoc_s_6",
0536     .id = QCS404_PNOC_SLV_6,
0537     .buswidth = 4,
0538     .mas_rpm_id = 94,
0539     .slv_rpm_id = 123,
0540     .num_links = ARRAY_SIZE(pcnoc_s_6_links),
0541     .links = pcnoc_s_6_links,
0542 };
0543 
0544 static const u16 pcnoc_s_7_links[] = {
0545     QCS404_SLAVE_TLMM_SOUTH,
0546     QCS404_SLAVE_DISPLAY_CFG,
0547     QCS404_SLAVE_SDCC_1,
0548     QCS404_SLAVE_PCIE_1,
0549     QCS404_SLAVE_SDCC_2
0550 };
0551 
0552 static struct qcom_icc_node pcnoc_s_7 = {
0553     .name = "pcnoc_s_7",
0554     .id = QCS404_PNOC_SLV_7,
0555     .buswidth = 4,
0556     .mas_rpm_id = 95,
0557     .slv_rpm_id = 124,
0558     .num_links = ARRAY_SIZE(pcnoc_s_7_links),
0559     .links = pcnoc_s_7_links,
0560 };
0561 
0562 static const u16 pcnoc_s_8_links[] = {
0563     QCS404_SLAVE_CRYPTO_0_CFG
0564 };
0565 
0566 static struct qcom_icc_node pcnoc_s_8 = {
0567     .name = "pcnoc_s_8",
0568     .id = QCS404_PNOC_SLV_8,
0569     .buswidth = 4,
0570     .mas_rpm_id = 96,
0571     .slv_rpm_id = 125,
0572     .num_links = ARRAY_SIZE(pcnoc_s_8_links),
0573     .links = pcnoc_s_8_links,
0574 };
0575 
0576 static const u16 pcnoc_s_9_links[] = {
0577     QCS404_SLAVE_BLSP_2,
0578     QCS404_SLAVE_TLMM_EAST,
0579     QCS404_SLAVE_PMIC_ARB
0580 };
0581 
0582 static struct qcom_icc_node pcnoc_s_9 = {
0583     .name = "pcnoc_s_9",
0584     .id = QCS404_PNOC_SLV_9,
0585     .buswidth = 4,
0586     .mas_rpm_id = 97,
0587     .slv_rpm_id = 126,
0588     .num_links = ARRAY_SIZE(pcnoc_s_9_links),
0589     .links = pcnoc_s_9_links,
0590 };
0591 
0592 static const u16 pcnoc_s_10_links[] = {
0593     QCS404_SLAVE_USB_HS
0594 };
0595 
0596 static struct qcom_icc_node pcnoc_s_10 = {
0597     .name = "pcnoc_s_10",
0598     .id = QCS404_PNOC_SLV_10,
0599     .buswidth = 4,
0600     .mas_rpm_id = 157,
0601     .slv_rpm_id = -1,
0602     .num_links = ARRAY_SIZE(pcnoc_s_10_links),
0603     .links = pcnoc_s_10_links,
0604 };
0605 
0606 static const u16 pcnoc_s_11_links[] = {
0607     QCS404_SLAVE_USB3
0608 };
0609 
0610 static struct qcom_icc_node pcnoc_s_11 = {
0611     .name = "pcnoc_s_11",
0612     .id = QCS404_PNOC_SLV_11,
0613     .buswidth = 4,
0614     .mas_rpm_id = 158,
0615     .slv_rpm_id = 246,
0616     .num_links = ARRAY_SIZE(pcnoc_s_11_links),
0617     .links = pcnoc_s_11_links,
0618 };
0619 
0620 static const u16 qdss_int_links[] = {
0621     QCS404_SNOC_BIMC_1_SLV,
0622     QCS404_SNOC_INT_1
0623 };
0624 
0625 static struct qcom_icc_node qdss_int = {
0626     .name = "qdss_int",
0627     .id = QCS404_SNOC_QDSS_INT,
0628     .buswidth = 8,
0629     .mas_rpm_id = -1,
0630     .slv_rpm_id = -1,
0631     .num_links = ARRAY_SIZE(qdss_int_links),
0632     .links = qdss_int_links,
0633 };
0634 
0635 static const u16 snoc_int_0_links[] = {
0636     QCS404_SLAVE_LPASS,
0637     QCS404_SLAVE_APPSS,
0638     QCS404_SLAVE_WCSS
0639 };
0640 
0641 static struct qcom_icc_node snoc_int_0 = {
0642     .name = "snoc_int_0",
0643     .id = QCS404_SNOC_INT_0,
0644     .buswidth = 8,
0645     .mas_rpm_id = 99,
0646     .slv_rpm_id = 130,
0647     .num_links = ARRAY_SIZE(snoc_int_0_links),
0648     .links = snoc_int_0_links,
0649 };
0650 
0651 static const u16 snoc_int_1_links[] = {
0652     QCS404_SNOC_PNOC_SLV,
0653     QCS404_SNOC_INT_2
0654 };
0655 
0656 static struct qcom_icc_node snoc_int_1 = {
0657     .name = "snoc_int_1",
0658     .id = QCS404_SNOC_INT_1,
0659     .buswidth = 8,
0660     .mas_rpm_id = 100,
0661     .slv_rpm_id = 131,
0662     .num_links = ARRAY_SIZE(snoc_int_1_links),
0663     .links = snoc_int_1_links,
0664 };
0665 
0666 static const u16 snoc_int_2_links[] = {
0667     QCS404_SLAVE_QDSS_STM,
0668     QCS404_SLAVE_OCIMEM
0669 };
0670 
0671 static struct qcom_icc_node snoc_int_2 = {
0672     .name = "snoc_int_2",
0673     .id = QCS404_SNOC_INT_2,
0674     .buswidth = 8,
0675     .mas_rpm_id = 134,
0676     .slv_rpm_id = 197,
0677     .num_links = ARRAY_SIZE(snoc_int_2_links),
0678     .links = snoc_int_2_links,
0679 };
0680 
0681 static struct qcom_icc_node slv_ebi = {
0682     .name = "slv_ebi",
0683     .id = QCS404_SLAVE_EBI_CH0,
0684     .buswidth = 8,
0685     .mas_rpm_id = -1,
0686     .slv_rpm_id = 0,
0687 };
0688 
0689 static const u16 slv_bimc_snoc_links[] = {
0690     QCS404_BIMC_SNOC_MAS
0691 };
0692 
0693 static struct qcom_icc_node slv_bimc_snoc = {
0694     .name = "slv_bimc_snoc",
0695     .id = QCS404_BIMC_SNOC_SLV,
0696     .buswidth = 8,
0697     .mas_rpm_id = -1,
0698     .slv_rpm_id = 2,
0699     .num_links = ARRAY_SIZE(slv_bimc_snoc_links),
0700     .links = slv_bimc_snoc_links,
0701 };
0702 
0703 static struct qcom_icc_node slv_spdm = {
0704     .name = "slv_spdm",
0705     .id = QCS404_SLAVE_SPDM_WRAPPER,
0706     .buswidth = 4,
0707     .mas_rpm_id = -1,
0708     .slv_rpm_id = -1,
0709 };
0710 
0711 static struct qcom_icc_node slv_pdm = {
0712     .name = "slv_pdm",
0713     .id = QCS404_SLAVE_PDM,
0714     .buswidth = 4,
0715     .mas_rpm_id = -1,
0716     .slv_rpm_id = 41,
0717 };
0718 
0719 static struct qcom_icc_node slv_prng = {
0720     .name = "slv_prng",
0721     .id = QCS404_SLAVE_PRNG,
0722     .buswidth = 4,
0723     .mas_rpm_id = -1,
0724     .slv_rpm_id = 44,
0725 };
0726 
0727 static struct qcom_icc_node slv_tcsr = {
0728     .name = "slv_tcsr",
0729     .id = QCS404_SLAVE_TCSR,
0730     .buswidth = 4,
0731     .mas_rpm_id = -1,
0732     .slv_rpm_id = 50,
0733 };
0734 
0735 static struct qcom_icc_node slv_snoc_cfg = {
0736     .name = "slv_snoc_cfg",
0737     .id = QCS404_SLAVE_SNOC_CFG,
0738     .buswidth = 4,
0739     .mas_rpm_id = -1,
0740     .slv_rpm_id = 70,
0741 };
0742 
0743 static struct qcom_icc_node slv_message_ram = {
0744     .name = "slv_message_ram",
0745     .id = QCS404_SLAVE_MESSAGE_RAM,
0746     .buswidth = 4,
0747     .mas_rpm_id = -1,
0748     .slv_rpm_id = 55,
0749 };
0750 
0751 static struct qcom_icc_node slv_disp_ss_cfg = {
0752     .name = "slv_disp_ss_cfg",
0753     .id = QCS404_SLAVE_DISPLAY_CFG,
0754     .buswidth = 4,
0755     .mas_rpm_id = -1,
0756     .slv_rpm_id = -1,
0757 };
0758 
0759 static struct qcom_icc_node slv_gpu_cfg = {
0760     .name = "slv_gpu_cfg",
0761     .id = QCS404_SLAVE_GRAPHICS_3D_CFG,
0762     .buswidth = 4,
0763     .mas_rpm_id = -1,
0764     .slv_rpm_id = -1,
0765 };
0766 
0767 static struct qcom_icc_node slv_blsp_1 = {
0768     .name = "slv_blsp_1",
0769     .id = QCS404_SLAVE_BLSP_1,
0770     .buswidth = 4,
0771     .mas_rpm_id = -1,
0772     .slv_rpm_id = 39,
0773 };
0774 
0775 static struct qcom_icc_node slv_tlmm_north = {
0776     .name = "slv_tlmm_north",
0777     .id = QCS404_SLAVE_TLMM_NORTH,
0778     .buswidth = 4,
0779     .mas_rpm_id = -1,
0780     .slv_rpm_id = 214,
0781 };
0782 
0783 static struct qcom_icc_node slv_pcie = {
0784     .name = "slv_pcie",
0785     .id = QCS404_SLAVE_PCIE_1,
0786     .buswidth = 4,
0787     .mas_rpm_id = -1,
0788     .slv_rpm_id = -1,
0789 };
0790 
0791 static struct qcom_icc_node slv_ethernet = {
0792     .name = "slv_ethernet",
0793     .id = QCS404_SLAVE_EMAC_CFG,
0794     .buswidth = 4,
0795     .mas_rpm_id = -1,
0796     .slv_rpm_id = -1,
0797 };
0798 
0799 static struct qcom_icc_node slv_blsp_2 = {
0800     .name = "slv_blsp_2",
0801     .id = QCS404_SLAVE_BLSP_2,
0802     .buswidth = 4,
0803     .mas_rpm_id = -1,
0804     .slv_rpm_id = 37,
0805 };
0806 
0807 static struct qcom_icc_node slv_tlmm_east = {
0808     .name = "slv_tlmm_east",
0809     .id = QCS404_SLAVE_TLMM_EAST,
0810     .buswidth = 4,
0811     .mas_rpm_id = -1,
0812     .slv_rpm_id = 213,
0813 };
0814 
0815 static struct qcom_icc_node slv_tcu = {
0816     .name = "slv_tcu",
0817     .id = QCS404_SLAVE_TCU,
0818     .buswidth = 8,
0819     .mas_rpm_id = -1,
0820     .slv_rpm_id = -1,
0821 };
0822 
0823 static struct qcom_icc_node slv_pmic_arb = {
0824     .name = "slv_pmic_arb",
0825     .id = QCS404_SLAVE_PMIC_ARB,
0826     .buswidth = 4,
0827     .mas_rpm_id = -1,
0828     .slv_rpm_id = 59,
0829 };
0830 
0831 static struct qcom_icc_node slv_sdcc_1 = {
0832     .name = "slv_sdcc_1",
0833     .id = QCS404_SLAVE_SDCC_1,
0834     .buswidth = 4,
0835     .mas_rpm_id = -1,
0836     .slv_rpm_id = 31,
0837 };
0838 
0839 static struct qcom_icc_node slv_sdcc_2 = {
0840     .name = "slv_sdcc_2",
0841     .id = QCS404_SLAVE_SDCC_2,
0842     .buswidth = 4,
0843     .mas_rpm_id = -1,
0844     .slv_rpm_id = 33,
0845 };
0846 
0847 static struct qcom_icc_node slv_tlmm_south = {
0848     .name = "slv_tlmm_south",
0849     .id = QCS404_SLAVE_TLMM_SOUTH,
0850     .buswidth = 4,
0851     .mas_rpm_id = -1,
0852     .slv_rpm_id = -1,
0853 };
0854 
0855 static struct qcom_icc_node slv_usb_hs = {
0856     .name = "slv_usb_hs",
0857     .id = QCS404_SLAVE_USB_HS,
0858     .buswidth = 4,
0859     .mas_rpm_id = -1,
0860     .slv_rpm_id = 40,
0861 };
0862 
0863 static struct qcom_icc_node slv_usb3 = {
0864     .name = "slv_usb3",
0865     .id = QCS404_SLAVE_USB3,
0866     .buswidth = 4,
0867     .mas_rpm_id = -1,
0868     .slv_rpm_id = 22,
0869 };
0870 
0871 static struct qcom_icc_node slv_crypto_0_cfg = {
0872     .name = "slv_crypto_0_cfg",
0873     .id = QCS404_SLAVE_CRYPTO_0_CFG,
0874     .buswidth = 4,
0875     .mas_rpm_id = -1,
0876     .slv_rpm_id = 52,
0877 };
0878 
0879 static const u16 slv_pcnoc_snoc_links[] = {
0880     QCS404_PNOC_SNOC_MAS
0881 };
0882 
0883 static struct qcom_icc_node slv_pcnoc_snoc = {
0884     .name = "slv_pcnoc_snoc",
0885     .id = QCS404_PNOC_SNOC_SLV,
0886     .buswidth = 8,
0887     .mas_rpm_id = -1,
0888     .slv_rpm_id = 45,
0889     .num_links = ARRAY_SIZE(slv_pcnoc_snoc_links),
0890     .links = slv_pcnoc_snoc_links,
0891 };
0892 
0893 static struct qcom_icc_node slv_kpss_ahb = {
0894     .name = "slv_kpss_ahb",
0895     .id = QCS404_SLAVE_APPSS,
0896     .buswidth = 4,
0897     .mas_rpm_id = -1,
0898     .slv_rpm_id = -1,
0899 };
0900 
0901 static struct qcom_icc_node slv_wcss = {
0902     .name = "slv_wcss",
0903     .id = QCS404_SLAVE_WCSS,
0904     .buswidth = 4,
0905     .mas_rpm_id = -1,
0906     .slv_rpm_id = 23,
0907 };
0908 
0909 static const u16 slv_snoc_bimc_1_links[] = {
0910     QCS404_SNOC_BIMC_1_MAS
0911 };
0912 
0913 static struct qcom_icc_node slv_snoc_bimc_1 = {
0914     .name = "slv_snoc_bimc_1",
0915     .id = QCS404_SNOC_BIMC_1_SLV,
0916     .buswidth = 8,
0917     .mas_rpm_id = -1,
0918     .slv_rpm_id = 104,
0919     .num_links = ARRAY_SIZE(slv_snoc_bimc_1_links),
0920     .links = slv_snoc_bimc_1_links,
0921 };
0922 
0923 static struct qcom_icc_node slv_imem = {
0924     .name = "slv_imem",
0925     .id = QCS404_SLAVE_OCIMEM,
0926     .buswidth = 8,
0927     .mas_rpm_id = -1,
0928     .slv_rpm_id = 26,
0929 };
0930 
0931 static const u16 slv_snoc_pcnoc_links[] = {
0932     QCS404_SNOC_PNOC_MAS
0933 };
0934 
0935 static struct qcom_icc_node slv_snoc_pcnoc = {
0936     .name = "slv_snoc_pcnoc",
0937     .id = QCS404_SNOC_PNOC_SLV,
0938     .buswidth = 8,
0939     .mas_rpm_id = -1,
0940     .slv_rpm_id = 28,
0941     .num_links = ARRAY_SIZE(slv_snoc_pcnoc_links),
0942     .links = slv_snoc_pcnoc_links,
0943 };
0944 
0945 static struct qcom_icc_node slv_qdss_stm = {
0946     .name = "slv_qdss_stm",
0947     .id = QCS404_SLAVE_QDSS_STM,
0948     .buswidth = 4,
0949     .mas_rpm_id = -1,
0950     .slv_rpm_id = 30,
0951 };
0952 
0953 static struct qcom_icc_node slv_cats_0 = {
0954     .name = "slv_cats_0",
0955     .id = QCS404_SLAVE_CATS_128,
0956     .buswidth = 16,
0957     .mas_rpm_id = -1,
0958     .slv_rpm_id = -1,
0959 };
0960 
0961 static struct qcom_icc_node slv_cats_1 = {
0962     .name = "slv_cats_1",
0963     .id = QCS404_SLAVE_OCMEM_64,
0964     .buswidth = 8,
0965     .mas_rpm_id = -1,
0966     .slv_rpm_id = -1,
0967 };
0968 
0969 static struct qcom_icc_node slv_lpass = {
0970     .name = "slv_lpass",
0971     .id = QCS404_SLAVE_LPASS,
0972     .buswidth = 4,
0973     .mas_rpm_id = -1,
0974     .slv_rpm_id = -1,
0975 };
0976 
0977 static struct qcom_icc_node * const qcs404_bimc_nodes[] = {
0978     [MASTER_AMPSS_M0] = &mas_apps_proc,
0979     [MASTER_OXILI] = &mas_oxili,
0980     [MASTER_MDP_PORT0] = &mas_mdp,
0981     [MASTER_SNOC_BIMC_1] = &mas_snoc_bimc_1,
0982     [MASTER_TCU_0] = &mas_tcu_0,
0983     [SLAVE_EBI_CH0] = &slv_ebi,
0984     [SLAVE_BIMC_SNOC] = &slv_bimc_snoc,
0985 };
0986 
0987 static const struct qcom_icc_desc qcs404_bimc = {
0988     .nodes = qcs404_bimc_nodes,
0989     .num_nodes = ARRAY_SIZE(qcs404_bimc_nodes),
0990 };
0991 
0992 static struct qcom_icc_node * const qcs404_pcnoc_nodes[] = {
0993     [MASTER_SPDM] = &mas_spdm,
0994     [MASTER_BLSP_1] = &mas_blsp_1,
0995     [MASTER_BLSP_2] = &mas_blsp_2,
0996     [MASTER_XI_USB_HS1] = &mas_xi_usb_hs1,
0997     [MASTER_CRYPT0] = &mas_crypto,
0998     [MASTER_SDCC_1] = &mas_sdcc_1,
0999     [MASTER_SDCC_2] = &mas_sdcc_2,
1000     [MASTER_SNOC_PCNOC] = &mas_snoc_pcnoc,
1001     [MASTER_QPIC] = &mas_qpic,
1002     [PCNOC_INT_0] = &pcnoc_int_0,
1003     [PCNOC_INT_2] = &pcnoc_int_2,
1004     [PCNOC_INT_3] = &pcnoc_int_3,
1005     [PCNOC_S_0] = &pcnoc_s_0,
1006     [PCNOC_S_1] = &pcnoc_s_1,
1007     [PCNOC_S_2] = &pcnoc_s_2,
1008     [PCNOC_S_3] = &pcnoc_s_3,
1009     [PCNOC_S_4] = &pcnoc_s_4,
1010     [PCNOC_S_6] = &pcnoc_s_6,
1011     [PCNOC_S_7] = &pcnoc_s_7,
1012     [PCNOC_S_8] = &pcnoc_s_8,
1013     [PCNOC_S_9] = &pcnoc_s_9,
1014     [PCNOC_S_10] = &pcnoc_s_10,
1015     [PCNOC_S_11] = &pcnoc_s_11,
1016     [SLAVE_SPDM] = &slv_spdm,
1017     [SLAVE_PDM] = &slv_pdm,
1018     [SLAVE_PRNG] = &slv_prng,
1019     [SLAVE_TCSR] = &slv_tcsr,
1020     [SLAVE_SNOC_CFG] = &slv_snoc_cfg,
1021     [SLAVE_MESSAGE_RAM] = &slv_message_ram,
1022     [SLAVE_DISP_SS_CFG] = &slv_disp_ss_cfg,
1023     [SLAVE_GPU_CFG] = &slv_gpu_cfg,
1024     [SLAVE_BLSP_1] = &slv_blsp_1,
1025     [SLAVE_BLSP_2] = &slv_blsp_2,
1026     [SLAVE_TLMM_NORTH] = &slv_tlmm_north,
1027     [SLAVE_PCIE] = &slv_pcie,
1028     [SLAVE_ETHERNET] = &slv_ethernet,
1029     [SLAVE_TLMM_EAST] = &slv_tlmm_east,
1030     [SLAVE_TCU] = &slv_tcu,
1031     [SLAVE_PMIC_ARB] = &slv_pmic_arb,
1032     [SLAVE_SDCC_1] = &slv_sdcc_1,
1033     [SLAVE_SDCC_2] = &slv_sdcc_2,
1034     [SLAVE_TLMM_SOUTH] = &slv_tlmm_south,
1035     [SLAVE_USB_HS] = &slv_usb_hs,
1036     [SLAVE_USB3] = &slv_usb3,
1037     [SLAVE_CRYPTO_0_CFG] = &slv_crypto_0_cfg,
1038     [SLAVE_PCNOC_SNOC] = &slv_pcnoc_snoc,
1039 };
1040 
1041 static const struct qcom_icc_desc qcs404_pcnoc = {
1042     .nodes = qcs404_pcnoc_nodes,
1043     .num_nodes = ARRAY_SIZE(qcs404_pcnoc_nodes),
1044 };
1045 
1046 static struct qcom_icc_node * const qcs404_snoc_nodes[] = {
1047     [MASTER_QDSS_BAM] = &mas_qdss_bam,
1048     [MASTER_BIMC_SNOC] = &mas_bimc_snoc,
1049     [MASTER_PCNOC_SNOC] = &mas_pcnoc_snoc,
1050     [MASTER_QDSS_ETR] = &mas_qdss_etr,
1051     [MASTER_EMAC] = &mas_emac,
1052     [MASTER_PCIE] = &mas_pcie,
1053     [MASTER_USB3] = &mas_usb3,
1054     [QDSS_INT] = &qdss_int,
1055     [SNOC_INT_0] = &snoc_int_0,
1056     [SNOC_INT_1] = &snoc_int_1,
1057     [SNOC_INT_2] = &snoc_int_2,
1058     [SLAVE_KPSS_AHB] = &slv_kpss_ahb,
1059     [SLAVE_WCSS] = &slv_wcss,
1060     [SLAVE_SNOC_BIMC_1] = &slv_snoc_bimc_1,
1061     [SLAVE_IMEM] = &slv_imem,
1062     [SLAVE_SNOC_PCNOC] = &slv_snoc_pcnoc,
1063     [SLAVE_QDSS_STM] = &slv_qdss_stm,
1064     [SLAVE_CATS_0] = &slv_cats_0,
1065     [SLAVE_CATS_1] = &slv_cats_1,
1066     [SLAVE_LPASS] = &slv_lpass,
1067 };
1068 
1069 static const struct qcom_icc_desc qcs404_snoc = {
1070     .nodes = qcs404_snoc_nodes,
1071     .num_nodes = ARRAY_SIZE(qcs404_snoc_nodes),
1072 };
1073 
1074 
1075 static const struct of_device_id qcs404_noc_of_match[] = {
1076     { .compatible = "qcom,qcs404-bimc", .data = &qcs404_bimc },
1077     { .compatible = "qcom,qcs404-pcnoc", .data = &qcs404_pcnoc },
1078     { .compatible = "qcom,qcs404-snoc", .data = &qcs404_snoc },
1079     { },
1080 };
1081 MODULE_DEVICE_TABLE(of, qcs404_noc_of_match);
1082 
1083 static struct platform_driver qcs404_noc_driver = {
1084     .probe = qnoc_probe,
1085     .remove = qnoc_remove,
1086     .driver = {
1087         .name = "qnoc-qcs404",
1088         .of_match_table = qcs404_noc_of_match,
1089     },
1090 };
1091 module_platform_driver(qcs404_noc_driver);
1092 MODULE_DESCRIPTION("Qualcomm QCS404 NoC driver");
1093 MODULE_LICENSE("GPL v2");