memory: tegra: Updates for v6.17-rc1

Enable support for the memory and external memory controllers found on
 Tegra264.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEiOrDCAFJzPfAjcif3SOs138+s6EFAmhxiZwACgkQ3SOs138+
 s6GwjA//WLLmpGF1BVk2o4tiREwMttyQ8FW5aJF0XUl2CP6H1D+aekbrSZaQ0TIU
 vDxmtXZwaud8TWQ1OAsc2jVCzwEsowChQ8EO6+AcKejUlJNeFmJ+qm1OqP9OxzJY
 9InZeTzYexsqxR4y9XPGAd6MWwCBlIrCzjfOZSRwEULCFlvzdZ1qFUbXBKboMMT7
 Az2BFWiH8ecjlVAx0Ejy4rhrVTcGNznPDkPutUgQmWbamdET51h2/4tvUlNpM6jU
 Zpmj7rfma8u318RRz0gcGXMHNg8w8JGUM8TPl9hYrl9Y1hd56EKENxUf+uOw5i8M
 6iE7gYuglhfXQ9FVjMkoE5ISecLQpGnT5nNC6mmSoG4KTFGhwoo2AMBGf4MLlm1O
 uE3F9+HTZzn0eZA6ney1EKcqpaf+MqdRVAduxYNXZpZN+Fe2QbwQ8ztRyAt3kOKL
 XRmuofsS7fe9TLWB6uRCabA84UbGvQlnn9CwBaCqtaGcYHWojO942PPO6Rg0nRaM
 V2WjmcIexXiiIp80xPQTp/+onj+STE+K/R0QzDjvImZQyXvUxBX8SY6TTAvO3gZm
 EoVbdDQc+9KhmQnUmlSg4WVdD21NmlfM6goloHA3EJVOyjyrehIzjLVrVppu3dy4
 LEA6xl1Jy5xkufFdeF8jLugtkoPLYY0PM5cXJLgooakayujEru4=
 =4VeH
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmh/+DQACgkQmmx57+YA
 GNmgmg/+MEcHxmHS+Eh394bl8dqHlqSBKIG5rijCZduUKYJUcws68B0+IeW2Gswd
 s3Wk9y8O3lb8yACxDXdW9+Lt4AZEvUtM9ZFU2Wb09H0P83aqdNBWHWkwBrMuMlMH
 Bg7OGA5SLjJ3ke1RJQ00ba6dMKhfhxAUkRFeySzqMq843hRGObIZFAp6BpADJf31
 7UjSz+yePlA5ZdzCeUssDyZvRRVQdUj1Hg2+nJE8g5MGZK04yoFz4hWPxXLb2PEw
 vcbQ4n7WZb3/MD2qdASAXk81vKYala8MHCdvBFALva5a1JjlY2h0JK/2jrcylx2W
 RgbBXThAiOSJ46KipO1qn1jSoyS8SQre8OKCiLRSdg73xoE5on8wRnLul4SbIGyo
 fzgC993YS2wCe3UUuhoa+Nm5dI630t0xdSFDeUEfAurDiNcLjsvOv0atHW572/fi
 ZPifQW0Rd69zPG/dXJxBFuXJjrcXW2XXJiDuXq/YTxFmMiWqHXu0XvxwH346gY9V
 P77MjSa2EJ1C8ZTTph5WOzkf2tO7gMKBL8shmHXz4DO/F81khKu6CIl275+JiEzn
 nDz4e9bcFAbvsnb39ItdA1vTdpP0SiQ05VRVrRER1gBl+1EvJ/QMIuQi8Izky8DB
 N3fiyuzxRhDaApXGRTWp/rrF6GEulzI7LEN9bCm6an/egYePQWQ=
 =oTmk
 -----END PGP SIGNATURE-----

Merge tag 'tegra-for-6.17-memory' of https://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into soc/drivers

memory: tegra: Updates for v6.17-rc1

Enable support for the memory and external memory controllers found on
Tegra264.

* tag 'tegra-for-6.17-memory' of https://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
  memory: tegra: Add Tegra264 MC and EMC support
  dt-bindings: memory: tegra: Add Tegra264 support

Link: https://lore.kernel.org/r/20250711220943.2389322-4-thierry.reding@gmail.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann 2025-07-22 22:44:35 +02:00
commit 62bd59ca1c
9 changed files with 613 additions and 8 deletions

View File

@ -32,6 +32,7 @@ properties:
- nvidia,tegra186-mc
- nvidia,tegra194-mc
- nvidia,tegra234-mc
- nvidia,tegra264-mc
reg:
minItems: 6
@ -42,8 +43,12 @@ properties:
maxItems: 18
interrupts:
items:
- description: MC general interrupt
minItems: 1
maxItems: 8
interrupt-names:
minItems: 1
maxItems: 8
"#address-cells":
const: 2
@ -74,6 +79,7 @@ patternProperties:
- nvidia,tegra186-emc
- nvidia,tegra194-emc
- nvidia,tegra234-emc
- nvidia,tegra264-emc
reg:
minItems: 1
@ -127,6 +133,15 @@ patternProperties:
reg:
minItems: 2
- if:
properties:
compatible:
const: nvidia,tegra264-emc
then:
properties:
reg:
minItems: 2
additionalProperties: false
required:
@ -158,6 +173,12 @@ allOf:
- const: ch2
- const: ch3
interrupts:
items:
- description: MC general interrupt
interrupt-names: false
- if:
properties:
compatible:
@ -189,6 +210,12 @@ allOf:
- const: ch14
- const: ch15
interrupts:
items:
- description: MC general interrupt
interrupt-names: false
- if:
properties:
compatible:
@ -220,6 +247,59 @@ allOf:
- const: ch14
- const: ch15
interrupts:
items:
- description: MC general interrupt
interrupt-names: false
- if:
properties:
compatible:
const: nvidia,tegra264-mc
then:
properties:
reg:
minItems: 17
maxItems: 17
description: 17 memory controller channels
reg-names:
items:
- const: broadcast
- const: ch0
- const: ch1
- const: ch2
- const: ch3
- const: ch4
- const: ch5
- const: ch6
- const: ch7
- const: ch8
- const: ch9
- const: ch10
- const: ch11
- const: ch12
- const: ch13
- const: ch14
- const: ch15
interrupts:
minItems: 8
maxItems: 8
description: One interrupt line for each MC component
interrupt-names:
items:
- const: mcf
- const: hub1
- const: hub2
- const: hub3
- const: hub4
- const: hub5
- const: sbs
- const: channel
additionalProperties: false
required:

View File

@ -10,6 +10,7 @@ tegra-mc-$(CONFIG_ARCH_TEGRA_210_SOC) += tegra210.o
tegra-mc-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186.o
tegra-mc-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186.o tegra194.o
tegra-mc-$(CONFIG_ARCH_TEGRA_234_SOC) += tegra186.o tegra234.o
tegra-mc-$(CONFIG_ARCH_TEGRA_264_SOC) += tegra186.o tegra264.o
obj-$(CONFIG_TEGRA_MC) += tegra-mc.o
@ -21,5 +22,6 @@ obj-$(CONFIG_TEGRA210_EMC) += tegra210-emc.o
obj-$(CONFIG_ARCH_TEGRA_186_SOC) += tegra186-emc.o
obj-$(CONFIG_ARCH_TEGRA_194_SOC) += tegra186-emc.o
obj-$(CONFIG_ARCH_TEGRA_234_SOC) += tegra186-emc.o
obj-$(CONFIG_ARCH_TEGRA_264_SOC) += tegra186-emc.o
tegra210-emc-y := tegra210-emc-core.o tegra210-emc-cc-r21021.o

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
* Copyright (C) 2014-2025 NVIDIA CORPORATION. All rights reserved.
*/
#include <linux/clk.h>
@ -48,6 +48,9 @@ static const struct of_device_id tegra_mc_of_match[] = {
#endif
#ifdef CONFIG_ARCH_TEGRA_234_SOC
{ .compatible = "nvidia,tegra234-mc", .data = &tegra234_mc_soc },
#endif
#ifdef CONFIG_ARCH_TEGRA_264_SOC
{ .compatible = "nvidia,tegra264-mc", .data = &tegra264_mc_soc },
#endif
{ /* sentinel */ }
};

View File

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2014 NVIDIA CORPORATION. All rights reserved.
* Copyright (C) 2014-2025 NVIDIA CORPORATION. All rights reserved.
*/
#ifndef MEMORY_TEGRA_MC_H
@ -182,6 +182,10 @@ extern const struct tegra_mc_soc tegra194_mc_soc;
extern const struct tegra_mc_soc tegra234_mc_soc;
#endif
#ifdef CONFIG_ARCH_TEGRA_264_SOC
extern const struct tegra_mc_soc tegra264_mc_soc;
#endif
#if defined(CONFIG_ARCH_TEGRA_3x_SOC) || \
defined(CONFIG_ARCH_TEGRA_114_SOC) || \
defined(CONFIG_ARCH_TEGRA_124_SOC) || \
@ -193,7 +197,8 @@ extern const struct tegra_mc_ops tegra30_mc_ops;
#if defined(CONFIG_ARCH_TEGRA_186_SOC) || \
defined(CONFIG_ARCH_TEGRA_194_SOC) || \
defined(CONFIG_ARCH_TEGRA_234_SOC)
defined(CONFIG_ARCH_TEGRA_234_SOC) || \
defined(CONFIG_ARCH_TEGRA_264_SOC)
extern const struct tegra_mc_ops tegra186_mc_ops;
#endif

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2019 NVIDIA CORPORATION. All rights reserved.
* Copyright (C) 2019-2025 NVIDIA CORPORATION. All rights reserved.
*/
#include <linux/clk.h>
@ -393,6 +393,9 @@ static const struct of_device_id tegra186_emc_of_match[] = {
#endif
#if defined(CONFIG_ARCH_TEGRA_234_SOC)
{ .compatible = "nvidia,tegra234-emc" },
#endif
#if defined(CONFIG_ARCH_TEGRA_264_SOC)
{ .compatible = "nvidia,tegra264-emc" },
#endif
{ /* sentinel */ }
};

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2017-2021 NVIDIA CORPORATION. All rights reserved.
* Copyright (C) 2017-2025 NVIDIA CORPORATION. All rights reserved.
*/
#include <linux/io.h>
@ -26,11 +26,24 @@
static int tegra186_mc_probe(struct tegra_mc *mc)
{
struct platform_device *pdev = to_platform_device(mc->dev);
struct resource *res;
unsigned int i;
char name[8];
int err;
mc->bcast_ch_regs = devm_platform_ioremap_resource_byname(pdev, "broadcast");
/*
* From Tegra264, the SID region is not present in MC node and BROADCAST is first.
* The common function 'tegra_mc_probe()' already maps first region entry from DT.
* Check if the SID region is present in DT then map BROADCAST. Otherwise, consider
* the first entry mapped in mc probe as the BROADCAST region. This is done to avoid
* mapping the region twice when SID is not present and keep backward compatibility.
*/
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sid");
if (res)
mc->bcast_ch_regs = devm_platform_ioremap_resource_byname(pdev, "broadcast");
else
mc->bcast_ch_regs = mc->regs;
if (IS_ERR(mc->bcast_ch_regs)) {
if (PTR_ERR(mc->bcast_ch_regs) == -EINVAL) {
dev_warn(&pdev->dev,

View File

@ -0,0 +1,50 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2025 NVIDIA CORPORATION. All rights reserved. */
#ifndef MEMORY_TEGRA_TEGRA264_BWMGR_H
#define MEMORY_TEGRA_TEGRA264_BWMGR_H
#define TEGRA264_BWMGR_ICC_PRIMARY 1
#define TEGRA264_BWMGR_DEBUG 2
#define TEGRA264_BWMGR_CPU_CLUSTER0 3
#define TEGRA264_BWMGR_CPU_CLUSTER1 4
#define TEGRA264_BWMGR_CPU_CLUSTER2 5
#define TEGRA264_BWMGR_CPU_CLUSTER3 6
#define TEGRA264_BWMGR_CPU_CLUSTER4 7
#define TEGRA264_BWMGR_CPU_CLUSTER5 8
#define TEGRA264_BWMGR_CPU_CLUSTER6 9
#define TEGRA264_BWMGR_CACTMON 10
#define TEGRA264_BWMGR_DISPLAY 11
#define TEGRA264_BWMGR_VI 12
#define TEGRA264_BWMGR_APE 13
#define TEGRA264_BWMGR_VIFAL 14
#define TEGRA264_BWMGR_GPU 15
#define TEGRA264_BWMGR_EQOS 16
#define TEGRA264_BWMGR_PCIE_0 17
#define TEGRA264_BWMGR_PCIE_1 18
#define TEGRA264_BWMGR_PCIE_2 19
#define TEGRA264_BWMGR_PCIE_3 20
#define TEGRA264_BWMGR_PCIE_4 21
#define TEGRA264_BWMGR_PCIE_5 22
#define TEGRA264_BWMGR_SDMMC_1 23
#define TEGRA264_BWMGR_SDMMC_2 24
#define TEGRA264_BWMGR_NVDEC 25
#define TEGRA264_BWMGR_NVENC 26
#define TEGRA264_BWMGR_NVJPG_0 27
#define TEGRA264_BWMGR_NVJPG_1 28
#define TEGRA264_BWMGR_OFAA 29
#define TEGRA264_BWMGR_XUSB_HOST 30
#define TEGRA264_BWMGR_XUSB_DEV 31
#define TEGRA264_BWMGR_TSEC 32
#define TEGRA264_BWMGR_VIC 33
#define TEGRA264_BWMGR_APEDMA 34
#define TEGRA264_BWMGR_SE 35
#define TEGRA264_BWMGR_ISP 36
#define TEGRA264_BWMGR_HDA 37
#define TEGRA264_BWMGR_VI2FAL 38
#define TEGRA264_BWMGR_VI2 39
#define TEGRA264_BWMGR_RCE 40
#define TEGRA264_BWMGR_PVA 41
#define TEGRA264_BWMGR_NVPMODEL 42
#endif

View File

@ -0,0 +1,313 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2025, NVIDIA CORPORATION. All rights reserved.
*/
#include <dt-bindings/memory/nvidia,tegra264.h>
#include <linux/interconnect.h>
#include <linux/of_device.h>
#include <linux/tegra-icc.h>
#include <soc/tegra/bpmp.h>
#include <soc/tegra/mc.h>
#include "mc.h"
#include "tegra264-bwmgr.h"
/*
* MC Client entries are sorted in the increasing order of the
* override and security register offsets.
*/
static const struct tegra_mc_client tegra264_mc_clients[] = {
{
.id = TEGRA264_MEMORY_CLIENT_HDAR,
.name = "hdar",
.bpmp_id = TEGRA264_BWMGR_HDA,
.type = TEGRA_ICC_ISO_AUDIO,
}, {
.id = TEGRA264_MEMORY_CLIENT_HDAW,
.name = "hdaw",
.bpmp_id = TEGRA264_BWMGR_HDA,
.type = TEGRA_ICC_ISO_AUDIO,
}, {
.id = TEGRA264_MEMORY_CLIENT_MGBE0R,
.name = "mgbe0r",
.bpmp_id = TEGRA264_BWMGR_EQOS,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_MGBE0W,
.name = "mgbe0w",
.bpmp_id = TEGRA264_BWMGR_EQOS,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_MGBE1R,
.name = "mgbe1r",
.bpmp_id = TEGRA264_BWMGR_EQOS,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_MGBE1W,
.name = "mgbe1w",
.bpmp_id = TEGRA264_BWMGR_EQOS,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_SDMMC0R,
.name = "sdmmc0r",
.bpmp_id = TEGRA264_BWMGR_SDMMC_1,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_SDMMC0W,
.name = "sdmmc0w",
.bpmp_id = TEGRA264_BWMGR_SDMMC_1,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_VICR,
.name = "vicr",
.bpmp_id = TEGRA264_BWMGR_VIC,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_VICW,
.name = "vicw",
.bpmp_id = TEGRA264_BWMGR_VIC,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_APER,
.name = "aper",
.bpmp_id = TEGRA264_BWMGR_APE,
.type = TEGRA_ICC_ISO_AUDIO,
}, {
.id = TEGRA264_MEMORY_CLIENT_APEW,
.name = "apew",
.bpmp_id = TEGRA264_BWMGR_APE,
.type = TEGRA_ICC_ISO_AUDIO,
}, {
.id = TEGRA264_MEMORY_CLIENT_APEDMAR,
.name = "apedmar",
.bpmp_id = TEGRA264_BWMGR_APEDMA,
.type = TEGRA_ICC_ISO_AUDIO,
}, {
.id = TEGRA264_MEMORY_CLIENT_APEDMAW,
.name = "apedmaw",
.bpmp_id = TEGRA264_BWMGR_APEDMA,
.type = TEGRA_ICC_ISO_AUDIO,
}, {
.id = TEGRA264_MEMORY_CLIENT_VIFALCONR,
.name = "vifalconr",
.bpmp_id = TEGRA264_BWMGR_VIFAL,
.type = TEGRA_ICC_ISO_VIFAL,
}, {
.id = TEGRA264_MEMORY_CLIENT_VIFALCONW,
.name = "vifalconw",
.bpmp_id = TEGRA264_BWMGR_VIFAL,
.type = TEGRA_ICC_ISO_VIFAL,
}, {
.id = TEGRA264_MEMORY_CLIENT_RCER,
.name = "rcer",
.bpmp_id = TEGRA264_BWMGR_RCE,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_RCEW,
.name = "rcew",
.bpmp_id = TEGRA264_BWMGR_RCE,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE0W,
.name = "pcie0w",
.bpmp_id = TEGRA264_BWMGR_PCIE_0,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE1R,
.name = "pcie1r",
.bpmp_id = TEGRA264_BWMGR_PCIE_1,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE1W,
.name = "pcie1w",
.bpmp_id = TEGRA264_BWMGR_PCIE_1,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE2AR,
.name = "pcie2ar",
.bpmp_id = TEGRA264_BWMGR_PCIE_2,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE2AW,
.name = "pcie2aw",
.bpmp_id = TEGRA264_BWMGR_PCIE_2,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE3R,
.name = "pcie3r",
.bpmp_id = TEGRA264_BWMGR_PCIE_3,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE3W,
.name = "pcie3w",
.bpmp_id = TEGRA264_BWMGR_PCIE_3,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE4R,
.name = "pcie4r",
.bpmp_id = TEGRA264_BWMGR_PCIE_4,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE4W,
.name = "pcie4w",
.bpmp_id = TEGRA264_BWMGR_PCIE_4,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE5R,
.name = "pcie5r",
.bpmp_id = TEGRA264_BWMGR_PCIE_5,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_PCIE5W,
.name = "pcie5w",
.bpmp_id = TEGRA264_BWMGR_PCIE_5,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_GPUR02MC,
.name = "gpur02mc",
.bpmp_id = TEGRA264_BWMGR_GPU,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_GPUW02MC,
.name = "gpuw02mc",
.bpmp_id = TEGRA264_BWMGR_GPU,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_NVDECSRD2MC,
.name = "nvdecsrd2mc",
.bpmp_id = TEGRA264_BWMGR_NVDEC,
.type = TEGRA_ICC_NISO,
}, {
.id = TEGRA264_MEMORY_CLIENT_NVDECSWR2MC,
.name = "nvdecswr2mc",
.bpmp_id = TEGRA264_BWMGR_NVDEC,
.type = TEGRA_ICC_NISO,
},
};
/*
* tegra264_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 tegra264_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);
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 tegra264_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;
*agg_avg += avg_bw;
*agg_peak = max(*agg_peak, peak_bw);
return 0;
}
static int tegra264_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 tegra264_mc_icc_ops = {
.xlate = tegra_mc_icc_xlate,
.aggregate = tegra264_mc_icc_aggregate,
.get_bw = tegra264_mc_icc_get_init_bw,
.set = tegra264_mc_icc_set,
};
const struct tegra_mc_soc tegra264_mc_soc = {
.num_clients = ARRAY_SIZE(tegra264_mc_clients),
.clients = tegra264_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 = &tegra264_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,
};

View File

@ -0,0 +1,136 @@
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
/* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. */
#ifndef DT_BINDINGS_MEMORY_NVIDIA_TEGRA264_H
#define DT_BINDINGS_MEMORY_NVIDIA_TEGRA264_H
#define TEGRA264_SID(x) ((x) << 8)
/*
* SMMU stream IDs
*/
#define TEGRA264_SID_AON TEGRA264_SID(0x01)
#define TEGRA264_SID_APE TEGRA264_SID(0x02)
#define TEGRA264_SID_ETR TEGRA264_SID(0x03)
#define TEGRA264_SID_BPMP TEGRA264_SID(0x04)
#define TEGRA264_SID_DCE TEGRA264_SID(0x05)
#define TEGRA264_SID_EQOS TEGRA264_SID(0x06)
#define TEGRA264_SID_GPCDMA TEGRA264_SID(0x08)
#define TEGRA264_SID_DISP TEGRA264_SID(0x09)
#define TEGRA264_SID_HDA TEGRA264_SID(0x0a)
#define TEGRA264_SID_HOST1X TEGRA264_SID(0x0b)
#define TEGRA264_SID_ISP0 TEGRA264_SID(0x0c)
#define TEGRA264_SID_ISP1 TEGRA264_SID(0x0d)
#define TEGRA264_SID_PMA0 TEGRA264_SID(0x0e)
#define TEGRA264_SID_FSI0 TEGRA264_SID(0x0f)
#define TEGRA264_SID_FSI1 TEGRA264_SID(0x10)
#define TEGRA264_SID_PVA TEGRA264_SID(0x11)
#define TEGRA264_SID_SDMMC0 TEGRA264_SID(0x12)
#define TEGRA264_SID_MGBE0 TEGRA264_SID(0x13)
#define TEGRA264_SID_MGBE1 TEGRA264_SID(0x14)
#define TEGRA264_SID_MGBE2 TEGRA264_SID(0x15)
#define TEGRA264_SID_MGBE3 TEGRA264_SID(0x16)
#define TEGRA264_SID_MSSSEQ TEGRA264_SID(0x17)
#define TEGRA264_SID_SE TEGRA264_SID(0x18)
#define TEGRA264_SID_SEU1 TEGRA264_SID(0x19)
#define TEGRA264_SID_SEU2 TEGRA264_SID(0x1a)
#define TEGRA264_SID_SEU3 TEGRA264_SID(0x1b)
#define TEGRA264_SID_PSC TEGRA264_SID(0x1c)
#define TEGRA264_SID_OESP TEGRA264_SID(0x23)
#define TEGRA264_SID_SB TEGRA264_SID(0x24)
#define TEGRA264_SID_XSPI0 TEGRA264_SID(0x25)
#define TEGRA264_SID_TSEC TEGRA264_SID(0x29)
#define TEGRA264_SID_UFS TEGRA264_SID(0x2a)
#define TEGRA264_SID_RCE TEGRA264_SID(0x2b)
#define TEGRA264_SID_RCE1 TEGRA264_SID(0x2c)
#define TEGRA264_SID_VI TEGRA264_SID(0x2e)
#define TEGRA264_SID_VI1 TEGRA264_SID(0x2f)
#define TEGRA264_SID_VIC TEGRA264_SID(0x30)
#define TEGRA264_SID_XUSB_DEV TEGRA264_SID(0x32)
#define TEGRA264_SID_XUSB_DEV1 TEGRA264_SID(0x33)
#define TEGRA264_SID_XUSB_DEV2 TEGRA264_SID(0x34)
#define TEGRA264_SID_XUSB_DEV3 TEGRA264_SID(0x35)
#define TEGRA264_SID_XUSB_DEV4 TEGRA264_SID(0x36)
#define TEGRA264_SID_XUSB_DEV5 TEGRA264_SID(0x37)
/*
* memory client IDs
*/
/* HOST1X read client */
#define TEGRA264_MEMORY_CLIENT_HOST1XR 0x16
/* VIC read client */
#define TEGRA264_MEMORY_CLIENT_VICR 0x6c
/* VIC Write client */
#define TEGRA264_MEMORY_CLIENT_VICW 0x6d
/* VI R5 Write client */
#define TEGRA264_MEMORY_CLIENT_VIW 0x72
#define TEGRA264_MEMORY_CLIENT_NVDECSRD2MC 0x78
#define TEGRA264_MEMORY_CLIENT_NVDECSWR2MC 0x79
/* Audio processor(APE) Read client */
#define TEGRA264_MEMORY_CLIENT_APER 0x7a
/* Audio processor(APE) Write client */
#define TEGRA264_MEMORY_CLIENT_APEW 0x7b
/* Audio DMA Read client */
#define TEGRA264_MEMORY_CLIENT_APEDMAR 0x9f
/* Audio DMA Write client */
#define TEGRA264_MEMORY_CLIENT_APEDMAW 0xa0
#define TEGRA264_MEMORY_CLIENT_GPUR02MC 0xb6
#define TEGRA264_MEMORY_CLIENT_GPUW02MC 0xb7
/* VI Falcon Read client */
#define TEGRA264_MEMORY_CLIENT_VIFALCONR 0xbc
/* VI Falcon Write client */
#define TEGRA264_MEMORY_CLIENT_VIFALCONW 0xbd
/* Read Client of RCE */
#define TEGRA264_MEMORY_CLIENT_RCER 0xd2
/* Write client of RCE */
#define TEGRA264_MEMORY_CLIENT_RCEW 0xd3
/* PCIE0/MSI Write clients */
#define TEGRA264_MEMORY_CLIENT_PCIE0W 0xd9
/* PCIE1/RPX4 Read clients */
#define TEGRA264_MEMORY_CLIENT_PCIE1R 0xda
/* PCIE1/RPX4 Write clients */
#define TEGRA264_MEMORY_CLIENT_PCIE1W 0xdb
/* PCIE2/DMX4 Read clients */
#define TEGRA264_MEMORY_CLIENT_PCIE2AR 0xdc
/* PCIE2/DMX4 Write clients */
#define TEGRA264_MEMORY_CLIENT_PCIE2AW 0xdd
/* PCIE3/RPX4 Read clients */
#define TEGRA264_MEMORY_CLIENT_PCIE3R 0xde
/* PCIE3/RPX4 Write clients */
#define TEGRA264_MEMORY_CLIENT_PCIE3W 0xdf
/* PCIE4/DMX8 Read clients */
#define TEGRA264_MEMORY_CLIENT_PCIE4R 0xe0
/* PCIE4/DMX8 Write clients */
#define TEGRA264_MEMORY_CLIENT_PCIE4W 0xe1
/* PCIE5/DMX4 Read clients */
#define TEGRA264_MEMORY_CLIENT_PCIE5R 0xe2
/* PCIE5/DMX4 Write clients */
#define TEGRA264_MEMORY_CLIENT_PCIE5W 0xe3
/* UFS Read client */
#define TEGRA264_MEMORY_CLIENT_UFSR 0x15c
/* UFS write client */
#define TEGRA264_MEMORY_CLIENT_UFSW 0x15d
/* HDA Read client */
#define TEGRA264_MEMORY_CLIENT_HDAR 0x17c
/* HDA Write client */
#define TEGRA264_MEMORY_CLIENT_HDAW 0x17d
/* Disp ISO Read Client */
#define TEGRA264_MEMORY_CLIENT_DISPR 0x182
/* MGBE0 Read mccif */
#define TEGRA264_MEMORY_CLIENT_MGBE0R 0x1a2
/* MGBE0 Write mccif */
#define TEGRA264_MEMORY_CLIENT_MGBE0W 0x1a3
/* MGBE1 Read mccif */
#define TEGRA264_MEMORY_CLIENT_MGBE1R 0x1a4
/* MGBE1 Write mccif */
#define TEGRA264_MEMORY_CLIENT_MGBE1W 0x1a5
/* VI1 R5 Write client */
#define TEGRA264_MEMORY_CLIENT_VI1W 0x1a6
/* SDMMC0 Read mccif */
#define TEGRA264_MEMORY_CLIENT_SDMMC0R 0x1c2
/* SDMMC0 Write mccif */
#define TEGRA264_MEMORY_CLIENT_SDMMC0W 0x1c3
#endif /* DT_BINDINGS_MEMORY_NVIDIA_TEGRA264_H */