iommu/arm-smmu: fix calculation of TCR.T0SZ
authorWill Deacon <will.deacon@arm.com>
Tue, 24 Jun 2014 17:26:26 +0000 (18:26 +0100)
committerWill Deacon <will.deacon@arm.com>
Wed, 2 Jul 2014 10:55:49 +0000 (11:55 +0100)
T0SZ controls the input address range for TTBR0, so use the input
address range rather than the output address range for the calculation.
For stage-2, this means using the output size of stage-1.

Signed-off-by: Will Deacon <will.deacon@arm.com>
drivers/iommu/arm-smmu.c

index 1599354..81e8ec2 100644 (file)
@@ -800,6 +800,8 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain)
                        reg = TTBCR_TG0_64K;
 
                if (!stage1) {
+                       reg |= (64 - smmu->s1_output_size) << TTBCR_T0SZ_SHIFT;
+
                        switch (smmu->s2_output_size) {
                        case 32:
                                reg |= (TTBCR2_ADDR_32 << TTBCR_PASIZE_SHIFT);
@@ -821,7 +823,7 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain)
                                break;
                        }
                } else {
-                       reg |= (64 - smmu->s1_output_size) << TTBCR_T0SZ_SHIFT;
+                       reg |= (64 - smmu->input_size) << TTBCR_T0SZ_SHIFT;
                }
        } else {
                reg = 0;