Skip to content

Commit 86c8d5c

Browse files
nicolincgregkh
authored andcommitted
iommu/tegra241-cmdqv: Set supports_cmd op in tegra241_vcmdq_hw_init()
[ Upstream commit 803e41f ] 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: a9d4028 ("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 3a8d944 commit 86c8d5c

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,10 @@ static int tegra241_vcmdq_hw_init(struct tegra241_vcmdq *vcmdq)
481481
/* Reset VCMDQ */
482482
tegra241_vcmdq_hw_deinit(vcmdq);
483483

484+
/* vintf->hyp_own is a HW state finalized in tegra241_vintf_hw_init() */
485+
if (!vcmdq->vintf->hyp_own)
486+
vcmdq->cmdq.supports_cmd = tegra241_guest_vcmdq_supports_cmd;
487+
484488
/* Configure and enable VCMDQ */
485489
writeq_relaxed(vcmdq->cmdq.q.q_base, REG_VCMDQ_PAGE1(vcmdq, BASE));
486490

@@ -641,9 +645,6 @@ static int tegra241_vcmdq_alloc_smmu_cmdq(struct tegra241_vcmdq *vcmdq)
641645
q->q_base = q->base_dma & VCMDQ_ADDR;
642646
q->q_base |= FIELD_PREP(VCMDQ_LOG2SIZE, q->llq.max_n_shift);
643647

644-
if (!vcmdq->vintf->hyp_own)
645-
cmdq->supports_cmd = tegra241_guest_vcmdq_supports_cmd;
646-
647648
return arm_smmu_cmdq_init(smmu, cmdq);
648649
}
649650

0 commit comments

Comments
 (0)