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 ef86b2c280 ("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>
This commit is contained in:
Ashish Mhetre 2023-11-07 16:57:12 +05:30 committed by Krzysztof Kozlowski
parent b85ea95d08
commit fe3b082a6e
2 changed files with 15 additions and 0 deletions

View File

@ -136,9 +136,23 @@ static int tegra186_mc_probe_device(struct tegra_mc *mc, struct device *dev)
return 0; 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 = { const struct tegra_mc_ops tegra186_mc_ops = {
.probe = tegra186_mc_probe, .probe = tegra186_mc_probe,
.remove = tegra186_mc_remove, .remove = tegra186_mc_remove,
.resume = tegra186_mc_resume,
.probe_device = tegra186_mc_probe_device, .probe_device = tegra186_mc_probe_device,
.handle_irq = tegra30_mc_handle_irq, .handle_irq = tegra30_mc_handle_irq,
}; };

View File

@ -162,6 +162,7 @@ struct tegra_mc_ops {
*/ */
int (*probe)(struct tegra_mc *mc); int (*probe)(struct tegra_mc *mc);
void (*remove)(struct tegra_mc *mc); void (*remove)(struct tegra_mc *mc);
int (*resume)(struct tegra_mc *mc);
irqreturn_t (*handle_irq)(int irq, void *data); irqreturn_t (*handle_irq)(int irq, void *data);
int (*probe_device)(struct tegra_mc *mc, struct device *dev); int (*probe_device)(struct tegra_mc *mc, struct device *dev);
}; };