2 * Based on arch/arm/mm/init.c
4 * Copyright (C) 1995-2005 Russell King
5 * Copyright (C) 2012 ARM Ltd.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <linux/kernel.h>
21 #include <linux/export.h>
22 #include <linux/errno.h>
23 #include <linux/swap.h>
24 #include <linux/init.h>
25 #include <linux/bootmem.h>
26 #include <linux/cache.h>
27 #include <linux/mman.h>
28 #include <linux/nodemask.h>
29 #include <linux/initrd.h>
30 #include <linux/gfp.h>
31 #include <linux/memblock.h>
32 #include <linux/sort.h>
33 #include <linux/of_fdt.h>
34 #include <linux/dma-mapping.h>
35 #include <linux/dma-contiguous.h>
36 #include <linux/efi.h>
37 #include <linux/swiotlb.h>
38 #include <linux/vmalloc.h>
41 #include <asm/fixmap.h>
42 #include <asm/kasan.h>
43 #include <asm/kernel-pgtable.h>
44 #include <asm/memory.h>
46 #include <asm/sections.h>
47 #include <asm/setup.h>
48 #include <asm/sizes.h>
50 #include <asm/alternative.h>
53 * We need to be able to catch inadvertent references to memstart_addr
54 * that occur (potentially in generic code) before arm64_memblock_init()
55 * executes, which assigns it its actual value. So use a default value
56 * that cannot be mistaken for a real physical address.
58 s64 memstart_addr __ro_after_init
= -1;
59 phys_addr_t arm64_dma_phys_limit __ro_after_init
;
61 #ifdef CONFIG_BLK_DEV_INITRD
62 static int __init
early_initrd(char *p
)
64 unsigned long start
, size
;
67 start
= memparse(p
, &endp
);
69 size
= memparse(endp
+ 1, NULL
);
72 initrd_end
= start
+ size
;
76 early_param("initrd", early_initrd
);
80 * Return the maximum physical address for ZONE_DMA (DMA_BIT_MASK(32)). It
81 * currently assumes that for memory starting above 4G, 32-bit devices will
84 static phys_addr_t __init
max_zone_dma_phys(void)
86 phys_addr_t offset
= memblock_start_of_DRAM() & GENMASK_ULL(63, 32);
87 return min(offset
+ (1ULL << 32), memblock_end_of_DRAM());
92 static void __init
zone_sizes_init(unsigned long min
, unsigned long max
)
94 unsigned long max_zone_pfns
[MAX_NR_ZONES
] = {0};
96 if (IS_ENABLED(CONFIG_ZONE_DMA
))
97 max_zone_pfns
[ZONE_DMA
] = PFN_DOWN(max_zone_dma_phys());
98 max_zone_pfns
[ZONE_NORMAL
] = max
;
100 free_area_init_nodes(max_zone_pfns
);
105 static void __init
zone_sizes_init(unsigned long min
, unsigned long max
)
107 struct memblock_region
*reg
;
108 unsigned long zone_size
[MAX_NR_ZONES
], zhole_size
[MAX_NR_ZONES
];
109 unsigned long max_dma
= min
;
111 memset(zone_size
, 0, sizeof(zone_size
));
113 /* 4GB maximum for 32-bit only capable devices */
114 #ifdef CONFIG_ZONE_DMA
115 max_dma
= PFN_DOWN(arm64_dma_phys_limit
);
116 zone_size
[ZONE_DMA
] = max_dma
- min
;
118 zone_size
[ZONE_NORMAL
] = max
- max_dma
;
120 memcpy(zhole_size
, zone_size
, sizeof(zhole_size
));
122 for_each_memblock(memory
, reg
) {
123 unsigned long start
= memblock_region_memory_base_pfn(reg
);
124 unsigned long end
= memblock_region_memory_end_pfn(reg
);
129 #ifdef CONFIG_ZONE_DMA
130 if (start
< max_dma
) {
131 unsigned long dma_end
= min(end
, max_dma
);
132 zhole_size
[ZONE_DMA
] -= dma_end
- start
;
136 unsigned long normal_end
= min(end
, max
);
137 unsigned long normal_start
= max(start
, max_dma
);
138 zhole_size
[ZONE_NORMAL
] -= normal_end
- normal_start
;
142 free_area_init_node(0, zone_size
, min
, zhole_size
);
145 #endif /* CONFIG_NUMA */
147 #ifdef CONFIG_HAVE_ARCH_PFN_VALID
148 int pfn_valid(unsigned long pfn
)
150 return memblock_is_map_memory(pfn
<< PAGE_SHIFT
);
152 EXPORT_SYMBOL(pfn_valid
);
155 #ifndef CONFIG_SPARSEMEM
156 static void __init
arm64_memory_present(void)
160 static void __init
arm64_memory_present(void)
162 struct memblock_region
*reg
;
164 for_each_memblock(memory
, reg
) {
165 int nid
= memblock_get_region_node(reg
);
167 memory_present(nid
, memblock_region_memory_base_pfn(reg
),
168 memblock_region_memory_end_pfn(reg
));
173 static phys_addr_t memory_limit
= (phys_addr_t
)ULLONG_MAX
;
176 * Limit the memory size that was specified via FDT.
178 static int __init
early_mem(char *p
)
183 memory_limit
= memparse(p
, &p
) & PAGE_MASK
;
184 pr_notice("Memory limited to %lldMB\n", memory_limit
>> 20);
188 early_param("mem", early_mem
);
190 void __init
arm64_memblock_init(void)
192 const s64 linear_region_size
= -(s64
)PAGE_OFFSET
;
195 * Ensure that the linear region takes up exactly half of the kernel
196 * virtual address space. This way, we can distinguish a linear address
197 * from a kernel/module/vmalloc address by testing a single bit.
199 BUILD_BUG_ON(linear_region_size
!= BIT(VA_BITS
- 1));
202 * Select a suitable value for the base of physical memory.
204 memstart_addr
= round_down(memblock_start_of_DRAM(),
205 ARM64_MEMSTART_ALIGN
);
208 * Remove the memory that we will not be able to cover with the
209 * linear mapping. Take care not to clip the kernel which may be
212 memblock_remove(max_t(u64
, memstart_addr
+ linear_region_size
, __pa(_end
)),
214 if (memstart_addr
+ linear_region_size
< memblock_end_of_DRAM()) {
215 /* ensure that memstart_addr remains sufficiently aligned */
216 memstart_addr
= round_up(memblock_end_of_DRAM() - linear_region_size
,
217 ARM64_MEMSTART_ALIGN
);
218 memblock_remove(0, memstart_addr
);
222 * Apply the memory limit if it was set. Since the kernel may be loaded
223 * high up in memory, add back the kernel region that must be accessible
224 * via the linear mapping.
226 if (memory_limit
!= (phys_addr_t
)ULLONG_MAX
) {
227 memblock_mem_limit_remove_map(memory_limit
);
228 memblock_add(__pa(_text
), (u64
)(_end
- _text
));
231 if (IS_ENABLED(CONFIG_BLK_DEV_INITRD
) && initrd_start
) {
233 * Add back the memory we just removed if it results in the
234 * initrd to become inaccessible via the linear mapping.
235 * Otherwise, this is a no-op
237 u64 base
= initrd_start
& PAGE_MASK
;
238 u64 size
= PAGE_ALIGN(initrd_end
) - base
;
241 * We can only add back the initrd memory if we don't end up
242 * with more memory than we can address via the linear mapping.
243 * It is up to the bootloader to position the kernel and the
244 * initrd reasonably close to each other (i.e., within 32 GB of
245 * each other) so that all granule/#levels combinations can
246 * always access both.
248 if (WARN(base
< memblock_start_of_DRAM() ||
249 base
+ size
> memblock_start_of_DRAM() +
251 "initrd not fully accessible via the linear mapping -- please check your bootloader ...\n")) {
254 memblock_remove(base
, size
); /* clear MEMBLOCK_ flags */
255 memblock_add(base
, size
);
256 memblock_reserve(base
, size
);
260 if (IS_ENABLED(CONFIG_RANDOMIZE_BASE
)) {
261 extern u16 memstart_offset_seed
;
262 u64 range
= linear_region_size
-
263 (memblock_end_of_DRAM() - memblock_start_of_DRAM());
266 * If the size of the linear region exceeds, by a sufficient
267 * margin, the size of the region that the available physical
268 * memory spans, randomize the linear region as well.
270 if (memstart_offset_seed
> 0 && range
>= ARM64_MEMSTART_ALIGN
) {
271 range
= range
/ ARM64_MEMSTART_ALIGN
+ 1;
272 memstart_addr
-= ARM64_MEMSTART_ALIGN
*
273 ((range
* memstart_offset_seed
) >> 16);
278 * Register the kernel text, kernel data, initrd, and initial
279 * pagetables with memblock.
281 memblock_reserve(__pa(_text
), _end
- _text
);
282 #ifdef CONFIG_BLK_DEV_INITRD
284 memblock_reserve(initrd_start
, initrd_end
- initrd_start
);
286 /* the generic initrd code expects virtual addresses */
287 initrd_start
= __phys_to_virt(initrd_start
);
288 initrd_end
= __phys_to_virt(initrd_end
);
292 early_init_fdt_scan_reserved_mem();
294 /* 4GB maximum for 32-bit only capable devices */
295 if (IS_ENABLED(CONFIG_ZONE_DMA
))
296 arm64_dma_phys_limit
= max_zone_dma_phys();
298 arm64_dma_phys_limit
= PHYS_MASK
+ 1;
299 dma_contiguous_reserve(arm64_dma_phys_limit
);
301 memblock_allow_resize();
304 void __init
bootmem_init(void)
306 unsigned long min
, max
;
308 min
= PFN_UP(memblock_start_of_DRAM());
309 max
= PFN_DOWN(memblock_end_of_DRAM());
311 early_memtest(min
<< PAGE_SHIFT
, max
<< PAGE_SHIFT
);
313 max_pfn
= max_low_pfn
= max
;
317 * Sparsemem tries to allocate bootmem in memory_present(), so must be
318 * done after the fixed reservations.
320 arm64_memory_present();
323 zone_sizes_init(min
, max
);
325 high_memory
= __va((max
<< PAGE_SHIFT
) - 1) + 1;
329 #ifndef CONFIG_SPARSEMEM_VMEMMAP
330 static inline void free_memmap(unsigned long start_pfn
, unsigned long end_pfn
)
332 struct page
*start_pg
, *end_pg
;
333 unsigned long pg
, pgend
;
336 * Convert start_pfn/end_pfn to a struct page pointer.
338 start_pg
= pfn_to_page(start_pfn
- 1) + 1;
339 end_pg
= pfn_to_page(end_pfn
- 1) + 1;
342 * Convert to physical addresses, and round start upwards and end
345 pg
= (unsigned long)PAGE_ALIGN(__pa(start_pg
));
346 pgend
= (unsigned long)__pa(end_pg
) & PAGE_MASK
;
349 * If there are free pages between these, free the section of the
353 free_bootmem(pg
, pgend
- pg
);
357 * The mem_map array can get very big. Free the unused area of the memory map.
359 static void __init
free_unused_memmap(void)
361 unsigned long start
, prev_end
= 0;
362 struct memblock_region
*reg
;
364 for_each_memblock(memory
, reg
) {
365 start
= __phys_to_pfn(reg
->base
);
367 #ifdef CONFIG_SPARSEMEM
369 * Take care not to free memmap entries that don't exist due
370 * to SPARSEMEM sections which aren't present.
372 start
= min(start
, ALIGN(prev_end
, PAGES_PER_SECTION
));
375 * If we had a previous bank, and there is a space between the
376 * current bank and the previous, free it.
378 if (prev_end
&& prev_end
< start
)
379 free_memmap(prev_end
, start
);
382 * Align up here since the VM subsystem insists that the
383 * memmap entries are valid from the bank end aligned to
384 * MAX_ORDER_NR_PAGES.
386 prev_end
= ALIGN(__phys_to_pfn(reg
->base
+ reg
->size
),
390 #ifdef CONFIG_SPARSEMEM
391 if (!IS_ALIGNED(prev_end
, PAGES_PER_SECTION
))
392 free_memmap(prev_end
, ALIGN(prev_end
, PAGES_PER_SECTION
));
395 #endif /* !CONFIG_SPARSEMEM_VMEMMAP */
398 * mem_init() marks the free areas in the mem_map and tells us how much memory
399 * is free. This is done after various parts of the system have claimed their
400 * memory after the kernel image.
402 void __init
mem_init(void)
404 if (swiotlb_force
== SWIOTLB_FORCE
||
405 max_pfn
> (arm64_dma_phys_limit
>> PAGE_SHIFT
))
408 swiotlb_force
= SWIOTLB_NO_FORCE
;
410 set_max_mapnr(pfn_to_page(max_pfn
) - mem_map
);
412 #ifndef CONFIG_SPARSEMEM_VMEMMAP
413 free_unused_memmap();
415 /* this will put all unused low memory onto the freelists */
418 mem_init_print_info(NULL
);
420 #define MLK(b, t) b, t, ((t) - (b)) >> 10
421 #define MLM(b, t) b, t, ((t) - (b)) >> 20
422 #define MLG(b, t) b, t, ((t) - (b)) >> 30
423 #define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), SZ_1K)
425 pr_notice("Virtual kernel memory layout:\n");
427 pr_notice(" kasan : 0x%16lx - 0x%16lx (%6ld GB)\n",
428 MLG(KASAN_SHADOW_START
, KASAN_SHADOW_END
));
430 pr_notice(" modules : 0x%16lx - 0x%16lx (%6ld MB)\n",
431 MLM(MODULES_VADDR
, MODULES_END
));
432 pr_notice(" vmalloc : 0x%16lx - 0x%16lx (%6ld GB)\n",
433 MLG(VMALLOC_START
, VMALLOC_END
));
434 pr_notice(" .text : 0x%p" " - 0x%p" " (%6ld KB)\n",
435 MLK_ROUNDUP(_text
, _etext
));
436 pr_notice(" .rodata : 0x%p" " - 0x%p" " (%6ld KB)\n",
437 MLK_ROUNDUP(__start_rodata
, __init_begin
));
438 pr_notice(" .init : 0x%p" " - 0x%p" " (%6ld KB)\n",
439 MLK_ROUNDUP(__init_begin
, __init_end
));
440 pr_notice(" .data : 0x%p" " - 0x%p" " (%6ld KB)\n",
441 MLK_ROUNDUP(_sdata
, _edata
));
442 pr_notice(" .bss : 0x%p" " - 0x%p" " (%6ld KB)\n",
443 MLK_ROUNDUP(__bss_start
, __bss_stop
));
444 pr_notice(" fixed : 0x%16lx - 0x%16lx (%6ld KB)\n",
445 MLK(FIXADDR_START
, FIXADDR_TOP
));
446 pr_notice(" PCI I/O : 0x%16lx - 0x%16lx (%6ld MB)\n",
447 MLM(PCI_IO_START
, PCI_IO_END
));
448 #ifdef CONFIG_SPARSEMEM_VMEMMAP
449 pr_notice(" vmemmap : 0x%16lx - 0x%16lx (%6ld GB maximum)\n",
450 MLG(VMEMMAP_START
, VMEMMAP_START
+ VMEMMAP_SIZE
));
451 pr_notice(" 0x%16lx - 0x%16lx (%6ld MB actual)\n",
452 MLM((unsigned long)phys_to_page(memblock_start_of_DRAM()),
453 (unsigned long)virt_to_page(high_memory
)));
455 pr_notice(" memory : 0x%16lx - 0x%16lx (%6ld MB)\n",
456 MLM(__phys_to_virt(memblock_start_of_DRAM()),
457 (unsigned long)high_memory
));
464 * Check boundaries twice: Some fundamental inconsistencies can be
465 * detected at build time already.
468 BUILD_BUG_ON(TASK_SIZE_32
> TASK_SIZE_64
);
472 * Make sure we chose the upper bound of sizeof(struct page)
475 BUILD_BUG_ON(sizeof(struct page
) > (1 << STRUCT_PAGE_MAX_SHIFT
));
477 if (PAGE_SIZE
>= 16384 && get_num_physpages() <= 128) {
478 extern int sysctl_overcommit_memory
;
480 * On a machine this small we won't get anywhere without
481 * overcommit, so turn it on by default.
483 sysctl_overcommit_memory
= OVERCOMMIT_ALWAYS
;
487 void free_initmem(void)
489 free_reserved_area(__va(__pa(__init_begin
)), __va(__pa(__init_end
)),
492 * Unmap the __init region but leave the VM area in place. This
493 * prevents the region from being reused for kernel modules, which
494 * is not supported by kallsyms.
496 unmap_kernel_range((u64
)__init_begin
, (u64
)(__init_end
- __init_begin
));
499 #ifdef CONFIG_BLK_DEV_INITRD
501 static int keep_initrd __initdata
;
503 void __init
free_initrd_mem(unsigned long start
, unsigned long end
)
506 free_reserved_area((void *)start
, (void *)end
, 0, "initrd");
509 static int __init
keepinitrd_setup(char *__unused
)
515 __setup("keepinitrd", keepinitrd_setup
);
519 * Dump out memory limit information on panic.
521 static int dump_mem_limit(struct notifier_block
*self
, unsigned long v
, void *p
)
523 if (memory_limit
!= (phys_addr_t
)ULLONG_MAX
) {
524 pr_emerg("Memory Limit: %llu MB\n", memory_limit
>> 20);
526 pr_emerg("Memory Limit: none\n");
531 static struct notifier_block mem_limit_notifier
= {
532 .notifier_call
= dump_mem_limit
,
535 static int __init
register_mem_limit_dumper(void)
537 atomic_notifier_chain_register(&panic_notifier_list
,
538 &mem_limit_notifier
);
541 __initcall(register_mem_limit_dumper
);