memory: tegra: Add SID override programming for MC clients
Subsystems (2)
PATCH v2 1/2 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")'
---
Changes in v2:
- Fixed build issues reported by Kernel test robot from v1
drivers/memory/tegra/tegra186.c | 14 ++++++++++++++ include/soc/tegra/mc.h | 1 + 2 files changed, 15 insertions(+)
drivers/memory/tegra/tegra186.c +14 -0
@@ -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, };
include/soc/tegra/mc.h +1 -0
@@ -162,6 +162,7 @@ struct tegra_mc_ops {*/ int (*probe)(struct tegra_mc *mc);void (*remove)(struct tegra_mc *mc); +int (*resume)(struct tegra_mc *mc);irqreturn_t (*handle_irq)(int irq,void *data);int (*probe_device)(struct tegra_mc *mc,struct device *dev); };
Signature · 1 line
2.17.1
PATCH v2 2/2 memory: tegra: Skip SID programming if SID registers aren't set
There are few MC clients where SID security and override register offsets are not specified like "sw_cluster0" in tegra234. Don't program SID override for such clients because it leads to access to invalid addresses.
--- drivers/memory/tegra/tegra186.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/memory/tegra/tegra186.c +3 -0
@@ -75,6 +75,9 @@ static void tegra186_mc_client_sid_override(struct tegra_mc *mc, {u32 value, old; +if (client->regs.sid.security ==0 && client->regs.sid.override ==0 ) +return ; + value =readl (mc->regs + client->regs.sid.security);if ((value &MC_SID_STREAMID_SECURITY_OVERRIDE ) ==0 ) {/*
Signature · 1 line
2.17.1
Krzysztof Kozlowski
AppliedQuoted 8 lines · Ashish Mhetre
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.
[...]
Applied, thanks!
[1/2] memory: tegra: Add SID override programming for MC clients
https://git.kernel.org/krzk/linux-mem-ctrl/c/fe3b082a6eb8b1526ed7397c849d6b2a6baeb6a1 [2/2] memory: tegra: Skip SID programming if SID registers aren't set https://git.kernel.org/krzk/linux-mem-ctrl/c/0d6c918011ce4764ed277de4726a468b7ffe5fed
Best regards,
Signature · 1 line
Krzysztof Kozlowski <[email protected]>