1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2022-2023, NVIDIA CORPORATION. All rights reserved.
6 #include <soc/tegra/mc.h>
8 #include <dt-bindings/memory/tegra234-mc.h>
9 #include <linux/interconnect.h>
10 #include <linux/tegra-icc.h>
12 #include <soc/tegra/bpmp.h>
16 * MC Client entries are sorted in the increasing order of the
17 * override and security register offsets.
19 static const struct tegra_mc_client tegra234_mc_clients[] = {
21 .id = TEGRA234_MEMORY_CLIENT_HDAR,
23 .bpmp_id = TEGRA_ICC_BPMP_HDA,
24 .type = TEGRA_ICC_ISO_AUDIO,
25 .sid = TEGRA234_SID_HDA,
33 .id = TEGRA234_MEMORY_CLIENT_NVENCSRD,
35 .bpmp_id = TEGRA_ICC_BPMP_NVENC,
36 .type = TEGRA_ICC_NISO,
37 .sid = TEGRA234_SID_NVENC,
45 .id = TEGRA234_MEMORY_CLIENT_PCIE6AR,
47 .bpmp_id = TEGRA_ICC_BPMP_PCIE_6,
48 .type = TEGRA_ICC_NISO,
49 .sid = TEGRA234_SID_PCIE6,
57 .id = TEGRA234_MEMORY_CLIENT_PCIE6AW,
59 .bpmp_id = TEGRA_ICC_BPMP_PCIE_6,
60 .type = TEGRA_ICC_NISO,
61 .sid = TEGRA234_SID_PCIE6,
69 .id = TEGRA234_MEMORY_CLIENT_PCIE7AR,
71 .bpmp_id = TEGRA_ICC_BPMP_PCIE_7,
72 .type = TEGRA_ICC_NISO,
73 .sid = TEGRA234_SID_PCIE7,
81 .id = TEGRA234_MEMORY_CLIENT_NVENCSWR,
83 .bpmp_id = TEGRA_ICC_BPMP_NVENC,
84 .type = TEGRA_ICC_NISO,
85 .sid = TEGRA234_SID_NVENC,
93 .id = TEGRA234_MEMORY_CLIENT_DLA0RDB,
95 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
96 .type = TEGRA_ICC_NISO,
97 .sid = TEGRA234_SID_NVDLA0,
105 .id = TEGRA234_MEMORY_CLIENT_DLA0RDB1,
107 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
108 .type = TEGRA_ICC_NISO,
109 .sid = TEGRA234_SID_NVDLA0,
117 .id = TEGRA234_MEMORY_CLIENT_DLA0WRB,
119 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
120 .type = TEGRA_ICC_NISO,
121 .sid = TEGRA234_SID_NVDLA0,
129 .id = TEGRA234_MEMORY_CLIENT_DLA1RDB,
131 .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
132 .type = TEGRA_ICC_NISO,
133 .sid = TEGRA234_SID_NVDLA1,
141 .id = TEGRA234_MEMORY_CLIENT_PCIE7AW,
143 .bpmp_id = TEGRA_ICC_BPMP_PCIE_7,
144 .type = TEGRA_ICC_NISO,
145 .sid = TEGRA234_SID_PCIE7,
153 .id = TEGRA234_MEMORY_CLIENT_PCIE8AR,
155 .bpmp_id = TEGRA_ICC_BPMP_PCIE_8,
156 .type = TEGRA_ICC_NISO,
157 .sid = TEGRA234_SID_PCIE8,
165 .id = TEGRA234_MEMORY_CLIENT_HDAW,
167 .bpmp_id = TEGRA_ICC_BPMP_HDA,
168 .type = TEGRA_ICC_ISO_AUDIO,
169 .sid = TEGRA234_SID_HDA,
177 .id = TEGRA234_MEMORY_CLIENT_PCIE8AW,
179 .bpmp_id = TEGRA_ICC_BPMP_PCIE_8,
180 .type = TEGRA_ICC_NISO,
181 .sid = TEGRA234_SID_PCIE8,
189 .id = TEGRA234_MEMORY_CLIENT_PCIE9AR,
191 .bpmp_id = TEGRA_ICC_BPMP_PCIE_9,
192 .type = TEGRA_ICC_NISO,
193 .sid = TEGRA234_SID_PCIE9,
201 .id = TEGRA234_MEMORY_CLIENT_PCIE6AR1,
203 .bpmp_id = TEGRA_ICC_BPMP_PCIE_6,
204 .type = TEGRA_ICC_NISO,
205 .sid = TEGRA234_SID_PCIE6,
213 .id = TEGRA234_MEMORY_CLIENT_PCIE9AW,
215 .bpmp_id = TEGRA_ICC_BPMP_PCIE_9,
216 .type = TEGRA_ICC_NISO,
217 .sid = TEGRA234_SID_PCIE9,
225 .id = TEGRA234_MEMORY_CLIENT_PCIE10AR,
227 .bpmp_id = TEGRA_ICC_BPMP_PCIE_10,
228 .type = TEGRA_ICC_NISO,
229 .sid = TEGRA234_SID_PCIE10,
237 .id = TEGRA234_MEMORY_CLIENT_PCIE10AW,
239 .bpmp_id = TEGRA_ICC_BPMP_PCIE_10,
240 .type = TEGRA_ICC_NISO,
241 .sid = TEGRA234_SID_PCIE10,
249 .id = TEGRA234_MEMORY_CLIENT_PCIE10AR1,
251 .bpmp_id = TEGRA_ICC_BPMP_PCIE_10,
252 .type = TEGRA_ICC_NISO,
253 .sid = TEGRA234_SID_PCIE10,
261 .id = TEGRA234_MEMORY_CLIENT_PCIE7AR1,
263 .bpmp_id = TEGRA_ICC_BPMP_PCIE_7,
264 .type = TEGRA_ICC_NISO,
265 .sid = TEGRA234_SID_PCIE7,
273 .id = TEGRA234_MEMORY_CLIENT_MGBEARD,
275 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
276 .type = TEGRA_ICC_NISO,
277 .sid = TEGRA234_SID_MGBE,
285 .id = TEGRA234_MEMORY_CLIENT_MGBEBRD,
287 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
288 .type = TEGRA_ICC_NISO,
289 .sid = TEGRA234_SID_MGBE_VF1,
297 .id = TEGRA234_MEMORY_CLIENT_MGBECRD,
299 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
300 .type = TEGRA_ICC_NISO,
301 .sid = TEGRA234_SID_MGBE_VF2,
309 .id = TEGRA234_MEMORY_CLIENT_MGBEDRD,
311 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
312 .type = TEGRA_ICC_NISO,
313 .sid = TEGRA234_SID_MGBE_VF3,
321 .id = TEGRA234_MEMORY_CLIENT_MGBEAWR,
322 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
323 .type = TEGRA_ICC_NISO,
325 .sid = TEGRA234_SID_MGBE,
333 .id = TEGRA234_MEMORY_CLIENT_MGBEBWR,
335 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
336 .type = TEGRA_ICC_NISO,
337 .sid = TEGRA234_SID_MGBE_VF1,
345 .id = TEGRA234_MEMORY_CLIENT_MGBECWR,
347 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
348 .type = TEGRA_ICC_NISO,
349 .sid = TEGRA234_SID_MGBE_VF2,
357 .id = TEGRA234_MEMORY_CLIENT_SDMMCRAB,
359 .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4,
360 .type = TEGRA_ICC_NISO,
361 .sid = TEGRA234_SID_SDMMC4,
369 .id = TEGRA234_MEMORY_CLIENT_MGBEDWR,
371 .bpmp_id = TEGRA_ICC_BPMP_EQOS,
372 .type = TEGRA_ICC_NISO,
373 .sid = TEGRA234_SID_MGBE_VF3,
381 .id = TEGRA234_MEMORY_CLIENT_SDMMCWAB,
383 .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4,
384 .type = TEGRA_ICC_NISO,
385 .sid = TEGRA234_SID_SDMMC4,
393 .id = TEGRA234_MEMORY_CLIENT_VICSRD,
395 .bpmp_id = TEGRA_ICC_BPMP_VIC,
396 .type = TEGRA_ICC_NISO,
397 .sid = TEGRA234_SID_VIC,
405 .id = TEGRA234_MEMORY_CLIENT_VICSWR,
407 .bpmp_id = TEGRA_ICC_BPMP_VIC,
408 .type = TEGRA_ICC_NISO,
409 .sid = TEGRA234_SID_VIC,
417 .id = TEGRA234_MEMORY_CLIENT_DLA1RDB1,
419 .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
420 .type = TEGRA_ICC_NISO,
421 .sid = TEGRA234_SID_NVDLA1,
429 .id = TEGRA234_MEMORY_CLIENT_DLA1WRB,
431 .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
432 .type = TEGRA_ICC_NISO,
433 .sid = TEGRA234_SID_NVDLA1,
441 .id = TEGRA234_MEMORY_CLIENT_VI2W,
443 .bpmp_id = TEGRA_ICC_BPMP_VI2,
444 .type = TEGRA_ICC_ISO_VI,
445 .sid = TEGRA234_SID_ISO_VI2,
453 .id = TEGRA234_MEMORY_CLIENT_VI2FALR,
455 .bpmp_id = TEGRA_ICC_BPMP_VI2FAL,
456 .type = TEGRA_ICC_ISO_VIFAL,
457 .sid = TEGRA234_SID_ISO_VI2FALC,
465 .id = TEGRA234_MEMORY_CLIENT_VIW,
467 .bpmp_id = TEGRA_ICC_BPMP_VI,
468 .type = TEGRA_ICC_ISO_VI,
469 .sid = TEGRA234_SID_ISO_VI,
477 .id = TEGRA234_MEMORY_CLIENT_NVDECSRD,
479 .bpmp_id = TEGRA_ICC_BPMP_NVDEC,
480 .type = TEGRA_ICC_NISO,
481 .sid = TEGRA234_SID_NVDEC,
489 .id = TEGRA234_MEMORY_CLIENT_NVDECSWR,
491 .bpmp_id = TEGRA_ICC_BPMP_NVDEC,
492 .type = TEGRA_ICC_NISO,
493 .sid = TEGRA234_SID_NVDEC,
501 .id = TEGRA234_MEMORY_CLIENT_APER,
503 .bpmp_id = TEGRA_ICC_BPMP_APE,
504 .type = TEGRA_ICC_ISO_AUDIO,
505 .sid = TEGRA234_SID_APE,
513 .id = TEGRA234_MEMORY_CLIENT_APEW,
515 .bpmp_id = TEGRA_ICC_BPMP_APE,
516 .type = TEGRA_ICC_ISO_AUDIO,
517 .sid = TEGRA234_SID_APE,
525 .id = TEGRA234_MEMORY_CLIENT_VI2FALW,
527 .bpmp_id = TEGRA_ICC_BPMP_VI2FAL,
528 .type = TEGRA_ICC_ISO_VIFAL,
529 .sid = TEGRA234_SID_ISO_VI2FALC,
537 .id = TEGRA234_MEMORY_CLIENT_NVJPGSRD,
539 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0,
540 .type = TEGRA_ICC_NISO,
541 .sid = TEGRA234_SID_NVJPG,
549 .id = TEGRA234_MEMORY_CLIENT_NVJPGSWR,
551 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0,
552 .type = TEGRA_ICC_NISO,
553 .sid = TEGRA234_SID_NVJPG,
561 .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR,
562 .name = "nvdisplayr",
563 .bpmp_id = TEGRA_ICC_BPMP_DISPLAY,
564 .type = TEGRA_ICC_ISO_DISPLAY,
565 .sid = TEGRA234_SID_ISO_NVDISPLAY,
573 .id = TEGRA234_MEMORY_CLIENT_BPMPR,
575 .sid = TEGRA234_SID_BPMP,
583 .id = TEGRA234_MEMORY_CLIENT_BPMPW,
585 .sid = TEGRA234_SID_BPMP,
593 .id = TEGRA234_MEMORY_CLIENT_BPMPDMAR,
595 .sid = TEGRA234_SID_BPMP,
603 .id = TEGRA234_MEMORY_CLIENT_BPMPDMAW,
605 .sid = TEGRA234_SID_BPMP,
613 .id = TEGRA234_MEMORY_CLIENT_APEDMAR,
615 .bpmp_id = TEGRA_ICC_BPMP_APEDMA,
616 .type = TEGRA_ICC_ISO_AUDIO,
617 .sid = TEGRA234_SID_APE,
625 .id = TEGRA234_MEMORY_CLIENT_APEDMAW,
627 .bpmp_id = TEGRA_ICC_BPMP_APEDMA,
628 .type = TEGRA_ICC_ISO_AUDIO,
629 .sid = TEGRA234_SID_APE,
637 .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR1,
638 .name = "nvdisplayr1",
639 .bpmp_id = TEGRA_ICC_BPMP_DISPLAY,
640 .type = TEGRA_ICC_ISO_DISPLAY,
641 .sid = TEGRA234_SID_ISO_NVDISPLAY,
649 .id = TEGRA234_MEMORY_CLIENT_VIFALR,
651 .bpmp_id = TEGRA_ICC_BPMP_VIFAL,
652 .type = TEGRA_ICC_ISO_VIFAL,
653 .sid = TEGRA234_SID_ISO_VIFALC,
661 .id = TEGRA234_MEMORY_CLIENT_VIFALW,
663 .bpmp_id = TEGRA_ICC_BPMP_VIFAL,
664 .type = TEGRA_ICC_ISO_VIFAL,
665 .sid = TEGRA234_SID_ISO_VIFALC,
673 .id = TEGRA234_MEMORY_CLIENT_DLA0RDA,
675 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
676 .type = TEGRA_ICC_NISO,
677 .sid = TEGRA234_SID_NVDLA0,
685 .id = TEGRA234_MEMORY_CLIENT_DLA0FALRDB,
686 .name = "dla0falrdb",
687 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
688 .type = TEGRA_ICC_NISO,
689 .sid = TEGRA234_SID_NVDLA0,
697 .id = TEGRA234_MEMORY_CLIENT_DLA0WRA,
699 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
700 .type = TEGRA_ICC_NISO,
701 .sid = TEGRA234_SID_NVDLA0,
709 .id = TEGRA234_MEMORY_CLIENT_DLA0FALWRB,
710 .name = "dla0falwrb",
711 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
712 .type = TEGRA_ICC_NISO,
713 .sid = TEGRA234_SID_NVDLA0,
721 .id = TEGRA234_MEMORY_CLIENT_DLA1RDA,
723 .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
724 .type = TEGRA_ICC_NISO,
725 .sid = TEGRA234_SID_NVDLA1,
733 .id = TEGRA234_MEMORY_CLIENT_DLA1FALRDB,
734 .name = "dla1falrdb",
735 .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
736 .type = TEGRA_ICC_NISO,
737 .sid = TEGRA234_SID_NVDLA1,
745 .id = TEGRA234_MEMORY_CLIENT_DLA1WRA,
747 .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
748 .type = TEGRA_ICC_NISO,
749 .sid = TEGRA234_SID_NVDLA1,
757 .id = TEGRA234_MEMORY_CLIENT_DLA1FALWRB,
758 .name = "dla1falwrb",
759 .bpmp_id = TEGRA_ICC_BPMP_DLA_1,
760 .type = TEGRA_ICC_NISO,
761 .sid = TEGRA234_SID_NVDLA1,
769 .id = TEGRA234_MEMORY_CLIENT_RCER,
771 .bpmp_id = TEGRA_ICC_BPMP_RCE,
772 .type = TEGRA_ICC_NISO,
773 .sid = TEGRA234_SID_RCE,
781 .id = TEGRA234_MEMORY_CLIENT_RCEW,
783 .bpmp_id = TEGRA_ICC_BPMP_RCE,
784 .type = TEGRA_ICC_NISO,
785 .sid = TEGRA234_SID_RCE,
793 .id = TEGRA234_MEMORY_CLIENT_PCIE0R,
795 .bpmp_id = TEGRA_ICC_BPMP_PCIE_0,
796 .type = TEGRA_ICC_NISO,
797 .sid = TEGRA234_SID_PCIE0,
805 .id = TEGRA234_MEMORY_CLIENT_PCIE0W,
807 .bpmp_id = TEGRA_ICC_BPMP_PCIE_0,
808 .type = TEGRA_ICC_NISO,
809 .sid = TEGRA234_SID_PCIE0,
817 .id = TEGRA234_MEMORY_CLIENT_PCIE1R,
819 .bpmp_id = TEGRA_ICC_BPMP_PCIE_1,
820 .type = TEGRA_ICC_NISO,
821 .sid = TEGRA234_SID_PCIE1,
829 .id = TEGRA234_MEMORY_CLIENT_PCIE1W,
831 .bpmp_id = TEGRA_ICC_BPMP_PCIE_1,
832 .type = TEGRA_ICC_NISO,
833 .sid = TEGRA234_SID_PCIE1,
841 .id = TEGRA234_MEMORY_CLIENT_PCIE2AR,
843 .bpmp_id = TEGRA_ICC_BPMP_PCIE_2,
844 .type = TEGRA_ICC_NISO,
845 .sid = TEGRA234_SID_PCIE2,
853 .id = TEGRA234_MEMORY_CLIENT_PCIE2AW,
855 .bpmp_id = TEGRA_ICC_BPMP_PCIE_2,
856 .type = TEGRA_ICC_NISO,
857 .sid = TEGRA234_SID_PCIE2,
865 .id = TEGRA234_MEMORY_CLIENT_PCIE3R,
867 .bpmp_id = TEGRA_ICC_BPMP_PCIE_3,
868 .type = TEGRA_ICC_NISO,
869 .sid = TEGRA234_SID_PCIE3,
877 .id = TEGRA234_MEMORY_CLIENT_PCIE3W,
879 .bpmp_id = TEGRA_ICC_BPMP_PCIE_3,
880 .type = TEGRA_ICC_NISO,
881 .sid = TEGRA234_SID_PCIE3,
889 .id = TEGRA234_MEMORY_CLIENT_PCIE4R,
891 .bpmp_id = TEGRA_ICC_BPMP_PCIE_4,
892 .type = TEGRA_ICC_NISO,
893 .sid = TEGRA234_SID_PCIE4,
901 .id = TEGRA234_MEMORY_CLIENT_PCIE4W,
903 .bpmp_id = TEGRA_ICC_BPMP_PCIE_4,
904 .type = TEGRA_ICC_NISO,
905 .sid = TEGRA234_SID_PCIE4,
913 .id = TEGRA234_MEMORY_CLIENT_PCIE5R,
915 .bpmp_id = TEGRA_ICC_BPMP_PCIE_5,
916 .type = TEGRA_ICC_NISO,
917 .sid = TEGRA234_SID_PCIE5,
925 .id = TEGRA234_MEMORY_CLIENT_PCIE5W,
927 .bpmp_id = TEGRA_ICC_BPMP_PCIE_5,
928 .type = TEGRA_ICC_NISO,
929 .sid = TEGRA234_SID_PCIE5,
937 .id = TEGRA234_MEMORY_CLIENT_DLA0RDA1,
939 .bpmp_id = TEGRA_ICC_BPMP_DLA_0,
940 .type = TEGRA_ICC_NISO,
941 .sid = TEGRA234_SID_NVDLA0,
949 .id = TEGRA234_MEMORY_CLIENT_DLA1RDA1,
951 .sid = TEGRA234_SID_NVDLA1,
959 .id = TEGRA234_MEMORY_CLIENT_PCIE5R1,
961 .bpmp_id = TEGRA_ICC_BPMP_PCIE_5,
962 .type = TEGRA_ICC_NISO,
963 .sid = TEGRA234_SID_PCIE5,
971 .id = TEGRA234_MEMORY_CLIENT_NVJPG1SRD,
973 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1,
974 .type = TEGRA_ICC_NISO,
975 .sid = TEGRA234_SID_NVJPG1,
983 .id = TEGRA234_MEMORY_CLIENT_NVJPG1SWR,
985 .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1,
986 .type = TEGRA_ICC_NISO,
987 .sid = TEGRA234_SID_NVJPG1,
995 .id = TEGRA_ICC_MC_CPU_CLUSTER0,
996 .name = "sw_cluster0",
997 .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER0,
998 .type = TEGRA_ICC_NISO,
1000 .id = TEGRA_ICC_MC_CPU_CLUSTER1,
1001 .name = "sw_cluster1",
1002 .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER1,
1003 .type = TEGRA_ICC_NISO,
1005 .id = TEGRA_ICC_MC_CPU_CLUSTER2,
1006 .name = "sw_cluster2",
1007 .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER2,
1008 .type = TEGRA_ICC_NISO,
1010 .id = TEGRA234_MEMORY_CLIENT_NVL1R,
1012 .bpmp_id = TEGRA_ICC_BPMP_GPU,
1013 .type = TEGRA_ICC_NISO,
1015 .id = TEGRA234_MEMORY_CLIENT_NVL1W,
1017 .bpmp_id = TEGRA_ICC_BPMP_GPU,
1018 .type = TEGRA_ICC_NISO,
1023 * tegra234_mc_icc_set() - Pass MC client info to the BPMP-FW
1024 * @src: ICC node for Memory Controller's (MC) Client
1025 * @dst: ICC node for Memory Controller (MC)
1027 * Passing the current request info from the MC to the BPMP-FW where
1028 * LA and PTSA registers are accessed and the final EMC freq is set
1029 * based on client_id, type, latency and bandwidth.
1030 * icc_set_bw() makes set_bw calls for both MC and EMC providers in
1031 * sequence. Both the calls are protected by 'mutex_lock(&icc_lock)'.
1032 * So, the data passed won't be updated by concurrent set calls from
1035 static int tegra234_mc_icc_set(struct icc_node *src, struct icc_node *dst)
1037 struct tegra_mc *mc = icc_provider_to_tegra_mc(dst->provider);
1038 struct mrq_bwmgr_int_request bwmgr_req = { 0 };
1039 struct mrq_bwmgr_int_response bwmgr_resp = { 0 };
1040 const struct tegra_mc_client *pclient = src->data;
1041 struct tegra_bpmp_message msg;
1045 * Same Src and Dst node will happen during boot from icc_node_add().
1046 * This can be used to pre-initialize and set bandwidth for all clients
1047 * before their drivers are loaded. We are skipping this case as for us,
1048 * the pre-initialization already happened in Bootloader(MB2) and BPMP-FW.
1050 if (src->id == dst->id)
1053 if (!mc->bwmgr_mrq_supported)
1057 dev_err(mc->dev, "BPMP reference NULL\n");
1061 if (pclient->type == TEGRA_ICC_NISO)
1062 bwmgr_req.bwmgr_calc_set_req.niso_bw = src->avg_bw;
1064 bwmgr_req.bwmgr_calc_set_req.iso_bw = src->avg_bw;
1066 bwmgr_req.bwmgr_calc_set_req.client_id = pclient->bpmp_id;
1068 bwmgr_req.cmd = CMD_BWMGR_INT_CALC_AND_SET;
1069 bwmgr_req.bwmgr_calc_set_req.mc_floor = src->peak_bw;
1070 bwmgr_req.bwmgr_calc_set_req.floor_unit = BWMGR_INT_UNIT_KBPS;
1072 memset(&msg, 0, sizeof(msg));
1073 msg.mrq = MRQ_BWMGR_INT;
1074 msg.tx.data = &bwmgr_req;
1075 msg.tx.size = sizeof(bwmgr_req);
1076 msg.rx.data = &bwmgr_resp;
1077 msg.rx.size = sizeof(bwmgr_resp);
1079 if (pclient->bpmp_id >= TEGRA_ICC_BPMP_CPU_CLUSTER0 &&
1080 pclient->bpmp_id <= TEGRA_ICC_BPMP_CPU_CLUSTER2)
1081 msg.flags = TEGRA_BPMP_MESSAGE_RESET;
1083 ret = tegra_bpmp_transfer(mc->bpmp, &msg);
1085 dev_err(mc->dev, "BPMP transfer failed: %d\n", ret);
1088 if (msg.rx.ret < 0) {
1089 pr_err("failed to set bandwidth for %u: %d\n",
1090 bwmgr_req.bwmgr_calc_set_req.client_id, msg.rx.ret);
1098 static int tegra234_mc_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
1099 u32 peak_bw, u32 *agg_avg, u32 *agg_peak)
1101 struct icc_provider *p = node->provider;
1102 struct tegra_mc *mc = icc_provider_to_tegra_mc(p);
1104 if (!mc->bwmgr_mrq_supported)
1107 if (node->id == TEGRA_ICC_MC_CPU_CLUSTER0 ||
1108 node->id == TEGRA_ICC_MC_CPU_CLUSTER1 ||
1109 node->id == TEGRA_ICC_MC_CPU_CLUSTER2) {
1111 peak_bw = peak_bw * mc->num_channels;
1115 *agg_peak = max(*agg_peak, peak_bw);
1120 static int tegra234_mc_icc_get_init_bw(struct icc_node *node, u32 *avg, u32 *peak)
1128 static const struct tegra_mc_icc_ops tegra234_mc_icc_ops = {
1129 .xlate = tegra_mc_icc_xlate,
1130 .aggregate = tegra234_mc_icc_aggregate,
1131 .get_bw = tegra234_mc_icc_get_init_bw,
1132 .set = tegra234_mc_icc_set,
1135 const struct tegra_mc_soc tegra234_mc_soc = {
1136 .num_clients = ARRAY_SIZE(tegra234_mc_clients),
1137 .clients = tegra234_mc_clients,
1138 .num_address_bits = 40,
1140 .client_id_mask = 0x1ff,
1141 .intmask = MC_INT_DECERR_ROUTE_SANITY |
1142 MC_INT_DECERR_GENERALIZED_CARVEOUT | MC_INT_DECERR_MTS |
1143 MC_INT_SECERR_SEC | MC_INT_DECERR_VPR |
1144 MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM,
1145 .has_addr_hi_reg = true,
1146 .ops = &tegra186_mc_ops,
1147 .icc_ops = &tegra234_mc_icc_ops,
1148 .ch_intmask = 0x0000ff00,
1149 .global_intstatus_channel_shift = 8,
1151 * Additionally, there are lite carveouts but those are not currently
1154 .num_carveouts = 32,