| From af33a5aee3a208b4fbab1625fd1cdbbcaf6bd258 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 25 Nov 2022 09:37:52 +0530 |
| Subject: memory: tegra: Remove clients SID override programming |
| |
| From: Ashish Mhetre <amhetre@nvidia.com> |
| |
| [ Upstream commit ef86b2c2807f41c045e5534d8513a8b83f63bc39 ] |
| |
| On newer Tegra releases, early boot SID override programming and SID |
| override programming during resume is handled by bootloader. |
| In the function tegra186_mc_program_sid() which is getting removed, SID |
| override register of all clients is written without checking if secure |
| firmware has allowed write on it or not. If write is disabled by secure |
| firmware then it can lead to errors coming from secure firmware and hang |
| in kernel boot. |
| Also, SID override is programmed on-demand during probe_finalize() call |
| of IOMMU which is done in tegra186_mc_client_sid_override() in this same |
| file. This function does it correctly by checking if write is permitted |
| on SID override register. It also checks if SID override register is |
| already written with correct value and skips re-writing it in that case. |
| |
| Fixes: 393d66fd2cac ("memory: tegra: Implement SID override programming") |
| Signed-off-by: Ashish Mhetre <amhetre@nvidia.com> |
| Acked-by: Thierry Reding <treding@nvidia.com> |
| Link: https://lore.kernel.org/r/20221125040752.12627-1-amhetre@nvidia.com |
| Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/memory/tegra/tegra186.c | 36 --------------------------------- |
| 1 file changed, 36 deletions(-) |
| |
| diff --git a/drivers/memory/tegra/tegra186.c b/drivers/memory/tegra/tegra186.c |
| index 3d153881abc1..4bed0e54fd45 100644 |
| --- a/drivers/memory/tegra/tegra186.c |
| +++ b/drivers/memory/tegra/tegra186.c |
| @@ -20,32 +20,6 @@ |
| #define MC_SID_STREAMID_SECURITY_WRITE_ACCESS_DISABLED BIT(16) |
| #define MC_SID_STREAMID_SECURITY_OVERRIDE BIT(8) |
| |
| -static void tegra186_mc_program_sid(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]; |
| - u32 override, security; |
| - |
| - override = readl(mc->regs + client->regs.sid.override); |
| - security = readl(mc->regs + client->regs.sid.security); |
| - |
| - dev_dbg(mc->dev, "client %s: override: %x security: %x\n", |
| - client->name, override, security); |
| - |
| - dev_dbg(mc->dev, "setting SID %u for %s\n", client->sid, |
| - client->name); |
| - writel(client->sid, mc->regs + client->regs.sid.override); |
| - |
| - override = readl(mc->regs + client->regs.sid.override); |
| - security = readl(mc->regs + client->regs.sid.security); |
| - |
| - dev_dbg(mc->dev, "client %s: override: %x security: %x\n", |
| - client->name, override, security); |
| - } |
| -} |
| - |
| static int tegra186_mc_probe(struct tegra_mc *mc) |
| { |
| int err; |
| @@ -54,8 +28,6 @@ static int tegra186_mc_probe(struct tegra_mc *mc) |
| if (err < 0) |
| return err; |
| |
| - tegra186_mc_program_sid(mc); |
| - |
| return 0; |
| } |
| |
| @@ -64,13 +36,6 @@ static void tegra186_mc_remove(struct tegra_mc *mc) |
| of_platform_depopulate(mc->dev); |
| } |
| |
| -static int tegra186_mc_resume(struct tegra_mc *mc) |
| -{ |
| - tegra186_mc_program_sid(mc); |
| - |
| - return 0; |
| -} |
| - |
| #if IS_ENABLED(CONFIG_IOMMU_API) |
| static void tegra186_mc_client_sid_override(struct tegra_mc *mc, |
| const struct tegra_mc_client *client, |
| @@ -142,7 +107,6 @@ static int tegra186_mc_probe_device(struct tegra_mc *mc, struct device *dev) |
| 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, |
| }; |
| |
| -- |
| 2.39.0 |
| |