rk: revert to v3.10
[firefly-linux-kernel-4.4.55.git] / arch / arm / mm / mmu.c
index a4e5cd5c30676446dedd0f8f338206c225086ae9..4d409e6a552df67f11ea8bb81b1930e830c3dcde 100644 (file)
@@ -458,16 +458,6 @@ static void __init build_mem_type_table(void)
        s2_pgprot = cp->pte_s2;
        hyp_device_pgprot = s2_device_pgprot = mem_types[MT_DEVICE].prot_pte;
 
-       /*
-        * We don't use domains on ARMv6 (since this causes problems with
-        * v6/v7 kernels), so we must use a separate memory type for user
-        * r/o, kernel r/w to map the vectors page.
-        */
-#ifndef CONFIG_ARM_LPAE
-       if (cpu_arch == CPU_ARCH_ARMv6)
-               vecs_pgprot |= L_PTE_MT_VECTORS;
-#endif
-
        /*
         * ARMv6 and above have extended page tables.
         */
@@ -605,25 +595,11 @@ static void __init *early_alloc(unsigned long sz)
        return early_alloc_aligned(sz, sz);
 }
 
-static pte_t * __init early_pte_alloc(pmd_t *pmd)
-{
-       if (pmd_none(*pmd) || pmd_bad(*pmd))
-               return early_alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE);
-       return pmd_page_vaddr(*pmd);
-}
-
-static void __init early_pte_install(pmd_t *pmd, pte_t *pte, unsigned long prot)
-{
-       __pmd_populate(pmd, __pa(pte), prot);
-       BUG_ON(pmd_bad(*pmd));
-}
-
-static pte_t * __init early_pte_alloc_and_install(pmd_t *pmd,
-       unsigned long addr, unsigned long prot)
+static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot)
 {
        if (pmd_none(*pmd)) {
-               pte_t *pte = early_pte_alloc(pmd);
-               early_pte_install(pmd, pte, prot);
+               pte_t *pte = early_alloc(PTE_HWTABLE_OFF + PTE_HWTABLE_SIZE);
+               __pmd_populate(pmd, __pa(pte), prot);
        }
        BUG_ON(pmd_bad(*pmd));
        return pte_offset_kernel(pmd, addr);
@@ -633,17 +609,11 @@ static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr,
                                  unsigned long end, unsigned long pfn,
                                  const struct mem_type *type)
 {
-       pte_t *start_pte = early_pte_alloc(pmd);
-       pte_t *pte = start_pte + pte_index(addr);
-
-       /* If replacing a section mapping, the whole section must be replaced */
-       BUG_ON(!pmd_none(*pmd) && pmd_bad(*pmd) && ((addr | end) & ~PMD_MASK));
-
+       pte_t *pte = early_pte_alloc(pmd, addr, type->prot_l1);
        do {
                set_pte_ext(pte, pfn_pte(pfn, __pgprot(type->prot_pte)), 0);
                pfn++;
        } while (pte++, addr += PAGE_SIZE, addr != end);
-       early_pte_install(pmd, start_pte, type->prot_l1);
 }
 
 static void __init __map_init_section(pmd_t *pmd, unsigned long addr,
@@ -675,8 +645,7 @@ static void __init __map_init_section(pmd_t *pmd, unsigned long addr,
 
 static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
                                      unsigned long end, phys_addr_t phys,
-                                     const struct mem_type *type,
-                                     bool force_pages)
+                                     const struct mem_type *type)
 {
        pmd_t *pmd = pmd_offset(pud, addr);
        unsigned long next;
@@ -693,8 +662,7 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
                 * aligned to a section boundary.
                 */
                if (type->prot_sect &&
-                               ((addr | next | phys) & ~SECTION_MASK) == 0 &&
-                               !force_pages) {
+                               ((addr | next | phys) & ~SECTION_MASK) == 0) {
                        __map_init_section(pmd, addr, next, phys, type);
                } else {
                        alloc_init_pte(pmd, addr, next,
@@ -707,16 +675,14 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
 }
 
 static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
-                                 unsigned long end, phys_addr_t phys,
-                                 const struct mem_type *type,
-                                 bool force_pages)
+       unsigned long end, unsigned long phys, const struct mem_type *type)
 {
        pud_t *pud = pud_offset(pgd, addr);
        unsigned long next;
 
        do {
                next = pud_addr_end(addr, end);
-               alloc_init_pmd(pud, addr, next, phys, type, force_pages);
+               alloc_init_pmd(pud, addr, next, phys, type);
                phys += next - addr;
        } while (pud++, addr = next, addr != end);
 }
@@ -790,7 +756,7 @@ static void __init create_36bit_mapping(struct map_desc *md,
  * offsets, and we take full advantage of sections and
  * supersections.
  */
-static void __init create_mapping(struct map_desc *md, bool force_pages)
+static void __init create_mapping(struct map_desc *md)
 {
        unsigned long addr, length, end;
        phys_addr_t phys;
@@ -840,7 +806,7 @@ static void __init create_mapping(struct map_desc *md, bool force_pages)
        do {
                unsigned long next = pgd_addr_end(addr, end);
 
-               alloc_init_pud(pgd, addr, next, phys, type, force_pages);
+               alloc_init_pud(pgd, addr, next, phys, type);
 
                phys += next - addr;
                addr = next;
@@ -862,7 +828,7 @@ void __init iotable_init(struct map_desc *io_desc, int nr)
        svm = early_alloc_aligned(sizeof(*svm) * nr, __alignof__(*svm));
 
        for (md = io_desc; nr; md++, nr--) {
-               create_mapping(md, false);
+               create_mapping(md);
 
                vm = &svm->vm;
                vm->addr = (void *)(md->virtual & PAGE_MASK);
@@ -983,7 +949,7 @@ void __init debug_ll_io_init(void)
        map.virtual &= PAGE_MASK;
        map.length = PAGE_SIZE;
        map.type = MT_DEVICE;
-       create_mapping(&map, false);
+       create_mapping(&map);
 }
 #endif
 
@@ -1028,28 +994,6 @@ void __init sanity_check_meminfo(void)
                struct membank *bank = &meminfo.bank[j];
                *bank = meminfo.bank[i];
 
-#ifdef CONFIG_SPARSEMEM
-               if (pfn_to_section_nr(bank_pfn_start(bank)) !=
-                   pfn_to_section_nr(bank_pfn_end(bank) - 1)) {
-                       phys_addr_t sz;
-                       unsigned long start_pfn = bank_pfn_start(bank);
-                       unsigned long end_pfn = SECTION_ALIGN_UP(start_pfn + 1);
-                       sz = ((phys_addr_t)(end_pfn - start_pfn) << PAGE_SHIFT);
-
-                       if (meminfo.nr_banks >= NR_BANKS) {
-                               pr_crit("NR_BANKS too low, ignoring %lld bytes of memory\n",
-                                       (unsigned long long)(bank->size - sz));
-                       } else {
-                               memmove(bank + 1, bank,
-                                       (meminfo.nr_banks - i) * sizeof(*bank));
-                               meminfo.nr_banks++;
-                               bank[1].size -= sz;
-                               bank[1].start = __pfn_to_phys(end_pfn);
-                       }
-                       bank->size = sz;
-               }
-#endif
-
                if (bank->start > ULONG_MAX)
                        highmem = 1;
 
@@ -1231,7 +1175,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
        /*
         * Allocate the vector page early.
         */
-       vectors = early_alloc(PAGE_SIZE * 2);
+       vectors = early_alloc(PAGE_SIZE);
 
        early_trap_init(vectors);
 
@@ -1247,7 +1191,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
        map.virtual = MODULES_VADDR;
        map.length = ((unsigned long)_etext - map.virtual + ~SECTION_MASK) & SECTION_MASK;
        map.type = MT_ROM;
-       create_mapping(&map, false);
+       create_mapping(&map);
 #endif
 
        /*
@@ -1258,14 +1202,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
        map.virtual = FLUSH_BASE;
        map.length = SZ_1M;
        map.type = MT_CACHECLEAN;
-       create_mapping(&map, false);
+       create_mapping(&map);
 #endif
 #ifdef FLUSH_BASE_MINICACHE
        map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + SZ_1M);
        map.virtual = FLUSH_BASE_MINICACHE;
        map.length = SZ_1M;
        map.type = MT_MINICLEAN;
-       create_mapping(&map, false);
+       create_mapping(&map);
 #endif
 
        /*
@@ -1276,27 +1220,15 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
        map.pfn = __phys_to_pfn(virt_to_phys(vectors));
        map.virtual = 0xffff0000;
        map.length = PAGE_SIZE;
-#ifdef CONFIG_KUSER_HELPERS
        map.type = MT_HIGH_VECTORS;
-#else
-       map.type = MT_LOW_VECTORS;
-#endif
-       create_mapping(&map, false);
+       create_mapping(&map);
 
        if (!vectors_high()) {
                map.virtual = 0;
-               map.length = PAGE_SIZE * 2;
                map.type = MT_LOW_VECTORS;
-               create_mapping(&map, false);
+               create_mapping(&map);
        }
 
-       /* Now create a kernel read-only mapping */
-       map.pfn += 1;
-       map.virtual = 0xffff0000 + PAGE_SIZE;
-       map.length = PAGE_SIZE;
-       map.type = MT_LOW_VECTORS;
-       create_mapping(&map, false);
-
        /*
         * Ask the machine support to map in the statically mapped devices.
         */
@@ -1320,23 +1252,20 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
 static void __init kmap_init(void)
 {
 #ifdef CONFIG_HIGHMEM
-       pkmap_page_table = early_pte_alloc_and_install(pmd_off_k(PKMAP_BASE),
+       pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE),
                PKMAP_BASE, _PAGE_KERNEL_TABLE);
 #endif
 }
 
-
 static void __init map_lowmem(void)
 {
        struct memblock_region *reg;
-       phys_addr_t start;
-       phys_addr_t end;
-       struct map_desc map;
 
        /* Map all the lowmem memory banks. */
        for_each_memblock(memory, reg) {
-               start = reg->base;
-               end = start + reg->size;
+               phys_addr_t start = reg->base;
+               phys_addr_t end = start + reg->size;
+               struct map_desc map;
 
                if (end > arm_lowmem_limit)
                        end = arm_lowmem_limit;
@@ -1348,20 +1277,8 @@ static void __init map_lowmem(void)
                map.length = end - start;
                map.type = MT_MEMORY;
 
-               create_mapping(&map, false);
+               create_mapping(&map);
        }
-
-#ifdef CONFIG_DEBUG_RODATA
-       start = __pa(_stext) & PMD_MASK;
-       end = ALIGN(__pa(__end_rodata), PMD_SIZE);
-
-       map.pfn = __phys_to_pfn(start);
-       map.virtual = __phys_to_virt(start);
-       map.length = end - start;
-       map.type = MT_MEMORY;
-
-       create_mapping(&map, true);
-#endif
 }
 
 /*