1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
9 #include <dt-bindings/memory/tegra30-mc.h>
13 static const unsigned long tegra30_mc_emem_regs[] = {
15 MC_EMEM_ARB_OUTSTANDING_REQ,
16 MC_EMEM_ARB_TIMING_RCD,
17 MC_EMEM_ARB_TIMING_RP,
18 MC_EMEM_ARB_TIMING_RC,
19 MC_EMEM_ARB_TIMING_RAS,
20 MC_EMEM_ARB_TIMING_FAW,
21 MC_EMEM_ARB_TIMING_RRD,
22 MC_EMEM_ARB_TIMING_RAP2PRE,
23 MC_EMEM_ARB_TIMING_WAP2PRE,
24 MC_EMEM_ARB_TIMING_R2R,
25 MC_EMEM_ARB_TIMING_W2W,
26 MC_EMEM_ARB_TIMING_R2W,
27 MC_EMEM_ARB_TIMING_W2R,
29 MC_EMEM_ARB_DA_COVERS,
31 MC_EMEM_ARB_RING1_THROTTLE,
34 static const struct tegra_mc_client tegra30_mc_clients[] = {
38 .swgroup = TEGRA_SWGROUP_PTC,
49 .swgroup = TEGRA_SWGROUP_DC,
60 .fifo_size = 16 * 128,
64 .swgroup = TEGRA_SWGROUP_DCB,
75 .fifo_size = 16 * 128,
79 .swgroup = TEGRA_SWGROUP_DC,
94 .swgroup = TEGRA_SWGROUP_DCB,
105 .fifo_size = 16 * 64,
109 .swgroup = TEGRA_SWGROUP_DC,
120 .fifo_size = 16 * 128,
123 .name = "display0cb",
124 .swgroup = TEGRA_SWGROUP_DCB,
135 .fifo_size = 16 * 128,
139 .swgroup = TEGRA_SWGROUP_DC,
150 .fifo_size = 16 * 64,
153 .name = "display1bb",
154 .swgroup = TEGRA_SWGROUP_DCB,
165 .fifo_size = 16 * 64,
169 .swgroup = TEGRA_SWGROUP_EPP,
184 .swgroup = TEGRA_SWGROUP_G2,
195 .fifo_size = 16 * 64,
199 .swgroup = TEGRA_SWGROUP_G2,
210 .fifo_size = 16 * 64,
214 .swgroup = TEGRA_SWGROUP_MPE,
229 .swgroup = TEGRA_SWGROUP_VI,
244 .swgroup = TEGRA_SWGROUP_AFI,
255 .fifo_size = 16 * 32,
259 .swgroup = TEGRA_SWGROUP_AVPC,
274 .swgroup = TEGRA_SWGROUP_DC,
288 .name = "displayhcb",
289 .swgroup = TEGRA_SWGROUP_DCB,
304 .swgroup = TEGRA_SWGROUP_NV,
315 .fifo_size = 16 * 48,
319 .swgroup = TEGRA_SWGROUP_NV2,
330 .fifo_size = 16 * 48,
334 .swgroup = TEGRA_SWGROUP_G2,
345 .fifo_size = 16 * 48,
349 .swgroup = TEGRA_SWGROUP_HDA,
360 .fifo_size = 16 * 16,
363 .name = "host1xdmar",
364 .swgroup = TEGRA_SWGROUP_HC,
375 .fifo_size = 16 * 16,
379 .swgroup = TEGRA_SWGROUP_HC,
394 .swgroup = TEGRA_SWGROUP_NV,
405 .fifo_size = 16 * 64,
409 .swgroup = TEGRA_SWGROUP_NV2,
420 .fifo_size = 16 * 64,
424 .swgroup = TEGRA_SWGROUP_MPE,
439 .swgroup = TEGRA_SWGROUP_MPE,
450 .fifo_size = 16 * 64,
454 .swgroup = TEGRA_SWGROUP_MPE,
468 .name = "ppcsahbdmar",
469 .swgroup = TEGRA_SWGROUP_PPCS,
483 .name = "ppcsahbslvr",
484 .swgroup = TEGRA_SWGROUP_PPCS,
499 .swgroup = TEGRA_SWGROUP_SATA,
510 .fifo_size = 16 * 32,
514 .swgroup = TEGRA_SWGROUP_NV,
525 .fifo_size = 16 * 64,
529 .swgroup = TEGRA_SWGROUP_NV2,
540 .fifo_size = 16 * 64,
544 .swgroup = TEGRA_SWGROUP_VDE,
559 .swgroup = TEGRA_SWGROUP_VDE,
574 .swgroup = TEGRA_SWGROUP_VDE,
585 .fifo_size = 16 * 16,
589 .swgroup = TEGRA_SWGROUP_VDE,
600 .fifo_size = 16 * 16,
604 .swgroup = TEGRA_SWGROUP_MPCORELP,
611 .fifo_size = 16 * 14,
615 .swgroup = TEGRA_SWGROUP_MPCORE,
622 .fifo_size = 16 * 14,
626 .swgroup = TEGRA_SWGROUP_EPP,
637 .fifo_size = 16 * 64,
641 .swgroup = TEGRA_SWGROUP_EPP,
652 .fifo_size = 16 * 64,
656 .swgroup = TEGRA_SWGROUP_EPP,
667 .fifo_size = 16 * 64,
671 .swgroup = TEGRA_SWGROUP_MPE,
686 .swgroup = TEGRA_SWGROUP_VI,
697 .fifo_size = 16 * 64,
701 .swgroup = TEGRA_SWGROUP_VI,
712 .fifo_size = 16 * 64,
716 .swgroup = TEGRA_SWGROUP_VI,
727 .fifo_size = 16 * 64,
731 .swgroup = TEGRA_SWGROUP_VI,
742 .fifo_size = 16 * 64,
746 .swgroup = TEGRA_SWGROUP_G2,
757 .fifo_size = 16 * 128,
761 .swgroup = TEGRA_SWGROUP_AFI,
772 .fifo_size = 16 * 32,
776 .swgroup = TEGRA_SWGROUP_AVPC,
791 .swgroup = TEGRA_SWGROUP_NV,
802 .fifo_size = 16 * 48,
806 .swgroup = TEGRA_SWGROUP_NV2,
817 .fifo_size = 16 * 48,
821 .swgroup = TEGRA_SWGROUP_HDA,
832 .fifo_size = 16 * 16,
836 .swgroup = TEGRA_SWGROUP_HC,
847 .fifo_size = 16 * 32,
851 .swgroup = TEGRA_SWGROUP_ISP,
862 .fifo_size = 16 * 64,
866 .swgroup = TEGRA_SWGROUP_MPCORELP,
873 .fifo_size = 16 * 24,
877 .swgroup = TEGRA_SWGROUP_MPCORE,
884 .fifo_size = 16 * 24,
888 .swgroup = TEGRA_SWGROUP_MPE,
902 .name = "ppcsahbdmaw",
903 .swgroup = TEGRA_SWGROUP_PPCS,
917 .name = "ppcsahbslvw",
918 .swgroup = TEGRA_SWGROUP_PPCS,
933 .swgroup = TEGRA_SWGROUP_SATA,
944 .fifo_size = 16 * 32,
948 .swgroup = TEGRA_SWGROUP_VDE,
963 .swgroup = TEGRA_SWGROUP_VDE,
974 .fifo_size = 16 * 16,
978 .swgroup = TEGRA_SWGROUP_VDE,
993 .swgroup = TEGRA_SWGROUP_VDE,
1004 .fifo_size = 16 * 16,
1008 static const struct tegra_smmu_swgroup tegra30_swgroups[] = {
1009 { .name = "dc", .swgroup = TEGRA_SWGROUP_DC, .reg = 0x240 },
1010 { .name = "dcb", .swgroup = TEGRA_SWGROUP_DCB, .reg = 0x244 },
1011 { .name = "epp", .swgroup = TEGRA_SWGROUP_EPP, .reg = 0x248 },
1012 { .name = "g2", .swgroup = TEGRA_SWGROUP_G2, .reg = 0x24c },
1013 { .name = "mpe", .swgroup = TEGRA_SWGROUP_MPE, .reg = 0x264 },
1014 { .name = "vi", .swgroup = TEGRA_SWGROUP_VI, .reg = 0x280 },
1015 { .name = "afi", .swgroup = TEGRA_SWGROUP_AFI, .reg = 0x238 },
1016 { .name = "avpc", .swgroup = TEGRA_SWGROUP_AVPC, .reg = 0x23c },
1017 { .name = "nv", .swgroup = TEGRA_SWGROUP_NV, .reg = 0x268 },
1018 { .name = "nv2", .swgroup = TEGRA_SWGROUP_NV2, .reg = 0x26c },
1019 { .name = "hda", .swgroup = TEGRA_SWGROUP_HDA, .reg = 0x254 },
1020 { .name = "hc", .swgroup = TEGRA_SWGROUP_HC, .reg = 0x250 },
1021 { .name = "ppcs", .swgroup = TEGRA_SWGROUP_PPCS, .reg = 0x270 },
1022 { .name = "sata", .swgroup = TEGRA_SWGROUP_SATA, .reg = 0x278 },
1023 { .name = "vde", .swgroup = TEGRA_SWGROUP_VDE, .reg = 0x27c },
1024 { .name = "isp", .swgroup = TEGRA_SWGROUP_ISP, .reg = 0x258 },
1027 static const unsigned int tegra30_group_drm[] = {
1035 static const struct tegra_smmu_group_soc tegra30_groups[] = {
1038 .swgroups = tegra30_group_drm,
1039 .num_swgroups = ARRAY_SIZE(tegra30_group_drm),
1043 static const struct tegra_smmu_soc tegra30_smmu_soc = {
1044 .clients = tegra30_mc_clients,
1045 .num_clients = ARRAY_SIZE(tegra30_mc_clients),
1046 .swgroups = tegra30_swgroups,
1047 .num_swgroups = ARRAY_SIZE(tegra30_swgroups),
1048 .groups = tegra30_groups,
1049 .num_groups = ARRAY_SIZE(tegra30_groups),
1050 .supports_round_robin_arbitration = false,
1051 .supports_request_limit = false,
1052 .num_tlb_lines = 16,
1056 #define TEGRA30_MC_RESET(_name, _control, _status, _bit) \
1059 .id = TEGRA30_MC_RESET_##_name, \
1060 .control = _control, \
1061 .status = _status, \
1065 static const struct tegra_mc_reset tegra30_mc_resets[] = {
1066 TEGRA30_MC_RESET(AFI, 0x200, 0x204, 0),
1067 TEGRA30_MC_RESET(AVPC, 0x200, 0x204, 1),
1068 TEGRA30_MC_RESET(DC, 0x200, 0x204, 2),
1069 TEGRA30_MC_RESET(DCB, 0x200, 0x204, 3),
1070 TEGRA30_MC_RESET(EPP, 0x200, 0x204, 4),
1071 TEGRA30_MC_RESET(2D, 0x200, 0x204, 5),
1072 TEGRA30_MC_RESET(HC, 0x200, 0x204, 6),
1073 TEGRA30_MC_RESET(HDA, 0x200, 0x204, 7),
1074 TEGRA30_MC_RESET(ISP, 0x200, 0x204, 8),
1075 TEGRA30_MC_RESET(MPCORE, 0x200, 0x204, 9),
1076 TEGRA30_MC_RESET(MPCORELP, 0x200, 0x204, 10),
1077 TEGRA30_MC_RESET(MPE, 0x200, 0x204, 11),
1078 TEGRA30_MC_RESET(3D, 0x200, 0x204, 12),
1079 TEGRA30_MC_RESET(3D2, 0x200, 0x204, 13),
1080 TEGRA30_MC_RESET(PPCS, 0x200, 0x204, 14),
1081 TEGRA30_MC_RESET(SATA, 0x200, 0x204, 15),
1082 TEGRA30_MC_RESET(VDE, 0x200, 0x204, 16),
1083 TEGRA30_MC_RESET(VI, 0x200, 0x204, 17),
1086 const struct tegra_mc_soc tegra30_mc_soc = {
1087 .clients = tegra30_mc_clients,
1088 .num_clients = ARRAY_SIZE(tegra30_mc_clients),
1089 .num_address_bits = 32,
1091 .client_id_mask = 0x7f,
1092 .smmu = &tegra30_smmu_soc,
1093 .emem_regs = tegra30_mc_emem_regs,
1094 .num_emem_regs = ARRAY_SIZE(tegra30_mc_emem_regs),
1095 .intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION |
1097 .reset_ops = &tegra_mc_reset_ops_common,
1098 .resets = tegra30_mc_resets,
1099 .num_resets = ARRAY_SIZE(tegra30_mc_resets),