summaryrefslogtreecommitdiffstats
path: root/drivers/memory
diff options
context:
space:
mode:
authorAshish Mhetre <amhetre@nvidia.com>2023-11-07 16:57:12 +0530
committerKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>2023-11-21 10:09:28 +0100
commitfe3b082a6eb8b1526ed7397c849d6b2a6baeb6a1 (patch)
treedd08b498edd1a3c74d750d73a44cdc07b7dae9af /drivers/memory
parentb85ea95d086471afb4ad062012a4d73cd328fa86 (diff)
downloadlinux-stable-fe3b082a6eb8b1526ed7397c849d6b2a6baeb6a1.tar.gz
linux-stable-fe3b082a6eb8b1526ed7397c849d6b2a6baeb6a1.tar.bz2
linux-stable-fe3b082a6eb8b1526ed7397c849d6b2a6baeb6a1.zip
memory: tegra: Add SID override programming for MC clients
For some devices the bootloader/firmware may set up the device in bypass. Memory clients like display needs kernel to program SID after resume because bootloader/firmware programs the SID of display device to bypass. In order to make sure that kernel IOMMU mappings for these devices work after resume, add SID override programming support for all memory clients on memory controller resume. This partially reverts 'commit ef86b2c2807f ("memory: tegra: Remove clients SID override programming")' Signed-off-by: Ashish Mhetre <amhetre@nvidia.com> Link: https://lore.kernel.org/r/20231107112713.21399-1-amhetre@nvidia.com Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Diffstat (limited to 'drivers/memory')
-rw-r--r--drivers/memory/tegra/tegra186.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/memory/tegra/tegra186.c b/drivers/memory/tegra/tegra186.c
index 533f85a4b2bd..8203f0db1350 100644
--- a/drivers/memory/tegra/tegra186.c
+++ b/drivers/memory/tegra/tegra186.c
@@ -136,9 +136,23 @@ static int tegra186_mc_probe_device(struct tegra_mc *mc, struct device *dev)
return 0;
}
+static int tegra186_mc_resume(struct tegra_mc *mc)
+{
+ unsigned int i;
+
+ for (i = 0; i < mc->soc->num_clients; i++) {
+ const struct tegra_mc_client *client = &mc->soc->clients[i];
+
+ tegra186_mc_client_sid_override(mc, client, client->sid);
+ }
+
+ return 0;
+}
+
const struct tegra_mc_ops tegra186_mc_ops = {
.probe = tegra186_mc_probe,
.remove = tegra186_mc_remove,
+ .resume = tegra186_mc_resume,
.probe_device = tegra186_mc_probe_device,
.handle_irq = tegra30_mc_handle_irq,
};