|
@@ -1320,6 +1320,11 @@ static int arm_smmu_alloc_init_pmd(struct arm_smmu_device *smmu, pud_t *pud,
|
|
|
pmd = pmd_alloc_one(NULL, addr);
|
|
|
if (!pmd)
|
|
|
return -ENOMEM;
|
|
|
+
|
|
|
+ pud_populate(NULL, pud, pmd);
|
|
|
+ arm_smmu_flush_pgtable(smmu, pud, sizeof(*pud));
|
|
|
+
|
|
|
+ pmd += pmd_index(addr);
|
|
|
} else
|
|
|
#endif
|
|
|
pmd = pmd_offset(pud, addr);
|
|
@@ -1328,8 +1333,6 @@ static int arm_smmu_alloc_init_pmd(struct arm_smmu_device *smmu, pud_t *pud,
|
|
|
next = pmd_addr_end(addr, end);
|
|
|
ret = arm_smmu_alloc_init_pte(smmu, pmd, addr, end, pfn,
|
|
|
flags, stage);
|
|
|
- pud_populate(NULL, pud, pmd);
|
|
|
- arm_smmu_flush_pgtable(smmu, pud, sizeof(*pud));
|
|
|
phys += next - addr;
|
|
|
} while (pmd++, addr = next, addr < end);
|
|
|
|
|
@@ -1349,6 +1352,11 @@ static int arm_smmu_alloc_init_pud(struct arm_smmu_device *smmu, pgd_t *pgd,
|
|
|
pud = pud_alloc_one(NULL, addr);
|
|
|
if (!pud)
|
|
|
return -ENOMEM;
|
|
|
+
|
|
|
+ pgd_populate(NULL, pgd, pud);
|
|
|
+ arm_smmu_flush_pgtable(smmu, pgd, sizeof(*pgd));
|
|
|
+
|
|
|
+ pud += pud_index(addr);
|
|
|
} else
|
|
|
#endif
|
|
|
pud = pud_offset(pgd, addr);
|
|
@@ -1357,8 +1365,6 @@ static int arm_smmu_alloc_init_pud(struct arm_smmu_device *smmu, pgd_t *pgd,
|
|
|
next = pud_addr_end(addr, end);
|
|
|
ret = arm_smmu_alloc_init_pmd(smmu, pud, addr, next, phys,
|
|
|
flags, stage);
|
|
|
- pgd_populate(NULL, pud, pgd);
|
|
|
- arm_smmu_flush_pgtable(smmu, pgd, sizeof(*pgd));
|
|
|
phys += next - addr;
|
|
|
} while (pud++, addr = next, addr < end);
|
|
|
|