[PATCH v9 04/12] iommu/tegra241-cmdqv: Restore PROD and CONS after resume
Pranjal Shrivastava <[email protected]> Tue, 28 Jul 2026 21:09:20 +0000
| Newsgroups | dev.linux.lists.iommu,org.infradead.lists.linux-arm-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Ashish Mhetre <[email protected]> PROD and CONS indices for vcmdqs are getting set to 0 after resume. Because of this the vcmdq is not consuming commands after resume. Fix this by restoring PROD and CONS indices after resume from saved pointers. Reviewed-by: Nicolin Chen <[email protected]> Signed-off-by: Ashish Mhetre <[email protected]> Signed-off-by: Pranjal Shrivastava <[email protected]> --- drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c index f62e9bdabf8a..8ecd2052b6dd 100644 --- a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c +++ b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c @@ -553,6 +553,13 @@ static int tegra241_vcmdq_hw_init(struct tegra241_vcmdq *vcmdq) /* Configure and enable VCMDQ */ writeq_relaxed(vcmdq->cmdq.q.q_base, REG_VCMDQ_PAGE1(vcmdq, BASE)); + /* + * HW Registers reset to 0 when power-cycled. Restore them from their + * SW copies to prevent executing stale/ghost commands after resume. + */ + writel_relaxed(vcmdq->cmdq.q.llq.prod, REG_VCMDQ_PAGE0(vcmdq, PROD)); + writel_relaxed(vcmdq->cmdq.q.llq.cons, REG_VCMDQ_PAGE0(vcmdq, CONS)); + ret = vcmdq_write_config(vcmdq, VCMDQ_EN); if (ret) { dev_err(vcmdq->cmdqv->dev, -- 2.55.0.487.gaf234c4eb3-goog