Re: [PATCH V3 3/3] memory: tegra: Restore MC interrupt masks on resume

Jon Hunter
2026-04-30T11:42:13Z

On 30/04/2026 10:52, Ashish Mhetre wrote:
> The MC interrupt mask registers lose their state across SC7. Without

SC7 may not mean anything to anyone that is not familiar with Tegra. I
often refer to this as 'Tegra low power suspend state (aka. SC7)'. Or we
can just simply say 'suspend' instead of 'SC7'.

Krzysztof, do you want use to clarify this and update the commit message?

> re-applying them on resume, MC interrupts that were enabled at probe
> remain masked after wake, so any post-resume MC error goes unreported.
>
> Factor the existing intmask programming out of tegra_mc_probe() into
> tegra_mc_setup_intmask() and reuse it from the system resume callback
> so the mask state is restored on wake.
>
> Signed-off-by: Ashish Mhetre <amhetre@nvidia.com>
> ---
> drivers/memory/tegra/mc.c | 23 ++++++++++++++++-------
> 1 file changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c
> index 64e41338cdf2..cfcfc7291106 100644
> --- a/drivers/memory/tegra/mc.c
> +++ b/drivers/memory/tegra/mc.c
> @@ -911,6 +911,19 @@ static void tegra_mc_num_channel_enabled(struct tegra_mc *mc)
> }
> }
>
> +static void tegra_mc_setup_intmask(struct tegra_mc *mc)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < mc->soc->num_intmasks; i++) {
> + if (mc->soc->num_channels)
> + mc_ch_writel(mc, MC_BROADCAST_CHANNEL, mc->soc->intmasks[i].mask,
> + mc->soc->intmasks[i].reg);
> + else
> + mc_writel(mc, mc->soc->intmasks[i].mask, mc->soc->intmasks[i].reg);
> + }
> +}
> +
> static int tegra_mc_probe(struct platform_device *pdev)
> {
> struct tegra_mc *mc;
> @@ -971,13 +984,7 @@ static int tegra_mc_probe(struct platform_device *pdev)
> }
> }
>
> - for (i = 0; i < mc->soc->num_intmasks; i++) {
> - if (mc->soc->num_channels)
> - mc_ch_writel(mc, MC_BROADCAST_CHANNEL, mc->soc->intmasks[i].mask,
> - mc->soc->intmasks[i].reg);
> - else
> - mc_writel(mc, mc->soc->intmasks[i].mask, mc->soc->intmasks[i].reg);
> - }
> + tegra_mc_setup_intmask(mc);
> }
>
> if (mc->soc->reset_ops) {
> @@ -1018,6 +1025,8 @@ static int tegra_mc_resume(struct device *dev)
> if (mc->soc->ops && mc->soc->ops->resume)
> mc->soc->ops->resume(mc);
>
> + tegra_mc_setup_intmask(mc);
> +
> return 0;
> }
>

Otherwise this looks good to me.

Jon

--
nvpublic