Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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");