tegrakernel/kernel/nvidia/drivers/platform/tegra/mc/tegra186-mc-sid.c

540 lines
8.7 KiB
C

/*
* Tegra186 MC StreamID configuration
*
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define pr_fmt(fmt) "%s(): " fmt, __func__
#include <linux/err.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/platform/tegra/tegra-mc-sid.h>
#include <dt-bindings/memory/tegra-swgroup.h>
enum override_id {
PTCR,
AFIR,
HDAR,
HOST1XDMAR,
NVENCSRD,
SATAR,
MPCORER,
NVENCSWR,
AFIW,
HDAW,
MPCOREW,
SATAW,
ISPRA,
ISPWA,
ISPWB,
XUSB_HOSTR,
XUSB_HOSTW,
XUSB_DEVR,
XUSB_DEVW,
TSECSRD,
TSECSWR,
GPUSRD,
GPUSWR,
SDMMCRA,
SDMMCRAA,
SDMMCR,
SDMMCRAB,
SDMMCWA,
SDMMCWAA,
SDMMCW,
SDMMCWAB,
VICSRD,
VICSWR,
VIW,
NVDECSRD,
NVDECSWR,
APER,
APEW,
NVJPGSRD,
NVJPGSWR,
SESRD,
SESWR,
ETRR,
ETRW,
TSECSRDB,
TSECSWRB,
GPUSRD2,
GPUSWR2,
AXISR,
AXISW,
EQOSR,
EQOSW,
UFSHCR,
UFSHCW,
NVDISPLAYR,
BPMPR,
BPMPW,
BPMPDMAR,
BPMPDMAW,
AONR,
AONW,
AONDMAR,
AONDMAW,
SCER,
SCEW,
SCEDMAR,
SCEDMAW,
APEDMAR,
APEDMAW,
NVDISPLAYR1,
VICSRD1,
NVDECSRD1,
MAX_OID,
};
static struct sid_override_reg sid_override_reg[] = {
DEFREG(PTCR, 0x000),
DEFREG(AFIR, 0x070),
DEFREG(HDAR, 0x0a8),
DEFREG(HOST1XDMAR, 0x0b0),
DEFREG(NVENCSRD, 0x0e0),
DEFREG(SATAR, 0x0f8),
DEFREG(MPCORER, 0x138),
DEFREG(NVENCSWR, 0x158),
DEFREG(AFIW, 0x188),
DEFREG(HDAW, 0x1a8),
DEFREG(MPCOREW, 0x1c8),
DEFREG(SATAW, 0x1e8),
DEFREG(ISPRA, 0x220),
DEFREG(ISPWA, 0x230),
DEFREG(ISPWB, 0x238),
DEFREG(XUSB_HOSTR, 0x250),
DEFREG(XUSB_HOSTW, 0x258),
DEFREG(XUSB_DEVR, 0x260),
DEFREG(XUSB_DEVW, 0x268),
DEFREG(TSECSRD, 0x2a0),
DEFREG(TSECSWR, 0x2a8),
DEFREG(GPUSRD, 0x2c0),
DEFREG(GPUSWR, 0x2c8),
DEFREG(SDMMCRA, 0x300),
DEFREG(SDMMCRAA, 0x308),
DEFREG(SDMMCR, 0x310),
DEFREG(SDMMCRAB, 0x318),
DEFREG(SDMMCWA, 0x320),
DEFREG(SDMMCWAA, 0x328),
DEFREG(SDMMCW, 0x330),
DEFREG(SDMMCWAB, 0x338),
DEFREG(VICSRD, 0x360),
DEFREG(VICSWR, 0x368),
DEFREG(VIW, 0x390),
DEFREG(NVDECSRD, 0x3c0),
DEFREG(NVDECSWR, 0x3c8),
DEFREG(APER, 0x3d0),
DEFREG(APEW, 0x3d8),
DEFREG(NVJPGSRD, 0x3f0),
DEFREG(NVJPGSWR, 0x3f8),
DEFREG(SESRD, 0x400),
DEFREG(SESWR, 0x408),
DEFREG(ETRR, 0x420),
DEFREG(ETRW, 0x428),
DEFREG(TSECSRDB, 0x430),
DEFREG(TSECSWRB, 0x438),
DEFREG(GPUSRD2, 0x440),
DEFREG(GPUSWR2, 0x448),
DEFREG(AXISR, 0x460),
DEFREG(AXISW, 0x468),
DEFREG(EQOSR, 0x470),
DEFREG(EQOSW, 0x478),
DEFREG(UFSHCR, 0x480),
DEFREG(UFSHCW, 0x488),
DEFREG(NVDISPLAYR, 0x490),
DEFREG(BPMPR, 0x498),
DEFREG(BPMPW, 0x4a0),
DEFREG(BPMPDMAR, 0x4a8),
DEFREG(BPMPDMAW, 0x4b0),
DEFREG(AONR, 0x4b8),
DEFREG(AONW, 0x4c0),
DEFREG(AONDMAR, 0x4c8),
DEFREG(AONDMAW, 0x4d0),
DEFREG(SCER, 0x4d8),
DEFREG(SCEW, 0x4e0),
DEFREG(SCEDMAR, 0x4e8),
DEFREG(SCEDMAW, 0x4f0),
DEFREG(APEDMAR, 0x4f8),
DEFREG(APEDMAW, 0x500),
DEFREG(NVDISPLAYR1, 0x508),
DEFREG(VICSRD1, 0x510),
DEFREG(NVDECSRD1, 0x518),
};
static struct sid_to_oids sid_to_oids[] = {
{
.sid = TEGRA_SID_AFI,
.noids = 2,
.oid = {
AFIR,
AFIW,
},
.ord = OVERRIDE,
.name = "AFI",
},
{
.sid = TEGRA_SID_HDA,
.noids = 2,
.oid = {
HDAR,
HDAW,
},
.ord = OVERRIDE,
.name = "HDA",
},
{
.sid = TEGRA_SID_SATA2,
.noids = 2,
.oid = {
SATAR,
SATAW,
},
.ord = OVERRIDE,
.name = "SATA2",
},
{
.sid = TEGRA_SID_XUSB_HOST,
.noids = 2,
.oid = {
XUSB_HOSTR,
XUSB_HOSTW,
},
.ord = OVERRIDE,
.name = "XUSB_HOST",
},
{
.sid = TEGRA_SID_XUSB_DEV,
.noids = 2,
.oid = {
XUSB_DEVR,
XUSB_DEVW,
},
.ord = OVERRIDE,
.name = "XUSB_DEV",
},
{
.sid = TEGRA_SID_TSEC,
.noids = 2,
.oid = {
TSECSRD,
TSECSWR,
},
.ord = SIM_OVERRIDE,
.name = "TSEC",
},
{
.sid = TEGRA_SID_GPUB,
.noids = 4,
.oid = {
GPUSRD,
GPUSWR,
GPUSRD2,
GPUSWR2,
},
.ord = NO_OVERRIDE,
.name = "GPU",
},
{
.sid = TEGRA_SID_SDMMC1A,
.noids = 2,
.oid = {
SDMMCRA,
SDMMCWA,
},
.ord = OVERRIDE,
.name = "SDMMC1A",
},
{
.sid = TEGRA_SID_SDMMC2A,
.noids = 2,
.oid = {
SDMMCRAA,
SDMMCWAA,
},
.ord = OVERRIDE,
.name = "SDMMC2A",
},
{
.sid = TEGRA_SID_SDMMC3A,
.noids = 2,
.oid = {
SDMMCR,
SDMMCW,
},
.ord = OVERRIDE,
.name = "SDMMC3A",
},
{
.sid = TEGRA_SID_SDMMC4A,
.noids = 2,
.oid = {
SDMMCRAB,
SDMMCWAB,
},
.ord = OVERRIDE,
.name = "SDMMC4A",
},
{
.sid = TEGRA_SID_APE,
.noids = 4,
.oid = {
APER,
APEW,
APEDMAR,
APEDMAW,
},
.ord = NO_OVERRIDE,
.name = "APE",
},
{
.sid = TEGRA_SID_SE,
.noids = 2,
.oid = {
SESRD,
SESWR,
},
.ord = NO_OVERRIDE,
.name = "SE",
},
{
.sid = TEGRA_SID_ETR,
.noids = 2,
.oid = {
ETRR,
ETRW,
},
.ord = OVERRIDE,
.name = "ETR",
},
{
.sid = TEGRA_SID_TSECB,
.noids = 2,
.oid = {
TSECSRDB,
TSECSWRB,
},
.ord = SIM_OVERRIDE,
.name = "TSECB",
},
{
.sid = TEGRA_SID_GPCDMA_0, /* AXIS */
.noids = 2,
.oid = {
AXISR,
AXISW,
},
.ord = NO_OVERRIDE,
.name = "GPCDMA",
},
{
.sid = TEGRA_SID_EQOS,
.noids = 2,
.oid = {
EQOSR,
EQOSW,
},
.ord = OVERRIDE,
.name = "EQOS",
},
{
.sid = TEGRA_SID_UFSHC,
.noids = 2,
.oid = {
UFSHCR,
UFSHCW,
},
.ord = OVERRIDE,
.name = "UFSHC",
},
{
.sid = TEGRA_SID_NVDISPLAY,
.noids = 2,
.oid = {
NVDISPLAYR,
NVDISPLAYR1,
},
.ord = OVERRIDE,
.name = "NVDISPLAY",
},
{
.sid = TEGRA_SID_BPMP,
.noids = 4,
.oid = {
BPMPR,
BPMPW,
BPMPDMAR,
BPMPDMAW,
},
.ord = NO_OVERRIDE,
.name = "BPMP",
},
{
.sid = TEGRA_SID_AON,
.noids = 4,
.oid = {
AONR,
AONW,
AONDMAR,
AONDMAW,
},
.ord = NO_OVERRIDE,
.name = "AON",
},
{
.sid = TEGRA_SID_SCE,
.noids = 4,
.oid = {
SCER,
SCEW,
SCEDMAR,
SCEDMAW,
},
.ord = NO_OVERRIDE,
.name = "SCE",
},
{
.sid = TEGRA_SID_HC,
.noids = 1,
.oid = {
HOST1XDMAR,
},
.ord = SIM_OVERRIDE,
.name = "HC",
},
{
.sid = TEGRA_SID_VIC,
.noids = 3,
.oid = {
VICSRD1,
VICSRD,
VICSWR,
},
.ord = SIM_OVERRIDE,
.name = "VIC",
},
{
.sid = TEGRA_SID_VI,
.noids = 1,
.oid = {
VIW,
},
.ord = OVERRIDE,
.name = "VI",
},
{
.sid = TEGRA_SID_ISP,
.noids = 3,
.oid = {
ISPRA,
ISPWA,
ISPWB,
},
.ord = OVERRIDE,
.name = "ISP",
},
{
.sid = TEGRA_SID_NVDEC,
.noids = 3,
.oid = {
NVDECSRD1,
NVDECSRD,
NVDECSWR,
},
.ord = SIM_OVERRIDE,
.name = "NVDEC",
},
{
.sid = TEGRA_SID_NVENC,
.noids = 2,
.oid = {
NVENCSRD,
NVENCSWR,
},
.ord = SIM_OVERRIDE,
.name = "NVENC",
},
{
.sid = TEGRA_SID_NVJPG,
.noids = 2,
.oid = {
NVJPGSRD,
NVJPGSWR,
},
.ord = SIM_OVERRIDE,
.name = "NVJPG",
},
};
static const struct tegra_mc_sid_soc_data tegra186_mc_soc_data = {
.sid_override_reg = sid_override_reg,
.nsid_override_reg = ARRAY_SIZE(sid_override_reg),
.sid_to_oids = sid_to_oids,
.nsid_to_oids = ARRAY_SIZE(sid_to_oids),
.max_oids = MAX_OID,
};
static int tegra186_mc_sid_probe(struct platform_device *pdev)
{
return tegra_mc_sid_probe(pdev, &tegra186_mc_soc_data);
}
static const struct of_device_id tegra186_mc_sid_of_match[] = {
{ .compatible = "nvidia,tegra-mc-sid", },
{ .compatible = "nvidia,tegra186-mc-sid", },
{},
};
MODULE_DEVICE_TABLE(of, tegra186_mc_sid_of_match);
static struct platform_driver tegra186_mc_sid_driver = {
.probe = tegra186_mc_sid_probe,
.remove = tegra_mc_sid_remove,
.driver = {
.owner = THIS_MODULE,
.name = "tegra186-mc-sid",
.of_match_table = of_match_ptr(tegra186_mc_sid_of_match),
},
};
static int __init tegra186_mc_sid_init(void)
{
struct device_node *np;
struct platform_device *pdev = NULL;
np = of_find_compatible_node(NULL, NULL, "nvidia,tegra186-mc-sid");
if (!np)
np = of_find_compatible_node(NULL, NULL, "nvidia,tegra-mc-sid");
if (np) {
pdev = of_platform_device_create(np, NULL,
platform_bus_type.dev_root);
of_node_put(np);
}
if (IS_ERR_OR_NULL(pdev))
return -ENODEV;
return platform_driver_register(&tegra186_mc_sid_driver);
}
arch_initcall(tegra186_mc_sid_init);
MODULE_DESCRIPTION("MC StreamID configuration");
MODULE_AUTHOR("Hiroshi DOYU <hdoyu@nvidia.com>, Pritesh Raithatha <praithatha@nvidia.com>");
MODULE_LICENSE("GPL v2");