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

Pranjal Shrivastava praan at google.com
Wed Sep 30 12:57:12 PDT 2026


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



More information about the linux-arm-kernel mailing list