| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * Copyright (C) 2022-2023, NVIDIA CORPORATION. All rights reserved. |
| */ |
| |
| #include <soc/tegra/mc.h> |
| |
| #include <dt-bindings/memory/tegra234-mc.h> |
| #include <linux/interconnect.h> |
| #include <linux/tegra-icc.h> |
| |
| #include <soc/tegra/bpmp.h> |
| #include "mc.h" |
| |
| /* |
| * MC Client entries are sorted in the increasing order of the |
| * override and security register offsets. |
| */ |
| static const struct tegra_mc_client tegra234_mc_clients[] = { |
| { |
| .id = TEGRA234_MEMORY_CLIENT_HDAR, |
| .name = "hdar", |
| .bpmp_id = TEGRA_ICC_BPMP_HDA, |
| .type = TEGRA_ICC_ISO_AUDIO, |
| .sid = TEGRA234_SID_HDA, |
| .regs = { |
| .sid = { |
| .override = 0xa8, |
| .security = 0xac, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVENCSRD, |
| .name = "nvencsrd", |
| .bpmp_id = TEGRA_ICC_BPMP_NVENC, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVENC, |
| .regs = { |
| .sid = { |
| .override = 0xe0, |
| .security = 0xe4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE6AR, |
| .name = "pcie6ar", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_6, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE6, |
| .regs = { |
| .sid = { |
| .override = 0x140, |
| .security = 0x144, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE6AW, |
| .name = "pcie6aw", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_6, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE6, |
| .regs = { |
| .sid = { |
| .override = 0x148, |
| .security = 0x14c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE7AR, |
| .name = "pcie7ar", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_7, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE7, |
| .regs = { |
| .sid = { |
| .override = 0x150, |
| .security = 0x154, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVENCSWR, |
| .name = "nvencswr", |
| .bpmp_id = TEGRA_ICC_BPMP_NVENC, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVENC, |
| .regs = { |
| .sid = { |
| .override = 0x158, |
| .security = 0x15c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0RDB, |
| .name = "dla0rdb", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x160, |
| .security = 0x164, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0RDB1, |
| .name = "dla0rdb1", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x168, |
| .security = 0x16c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0WRB, |
| .name = "dla0wrb", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x170, |
| .security = 0x174, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1RDB, |
| .name = "dla0rdb", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x178, |
| .security = 0x17c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE7AW, |
| .name = "pcie7aw", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_7, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE7, |
| .regs = { |
| .sid = { |
| .override = 0x180, |
| .security = 0x184, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE8AR, |
| .name = "pcie8ar", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_8, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE8, |
| .regs = { |
| .sid = { |
| .override = 0x190, |
| .security = 0x194, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_HDAW, |
| .name = "hdaw", |
| .bpmp_id = TEGRA_ICC_BPMP_HDA, |
| .type = TEGRA_ICC_ISO_AUDIO, |
| .sid = TEGRA234_SID_HDA, |
| .regs = { |
| .sid = { |
| .override = 0x1a8, |
| .security = 0x1ac, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE8AW, |
| .name = "pcie8aw", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_8, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE8, |
| .regs = { |
| .sid = { |
| .override = 0x1d8, |
| .security = 0x1dc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE9AR, |
| .name = "pcie9ar", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_9, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE9, |
| .regs = { |
| .sid = { |
| .override = 0x1e0, |
| .security = 0x1e4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE6AR1, |
| .name = "pcie6ar1", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_6, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE6, |
| .regs = { |
| .sid = { |
| .override = 0x1e8, |
| .security = 0x1ec, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE9AW, |
| .name = "pcie9aw", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_9, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE9, |
| .regs = { |
| .sid = { |
| .override = 0x1f0, |
| .security = 0x1f4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE10AR, |
| .name = "pcie10ar", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_10, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE10, |
| .regs = { |
| .sid = { |
| .override = 0x1f8, |
| .security = 0x1fc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE10AW, |
| .name = "pcie10aw", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_10, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE10, |
| .regs = { |
| .sid = { |
| .override = 0x200, |
| .security = 0x204, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE10AR1, |
| .name = "pcie10ar1", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_10, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE10, |
| .regs = { |
| .sid = { |
| .override = 0x240, |
| .security = 0x244, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE7AR1, |
| .name = "pcie7ar1", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_7, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE7, |
| .regs = { |
| .sid = { |
| .override = 0x248, |
| .security = 0x24c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBEARD, |
| .name = "mgbeard", |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_MGBE, |
| .regs = { |
| .sid = { |
| .override = 0x2c0, |
| .security = 0x2c4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBEBRD, |
| .name = "mgbebrd", |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_MGBE_VF1, |
| .regs = { |
| .sid = { |
| .override = 0x2c8, |
| .security = 0x2cc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBECRD, |
| .name = "mgbecrd", |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_MGBE_VF2, |
| .regs = { |
| .sid = { |
| .override = 0x2d0, |
| .security = 0x2d4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBEDRD, |
| .name = "mgbedrd", |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_MGBE_VF3, |
| .regs = { |
| .sid = { |
| .override = 0x2d8, |
| .security = 0x2dc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBEAWR, |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .name = "mgbeawr", |
| .sid = TEGRA234_SID_MGBE, |
| .regs = { |
| .sid = { |
| .override = 0x2e0, |
| .security = 0x2e4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBEBWR, |
| .name = "mgbebwr", |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_MGBE_VF1, |
| .regs = { |
| .sid = { |
| .override = 0x2f8, |
| .security = 0x2fc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBECWR, |
| .name = "mgbecwr", |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_MGBE_VF2, |
| .regs = { |
| .sid = { |
| .override = 0x308, |
| .security = 0x30c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_SDMMCRAB, |
| .name = "sdmmcrab", |
| .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_SDMMC4, |
| .regs = { |
| .sid = { |
| .override = 0x318, |
| .security = 0x31c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_MGBEDWR, |
| .name = "mgbedwr", |
| .bpmp_id = TEGRA_ICC_BPMP_EQOS, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_MGBE_VF3, |
| .regs = { |
| .sid = { |
| .override = 0x328, |
| .security = 0x32c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_SDMMCWAB, |
| .name = "sdmmcwab", |
| .bpmp_id = TEGRA_ICC_BPMP_SDMMC_4, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_SDMMC4, |
| .regs = { |
| .sid = { |
| .override = 0x338, |
| .security = 0x33c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VICSRD, |
| .name = "vicsrd", |
| .bpmp_id = TEGRA_ICC_BPMP_VIC, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_VIC, |
| .regs = { |
| .sid = { |
| .override = 0x360, |
| .security = 0x364, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VICSWR, |
| .name = "vicswr", |
| .bpmp_id = TEGRA_ICC_BPMP_VIC, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_VIC, |
| .regs = { |
| .sid = { |
| .override = 0x368, |
| .security = 0x36c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1RDB1, |
| .name = "dla0rdb1", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x370, |
| .security = 0x374, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1WRB, |
| .name = "dla0wrb", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x378, |
| .security = 0x37c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VI2W, |
| .name = "vi2w", |
| .bpmp_id = TEGRA_ICC_BPMP_VI2, |
| .type = TEGRA_ICC_ISO_VI, |
| .sid = TEGRA234_SID_ISO_VI2, |
| .regs = { |
| .sid = { |
| .override = 0x380, |
| .security = 0x384, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VI2FALR, |
| .name = "vi2falr", |
| .bpmp_id = TEGRA_ICC_BPMP_VI2FAL, |
| .type = TEGRA_ICC_ISO_VIFAL, |
| .sid = TEGRA234_SID_ISO_VI2FALC, |
| .regs = { |
| .sid = { |
| .override = 0x388, |
| .security = 0x38c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VIW, |
| .name = "viw", |
| .bpmp_id = TEGRA_ICC_BPMP_VI, |
| .type = TEGRA_ICC_ISO_VI, |
| .sid = TEGRA234_SID_ISO_VI, |
| .regs = { |
| .sid = { |
| .override = 0x390, |
| .security = 0x394, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVDECSRD, |
| .name = "nvdecsrd", |
| .bpmp_id = TEGRA_ICC_BPMP_NVDEC, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVDEC, |
| .regs = { |
| .sid = { |
| .override = 0x3c0, |
| .security = 0x3c4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVDECSWR, |
| .name = "nvdecswr", |
| .bpmp_id = TEGRA_ICC_BPMP_NVDEC, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVDEC, |
| .regs = { |
| .sid = { |
| .override = 0x3c8, |
| .security = 0x3cc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_APER, |
| .name = "aper", |
| .bpmp_id = TEGRA_ICC_BPMP_APE, |
| .type = TEGRA_ICC_ISO_AUDIO, |
| .sid = TEGRA234_SID_APE, |
| .regs = { |
| .sid = { |
| .override = 0x3d0, |
| .security = 0x3d4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_APEW, |
| .name = "apew", |
| .bpmp_id = TEGRA_ICC_BPMP_APE, |
| .type = TEGRA_ICC_ISO_AUDIO, |
| .sid = TEGRA234_SID_APE, |
| .regs = { |
| .sid = { |
| .override = 0x3d8, |
| .security = 0x3dc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VI2FALW, |
| .name = "vi2falw", |
| .bpmp_id = TEGRA_ICC_BPMP_VI2FAL, |
| .type = TEGRA_ICC_ISO_VIFAL, |
| .sid = TEGRA234_SID_ISO_VI2FALC, |
| .regs = { |
| .sid = { |
| .override = 0x3e0, |
| .security = 0x3e4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVJPGSRD, |
| .name = "nvjpgsrd", |
| .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVJPG, |
| .regs = { |
| .sid = { |
| .override = 0x3f0, |
| .security = 0x3f4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVJPGSWR, |
| .name = "nvjpgswr", |
| .bpmp_id = TEGRA_ICC_BPMP_NVJPG_0, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVJPG, |
| .regs = { |
| .sid = { |
| .override = 0x3f8, |
| .security = 0x3fc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR, |
| .name = "nvdisplayr", |
| .bpmp_id = TEGRA_ICC_BPMP_DISPLAY, |
| .type = TEGRA_ICC_ISO_DISPLAY, |
| .sid = TEGRA234_SID_ISO_NVDISPLAY, |
| .regs = { |
| .sid = { |
| .override = 0x490, |
| .security = 0x494, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_BPMPR, |
| .name = "bpmpr", |
| .sid = TEGRA234_SID_BPMP, |
| .regs = { |
| .sid = { |
| .override = 0x498, |
| .security = 0x49c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_BPMPW, |
| .name = "bpmpw", |
| .sid = TEGRA234_SID_BPMP, |
| .regs = { |
| .sid = { |
| .override = 0x4a0, |
| .security = 0x4a4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_BPMPDMAR, |
| .name = "bpmpdmar", |
| .sid = TEGRA234_SID_BPMP, |
| .regs = { |
| .sid = { |
| .override = 0x4a8, |
| .security = 0x4ac, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_BPMPDMAW, |
| .name = "bpmpdmaw", |
| .sid = TEGRA234_SID_BPMP, |
| .regs = { |
| .sid = { |
| .override = 0x4b0, |
| .security = 0x4b4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_APEDMAR, |
| .name = "apedmar", |
| .bpmp_id = TEGRA_ICC_BPMP_APEDMA, |
| .type = TEGRA_ICC_ISO_AUDIO, |
| .sid = TEGRA234_SID_APE, |
| .regs = { |
| .sid = { |
| .override = 0x4f8, |
| .security = 0x4fc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_APEDMAW, |
| .name = "apedmaw", |
| .bpmp_id = TEGRA_ICC_BPMP_APEDMA, |
| .type = TEGRA_ICC_ISO_AUDIO, |
| .sid = TEGRA234_SID_APE, |
| .regs = { |
| .sid = { |
| .override = 0x500, |
| .security = 0x504, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVDISPLAYR1, |
| .name = "nvdisplayr1", |
| .bpmp_id = TEGRA_ICC_BPMP_DISPLAY, |
| .type = TEGRA_ICC_ISO_DISPLAY, |
| .sid = TEGRA234_SID_ISO_NVDISPLAY, |
| .regs = { |
| .sid = { |
| .override = 0x508, |
| .security = 0x50c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VIFALR, |
| .name = "vifalr", |
| .bpmp_id = TEGRA_ICC_BPMP_VIFAL, |
| .type = TEGRA_ICC_ISO_VIFAL, |
| .sid = TEGRA234_SID_ISO_VIFALC, |
| .regs = { |
| .sid = { |
| .override = 0x5e0, |
| .security = 0x5e4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_VIFALW, |
| .name = "vifalw", |
| .bpmp_id = TEGRA_ICC_BPMP_VIFAL, |
| .type = TEGRA_ICC_ISO_VIFAL, |
| .sid = TEGRA234_SID_ISO_VIFALC, |
| .regs = { |
| .sid = { |
| .override = 0x5e8, |
| .security = 0x5ec, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0RDA, |
| .name = "dla0rda", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x5f0, |
| .security = 0x5f4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0FALRDB, |
| .name = "dla0falrdb", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x5f8, |
| .security = 0x5fc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0WRA, |
| .name = "dla0wra", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x600, |
| .security = 0x604, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0FALWRB, |
| .name = "dla0falwrb", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x608, |
| .security = 0x60c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1RDA, |
| .name = "dla0rda", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x610, |
| .security = 0x614, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1FALRDB, |
| .name = "dla0falrdb", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x618, |
| .security = 0x61c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1WRA, |
| .name = "dla0wra", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x620, |
| .security = 0x624, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1FALWRB, |
| .name = "dla0falwrb", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x628, |
| .security = 0x62c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_RCER, |
| .name = "rcer", |
| .bpmp_id = TEGRA_ICC_BPMP_RCE, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_RCE, |
| .regs = { |
| .sid = { |
| .override = 0x690, |
| .security = 0x694, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_RCEW, |
| .name = "rcew", |
| .bpmp_id = TEGRA_ICC_BPMP_RCE, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_RCE, |
| .regs = { |
| .sid = { |
| .override = 0x698, |
| .security = 0x69c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE0R, |
| .name = "pcie0r", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_0, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE0, |
| .regs = { |
| .sid = { |
| .override = 0x6c0, |
| .security = 0x6c4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE0W, |
| .name = "pcie0w", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_0, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE0, |
| .regs = { |
| .sid = { |
| .override = 0x6c8, |
| .security = 0x6cc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE1R, |
| .name = "pcie1r", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_1, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE1, |
| .regs = { |
| .sid = { |
| .override = 0x6d0, |
| .security = 0x6d4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE1W, |
| .name = "pcie1w", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_1, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE1, |
| .regs = { |
| .sid = { |
| .override = 0x6d8, |
| .security = 0x6dc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE2AR, |
| .name = "pcie2ar", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_2, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE2, |
| .regs = { |
| .sid = { |
| .override = 0x6e0, |
| .security = 0x6e4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE2AW, |
| .name = "pcie2aw", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_2, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE2, |
| .regs = { |
| .sid = { |
| .override = 0x6e8, |
| .security = 0x6ec, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE3R, |
| .name = "pcie3r", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_3, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE3, |
| .regs = { |
| .sid = { |
| .override = 0x6f0, |
| .security = 0x6f4, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE3W, |
| .name = "pcie3w", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_3, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE3, |
| .regs = { |
| .sid = { |
| .override = 0x6f8, |
| .security = 0x6fc, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE4R, |
| .name = "pcie4r", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_4, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE4, |
| .regs = { |
| .sid = { |
| .override = 0x700, |
| .security = 0x704, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE4W, |
| .name = "pcie4w", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_4, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE4, |
| .regs = { |
| .sid = { |
| .override = 0x708, |
| .security = 0x70c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE5R, |
| .name = "pcie5r", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_5, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE5, |
| .regs = { |
| .sid = { |
| .override = 0x710, |
| .security = 0x714, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE5W, |
| .name = "pcie5w", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_5, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE5, |
| .regs = { |
| .sid = { |
| .override = 0x718, |
| .security = 0x71c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA0RDA1, |
| .name = "dla0rda1", |
| .sid = TEGRA234_SID_NVDLA0, |
| .regs = { |
| .sid = { |
| .override = 0x748, |
| .security = 0x74c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_DLA1RDA1, |
| .name = "dla0rda1", |
| .sid = TEGRA234_SID_NVDLA1, |
| .regs = { |
| .sid = { |
| .override = 0x750, |
| .security = 0x754, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_PCIE5R1, |
| .name = "pcie5r1", |
| .bpmp_id = TEGRA_ICC_BPMP_PCIE_5, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_PCIE5, |
| .regs = { |
| .sid = { |
| .override = 0x778, |
| .security = 0x77c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVJPG1SRD, |
| .name = "nvjpg1srd", |
| .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVJPG1, |
| .regs = { |
| .sid = { |
| .override = 0x918, |
| .security = 0x91c, |
| }, |
| }, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVJPG1SWR, |
| .name = "nvjpg1swr", |
| .bpmp_id = TEGRA_ICC_BPMP_NVJPG_1, |
| .type = TEGRA_ICC_NISO, |
| .sid = TEGRA234_SID_NVJPG1, |
| .regs = { |
| .sid = { |
| .override = 0x920, |
| .security = 0x924, |
| }, |
| }, |
| }, { |
| .id = TEGRA_ICC_MC_CPU_CLUSTER0, |
| .name = "sw_cluster0", |
| .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER0, |
| .type = TEGRA_ICC_NISO, |
| }, { |
| .id = TEGRA_ICC_MC_CPU_CLUSTER1, |
| .name = "sw_cluster1", |
| .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER1, |
| .type = TEGRA_ICC_NISO, |
| }, { |
| .id = TEGRA_ICC_MC_CPU_CLUSTER2, |
| .name = "sw_cluster2", |
| .bpmp_id = TEGRA_ICC_BPMP_CPU_CLUSTER2, |
| .type = TEGRA_ICC_NISO, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVL1R, |
| .name = "nvl1r", |
| .bpmp_id = TEGRA_ICC_BPMP_GPU, |
| .type = TEGRA_ICC_NISO, |
| }, { |
| .id = TEGRA234_MEMORY_CLIENT_NVL1W, |
| .name = "nvl1w", |
| .bpmp_id = TEGRA_ICC_BPMP_GPU, |
| .type = TEGRA_ICC_NISO, |
| }, |
| }; |
| |
| /* |
| * tegra234_mc_icc_set() - Pass MC client info to the BPMP-FW |
| * @src: ICC node for Memory Controller's (MC) Client |
| * @dst: ICC node for Memory Controller (MC) |
| * |
| * Passing the current request info from the MC to the BPMP-FW where |
| * LA and PTSA registers are accessed and the final EMC freq is set |
| * based on client_id, type, latency and bandwidth. |
| * icc_set_bw() makes set_bw calls for both MC and EMC providers in |
| * sequence. Both the calls are protected by 'mutex_lock(&icc_lock)'. |
| * So, the data passed won't be updated by concurrent set calls from |
| * other clients. |
| */ |
| static int tegra234_mc_icc_set(struct icc_node *src, struct icc_node *dst) |
| { |
| struct tegra_mc *mc = icc_provider_to_tegra_mc(dst->provider); |
| struct mrq_bwmgr_int_request bwmgr_req = { 0 }; |
| struct mrq_bwmgr_int_response bwmgr_resp = { 0 }; |
| const struct tegra_mc_client *pclient = src->data; |
| struct tegra_bpmp_message msg; |
| int ret; |
| |
| /* |
| * Same Src and Dst node will happen during boot from icc_node_add(). |
| * This can be used to pre-initialize and set bandwidth for all clients |
| * before their drivers are loaded. We are skipping this case as for us, |
| * the pre-initialization already happened in Bootloader(MB2) and BPMP-FW. |
| */ |
| if (src->id == dst->id) |
| return 0; |
| |
| if (!mc->bwmgr_mrq_supported) |
| return 0; |
| |
| if (!mc->bpmp) { |
| dev_err(mc->dev, "BPMP reference NULL\n"); |
| return -ENOENT; |
| } |
| |
| if (pclient->type == TEGRA_ICC_NISO) |
| bwmgr_req.bwmgr_calc_set_req.niso_bw = src->avg_bw; |
| else |
| bwmgr_req.bwmgr_calc_set_req.iso_bw = src->avg_bw; |
| |
| bwmgr_req.bwmgr_calc_set_req.client_id = pclient->bpmp_id; |
| |
| bwmgr_req.cmd = CMD_BWMGR_INT_CALC_AND_SET; |
| bwmgr_req.bwmgr_calc_set_req.mc_floor = src->peak_bw; |
| bwmgr_req.bwmgr_calc_set_req.floor_unit = BWMGR_INT_UNIT_KBPS; |
| |
| memset(&msg, 0, sizeof(msg)); |
| msg.mrq = MRQ_BWMGR_INT; |
| msg.tx.data = &bwmgr_req; |
| msg.tx.size = sizeof(bwmgr_req); |
| msg.rx.data = &bwmgr_resp; |
| msg.rx.size = sizeof(bwmgr_resp); |
| |
| if (pclient->bpmp_id >= TEGRA_ICC_BPMP_CPU_CLUSTER0 && |
| pclient->bpmp_id <= TEGRA_ICC_BPMP_CPU_CLUSTER2) |
| msg.flags = TEGRA_BPMP_MESSAGE_RESET; |
| |
| ret = tegra_bpmp_transfer(mc->bpmp, &msg); |
| if (ret < 0) { |
| dev_err(mc->dev, "BPMP transfer failed: %d\n", ret); |
| goto error; |
| } |
| if (msg.rx.ret < 0) { |
| pr_err("failed to set bandwidth for %u: %d\n", |
| bwmgr_req.bwmgr_calc_set_req.client_id, msg.rx.ret); |
| ret = -EINVAL; |
| } |
| |
| error: |
| return ret; |
| } |
| |
| static int tegra234_mc_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, |
| u32 peak_bw, u32 *agg_avg, u32 *agg_peak) |
| { |
| struct icc_provider *p = node->provider; |
| struct tegra_mc *mc = icc_provider_to_tegra_mc(p); |
| |
| if (!mc->bwmgr_mrq_supported) |
| return 0; |
| |
| if (node->id == TEGRA_ICC_MC_CPU_CLUSTER0 || |
| node->id == TEGRA_ICC_MC_CPU_CLUSTER1 || |
| node->id == TEGRA_ICC_MC_CPU_CLUSTER2) { |
| if (mc) |
| peak_bw = peak_bw * mc->num_channels; |
| } |
| |
| *agg_avg += avg_bw; |
| *agg_peak = max(*agg_peak, peak_bw); |
| |
| return 0; |
| } |
| |
| static int tegra234_mc_icc_get_init_bw(struct icc_node *node, u32 *avg, u32 *peak) |
| { |
| *avg = 0; |
| *peak = 0; |
| |
| return 0; |
| } |
| |
| static const struct tegra_mc_icc_ops tegra234_mc_icc_ops = { |
| .xlate = tegra_mc_icc_xlate, |
| .aggregate = tegra234_mc_icc_aggregate, |
| .get_bw = tegra234_mc_icc_get_init_bw, |
| .set = tegra234_mc_icc_set, |
| }; |
| |
| const struct tegra_mc_soc tegra234_mc_soc = { |
| .num_clients = ARRAY_SIZE(tegra234_mc_clients), |
| .clients = tegra234_mc_clients, |
| .num_address_bits = 40, |
| .num_channels = 16, |
| .client_id_mask = 0x1ff, |
| .intmask = MC_INT_DECERR_ROUTE_SANITY | |
| MC_INT_DECERR_GENERALIZED_CARVEOUT | MC_INT_DECERR_MTS | |
| MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | |
| MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM, |
| .has_addr_hi_reg = true, |
| .ops = &tegra186_mc_ops, |
| .icc_ops = &tegra234_mc_icc_ops, |
| .ch_intmask = 0x0000ff00, |
| .global_intstatus_channel_shift = 8, |
| /* |
| * Additionally, there are lite carveouts but those are not currently |
| * supported. |
| */ |
| .num_carveouts = 32, |
| }; |