static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)
 {
        /* Upgrade to PMD_SIZE mappings whenever possible */
-       if ((base & (PMD_SIZE - 1)) || (size & (PMD_SIZE - 1)))
-               return PAGE_SIZE;
+       base &= PMD_SIZE - 1;
+       if (!base && size >= PMD_SIZE)
+               return PMD_SIZE;
 
-       return PMD_SIZE;
+       return PAGE_SIZE;
 }
 
 #ifdef CONFIG_XIP_KERNEL
                if (end >= __pa(PAGE_OFFSET) + memory_limit)
                        end = __pa(PAGE_OFFSET) + memory_limit;
 
-               map_size = best_map_size(start, end - start);
                for (pa = start; pa < end; pa += map_size) {
                        va = (uintptr_t)__va(pa);
+                       map_size = best_map_size(pa, end - pa);
 
                        create_pgd_mapping(swapper_pg_dir, va, pa, map_size,
                                           pgprot_from_va(va));