aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/mmu.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/mmu.c')
-rw-r--r--arch/arm/mm/mmu.c49
1 files changed, 17 insertions, 32 deletions
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index d1d1cefa1f93..d7229d28c7f8 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -675,7 +675,8 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,
675} 675}
676 676
677static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr, 677static void __init alloc_init_pud(pgd_t *pgd, unsigned long addr,
678 unsigned long end, unsigned long phys, const struct mem_type *type) 678 unsigned long end, phys_addr_t phys,
679 const struct mem_type *type)
679{ 680{
680 pud_t *pud = pud_offset(pgd, addr); 681 pud_t *pud = pud_offset(pgd, addr);
681 unsigned long next; 682 unsigned long next;
@@ -989,27 +990,28 @@ phys_addr_t arm_lowmem_limit __initdata = 0;
989void __init sanity_check_meminfo(void) 990void __init sanity_check_meminfo(void)
990{ 991{
991 int i, j, highmem = 0; 992 int i, j, highmem = 0;
993 phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
992 994
993 for (i = 0, j = 0; i < meminfo.nr_banks; i++) { 995 for (i = 0, j = 0; i < meminfo.nr_banks; i++) {
994 struct membank *bank = &meminfo.bank[j]; 996 struct membank *bank = &meminfo.bank[j];
995 *bank = meminfo.bank[i]; 997 phys_addr_t size_limit;
996 998
997 if (bank->start > ULONG_MAX) 999 *bank = meminfo.bank[i];
998 highmem = 1; 1000 size_limit = bank->size;
999 1001
1000#ifdef CONFIG_HIGHMEM 1002 if (bank->start >= vmalloc_limit)
1001 if (__va(bank->start) >= vmalloc_min ||
1002 __va(bank->start) < (void *)PAGE_OFFSET)
1003 highmem = 1; 1003 highmem = 1;
1004 else
1005 size_limit = vmalloc_limit - bank->start;
1004 1006
1005 bank->highmem = highmem; 1007 bank->highmem = highmem;
1006 1008
1009#ifdef CONFIG_HIGHMEM
1007 /* 1010 /*
1008 * Split those memory banks which are partially overlapping 1011 * Split those memory banks which are partially overlapping
1009 * the vmalloc area greatly simplifying things later. 1012 * the vmalloc area greatly simplifying things later.
1010 */ 1013 */
1011 if (!highmem && __va(bank->start) < vmalloc_min && 1014 if (!highmem && bank->size > size_limit) {
1012 bank->size > vmalloc_min - __va(bank->start)) {
1013 if (meminfo.nr_banks >= NR_BANKS) { 1015 if (meminfo.nr_banks >= NR_BANKS) {
1014 printk(KERN_CRIT "NR_BANKS too low, " 1016 printk(KERN_CRIT "NR_BANKS too low, "
1015 "ignoring high memory\n"); 1017 "ignoring high memory\n");
@@ -1018,16 +1020,14 @@ void __init sanity_check_meminfo(void)
1018 (meminfo.nr_banks - i) * sizeof(*bank)); 1020 (meminfo.nr_banks - i) * sizeof(*bank));
1019 meminfo.nr_banks++; 1021 meminfo.nr_banks++;
1020 i++; 1022 i++;
1021 bank[1].size -= vmalloc_min - __va(bank->start); 1023 bank[1].size -= size_limit;
1022 bank[1].start = __pa(vmalloc_min - 1) + 1; 1024 bank[1].start = vmalloc_limit;
1023 bank[1].highmem = highmem = 1; 1025 bank[1].highmem = highmem = 1;
1024 j++; 1026 j++;
1025 } 1027 }
1026 bank->size = vmalloc_min - __va(bank->start); 1028 bank->size = size_limit;
1027 } 1029 }
1028#else 1030#else
1029 bank->highmem = highmem;
1030
1031 /* 1031 /*
1032 * Highmem banks not allowed with !CONFIG_HIGHMEM. 1032 * Highmem banks not allowed with !CONFIG_HIGHMEM.
1033 */ 1033 */
@@ -1040,31 +1040,16 @@ void __init sanity_check_meminfo(void)
1040 } 1040 }
1041 1041
1042 /* 1042 /*
1043 * Check whether this memory bank would entirely overlap
1044 * the vmalloc area.
1045 */
1046 if (__va(bank->start) >= vmalloc_min ||
1047 __va(bank->start) < (void *)PAGE_OFFSET) {
1048 printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx "
1049 "(vmalloc region overlap).\n",
1050 (unsigned long long)bank->start,
1051 (unsigned long long)bank->start + bank->size - 1);
1052 continue;
1053 }
1054
1055 /*
1056 * Check whether this memory bank would partially overlap 1043 * Check whether this memory bank would partially overlap
1057 * the vmalloc area. 1044 * the vmalloc area.
1058 */ 1045 */
1059 if (__va(bank->start + bank->size - 1) >= vmalloc_min || 1046 if (bank->size > size_limit) {
1060 __va(bank->start + bank->size - 1) <= __va(bank->start)) {
1061 unsigned long newsize = vmalloc_min - __va(bank->start);
1062 printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx " 1047 printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx "
1063 "to -%.8llx (vmalloc region overlap).\n", 1048 "to -%.8llx (vmalloc region overlap).\n",
1064 (unsigned long long)bank->start, 1049 (unsigned long long)bank->start,
1065 (unsigned long long)bank->start + bank->size - 1, 1050 (unsigned long long)bank->start + bank->size - 1,
1066 (unsigned long long)bank->start + newsize - 1); 1051 (unsigned long long)bank->start + size_limit - 1);
1067 bank->size = newsize; 1052 bank->size = size_limit;
1068 } 1053 }
1069#endif 1054#endif
1070 if (!bank->highmem && bank->start + bank->size > arm_lowmem_limit) 1055 if (!bank->highmem && bank->start + bank->size > arm_lowmem_limit)