treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500
[linux-2.6-microblaze.git] / drivers / memory / tegra / tegra186.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2017 NVIDIA CORPORATION.  All rights reserved.
4  */
5
6 #include <linux/io.h>
7 #include <linux/module.h>
8 #include <linux/mod_devicetable.h>
9 #include <linux/platform_device.h>
10
11 #include <dt-bindings/memory/tegra186-mc.h>
12
13 struct tegra_mc {
14         struct device *dev;
15         void __iomem *regs;
16 };
17
18 struct tegra_mc_client {
19         const char *name;
20         unsigned int sid;
21         struct {
22                 unsigned int override;
23                 unsigned int security;
24         } regs;
25 };
26
27 static const struct tegra_mc_client tegra186_mc_clients[] = {
28         {
29                 .name = "ptcr",
30                 .sid = TEGRA186_SID_PASSTHROUGH,
31                 .regs = {
32                         .override = 0x000,
33                         .security = 0x004,
34                 },
35         }, {
36                 .name = "afir",
37                 .sid = TEGRA186_SID_AFI,
38                 .regs = {
39                         .override = 0x070,
40                         .security = 0x074,
41                 },
42         }, {
43                 .name = "hdar",
44                 .sid = TEGRA186_SID_HDA,
45                 .regs = {
46                         .override = 0x0a8,
47                         .security = 0x0ac,
48                 },
49         }, {
50                 .name = "host1xdmar",
51                 .sid = TEGRA186_SID_HOST1X,
52                 .regs = {
53                         .override = 0x0b0,
54                         .security = 0x0b4,
55                 },
56         }, {
57                 .name = "nvencsrd",
58                 .sid = TEGRA186_SID_NVENC,
59                 .regs = {
60                         .override = 0x0e0,
61                         .security = 0x0e4,
62                 },
63         }, {
64                 .name = "satar",
65                 .sid = TEGRA186_SID_SATA,
66                 .regs = {
67                         .override = 0x0f8,
68                         .security = 0x0fc,
69                 },
70         }, {
71                 .name = "mpcorer",
72                 .sid = TEGRA186_SID_PASSTHROUGH,
73                 .regs = {
74                         .override = 0x138,
75                         .security = 0x13c,
76                 },
77         }, {
78                 .name = "nvencswr",
79                 .sid = TEGRA186_SID_NVENC,
80                 .regs = {
81                         .override = 0x158,
82                         .security = 0x15c,
83                 },
84         }, {
85                 .name = "afiw",
86                 .sid = TEGRA186_SID_AFI,
87                 .regs = {
88                         .override = 0x188,
89                         .security = 0x18c,
90                 },
91         }, {
92                 .name = "hdaw",
93                 .sid = TEGRA186_SID_HDA,
94                 .regs = {
95                         .override = 0x1a8,
96                         .security = 0x1ac,
97                 },
98         }, {
99                 .name = "mpcorew",
100                 .sid = TEGRA186_SID_PASSTHROUGH,
101                 .regs = {
102                         .override = 0x1c8,
103                         .security = 0x1cc,
104                 },
105         }, {
106                 .name = "sataw",
107                 .sid = TEGRA186_SID_SATA,
108                 .regs = {
109                         .override = 0x1e8,
110                         .security = 0x1ec,
111                 },
112         }, {
113                 .name = "ispra",
114                 .sid = TEGRA186_SID_ISP,
115                 .regs = {
116                         .override = 0x220,
117                         .security = 0x224,
118                 },
119         }, {
120                 .name = "ispwa",
121                 .sid = TEGRA186_SID_ISP,
122                 .regs = {
123                         .override = 0x230,
124                         .security = 0x234,
125                 },
126         }, {
127                 .name = "ispwb",
128                 .sid = TEGRA186_SID_ISP,
129                 .regs = {
130                         .override = 0x238,
131                         .security = 0x23c,
132                 },
133         }, {
134                 .name = "xusb_hostr",
135                 .sid = TEGRA186_SID_XUSB_HOST,
136                 .regs = {
137                         .override = 0x250,
138                         .security = 0x254,
139                 },
140         }, {
141                 .name = "xusb_hostw",
142                 .sid = TEGRA186_SID_XUSB_HOST,
143                 .regs = {
144                         .override = 0x258,
145                         .security = 0x25c,
146                 },
147         }, {
148                 .name = "xusb_devr",
149                 .sid = TEGRA186_SID_XUSB_DEV,
150                 .regs = {
151                         .override = 0x260,
152                         .security = 0x264,
153                 },
154         }, {
155                 .name = "xusb_devw",
156                 .sid = TEGRA186_SID_XUSB_DEV,
157                 .regs = {
158                         .override = 0x268,
159                         .security = 0x26c,
160                 },
161         }, {
162                 .name = "tsecsrd",
163                 .sid = TEGRA186_SID_TSEC,
164                 .regs = {
165                         .override = 0x2a0,
166                         .security = 0x2a4,
167                 },
168         }, {
169                 .name = "tsecswr",
170                 .sid = TEGRA186_SID_TSEC,
171                 .regs = {
172                         .override = 0x2a8,
173                         .security = 0x2ac,
174                 },
175         }, {
176                 .name = "gpusrd",
177                 .sid = TEGRA186_SID_GPU,
178                 .regs = {
179                         .override = 0x2c0,
180                         .security = 0x2c4,
181                 },
182         }, {
183                 .name = "gpuswr",
184                 .sid = TEGRA186_SID_GPU,
185                 .regs = {
186                         .override = 0x2c8,
187                         .security = 0x2cc,
188                 },
189         }, {
190                 .name = "sdmmcra",
191                 .sid = TEGRA186_SID_SDMMC1,
192                 .regs = {
193                         .override = 0x300,
194                         .security = 0x304,
195                 },
196         }, {
197                 .name = "sdmmcraa",
198                 .sid = TEGRA186_SID_SDMMC2,
199                 .regs = {
200                         .override = 0x308,
201                         .security = 0x30c,
202                 },
203         }, {
204                 .name = "sdmmcr",
205                 .sid = TEGRA186_SID_SDMMC3,
206                 .regs = {
207                         .override = 0x310,
208                         .security = 0x314,
209                 },
210         }, {
211                 .name = "sdmmcrab",
212                 .sid = TEGRA186_SID_SDMMC4,
213                 .regs = {
214                         .override = 0x318,
215                         .security = 0x31c,
216                 },
217         }, {
218                 .name = "sdmmcwa",
219                 .sid = TEGRA186_SID_SDMMC1,
220                 .regs = {
221                         .override = 0x320,
222                         .security = 0x324,
223                 },
224         }, {
225                 .name = "sdmmcwaa",
226                 .sid = TEGRA186_SID_SDMMC2,
227                 .regs = {
228                         .override = 0x328,
229                         .security = 0x32c,
230                 },
231         }, {
232                 .name = "sdmmcw",
233                 .sid = TEGRA186_SID_SDMMC3,
234                 .regs = {
235                         .override = 0x330,
236                         .security = 0x334,
237                 },
238         }, {
239                 .name = "sdmmcwab",
240                 .sid = TEGRA186_SID_SDMMC4,
241                 .regs = {
242                         .override = 0x338,
243                         .security = 0x33c,
244                 },
245         }, {
246                 .name = "vicsrd",
247                 .sid = TEGRA186_SID_VIC,
248                 .regs = {
249                         .override = 0x360,
250                         .security = 0x364,
251                 },
252         }, {
253                 .name = "vicswr",
254                 .sid = TEGRA186_SID_VIC,
255                 .regs = {
256                         .override = 0x368,
257                         .security = 0x36c,
258                 },
259         }, {
260                 .name = "viw",
261                 .sid = TEGRA186_SID_VI,
262                 .regs = {
263                         .override = 0x390,
264                         .security = 0x394,
265                 },
266         }, {
267                 .name = "nvdecsrd",
268                 .sid = TEGRA186_SID_NVDEC,
269                 .regs = {
270                         .override = 0x3c0,
271                         .security = 0x3c4,
272                 },
273         }, {
274                 .name = "nvdecswr",
275                 .sid = TEGRA186_SID_NVDEC,
276                 .regs = {
277                         .override = 0x3c8,
278                         .security = 0x3cc,
279                 },
280         }, {
281                 .name = "aper",
282                 .sid = TEGRA186_SID_APE,
283                 .regs = {
284                         .override = 0x3d0,
285                         .security = 0x3d4,
286                 },
287         }, {
288                 .name = "apew",
289                 .sid = TEGRA186_SID_APE,
290                 .regs = {
291                         .override = 0x3d8,
292                         .security = 0x3dc,
293                 },
294         }, {
295                 .name = "nvjpgsrd",
296                 .sid = TEGRA186_SID_NVJPG,
297                 .regs = {
298                         .override = 0x3f0,
299                         .security = 0x3f4,
300                 },
301         }, {
302                 .name = "nvjpgswr",
303                 .sid = TEGRA186_SID_NVJPG,
304                 .regs = {
305                         .override = 0x3f8,
306                         .security = 0x3fc,
307                 },
308         }, {
309                 .name = "sesrd",
310                 .sid = TEGRA186_SID_SE,
311                 .regs = {
312                         .override = 0x400,
313                         .security = 0x404,
314                 },
315         }, {
316                 .name = "seswr",
317                 .sid = TEGRA186_SID_SE,
318                 .regs = {
319                         .override = 0x408,
320                         .security = 0x40c,
321                 },
322         }, {
323                 .name = "etrr",
324                 .sid = TEGRA186_SID_ETR,
325                 .regs = {
326                         .override = 0x420,
327                         .security = 0x424,
328                 },
329         }, {
330                 .name = "etrw",
331                 .sid = TEGRA186_SID_ETR,
332                 .regs = {
333                         .override = 0x428,
334                         .security = 0x42c,
335                 },
336         }, {
337                 .name = "tsecsrdb",
338                 .sid = TEGRA186_SID_TSECB,
339                 .regs = {
340                         .override = 0x430,
341                         .security = 0x434,
342                 },
343         }, {
344                 .name = "tsecswrb",
345                 .sid = TEGRA186_SID_TSECB,
346                 .regs = {
347                         .override = 0x438,
348                         .security = 0x43c,
349                 },
350         }, {
351                 .name = "gpusrd2",
352                 .sid = TEGRA186_SID_GPU,
353                 .regs = {
354                         .override = 0x440,
355                         .security = 0x444,
356                 },
357         }, {
358                 .name = "gpuswr2",
359                 .sid = TEGRA186_SID_GPU,
360                 .regs = {
361                         .override = 0x448,
362                         .security = 0x44c,
363                 },
364         }, {
365                 .name = "axisr",
366                 .sid = TEGRA186_SID_GPCDMA_0,
367                 .regs = {
368                         .override = 0x460,
369                         .security = 0x464,
370                 },
371         }, {
372                 .name = "axisw",
373                 .sid = TEGRA186_SID_GPCDMA_0,
374                 .regs = {
375                         .override = 0x468,
376                         .security = 0x46c,
377                 },
378         }, {
379                 .name = "eqosr",
380                 .sid = TEGRA186_SID_EQOS,
381                 .regs = {
382                         .override = 0x470,
383                         .security = 0x474,
384                 },
385         }, {
386                 .name = "eqosw",
387                 .sid = TEGRA186_SID_EQOS,
388                 .regs = {
389                         .override = 0x478,
390                         .security = 0x47c,
391                 },
392         }, {
393                 .name = "ufshcr",
394                 .sid = TEGRA186_SID_UFSHC,
395                 .regs = {
396                         .override = 0x480,
397                         .security = 0x484,
398                 },
399         }, {
400                 .name = "ufshcw",
401                 .sid = TEGRA186_SID_UFSHC,
402                 .regs = {
403                         .override = 0x488,
404                         .security = 0x48c,
405                 },
406         }, {
407                 .name = "nvdisplayr",
408                 .sid = TEGRA186_SID_NVDISPLAY,
409                 .regs = {
410                         .override = 0x490,
411                         .security = 0x494,
412                 },
413         }, {
414                 .name = "bpmpr",
415                 .sid = TEGRA186_SID_BPMP,
416                 .regs = {
417                         .override = 0x498,
418                         .security = 0x49c,
419                 },
420         }, {
421                 .name = "bpmpw",
422                 .sid = TEGRA186_SID_BPMP,
423                 .regs = {
424                         .override = 0x4a0,
425                         .security = 0x4a4,
426                 },
427         }, {
428                 .name = "bpmpdmar",
429                 .sid = TEGRA186_SID_BPMP,
430                 .regs = {
431                         .override = 0x4a8,
432                         .security = 0x4ac,
433                 },
434         }, {
435                 .name = "bpmpdmaw",
436                 .sid = TEGRA186_SID_BPMP,
437                 .regs = {
438                         .override = 0x4b0,
439                         .security = 0x4b4,
440                 },
441         }, {
442                 .name = "aonr",
443                 .sid = TEGRA186_SID_AON,
444                 .regs = {
445                         .override = 0x4b8,
446                         .security = 0x4bc,
447                 },
448         }, {
449                 .name = "aonw",
450                 .sid = TEGRA186_SID_AON,
451                 .regs = {
452                         .override = 0x4c0,
453                         .security = 0x4c4,
454                 },
455         }, {
456                 .name = "aondmar",
457                 .sid = TEGRA186_SID_AON,
458                 .regs = {
459                         .override = 0x4c8,
460                         .security = 0x4cc,
461                 },
462         }, {
463                 .name = "aondmaw",
464                 .sid = TEGRA186_SID_AON,
465                 .regs = {
466                         .override = 0x4d0,
467                         .security = 0x4d4,
468                 },
469         }, {
470                 .name = "scer",
471                 .sid = TEGRA186_SID_SCE,
472                 .regs = {
473                         .override = 0x4d8,
474                         .security = 0x4dc,
475                 },
476         }, {
477                 .name = "scew",
478                 .sid = TEGRA186_SID_SCE,
479                 .regs = {
480                         .override = 0x4e0,
481                         .security = 0x4e4,
482                 },
483         }, {
484                 .name = "scedmar",
485                 .sid = TEGRA186_SID_SCE,
486                 .regs = {
487                         .override = 0x4e8,
488                         .security = 0x4ec,
489                 },
490         }, {
491                 .name = "scedmaw",
492                 .sid = TEGRA186_SID_SCE,
493                 .regs = {
494                         .override = 0x4f0,
495                         .security = 0x4f4,
496                 },
497         }, {
498                 .name = "apedmar",
499                 .sid = TEGRA186_SID_APE,
500                 .regs = {
501                         .override = 0x4f8,
502                         .security = 0x4fc,
503                 },
504         }, {
505                 .name = "apedmaw",
506                 .sid = TEGRA186_SID_APE,
507                 .regs = {
508                         .override = 0x500,
509                         .security = 0x504,
510                 },
511         }, {
512                 .name = "nvdisplayr1",
513                 .sid = TEGRA186_SID_NVDISPLAY,
514                 .regs = {
515                         .override = 0x508,
516                         .security = 0x50c,
517                 },
518         }, {
519                 .name = "vicsrd1",
520                 .sid = TEGRA186_SID_VIC,
521                 .regs = {
522                         .override = 0x510,
523                         .security = 0x514,
524                 },
525         }, {
526                 .name = "nvdecsrd1",
527                 .sid = TEGRA186_SID_NVDEC,
528                 .regs = {
529                         .override = 0x518,
530                         .security = 0x51c,
531                 },
532         },
533 };
534
535 static int tegra186_mc_probe(struct platform_device *pdev)
536 {
537         struct resource *res;
538         struct tegra_mc *mc;
539         unsigned int i;
540         int err = 0;
541
542         mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL);
543         if (!mc)
544                 return -ENOMEM;
545
546         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
547         mc->regs = devm_ioremap_resource(&pdev->dev, res);
548         if (IS_ERR(mc->regs))
549                 return PTR_ERR(mc->regs);
550
551         mc->dev = &pdev->dev;
552
553         for (i = 0; i < ARRAY_SIZE(tegra186_mc_clients); i++) {
554                 const struct tegra_mc_client *client = &tegra186_mc_clients[i];
555                 u32 override, security;
556
557                 override = readl(mc->regs + client->regs.override);
558                 security = readl(mc->regs + client->regs.security);
559
560                 dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
561                         client->name, override, security);
562
563                 dev_dbg(&pdev->dev, "setting SID %u for %s\n", client->sid,
564                         client->name);
565                 writel(client->sid, mc->regs + client->regs.override);
566
567                 override = readl(mc->regs + client->regs.override);
568                 security = readl(mc->regs + client->regs.security);
569
570                 dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
571                         client->name, override, security);
572         }
573
574         platform_set_drvdata(pdev, mc);
575
576         return err;
577 }
578
579 static const struct of_device_id tegra186_mc_of_match[] = {
580         { .compatible = "nvidia,tegra186-mc", },
581         { /* sentinel */ }
582 };
583 MODULE_DEVICE_TABLE(of, tegra186_mc_of_match);
584
585 static struct platform_driver tegra186_mc_driver = {
586         .driver = {
587                 .name = "tegra186-mc",
588                 .of_match_table = tegra186_mc_of_match,
589                 .suppress_bind_attrs = true,
590         },
591         .prevent_deferred_probe = true,
592         .probe = tegra186_mc_probe,
593 };
594 module_platform_driver(tegra186_mc_driver);
595
596 MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
597 MODULE_DESCRIPTION("NVIDIA Tegra186 Memory Controller driver");
598 MODULE_LICENSE("GPL v2");