]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/tegra241-cmdqv: Set supports_cmd op in tegra241_vcmdq_hw_init()
authorNicolin Chen <nicolinc@nvidia.com>
Fri, 13 Mar 2026 00:36:34 +0000 (17:36 -0700)
committerWill Deacon <will@kernel.org>
Tue, 24 Mar 2026 14:04:34 +0000 (14:04 +0000)
vintf->hyp_own is finalized in tegra241_vintf_hw_init(). On the other hand,
tegra241_vcmdq_alloc_smmu_cmdq() is called via an init_structures callback,
which is earlier than tegra241_vintf_hw_init().

This results in the supports_cmd op always being set to the guest function,
although this doesn't break any functionality nor have some noticeable perf
impact since non-invalidation commands are not issued in the perf sensitive
context.

Fix this by moving supports_cmd to tegra241_vcmdq_hw_init().

After this change,
 - For a guest kernel, this will be a status quo
 - For a host kernel, non-invalidation commands will be issued to VCMDQ(s)

Fixes: a9d40285bdef ("iommu/tegra241-cmdqv: Limit CMDs for VCMDQs of a guest owned VINTF")
Reported-by: Eric Auger <eric.auger@redhat.com>
Reported-by: Shameer Kolothum <skolothumtho@nvidia.com>
Closes: https://lore.kernel.org/qemu-devel/CH3PR12MB754836BEE54E39B30C7210C0AB44A@CH3PR12MB7548.namprd12.prod.outlook.com/
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Tested-by: Shameer Kolothum <skolothumtho@nvidia.com>
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c

index 6fe5563eaf9eb2a680cc094152598ed8e4f6d1da..83f6e9f6c51d6b989c1f1b0d62941c74d3247201 100644 (file)
@@ -479,6 +479,10 @@ static int tegra241_vcmdq_hw_init(struct tegra241_vcmdq *vcmdq)
        /* Reset VCMDQ */
        tegra241_vcmdq_hw_deinit(vcmdq);
 
+       /* vintf->hyp_own is a HW state finalized in tegra241_vintf_hw_init() */
+       if (!vcmdq->vintf->hyp_own)
+               vcmdq->cmdq.supports_cmd = tegra241_guest_vcmdq_supports_cmd;
+
        /* Configure and enable VCMDQ */
        writeq_relaxed(vcmdq->cmdq.q.q_base, REG_VCMDQ_PAGE1(vcmdq, BASE));
 
@@ -639,9 +643,6 @@ static int tegra241_vcmdq_alloc_smmu_cmdq(struct tegra241_vcmdq *vcmdq)
        q->q_base = q->base_dma & VCMDQ_ADDR;
        q->q_base |= FIELD_PREP(VCMDQ_LOG2SIZE, q->llq.max_n_shift);
 
-       if (!vcmdq->vintf->hyp_own)
-               cmdq->supports_cmd = tegra241_guest_vcmdq_supports_cmd;
-
        return arm_smmu_cmdq_init(smmu, cmdq);
 }