2 * Copyright (C) 2017 NVIDIA CORPORATION. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
10 #include <linux/module.h>
11 #include <linux/mod_devicetable.h>
12 #include <linux/platform_device.h>
14 #include <dt-bindings/memory/tegra186-mc.h>
21 struct tegra_mc_client {
25 unsigned int override;
26 unsigned int security;
30 static const struct tegra_mc_client tegra186_mc_clients[] = {
33 .sid = TEGRA186_SID_PASSTHROUGH,
40 .sid = TEGRA186_SID_AFI,
47 .sid = TEGRA186_SID_HDA,
54 .sid = TEGRA186_SID_HOST1X,
61 .sid = TEGRA186_SID_NVENC,
68 .sid = TEGRA186_SID_SATA,
75 .sid = TEGRA186_SID_PASSTHROUGH,
82 .sid = TEGRA186_SID_NVENC,
89 .sid = TEGRA186_SID_AFI,
96 .sid = TEGRA186_SID_HDA,
103 .sid = TEGRA186_SID_PASSTHROUGH,
110 .sid = TEGRA186_SID_SATA,
117 .sid = TEGRA186_SID_ISP,
124 .sid = TEGRA186_SID_ISP,
131 .sid = TEGRA186_SID_ISP,
137 .name = "xusb_hostr",
138 .sid = TEGRA186_SID_XUSB_HOST,
144 .name = "xusb_hostw",
145 .sid = TEGRA186_SID_XUSB_HOST,
152 .sid = TEGRA186_SID_XUSB_DEV,
159 .sid = TEGRA186_SID_XUSB_DEV,
166 .sid = TEGRA186_SID_TSEC,
173 .sid = TEGRA186_SID_TSEC,
180 .sid = TEGRA186_SID_GPU,
187 .sid = TEGRA186_SID_GPU,
194 .sid = TEGRA186_SID_SDMMC1,
201 .sid = TEGRA186_SID_SDMMC2,
208 .sid = TEGRA186_SID_SDMMC3,
215 .sid = TEGRA186_SID_SDMMC4,
222 .sid = TEGRA186_SID_SDMMC1,
229 .sid = TEGRA186_SID_SDMMC2,
236 .sid = TEGRA186_SID_SDMMC3,
243 .sid = TEGRA186_SID_SDMMC4,
250 .sid = TEGRA186_SID_VIC,
257 .sid = TEGRA186_SID_VIC,
264 .sid = TEGRA186_SID_VI,
271 .sid = TEGRA186_SID_NVDEC,
278 .sid = TEGRA186_SID_NVDEC,
285 .sid = TEGRA186_SID_APE,
292 .sid = TEGRA186_SID_APE,
299 .sid = TEGRA186_SID_NVJPG,
306 .sid = TEGRA186_SID_NVJPG,
313 .sid = TEGRA186_SID_SE,
320 .sid = TEGRA186_SID_SE,
327 .sid = TEGRA186_SID_ETR,
334 .sid = TEGRA186_SID_ETR,
341 .sid = TEGRA186_SID_TSECB,
348 .sid = TEGRA186_SID_TSECB,
355 .sid = TEGRA186_SID_GPU,
362 .sid = TEGRA186_SID_GPU,
369 .sid = TEGRA186_SID_GPCDMA_0,
376 .sid = TEGRA186_SID_GPCDMA_0,
383 .sid = TEGRA186_SID_EQOS,
390 .sid = TEGRA186_SID_EQOS,
397 .sid = TEGRA186_SID_UFSHC,
404 .sid = TEGRA186_SID_UFSHC,
410 .name = "nvdisplayr",
411 .sid = TEGRA186_SID_NVDISPLAY,
418 .sid = TEGRA186_SID_BPMP,
425 .sid = TEGRA186_SID_BPMP,
432 .sid = TEGRA186_SID_BPMP,
439 .sid = TEGRA186_SID_BPMP,
446 .sid = TEGRA186_SID_AON,
453 .sid = TEGRA186_SID_AON,
460 .sid = TEGRA186_SID_AON,
467 .sid = TEGRA186_SID_AON,
474 .sid = TEGRA186_SID_SCE,
481 .sid = TEGRA186_SID_SCE,
488 .sid = TEGRA186_SID_SCE,
495 .sid = TEGRA186_SID_SCE,
502 .sid = TEGRA186_SID_APE,
509 .sid = TEGRA186_SID_APE,
515 .name = "nvdisplayr1",
516 .sid = TEGRA186_SID_NVDISPLAY,
523 .sid = TEGRA186_SID_VIC,
530 .sid = TEGRA186_SID_NVDEC,
538 static int tegra186_mc_probe(struct platform_device *pdev)
540 struct resource *res;
545 mc = devm_kzalloc(&pdev->dev, sizeof(*mc), GFP_KERNEL);
549 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
550 mc->regs = devm_ioremap_resource(&pdev->dev, res);
551 if (IS_ERR(mc->regs))
552 return PTR_ERR(mc->regs);
554 mc->dev = &pdev->dev;
556 for (i = 0; i < ARRAY_SIZE(tegra186_mc_clients); i++) {
557 const struct tegra_mc_client *client = &tegra186_mc_clients[i];
558 u32 override, security;
560 override = readl(mc->regs + client->regs.override);
561 security = readl(mc->regs + client->regs.security);
563 dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
564 client->name, override, security);
566 dev_dbg(&pdev->dev, "setting SID %u for %s\n", client->sid,
568 writel(client->sid, mc->regs + client->regs.override);
570 override = readl(mc->regs + client->regs.override);
571 security = readl(mc->regs + client->regs.security);
573 dev_dbg(&pdev->dev, "client %s: override: %x security: %x\n",
574 client->name, override, security);
577 platform_set_drvdata(pdev, mc);
582 static const struct of_device_id tegra186_mc_of_match[] = {
583 { .compatible = "nvidia,tegra186-mc", },
586 MODULE_DEVICE_TABLE(of, tegra186_mc_of_match);
588 static struct platform_driver tegra186_mc_driver = {
590 .name = "tegra186-mc",
591 .of_match_table = tegra186_mc_of_match,
592 .suppress_bind_attrs = true,
594 .prevent_deferred_probe = true,
595 .probe = tegra186_mc_probe,
597 module_platform_driver(tegra186_mc_driver);
600 MODULE_DESCRIPTION("NVIDIA Tegra186 Memory Controller driver");
601 MODULE_LICENSE("GPL v2");