1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2026, NVIDIA CORPORATION. All rights reserved. 4 */ 5 6 #include <soc/tegra/mc.h> 7 8 #include <dt-bindings/memory/tegra234-mc.h> 9 #include <dt-bindings/memory/nvidia,tegra238-mc.h> 10 #include <linux/interconnect.h> 11 #include <linux/tegra-icc.h> 12 13 #include <soc/tegra/bpmp.h> 14 #include "mc.h" 15 16 static const struct tegra_mc_client tegra238_mc_clients[] = { 17 { 18 .id = TEGRA234_MEMORY_CLIENT_HDAR, 19 .name = "hdar", 20 .bpmp_id = TEGRA_ICC_BPMP_HDA, 21 .type = TEGRA_ICC_ISO_AUDIO, 22 .sid = TEGRA238_SID_HDA, 23 .regs = { 24 .sid = { 25 .override = 0xa8, 26 .security = 0xac, 27 }, 28 }, 29 }, { 30 .id = TEGRA234_MEMORY_CLIENT_HDAW, 31 .name = "hdaw", 32 .bpmp_id = TEGRA_ICC_BPMP_HDA, 33 .type = TEGRA_ICC_ISO_AUDIO, 34 .sid = TEGRA238_SID_HDA, 35 .regs = { 36 .sid = { 37 .override = 0x1a8, 38 .security = 0x1ac, 39 }, 40 }, 41 }, { 42 .id = TEGRA234_MEMORY_CLIENT_SDMMCRAB, 43 .name = "sdmmcrab", 44 .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4, 45 .type = TEGRA_ICC_NISO, 46 .sid = TEGRA238_SID_SDMMC4A, 47 .regs = { 48 .sid = { 49 .override = 0x318, 50 .security = 0x31c, 51 }, 52 }, 53 }, { 54 .id = TEGRA234_MEMORY_CLIENT_SDMMCWAB, 55 .name = "sdmmcwab", 56 .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4, 57 .type = TEGRA_ICC_NISO, 58 .sid = TEGRA238_SID_SDMMC4A, 59 .regs = { 60 .sid = { 61 .override = 0x338, 62 .security = 0x33c, 63 }, 64 }, 65 }, { 66 .id = TEGRA234_MEMORY_CLIENT_APER, 67 .name = "aper", 68 .bpmp_id = TEGRA_ICC_BPMP_APE, 69 .type = TEGRA_ICC_ISO_AUDIO, 70 .sid = TEGRA238_SID_ISO_APE0, 71 .regs = { 72 .sid = { 73 .override = 0x3d0, 74 .security = 0x3d4, 75 }, 76 }, 77 }, { 78 .id = TEGRA234_MEMORY_CLIENT_APEW, 79 .name = "apew", 80 .bpmp_id = TEGRA_ICC_BPMP_APE, 81 .type = TEGRA_ICC_ISO_AUDIO, 82 .sid = TEGRA238_SID_ISO_APE0, 83 .regs = { 84 .sid = { 85 .override = 0x3d8, 86 .security = 0x3dc, 87 }, 88 }, 89 }, { 90 .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR, 91 .name = "nvdisplayr", 92 .bpmp_id = TEGRA_ICC_BPMP_DISPLAY, 93 .type = TEGRA_ICC_ISO_DISPLAY, 94 .sid = TEGRA238_SID_ISO_NVDISPLAY, 95 .regs = { 96 .sid = { 97 .override = 0x490, 98 .security = 0x494, 99 }, 100 }, 101 }, { 102 .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR1, 103 .name = "nvdisplayr1", 104 .bpmp_id = TEGRA_ICC_BPMP_DISPLAY, 105 .type = TEGRA_ICC_ISO_DISPLAY, 106 .sid = TEGRA238_SID_ISO_NVDISPLAY, 107 .regs = { 108 .sid = { 109 .override = 0x508, 110 .security = 0x50c, 111 }, 112 }, 113 }, { 114 .id = TEGRA234_MEMORY_CLIENT_BPMPR, 115 .name = "bpmpr", 116 .sid = TEGRA238_SID_BPMP, 117 .regs = { 118 .sid = { 119 .override = 0x498, 120 .security = 0x49c, 121 }, 122 }, 123 }, { 124 .id = TEGRA234_MEMORY_CLIENT_BPMPW, 125 .name = "bpmpw", 126 .sid = TEGRA238_SID_BPMP, 127 .regs = { 128 .sid = { 129 .override = 0x4a0, 130 .security = 0x4a4, 131 }, 132 }, 133 }, { 134 .id = TEGRA234_MEMORY_CLIENT_BPMPDMAR, 135 .name = "bpmpdmar", 136 .sid = TEGRA238_SID_BPMP, 137 .regs = { 138 .sid = { 139 .override = 0x4a8, 140 .security = 0x4ac, 141 }, 142 }, 143 }, { 144 .id = TEGRA234_MEMORY_CLIENT_BPMPDMAW, 145 .name = "bpmpdmaw", 146 .sid = TEGRA238_SID_BPMP, 147 .regs = { 148 .sid = { 149 .override = 0x4b0, 150 .security = 0x4b4, 151 }, 152 }, 153 }, { 154 .id = TEGRA234_MEMORY_CLIENT_APEDMAR, 155 .name = "apedmar", 156 .bpmp_id = TEGRA_ICC_BPMP_APEDMA, 157 .type = TEGRA_ICC_ISO_AUDIO, 158 .sid = TEGRA238_SID_ISO_APE1, 159 .regs = { 160 .sid = { 161 .override = 0x4f8, 162 .security = 0x4fc, 163 }, 164 }, 165 }, { 166 .id = TEGRA234_MEMORY_CLIENT_APEDMAW, 167 .name = "apedmaw", 168 .bpmp_id = TEGRA_ICC_BPMP_APEDMA, 169 .type = TEGRA_ICC_ISO_AUDIO, 170 .sid = TEGRA238_SID_ISO_APE1, 171 .regs = { 172 .sid = { 173 .override = 0x500, 174 .security = 0x504, 175 }, 176 }, 177 }, { 178 .id = TEGRA234_MEMORY_CLIENT_VICSRD, 179 .name = "vicsrd", 180 .bpmp_id = TEGRA_ICC_BPMP_VIC, 181 .type = TEGRA_ICC_NISO, 182 .sid = TEGRA238_SID_VIC, 183 .regs = { 184 .sid = { 185 .override = 0x360, 186 .security = 0x364, 187 }, 188 }, 189 }, { 190 .id = TEGRA234_MEMORY_CLIENT_VICSWR, 191 .name = "vicswr", 192 .bpmp_id = TEGRA_ICC_BPMP_VIC, 193 .type = TEGRA_ICC_NISO, 194 .sid = TEGRA238_SID_VIC, 195 .regs = { 196 .sid = { 197 .override = 0x368, 198 .security = 0x36c, 199 }, 200 }, 201 }, { 202 .id = TEGRA234_MEMORY_CLIENT_NVDECSRD, 203 .name = "nvdecsrd", 204 .bpmp_id = TEGRA_ICC_BPMP_NVDEC, 205 .type = TEGRA_ICC_NISO, 206 .sid = TEGRA238_SID_NVDEC, 207 .regs = { 208 .sid = { 209 .override = 0x3c0, 210 .security = 0x3c4, 211 }, 212 }, 213 }, { 214 .id = TEGRA234_MEMORY_CLIENT_NVDECSWR, 215 .name = "nvdecswr", 216 .bpmp_id = TEGRA_ICC_BPMP_NVDEC, 217 .type = TEGRA_ICC_NISO, 218 .sid = TEGRA238_SID_NVDEC, 219 .regs = { 220 .sid = { 221 .override = 0x3c8, 222 .security = 0x3cc, 223 }, 224 }, 225 }, { 226 .id = TEGRA234_MEMORY_CLIENT_NVENCSRD, 227 .name = "nvencsrd", 228 .bpmp_id = TEGRA_ICC_BPMP_NVENC, 229 .type = TEGRA_ICC_NISO, 230 .sid = TEGRA238_SID_NVENC, 231 .regs = { 232 .sid = { 233 .override = 0xe0, 234 .security = 0xe4, 235 }, 236 }, 237 }, { 238 .id = TEGRA234_MEMORY_CLIENT_NVENCSWR, 239 .name = "nvencswr", 240 .bpmp_id = TEGRA_ICC_BPMP_NVENC, 241 .type = TEGRA_ICC_NISO, 242 .sid = TEGRA238_SID_NVENC, 243 .regs = { 244 .sid = { 245 .override = 0x158, 246 .security = 0x15c, 247 }, 248 }, 249 }, { 250 .id = TEGRA234_MEMORY_CLIENT_PCIE0R, 251 .name = "pcie0r", 252 .bpmp_id = TEGRA_ICC_BPMP_PCIE_0, 253 .type = TEGRA_ICC_NISO, 254 .sid = TEGRA238_SID_PCIE0, 255 .regs = { 256 .sid = { 257 .override = 0x6c0, 258 .security = 0x6c4, 259 }, 260 }, 261 }, { 262 .id = TEGRA234_MEMORY_CLIENT_PCIE0W, 263 .name = "pcie0w", 264 .bpmp_id = TEGRA_ICC_BPMP_PCIE_0, 265 .type = TEGRA_ICC_NISO, 266 .sid = TEGRA238_SID_PCIE0, 267 .regs = { 268 .sid = { 269 .override = 0x6c8, 270 .security = 0x6cc, 271 }, 272 }, 273 }, { 274 .id = TEGRA234_MEMORY_CLIENT_PCIE1R, 275 .name = "pcie1r", 276 .bpmp_id = TEGRA_ICC_BPMP_PCIE_1, 277 .type = TEGRA_ICC_NISO, 278 .sid = TEGRA238_SID_PCIE1, 279 .regs = { 280 .sid = { 281 .override = 0x6d0, 282 .security = 0x6d4, 283 }, 284 }, 285 }, { 286 .id = TEGRA234_MEMORY_CLIENT_PCIE1W, 287 .name = "pcie1w", 288 .bpmp_id = TEGRA_ICC_BPMP_PCIE_1, 289 .type = TEGRA_ICC_NISO, 290 .sid = TEGRA238_SID_PCIE1, 291 .regs = { 292 .sid = { 293 .override = 0x6d8, 294 .security = 0x6dc, 295 }, 296 }, 297 }, { 298 .id = TEGRA234_MEMORY_CLIENT_PCIE2AR, 299 .name = "pcie2ar", 300 .bpmp_id = TEGRA_ICC_BPMP_PCIE_2, 301 .type = TEGRA_ICC_NISO, 302 .sid = TEGRA238_SID_PCIE2, 303 .regs = { 304 .sid = { 305 .override = 0x6e0, 306 .security = 0x6e4, 307 }, 308 }, 309 }, { 310 .id = TEGRA234_MEMORY_CLIENT_PCIE2AW, 311 .name = "pcie2aw", 312 .bpmp_id = TEGRA_ICC_BPMP_PCIE_2, 313 .type = TEGRA_ICC_NISO, 314 .sid = TEGRA238_SID_PCIE2, 315 .regs = { 316 .sid = { 317 .override = 0x6e8, 318 .security = 0x6ec, 319 }, 320 }, 321 }, { 322 .id = TEGRA234_MEMORY_CLIENT_PCIE3R, 323 .name = "pcie3r", 324 .bpmp_id = TEGRA_ICC_BPMP_PCIE_3, 325 .type = TEGRA_ICC_NISO, 326 .sid = TEGRA238_SID_PCIE3, 327 .regs = { 328 .sid = { 329 .override = 0x6f0, 330 .security = 0x6f4, 331 }, 332 }, 333 }, { 334 .id = TEGRA234_MEMORY_CLIENT_PCIE3W, 335 .name = "pcie3w", 336 .bpmp_id = TEGRA_ICC_BPMP_PCIE_3, 337 .type = TEGRA_ICC_NISO, 338 .sid = TEGRA238_SID_PCIE3, 339 .regs = { 340 .sid = { 341 .override = 0x6f8, 342 .security = 0x6fc, 343 }, 344 }, 345 }, { 346 .id = TEGRA_ICC_MC_CPU_CLUSTER0, 347 .name = "sw_cluster0", 348 .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER0, 349 .type = TEGRA_ICC_NISO, 350 }, { 351 .id = TEGRA234_MEMORY_CLIENT_NVL1R, 352 .name = "nvl1r", 353 .bpmp_id = TEGRA_ICC_BPMP_GPU, 354 .type = TEGRA_ICC_NISO, 355 }, { 356 .id = TEGRA234_MEMORY_CLIENT_NVL1W, 357 .name = "nvl1w", 358 .bpmp_id = TEGRA_ICC_BPMP_GPU, 359 .type = TEGRA_ICC_NISO, 360 } 361 }; 362 363 static const struct tegra_mc_intmask tegra238_mc_intmasks[] = { 364 { 365 .reg = MC_INTMASK, 366 .mask = MC_INT_DECERR_ROUTE_SANITY | MC_INT_DECERR_GENERALIZED_CARVEOUT | 367 MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | 368 MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM, 369 }, 370 }; 371 372 const struct tegra_mc_soc tegra238_mc_soc = { 373 .num_clients = ARRAY_SIZE(tegra238_mc_clients), 374 .clients = tegra238_mc_clients, 375 .num_address_bits = 40, 376 .num_channels = 8, 377 .client_id_mask = 0x1ff, 378 .intmasks = tegra238_mc_intmasks, 379 .num_intmasks = ARRAY_SIZE(tegra238_mc_intmasks), 380 .has_addr_hi_reg = true, 381 .ops = &tegra186_mc_ops, 382 .icc_ops = &tegra234_mc_icc_ops, 383 .ch_intmask = 0x0000ff00, 384 .global_intstatus_channel_shift = 8, 385 .num_carveouts = 32, 386 .regs = &tegra20_mc_regs, 387 .handle_irq = tegra30_mc_irq_handlers, 388 .num_interrupts = ARRAY_SIZE(tegra30_mc_irq_handlers), 389 .mc_addr_hi_mask = 0x3, 390 .mc_err_status_type_mask = (0x7 << 28), 391 }; 392