|
|
@@ -763,6 +763,7 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain)
|
|
|
reg = (TTBCR2_ADDR_36 << TTBCR2_SEP_SHIFT);
|
|
|
break;
|
|
|
case 39:
|
|
|
+ case 40:
|
|
|
reg = (TTBCR2_ADDR_40 << TTBCR2_SEP_SHIFT);
|
|
|
break;
|
|
|
case 42:
|
|
|
@@ -784,6 +785,7 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain)
|
|
|
reg |= (TTBCR2_ADDR_36 << TTBCR2_PASIZE_SHIFT);
|
|
|
break;
|
|
|
case 39:
|
|
|
+ case 40:
|
|
|
reg |= (TTBCR2_ADDR_40 << TTBCR2_PASIZE_SHIFT);
|
|
|
break;
|
|
|
case 42:
|
|
|
@@ -1806,11 +1808,16 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
|
|
|
* Stage-1 output limited by stage-2 input size due to pgd
|
|
|
* allocation (PTRS_PER_PGD).
|
|
|
*/
|
|
|
+ if (smmu->features & ARM_SMMU_FEAT_TRANS_NESTED) {
|
|
|
#ifdef CONFIG_64BIT
|
|
|
- smmu->s1_output_size = min_t(unsigned long, VA_BITS, size);
|
|
|
+ smmu->s1_output_size = min_t(unsigned long, VA_BITS, size);
|
|
|
#else
|
|
|
- smmu->s1_output_size = min(32UL, size);
|
|
|
+ smmu->s1_output_size = min(32UL, size);
|
|
|
#endif
|
|
|
+ } else {
|
|
|
+ smmu->s1_output_size = min_t(unsigned long, PHYS_MASK_SHIFT,
|
|
|
+ size);
|
|
|
+ }
|
|
|
|
|
|
/* The stage-2 output mask is also applied for bypass */
|
|
|
size = arm_smmu_id_size_to_bits((id >> ID2_OAS_SHIFT) & ID2_OAS_MASK);
|