projects/linux·blob master · refs

391 lines · 8.0 KiB

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
16static 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
363static 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
372const 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};