|
@@ -56,6 +56,7 @@
|
|
|
#define IDR0_TTF_SHIFT 2
|
|
|
#define IDR0_TTF_MASK 0x3
|
|
|
#define IDR0_TTF_AARCH64 (2 << IDR0_TTF_SHIFT)
|
|
|
+#define IDR0_TTF_AARCH32_64 (3 << IDR0_TTF_SHIFT)
|
|
|
#define IDR0_S1P (1 << 1)
|
|
|
#define IDR0_S2P (1 << 0)
|
|
|
|
|
@@ -2460,7 +2461,13 @@ static int arm_smmu_device_probe(struct arm_smmu_device *smmu)
|
|
|
}
|
|
|
|
|
|
/* We only support the AArch64 table format at present */
|
|
|
- if ((reg & IDR0_TTF_MASK << IDR0_TTF_SHIFT) < IDR0_TTF_AARCH64) {
|
|
|
+ switch (reg & IDR0_TTF_MASK << IDR0_TTF_SHIFT) {
|
|
|
+ case IDR0_TTF_AARCH32_64:
|
|
|
+ smmu->ias = 40;
|
|
|
+ /* Fallthrough */
|
|
|
+ case IDR0_TTF_AARCH64:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
dev_err(smmu->dev, "AArch64 table format not supported!\n");
|
|
|
return -ENXIO;
|
|
|
}
|
|
@@ -2541,8 +2548,7 @@ static int arm_smmu_device_probe(struct arm_smmu_device *smmu)
|
|
|
dev_warn(smmu->dev,
|
|
|
"failed to set DMA mask for table walker\n");
|
|
|
|
|
|
- if (!smmu->ias)
|
|
|
- smmu->ias = smmu->oas;
|
|
|
+ smmu->ias = max(smmu->ias, smmu->oas);
|
|
|
|
|
|
dev_info(smmu->dev, "ias %lu-bit, oas %lu-bit (features 0x%08x)\n",
|
|
|
smmu->ias, smmu->oas, smmu->features);
|