mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 09:13:55 +08:00
memory: tegra: Remove clients SID override programming
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: 393d66fd2c
("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>
This commit is contained in:
parent
827e0920db
commit
ef86b2c280
@ -22,32 +22,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)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(mc->dev);
|
||||
@ -85,8 +59,6 @@ populate:
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
tegra186_mc_program_sid(mc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -95,13 +67,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,
|
||||
@ -173,7 +138,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,
|
||||
.handle_irq = tegra30_mc_handle_irq,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user