|
@@ -8,6 +8,31 @@
|
|
|
|
|
|
pgd_t *idmap_pgd;
|
|
|
|
|
|
+#ifdef CONFIG_ARM_LPAE
|
|
|
+static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end,
|
|
|
+ unsigned long prot)
|
|
|
+{
|
|
|
+ pmd_t *pmd;
|
|
|
+ unsigned long next;
|
|
|
+
|
|
|
+ if (pud_none_or_clear_bad(pud) || (pud_val(*pud) & L_PGD_SWAPPER)) {
|
|
|
+ pmd = pmd_alloc_one(&init_mm, addr);
|
|
|
+ if (!pmd) {
|
|
|
+ pr_warning("Failed to allocate identity pmd.\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ pud_populate(&init_mm, pud, pmd);
|
|
|
+ pmd += pmd_index(addr);
|
|
|
+ } else
|
|
|
+ pmd = pmd_offset(pud, addr);
|
|
|
+
|
|
|
+ do {
|
|
|
+ next = pmd_addr_end(addr, end);
|
|
|
+ *pmd = __pmd((addr & PMD_MASK) | prot);
|
|
|
+ flush_pmd_entry(pmd);
|
|
|
+ } while (pmd++, addr = next, addr != end);
|
|
|
+}
|
|
|
+#else /* !CONFIG_ARM_LPAE */
|
|
|
static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end,
|
|
|
unsigned long prot)
|
|
|
{
|
|
@@ -19,6 +44,7 @@ static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end,
|
|
|
pmd[1] = __pmd(addr);
|
|
|
flush_pmd_entry(pmd);
|
|
|
}
|
|
|
+#endif /* CONFIG_ARM_LPAE */
|
|
|
|
|
|
static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end,
|
|
|
unsigned long prot)
|
|
@@ -36,7 +62,7 @@ static void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long e
|
|
|
{
|
|
|
unsigned long prot, next;
|
|
|
|
|
|
- prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE;
|
|
|
+ prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF;
|
|
|
if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale())
|
|
|
prot |= PMD_BIT4;
|
|
|
|