at v6.19 916 lines 19 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Qualcomm SDX55 interconnect driver 4 * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 5 * 6 * Copyright (c) 2021, Linaro Ltd. 7 * 8 */ 9 10#include <linux/device.h> 11#include <linux/interconnect.h> 12#include <linux/interconnect-provider.h> 13#include <linux/mod_devicetable.h> 14#include <linux/module.h> 15#include <linux/platform_device.h> 16#include <dt-bindings/interconnect/qcom,sdx55.h> 17 18#include "bcm-voter.h" 19#include "icc-rpmh.h" 20 21static struct qcom_icc_node llcc_mc; 22static struct qcom_icc_node acm_tcu; 23static struct qcom_icc_node qnm_snoc_gc; 24static struct qcom_icc_node xm_apps_rdwr; 25static struct qcom_icc_node qhm_audio; 26static struct qcom_icc_node qhm_blsp1; 27static struct qcom_icc_node qhm_qdss_bam; 28static struct qcom_icc_node qhm_qpic; 29static struct qcom_icc_node qhm_snoc_cfg; 30static struct qcom_icc_node qhm_spmi_fetcher1; 31static struct qcom_icc_node qnm_aggre_noc; 32static struct qcom_icc_node qnm_ipa; 33static struct qcom_icc_node qnm_memnoc; 34static struct qcom_icc_node qnm_memnoc_pcie; 35static struct qcom_icc_node qxm_crypto; 36static struct qcom_icc_node xm_emac; 37static struct qcom_icc_node xm_ipa2pcie_slv; 38static struct qcom_icc_node xm_pcie; 39static struct qcom_icc_node xm_qdss_etr; 40static struct qcom_icc_node xm_sdc1; 41static struct qcom_icc_node xm_usb3; 42static struct qcom_icc_node ebi; 43static struct qcom_icc_node qns_llcc; 44static struct qcom_icc_node qns_memnoc_snoc; 45static struct qcom_icc_node qns_sys_pcie; 46static struct qcom_icc_node qhs_aop; 47static struct qcom_icc_node qhs_aoss; 48static struct qcom_icc_node qhs_apss; 49static struct qcom_icc_node qhs_audio; 50static struct qcom_icc_node qhs_blsp1; 51static struct qcom_icc_node qhs_clk_ctl; 52static struct qcom_icc_node qhs_crypto0_cfg; 53static struct qcom_icc_node qhs_ddrss_cfg; 54static struct qcom_icc_node qhs_ecc_cfg; 55static struct qcom_icc_node qhs_emac_cfg; 56static struct qcom_icc_node qhs_imem_cfg; 57static struct qcom_icc_node qhs_ipa; 58static struct qcom_icc_node qhs_mss_cfg; 59static struct qcom_icc_node qhs_pcie_parf; 60static struct qcom_icc_node qhs_pdm; 61static struct qcom_icc_node qhs_prng; 62static struct qcom_icc_node qhs_qdss_cfg; 63static struct qcom_icc_node qhs_qpic; 64static struct qcom_icc_node qhs_sdc1; 65static struct qcom_icc_node qhs_snoc_cfg; 66static struct qcom_icc_node qhs_spmi_fetcher; 67static struct qcom_icc_node qhs_spmi_vgi_coex; 68static struct qcom_icc_node qhs_tcsr; 69static struct qcom_icc_node qhs_tlmm; 70static struct qcom_icc_node qhs_usb3; 71static struct qcom_icc_node qhs_usb3_phy; 72static struct qcom_icc_node qns_aggre_noc; 73static struct qcom_icc_node qns_snoc_memnoc; 74static struct qcom_icc_node qxs_imem; 75static struct qcom_icc_node srvc_snoc; 76static struct qcom_icc_node xs_pcie; 77static struct qcom_icc_node xs_qdss_stm; 78static struct qcom_icc_node xs_sys_tcu_cfg; 79 80static struct qcom_icc_node llcc_mc = { 81 .name = "llcc_mc", 82 .channels = 4, 83 .buswidth = 4, 84 .num_links = 1, 85 .link_nodes = { &ebi }, 86}; 87 88static struct qcom_icc_node acm_tcu = { 89 .name = "acm_tcu", 90 .channels = 1, 91 .buswidth = 8, 92 .num_links = 3, 93 .link_nodes = { &qns_llcc, 94 &qns_memnoc_snoc, 95 &qns_sys_pcie }, 96}; 97 98static struct qcom_icc_node qnm_snoc_gc = { 99 .name = "qnm_snoc_gc", 100 .channels = 1, 101 .buswidth = 8, 102 .num_links = 1, 103 .link_nodes = { &qns_llcc }, 104}; 105 106static struct qcom_icc_node xm_apps_rdwr = { 107 .name = "xm_apps_rdwr", 108 .channels = 1, 109 .buswidth = 16, 110 .num_links = 3, 111 .link_nodes = { &qns_llcc, 112 &qns_memnoc_snoc, 113 &qns_sys_pcie }, 114}; 115 116static struct qcom_icc_node qhm_audio = { 117 .name = "qhm_audio", 118 .channels = 1, 119 .buswidth = 4, 120 .num_links = 1, 121 .link_nodes = { &qns_aggre_noc }, 122}; 123 124static struct qcom_icc_node qhm_blsp1 = { 125 .name = "qhm_blsp1", 126 .channels = 1, 127 .buswidth = 4, 128 .num_links = 1, 129 .link_nodes = { &qns_aggre_noc }, 130}; 131 132static struct qcom_icc_node qhm_qdss_bam = { 133 .name = "qhm_qdss_bam", 134 .channels = 1, 135 .buswidth = 4, 136 .num_links = 28, 137 .link_nodes = { &qhs_snoc_cfg, 138 &qhs_emac_cfg, 139 &qhs_usb3, 140 &qhs_tlmm, 141 &qhs_spmi_fetcher, 142 &qhs_qdss_cfg, 143 &qhs_pdm, 144 &qns_snoc_memnoc, 145 &qhs_tcsr, 146 &qhs_ddrss_cfg, 147 &qhs_spmi_vgi_coex, 148 &qhs_qpic, 149 &qxs_imem, 150 &qhs_ipa, 151 &qhs_usb3_phy, 152 &qhs_aop, 153 &qhs_blsp1, 154 &qhs_sdc1, 155 &qhs_mss_cfg, 156 &qhs_pcie_parf, 157 &qhs_ecc_cfg, 158 &qhs_audio, 159 &qhs_aoss, 160 &qhs_prng, 161 &qhs_crypto0_cfg, 162 &xs_sys_tcu_cfg, 163 &qhs_clk_ctl, 164 &qhs_imem_cfg }, 165}; 166 167static struct qcom_icc_node qhm_qpic = { 168 .name = "qhm_qpic", 169 .channels = 1, 170 .buswidth = 4, 171 .num_links = 5, 172 .link_nodes = { &qhs_aoss, 173 &qhs_ipa, 174 &qns_aggre_noc, 175 &qhs_aop, 176 &qhs_audio }, 177}; 178 179static struct qcom_icc_node qhm_snoc_cfg = { 180 .name = "qhm_snoc_cfg", 181 .channels = 1, 182 .buswidth = 4, 183 .num_links = 1, 184 .link_nodes = { &srvc_snoc }, 185}; 186 187static struct qcom_icc_node qhm_spmi_fetcher1 = { 188 .name = "qhm_spmi_fetcher1", 189 .channels = 1, 190 .buswidth = 4, 191 .num_links = 3, 192 .link_nodes = { &qhs_aoss, 193 &qns_aggre_noc, 194 &qhs_aop }, 195}; 196 197static struct qcom_icc_node qnm_aggre_noc = { 198 .name = "qnm_aggre_noc", 199 .channels = 1, 200 .buswidth = 8, 201 .num_links = 30, 202 .link_nodes = { &xs_pcie, 203 &qhs_snoc_cfg, 204 &qhs_sdc1, 205 &qhs_tlmm, 206 &qhs_spmi_fetcher, 207 &qhs_qdss_cfg, 208 &qhs_pdm, 209 &qns_snoc_memnoc, 210 &qhs_tcsr, 211 &qhs_ddrss_cfg, 212 &qhs_spmi_vgi_coex, 213 &xs_qdss_stm, 214 &qhs_qpic, 215 &qxs_imem, 216 &qhs_ipa, 217 &qhs_usb3_phy, 218 &qhs_aop, 219 &qhs_blsp1, 220 &qhs_usb3, 221 &qhs_mss_cfg, 222 &qhs_pcie_parf, 223 &qhs_ecc_cfg, 224 &qhs_apss, 225 &qhs_audio, 226 &qhs_aoss, 227 &qhs_prng, 228 &qhs_crypto0_cfg, 229 &xs_sys_tcu_cfg, 230 &qhs_clk_ctl, 231 &qhs_imem_cfg }, 232}; 233 234static struct qcom_icc_node qnm_ipa = { 235 .name = "qnm_ipa", 236 .channels = 1, 237 .buswidth = 8, 238 .num_links = 27, 239 .link_nodes = { &qhs_snoc_cfg, 240 &qhs_emac_cfg, 241 &qhs_usb3, 242 &qhs_aoss, 243 &qhs_spmi_fetcher, 244 &qhs_qdss_cfg, 245 &qhs_pdm, 246 &qns_snoc_memnoc, 247 &qhs_tcsr, 248 &qhs_ddrss_cfg, 249 &xs_qdss_stm, 250 &qhs_qpic, 251 &qxs_imem, 252 &qhs_ipa, 253 &qhs_usb3_phy, 254 &qhs_aop, 255 &qhs_blsp1, 256 &qhs_sdc1, 257 &qhs_mss_cfg, 258 &qhs_pcie_parf, 259 &qhs_ecc_cfg, 260 &qhs_audio, 261 &qhs_tlmm, 262 &qhs_prng, 263 &qhs_crypto0_cfg, 264 &qhs_clk_ctl, 265 &qhs_imem_cfg }, 266}; 267 268static struct qcom_icc_node qnm_memnoc = { 269 .name = "qnm_memnoc", 270 .channels = 1, 271 .buswidth = 8, 272 .num_links = 29, 273 .link_nodes = { &qhs_snoc_cfg, 274 &qhs_emac_cfg, 275 &qhs_usb3, 276 &qhs_tlmm, 277 &qhs_spmi_fetcher, 278 &qhs_qdss_cfg, 279 &qhs_pdm, 280 &qhs_tcsr, 281 &qhs_ddrss_cfg, 282 &qhs_spmi_vgi_coex, 283 &xs_qdss_stm, 284 &qhs_qpic, 285 &qxs_imem, 286 &qhs_ipa, 287 &qhs_usb3_phy, 288 &qhs_aop, 289 &qhs_blsp1, 290 &qhs_sdc1, 291 &qhs_mss_cfg, 292 &qhs_pcie_parf, 293 &qhs_ecc_cfg, 294 &qhs_apss, 295 &qhs_audio, 296 &qhs_aoss, 297 &qhs_prng, 298 &qhs_crypto0_cfg, 299 &xs_sys_tcu_cfg, 300 &qhs_clk_ctl, 301 &qhs_imem_cfg }, 302}; 303 304static struct qcom_icc_node qnm_memnoc_pcie = { 305 .name = "qnm_memnoc_pcie", 306 .channels = 1, 307 .buswidth = 8, 308 .num_links = 1, 309 .link_nodes = { &xs_pcie }, 310}; 311 312static struct qcom_icc_node qxm_crypto = { 313 .name = "qxm_crypto", 314 .channels = 1, 315 .buswidth = 8, 316 .num_links = 3, 317 .link_nodes = { &qhs_aoss, 318 &qns_aggre_noc, 319 &qhs_aop }, 320}; 321 322static struct qcom_icc_node xm_emac = { 323 .name = "xm_emac", 324 .channels = 1, 325 .buswidth = 8, 326 .num_links = 1, 327 .link_nodes = { &qns_aggre_noc }, 328}; 329 330static struct qcom_icc_node xm_ipa2pcie_slv = { 331 .name = "xm_ipa2pcie_slv", 332 .channels = 1, 333 .buswidth = 8, 334 .num_links = 1, 335 .link_nodes = { &xs_pcie }, 336}; 337 338static struct qcom_icc_node xm_pcie = { 339 .name = "xm_pcie", 340 .channels = 1, 341 .buswidth = 8, 342 .num_links = 1, 343 .link_nodes = { &qns_aggre_noc }, 344}; 345 346static struct qcom_icc_node xm_qdss_etr = { 347 .name = "xm_qdss_etr", 348 .channels = 1, 349 .buswidth = 8, 350 .num_links = 28, 351 .link_nodes = { &qhs_snoc_cfg, 352 &qhs_emac_cfg, 353 &qhs_usb3, 354 &qhs_aoss, 355 &qhs_spmi_fetcher, 356 &qhs_qdss_cfg, 357 &qhs_pdm, 358 &qns_snoc_memnoc, 359 &qhs_tcsr, 360 &qhs_ddrss_cfg, 361 &qhs_spmi_vgi_coex, 362 &qhs_qpic, 363 &qxs_imem, 364 &qhs_ipa, 365 &qhs_usb3_phy, 366 &qhs_aop, 367 &qhs_blsp1, 368 &qhs_sdc1, 369 &qhs_mss_cfg, 370 &qhs_pcie_parf, 371 &qhs_ecc_cfg, 372 &qhs_audio, 373 &qhs_aoss, 374 &qhs_prng, 375 &qhs_crypto0_cfg, 376 &xs_sys_tcu_cfg, 377 &qhs_clk_ctl, 378 &qhs_imem_cfg }, 379}; 380 381static struct qcom_icc_node xm_sdc1 = { 382 .name = "xm_sdc1", 383 .channels = 1, 384 .buswidth = 8, 385 .num_links = 5, 386 .link_nodes = { &qhs_aoss, 387 &qhs_ipa, 388 &qns_aggre_noc, 389 &qhs_aop, 390 &qhs_audio }, 391}; 392 393static struct qcom_icc_node xm_usb3 = { 394 .name = "xm_usb3", 395 .channels = 1, 396 .buswidth = 8, 397 .num_links = 1, 398 .link_nodes = { &qns_aggre_noc }, 399}; 400 401static struct qcom_icc_node ebi = { 402 .name = "ebi", 403 .channels = 1, 404 .buswidth = 4, 405}; 406 407static struct qcom_icc_node qns_llcc = { 408 .name = "qns_llcc", 409 .channels = 1, 410 .buswidth = 16, 411 .num_links = 1, 412 .link_nodes = { &ebi }, 413}; 414 415static struct qcom_icc_node qns_memnoc_snoc = { 416 .name = "qns_memnoc_snoc", 417 .channels = 1, 418 .buswidth = 8, 419 .num_links = 1, 420 .link_nodes = { &qnm_memnoc }, 421}; 422 423static struct qcom_icc_node qns_sys_pcie = { 424 .name = "qns_sys_pcie", 425 .channels = 1, 426 .buswidth = 8, 427 .num_links = 1, 428 .link_nodes = { &qnm_memnoc_pcie }, 429}; 430 431static struct qcom_icc_node qhs_aop = { 432 .name = "qhs_aop", 433 .channels = 1, 434 .buswidth = 4, 435}; 436 437static struct qcom_icc_node qhs_aoss = { 438 .name = "qhs_aoss", 439 .channels = 1, 440 .buswidth = 4, 441}; 442 443static struct qcom_icc_node qhs_apss = { 444 .name = "qhs_apss", 445 .channels = 1, 446 .buswidth = 4, 447}; 448 449static struct qcom_icc_node qhs_audio = { 450 .name = "qhs_audio", 451 .channels = 1, 452 .buswidth = 4, 453}; 454 455static struct qcom_icc_node qhs_blsp1 = { 456 .name = "qhs_blsp1", 457 .channels = 1, 458 .buswidth = 4, 459}; 460 461static struct qcom_icc_node qhs_clk_ctl = { 462 .name = "qhs_clk_ctl", 463 .channels = 1, 464 .buswidth = 4, 465}; 466 467static struct qcom_icc_node qhs_crypto0_cfg = { 468 .name = "qhs_crypto0_cfg", 469 .channels = 1, 470 .buswidth = 4, 471}; 472 473static struct qcom_icc_node qhs_ddrss_cfg = { 474 .name = "qhs_ddrss_cfg", 475 .channels = 1, 476 .buswidth = 4, 477}; 478 479static struct qcom_icc_node qhs_ecc_cfg = { 480 .name = "qhs_ecc_cfg", 481 .channels = 1, 482 .buswidth = 4, 483}; 484 485static struct qcom_icc_node qhs_emac_cfg = { 486 .name = "qhs_emac_cfg", 487 .channels = 1, 488 .buswidth = 4, 489}; 490 491static struct qcom_icc_node qhs_imem_cfg = { 492 .name = "qhs_imem_cfg", 493 .channels = 1, 494 .buswidth = 4, 495}; 496 497static struct qcom_icc_node qhs_ipa = { 498 .name = "qhs_ipa", 499 .channels = 1, 500 .buswidth = 4, 501}; 502 503static struct qcom_icc_node qhs_mss_cfg = { 504 .name = "qhs_mss_cfg", 505 .channels = 1, 506 .buswidth = 4, 507}; 508 509static struct qcom_icc_node qhs_pcie_parf = { 510 .name = "qhs_pcie_parf", 511 .channels = 1, 512 .buswidth = 4, 513}; 514 515static struct qcom_icc_node qhs_pdm = { 516 .name = "qhs_pdm", 517 .channels = 1, 518 .buswidth = 4, 519}; 520 521static struct qcom_icc_node qhs_prng = { 522 .name = "qhs_prng", 523 .channels = 1, 524 .buswidth = 4, 525}; 526 527static struct qcom_icc_node qhs_qdss_cfg = { 528 .name = "qhs_qdss_cfg", 529 .channels = 1, 530 .buswidth = 4, 531}; 532 533static struct qcom_icc_node qhs_qpic = { 534 .name = "qhs_qpic", 535 .channels = 1, 536 .buswidth = 4, 537}; 538 539static struct qcom_icc_node qhs_sdc1 = { 540 .name = "qhs_sdc1", 541 .channels = 1, 542 .buswidth = 4, 543}; 544 545static struct qcom_icc_node qhs_snoc_cfg = { 546 .name = "qhs_snoc_cfg", 547 .channels = 1, 548 .buswidth = 4, 549 .num_links = 1, 550 .link_nodes = { &qhm_snoc_cfg }, 551}; 552 553static struct qcom_icc_node qhs_spmi_fetcher = { 554 .name = "qhs_spmi_fetcher", 555 .channels = 1, 556 .buswidth = 4, 557}; 558 559static struct qcom_icc_node qhs_spmi_vgi_coex = { 560 .name = "qhs_spmi_vgi_coex", 561 .channels = 1, 562 .buswidth = 4, 563}; 564 565static struct qcom_icc_node qhs_tcsr = { 566 .name = "qhs_tcsr", 567 .channels = 1, 568 .buswidth = 4, 569}; 570 571static struct qcom_icc_node qhs_tlmm = { 572 .name = "qhs_tlmm", 573 .channels = 1, 574 .buswidth = 4, 575}; 576 577static struct qcom_icc_node qhs_usb3 = { 578 .name = "qhs_usb3", 579 .channels = 1, 580 .buswidth = 4, 581}; 582 583static struct qcom_icc_node qhs_usb3_phy = { 584 .name = "qhs_usb3_phy", 585 .channels = 1, 586 .buswidth = 4, 587}; 588 589static struct qcom_icc_node qns_aggre_noc = { 590 .name = "qns_aggre_noc", 591 .channels = 1, 592 .buswidth = 8, 593 .num_links = 1, 594 .link_nodes = { &qnm_aggre_noc }, 595}; 596 597static struct qcom_icc_node qns_snoc_memnoc = { 598 .name = "qns_snoc_memnoc", 599 .channels = 1, 600 .buswidth = 8, 601 .num_links = 1, 602 .link_nodes = { &qnm_snoc_gc }, 603}; 604 605static struct qcom_icc_node qxs_imem = { 606 .name = "qxs_imem", 607 .channels = 1, 608 .buswidth = 8, 609}; 610 611static struct qcom_icc_node srvc_snoc = { 612 .name = "srvc_snoc", 613 .channels = 1, 614 .buswidth = 4, 615}; 616 617static struct qcom_icc_node xs_pcie = { 618 .name = "xs_pcie", 619 .channels = 1, 620 .buswidth = 8, 621}; 622 623static struct qcom_icc_node xs_qdss_stm = { 624 .name = "xs_qdss_stm", 625 .channels = 1, 626 .buswidth = 4, 627}; 628 629static struct qcom_icc_node xs_sys_tcu_cfg = { 630 .name = "xs_sys_tcu_cfg", 631 .channels = 1, 632 .buswidth = 8, 633}; 634 635static struct qcom_icc_bcm bcm_mc0 = { 636 .name = "MC0", 637 .keepalive = true, 638 .num_nodes = 1, 639 .nodes = { &ebi }, 640}; 641 642static struct qcom_icc_bcm bcm_sh0 = { 643 .name = "SH0", 644 .keepalive = true, 645 .num_nodes = 1, 646 .nodes = { &qns_llcc }, 647}; 648 649static struct qcom_icc_bcm bcm_ce0 = { 650 .name = "CE0", 651 .keepalive = false, 652 .num_nodes = 1, 653 .nodes = { &qxm_crypto }, 654}; 655 656static struct qcom_icc_bcm bcm_pn0 = { 657 .name = "PN0", 658 .keepalive = false, 659 .num_nodes = 1, 660 .nodes = { &qhm_snoc_cfg }, 661}; 662 663static struct qcom_icc_bcm bcm_sh3 = { 664 .name = "SH3", 665 .keepalive = false, 666 .num_nodes = 1, 667 .nodes = { &xm_apps_rdwr }, 668}; 669 670static struct qcom_icc_bcm bcm_sh4 = { 671 .name = "SH4", 672 .keepalive = false, 673 .num_nodes = 2, 674 .nodes = { &qns_memnoc_snoc, &qns_sys_pcie }, 675}; 676 677static struct qcom_icc_bcm bcm_sn0 = { 678 .name = "SN0", 679 .keepalive = true, 680 .num_nodes = 1, 681 .nodes = { &qns_snoc_memnoc }, 682}; 683 684static struct qcom_icc_bcm bcm_sn1 = { 685 .name = "SN1", 686 .keepalive = false, 687 .num_nodes = 1, 688 .nodes = { &qxs_imem }, 689}; 690 691static struct qcom_icc_bcm bcm_pn1 = { 692 .name = "PN1", 693 .keepalive = false, 694 .num_nodes = 1, 695 .nodes = { &xm_sdc1 }, 696}; 697 698static struct qcom_icc_bcm bcm_pn2 = { 699 .name = "PN2", 700 .keepalive = false, 701 .num_nodes = 2, 702 .nodes = { &qhm_audio, &qhm_spmi_fetcher1 }, 703}; 704 705static struct qcom_icc_bcm bcm_sn3 = { 706 .name = "SN3", 707 .keepalive = false, 708 .num_nodes = 1, 709 .nodes = { &xs_qdss_stm }, 710}; 711 712static struct qcom_icc_bcm bcm_pn3 = { 713 .name = "PN3", 714 .keepalive = false, 715 .num_nodes = 2, 716 .nodes = { &qhm_blsp1, &qhm_qpic }, 717}; 718 719static struct qcom_icc_bcm bcm_sn4 = { 720 .name = "SN4", 721 .keepalive = false, 722 .num_nodes = 1, 723 .nodes = { &xs_sys_tcu_cfg }, 724}; 725 726static struct qcom_icc_bcm bcm_pn5 = { 727 .name = "PN5", 728 .keepalive = false, 729 .num_nodes = 1, 730 .nodes = { &qxm_crypto }, 731}; 732 733static struct qcom_icc_bcm bcm_sn6 = { 734 .name = "SN6", 735 .keepalive = false, 736 .num_nodes = 1, 737 .nodes = { &xs_pcie }, 738}; 739 740static struct qcom_icc_bcm bcm_sn7 = { 741 .name = "SN7", 742 .keepalive = false, 743 .num_nodes = 5, 744 .nodes = { &qnm_aggre_noc, &xm_emac, &xm_emac, &xm_usb3, &qns_aggre_noc }, 745}; 746 747static struct qcom_icc_bcm bcm_sn8 = { 748 .name = "SN8", 749 .keepalive = false, 750 .num_nodes = 2, 751 .nodes = { &qhm_qdss_bam, &xm_qdss_etr }, 752}; 753 754static struct qcom_icc_bcm bcm_sn9 = { 755 .name = "SN9", 756 .keepalive = false, 757 .num_nodes = 1, 758 .nodes = { &qnm_memnoc }, 759}; 760 761static struct qcom_icc_bcm bcm_sn10 = { 762 .name = "SN10", 763 .keepalive = false, 764 .num_nodes = 1, 765 .nodes = { &qnm_memnoc_pcie }, 766}; 767 768static struct qcom_icc_bcm bcm_sn11 = { 769 .name = "SN11", 770 .keepalive = false, 771 .num_nodes = 2, 772 .nodes = { &qnm_ipa, &xm_ipa2pcie_slv }, 773}; 774 775static struct qcom_icc_bcm * const mc_virt_bcms[] = { 776 &bcm_mc0, 777}; 778 779static struct qcom_icc_node * const mc_virt_nodes[] = { 780 [MASTER_LLCC] = &llcc_mc, 781 [SLAVE_EBI_CH0] = &ebi, 782}; 783 784static const struct qcom_icc_desc sdx55_mc_virt = { 785 .nodes = mc_virt_nodes, 786 .num_nodes = ARRAY_SIZE(mc_virt_nodes), 787 .bcms = mc_virt_bcms, 788 .num_bcms = ARRAY_SIZE(mc_virt_bcms), 789}; 790 791static struct qcom_icc_bcm * const mem_noc_bcms[] = { 792 &bcm_sh0, 793 &bcm_sh3, 794 &bcm_sh4, 795}; 796 797static struct qcom_icc_node * const mem_noc_nodes[] = { 798 [MASTER_TCU_0] = &acm_tcu, 799 [MASTER_SNOC_GC_MEM_NOC] = &qnm_snoc_gc, 800 [MASTER_AMPSS_M0] = &xm_apps_rdwr, 801 [SLAVE_LLCC] = &qns_llcc, 802 [SLAVE_MEM_NOC_SNOC] = &qns_memnoc_snoc, 803 [SLAVE_MEM_NOC_PCIE_SNOC] = &qns_sys_pcie, 804}; 805 806static const struct qcom_icc_desc sdx55_mem_noc = { 807 .nodes = mem_noc_nodes, 808 .num_nodes = ARRAY_SIZE(mem_noc_nodes), 809 .bcms = mem_noc_bcms, 810 .num_bcms = ARRAY_SIZE(mem_noc_bcms), 811}; 812 813static struct qcom_icc_bcm * const system_noc_bcms[] = { 814 &bcm_ce0, 815 &bcm_pn0, 816 &bcm_pn1, 817 &bcm_pn2, 818 &bcm_pn3, 819 &bcm_pn5, 820 &bcm_sn0, 821 &bcm_sn1, 822 &bcm_sn3, 823 &bcm_sn4, 824 &bcm_sn6, 825 &bcm_sn7, 826 &bcm_sn8, 827 &bcm_sn9, 828 &bcm_sn10, 829 &bcm_sn11, 830}; 831 832static struct qcom_icc_node * const system_noc_nodes[] = { 833 [MASTER_AUDIO] = &qhm_audio, 834 [MASTER_BLSP_1] = &qhm_blsp1, 835 [MASTER_QDSS_BAM] = &qhm_qdss_bam, 836 [MASTER_QPIC] = &qhm_qpic, 837 [MASTER_SNOC_CFG] = &qhm_snoc_cfg, 838 [MASTER_SPMI_FETCHER] = &qhm_spmi_fetcher1, 839 [MASTER_ANOC_SNOC] = &qnm_aggre_noc, 840 [MASTER_IPA] = &qnm_ipa, 841 [MASTER_MEM_NOC_SNOC] = &qnm_memnoc, 842 [MASTER_MEM_NOC_PCIE_SNOC] = &qnm_memnoc_pcie, 843 [MASTER_CRYPTO_CORE_0] = &qxm_crypto, 844 [MASTER_EMAC] = &xm_emac, 845 [MASTER_IPA_PCIE] = &xm_ipa2pcie_slv, 846 [MASTER_PCIE] = &xm_pcie, 847 [MASTER_QDSS_ETR] = &xm_qdss_etr, 848 [MASTER_SDCC_1] = &xm_sdc1, 849 [MASTER_USB3] = &xm_usb3, 850 [SLAVE_AOP] = &qhs_aop, 851 [SLAVE_AOSS] = &qhs_aoss, 852 [SLAVE_APPSS] = &qhs_apss, 853 [SLAVE_AUDIO] = &qhs_audio, 854 [SLAVE_BLSP_1] = &qhs_blsp1, 855 [SLAVE_CLK_CTL] = &qhs_clk_ctl, 856 [SLAVE_CRYPTO_0_CFG] = &qhs_crypto0_cfg, 857 [SLAVE_CNOC_DDRSS] = &qhs_ddrss_cfg, 858 [SLAVE_ECC_CFG] = &qhs_ecc_cfg, 859 [SLAVE_EMAC_CFG] = &qhs_emac_cfg, 860 [SLAVE_IMEM_CFG] = &qhs_imem_cfg, 861 [SLAVE_IPA_CFG] = &qhs_ipa, 862 [SLAVE_CNOC_MSS] = &qhs_mss_cfg, 863 [SLAVE_PCIE_PARF] = &qhs_pcie_parf, 864 [SLAVE_PDM] = &qhs_pdm, 865 [SLAVE_PRNG] = &qhs_prng, 866 [SLAVE_QDSS_CFG] = &qhs_qdss_cfg, 867 [SLAVE_QPIC] = &qhs_qpic, 868 [SLAVE_SDCC_1] = &qhs_sdc1, 869 [SLAVE_SNOC_CFG] = &qhs_snoc_cfg, 870 [SLAVE_SPMI_FETCHER] = &qhs_spmi_fetcher, 871 [SLAVE_SPMI_VGI_COEX] = &qhs_spmi_vgi_coex, 872 [SLAVE_TCSR] = &qhs_tcsr, 873 [SLAVE_TLMM] = &qhs_tlmm, 874 [SLAVE_USB3] = &qhs_usb3, 875 [SLAVE_USB3_PHY_CFG] = &qhs_usb3_phy, 876 [SLAVE_ANOC_SNOC] = &qns_aggre_noc, 877 [SLAVE_SNOC_MEM_NOC_GC] = &qns_snoc_memnoc, 878 [SLAVE_OCIMEM] = &qxs_imem, 879 [SLAVE_SERVICE_SNOC] = &srvc_snoc, 880 [SLAVE_PCIE_0] = &xs_pcie, 881 [SLAVE_QDSS_STM] = &xs_qdss_stm, 882 [SLAVE_TCU] = &xs_sys_tcu_cfg, 883}; 884 885static const struct qcom_icc_desc sdx55_system_noc = { 886 .nodes = system_noc_nodes, 887 .num_nodes = ARRAY_SIZE(system_noc_nodes), 888 .bcms = system_noc_bcms, 889 .num_bcms = ARRAY_SIZE(system_noc_bcms), 890}; 891 892static const struct of_device_id qnoc_of_match[] = { 893 { .compatible = "qcom,sdx55-mc-virt", 894 .data = &sdx55_mc_virt}, 895 { .compatible = "qcom,sdx55-mem-noc", 896 .data = &sdx55_mem_noc}, 897 { .compatible = "qcom,sdx55-system-noc", 898 .data = &sdx55_system_noc}, 899 { } 900}; 901MODULE_DEVICE_TABLE(of, qnoc_of_match); 902 903static struct platform_driver qnoc_driver = { 904 .probe = qcom_icc_rpmh_probe, 905 .remove = qcom_icc_rpmh_remove, 906 .driver = { 907 .name = "qnoc-sdx55", 908 .of_match_table = qnoc_of_match, 909 .sync_state = icc_sync_state, 910 }, 911}; 912module_platform_driver(qnoc_driver); 913 914MODULE_DESCRIPTION("Qualcomm SDX55 NoC driver"); 915MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>"); 916MODULE_LICENSE("GPL v2");