Re: [PATCH v11 12/16] iommu/tegra241-cmdqv: Add a helper to quiesce VCMDQs

From: Pranjal Shrivastava

Date: Wed Sep 30 2026 - 16:29:23 EST


On Wed, Sep 30, 2026 at 12:02:28PM -0700, Nicolin Chen wrote:
> On Tue, Sep 29, 2026 at 03:45:06AM +0000, Pranjal Shrivastava wrote:
> > The tegra241-cmdqv driver supports vCMDQs which need to be quiesced using
> > the STOP_FLAG. The current driver implementation only uses VINTF0 for
> > vCMDQs owned by the kernel which need to be stopped. Add a helper that
> > sets the CMDQ_PROD_STOP_FLAG on these vCMDQs.
> >
> > Consolidate this logic by renaming the implementation hook to
> > quiesce_and_drain_queues and ensuring that the tegra241-cmdqv driver
> > gates all active local virtual queues before starting the drain loop.
> > Additionally, clear the STOP_FLAG in tegra241_vcmdq_hw_init() as a part
> > of tegra241_cmdqv_hw_reset().
>
> This whole suspend routine is missing the CMDQV flags.
>
> vintf->enabled and vcmdq->enabled must be cleared when the system
> does suspend, via tegra241_vintf_hw_deinit(vintf0).
>
> So, instead of quiesce_and_drain_queues, perhaps we need a suspend
> callback that:
> - set stop flags to all lvcmdqs
> - wait for all lvcmdqs being drained
> - hw_deinit vintf0 and its lvcmdqs
>

Interesting. I had thought about that but Ashish was able to test a
previous series (which def didn't de-init vintf0 & lvcmdqs in it) so I
dropped that thought..

Looking at it again though, leaving the enabled flags stale is actually
worse than I thought.. on resume, the CFGI_ALL / TLBI_*_ALL issued by
arm_smmu_device_reset() go through get_secondary_cmdq(), which still
sees vintf0 & its lvcmdqs as enabled and hands back an lvcmdq with the
STOP_FLAG still set.. so those invalidations get silently elided until
impl->device_reset re-inits vintf0 (after SMMUEN=1). Thanks for catching
this!

I'm planning to add an impl->suspend op now.. that will cover this, and
also the late breaking IRQ changes you're referring to in the other
thread. Roughly:
- set STOP_FLAG on all lvcmdqs
- wait for owners & drain all lvcmdqs
- handle any pending CMDQV errors
- tegra241_vintf_hw_deinit(vintf0)

I'll call it from arm_smmu_runtime_suspend() before gating the main
CMDQ, so the CMD_SYNC in tegra241_vcmdq_hw_flush_timeout() still goes
through and any late cmd simply falls back to smmu->cmdq.

(Will drop the extra line removal as well).

Thanks,
Praan