iommu/arm-smmu-qcom: Skip the TTBR1 quirk for db820c.
authorEric Anholt <eric@anholt.net>
Fri, 26 Mar 2021 23:13:02 +0000 (16:13 -0700)
committerWill Deacon <will@kernel.org>
Tue, 8 Jun 2021 11:35:50 +0000 (12:35 +0100)
db820c wants to use the qcom smmu path to get HUPCF set (which keeps
the GPU from wedging and then sometimes wedging the kernel after a
page fault), but it doesn't have separate pagetables support yet in
drm/msm so we can't go all the way to the TTBR1 path.

Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20210326231303.3071950-1-eric@anholt.net
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

index 70870a9..6f70f0e 100644 (file)
@@ -131,6 +131,16 @@ static int qcom_adreno_smmu_alloc_context_bank(struct arm_smmu_domain *smmu_doma
        return __arm_smmu_alloc_bitmap(smmu->context_map, start, count);
 }
 
+static bool qcom_adreno_can_do_ttbr1(struct arm_smmu_device *smmu)
+{
+       const struct device_node *np = smmu->dev->of_node;
+
+       if (of_device_is_compatible(np, "qcom,msm8996-smmu-v2"))
+               return false;
+
+       return true;
+}
+
 static int qcom_adreno_smmu_init_context(struct arm_smmu_domain *smmu_domain,
                struct io_pgtable_cfg *pgtbl_cfg, struct device *dev)
 {
@@ -145,7 +155,8 @@ static int qcom_adreno_smmu_init_context(struct arm_smmu_domain *smmu_domain,
         * be AARCH64 stage 1 but double check because the arm-smmu code assumes
         * that is the case when the TTBR1 quirk is enabled
         */
-       if ((smmu_domain->stage == ARM_SMMU_DOMAIN_S1) &&
+       if (qcom_adreno_can_do_ttbr1(smmu_domain->smmu) &&
+           (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) &&
            (smmu_domain->cfg.fmt == ARM_SMMU_CTX_FMT_AARCH64))
                pgtbl_cfg->quirks |= IO_PGTABLE_QUIRK_ARM_TTBR1;