1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
6 * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au)
7 * and Cort Dougan (PReP) (cort@cs.nmt.edu)
8 * Copyright (C) 1996 Paul Mackerras
10 * Derived from "arch/i386/mm/init.c"
11 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
13 * Dave Engebretsen <engebret@us.ibm.com>
14 * Rework for PPC64 port.
19 #include <linux/signal.h>
20 #include <linux/sched.h>
21 #include <linux/kernel.h>
22 #include <linux/errno.h>
23 #include <linux/string.h>
24 #include <linux/types.h>
25 #include <linux/mman.h>
27 #include <linux/swap.h>
28 #include <linux/stddef.h>
29 #include <linux/vmalloc.h>
30 #include <linux/init.h>
31 #include <linux/delay.h>
32 #include <linux/highmem.h>
33 #include <linux/idr.h>
34 #include <linux/nodemask.h>
35 #include <linux/module.h>
36 #include <linux/poison.h>
37 #include <linux/memblock.h>
38 #include <linux/hugetlb.h>
39 #include <linux/slab.h>
40 #include <linux/of_fdt.h>
41 #include <linux/libfdt.h>
42 #include <linux/memremap.h>
44 #include <asm/pgalloc.h>
49 #include <asm/mmu_context.h>
51 #include <linux/uaccess.h>
53 #include <asm/machdep.h>
56 #include <asm/processor.h>
57 #include <asm/mmzone.h>
58 #include <asm/cputable.h>
59 #include <asm/sections.h>
60 #include <asm/iommu.h>
63 #include <mm/mmu_decl.h>
65 #ifdef CONFIG_SPARSEMEM_VMEMMAP
67 * Given an address within the vmemmap, determine the page that
68 * represents the start of the subsection it is within. Note that we have to
69 * do this by hand as the proffered address may not be correctly aligned.
70 * Subtraction of non-aligned pointers produces undefined results.
72 static struct page
* __meminit
vmemmap_subsection_start(unsigned long vmemmap_addr
)
74 unsigned long start_pfn
;
75 unsigned long offset
= vmemmap_addr
- ((unsigned long)(vmemmap
));
77 /* Return the pfn of the start of the section. */
78 start_pfn
= (offset
/ sizeof(struct page
)) & PAGE_SUBSECTION_MASK
;
79 return pfn_to_page(start_pfn
);
83 * Since memory is added in sub-section chunks, before creating a new vmemmap
84 * mapping, the kernel should check whether there is an existing memmap mapping
85 * covering the new subsection added. This is needed because kernel can map
86 * vmemmap area using 16MB pages which will cover a memory range of 16G. Such
87 * a range covers multiple subsections (2M)
89 * If any subsection in the 16G range mapped by vmemmap is valid we consider the
90 * vmemmap populated (There is a page table entry already present). We can't do
91 * a page table lookup here because with the hash translation we don't keep
92 * vmemmap details in linux page table.
94 static int __meminit
vmemmap_populated(unsigned long vmemmap_addr
, int vmemmap_map_size
)
97 unsigned long vmemmap_end
= vmemmap_addr
+ vmemmap_map_size
;
98 start
= vmemmap_subsection_start(vmemmap_addr
);
100 for (; (unsigned long)start
< vmemmap_end
; start
+= PAGES_PER_SUBSECTION
)
102 * pfn valid check here is intended to really check
103 * whether we have any subsection already initialized
106 if (pfn_valid(page_to_pfn(start
)))
113 * vmemmap virtual address space management does not have a traditonal page
114 * table to track which virtual struct pages are backed by physical mapping.
115 * The virtual to physical mappings are tracked in a simple linked list
116 * format. 'vmemmap_list' maintains the entire vmemmap physical mapping at
117 * all times where as the 'next' list maintains the available
118 * vmemmap_backing structures which have been deleted from the
119 * 'vmemmap_global' list during system runtime (memory hotplug remove
120 * operation). The freed 'vmemmap_backing' structures are reused later when
121 * new requests come in without allocating fresh memory. This pointer also
122 * tracks the allocated 'vmemmap_backing' structures as we allocate one
123 * full page memory at a time when we dont have any.
125 struct vmemmap_backing
*vmemmap_list
;
126 static struct vmemmap_backing
*next
;
129 * The same pointer 'next' tracks individual chunks inside the allocated
130 * full page during the boot time and again tracks the freeed nodes during
131 * runtime. It is racy but it does not happen as they are separated by the
132 * boot process. Will create problem if some how we have memory hotplug
133 * operation during boot !!
136 static int num_freed
;
138 static __meminit
struct vmemmap_backing
* vmemmap_list_alloc(int node
)
140 struct vmemmap_backing
*vmem_back
;
141 /* get from freed entries first */
150 /* allocate a page when required and hand out chunks */
152 next
= vmemmap_alloc_block(PAGE_SIZE
, node
);
153 if (unlikely(!next
)) {
157 num_left
= PAGE_SIZE
/ sizeof(struct vmemmap_backing
);
165 static __meminit
int vmemmap_list_populate(unsigned long phys
,
169 struct vmemmap_backing
*vmem_back
;
171 vmem_back
= vmemmap_list_alloc(node
);
172 if (unlikely(!vmem_back
)) {
173 pr_debug("vmemap list allocation failed\n");
177 vmem_back
->phys
= phys
;
178 vmem_back
->virt_addr
= start
;
179 vmem_back
->list
= vmemmap_list
;
181 vmemmap_list
= vmem_back
;
185 static bool altmap_cross_boundary(struct vmem_altmap
*altmap
, unsigned long start
,
186 unsigned long page_size
)
188 unsigned long nr_pfn
= page_size
/ sizeof(struct page
);
189 unsigned long start_pfn
= page_to_pfn((struct page
*)start
);
191 if ((start_pfn
+ nr_pfn
) > altmap
->end_pfn
)
194 if (start_pfn
< altmap
->base_pfn
)
200 int __meminit
vmemmap_populate(unsigned long start
, unsigned long end
, int node
,
201 struct vmem_altmap
*altmap
)
204 unsigned long page_size
= 1 << mmu_psize_defs
[mmu_vmemmap_psize
].shift
;
206 /* Align to the page size of the linear mapping. */
207 start
= ALIGN_DOWN(start
, page_size
);
209 pr_debug("vmemmap_populate %lx..%lx, node %d\n", start
, end
, node
);
211 for (; start
< end
; start
+= page_size
) {
216 * This vmemmap range is backing different subsections. If any
217 * of that subsection is marked valid, that means we already
218 * have initialized a page table covering this range and hence
219 * the vmemmap range is populated.
221 if (vmemmap_populated(start
, page_size
))
225 * Allocate from the altmap first if we have one. This may
226 * fail due to alignment issues when using 16MB hugepages, so
227 * fall back to system memory if the altmap allocation fail.
229 if (altmap
&& !altmap_cross_boundary(altmap
, start
, page_size
)) {
230 p
= vmemmap_alloc_block_buf(page_size
, node
, altmap
);
232 pr_debug("altmap block allocation failed, falling back to system memory");
237 p
= vmemmap_alloc_block_buf(page_size
, node
, NULL
);
238 altmap_alloc
= false;
243 if (vmemmap_list_populate(__pa(p
), start
, node
)) {
245 * If we don't populate vmemap list, we don't have
246 * the ability to free the allocated vmemmap
247 * pages in section_deactivate. Hence free them
250 int nr_pfns
= page_size
>> PAGE_SHIFT
;
251 unsigned long page_order
= get_order(page_size
);
254 vmem_altmap_free(altmap
, nr_pfns
);
256 free_pages((unsigned long)p
, page_order
);
260 pr_debug(" * %016lx..%016lx allocated at %p\n",
261 start
, start
+ page_size
, p
);
263 rc
= vmemmap_create_mapping(start
, page_size
, __pa(p
));
265 pr_warn("%s: Unable to create vmemmap mapping: %d\n",
274 #ifdef CONFIG_MEMORY_HOTPLUG
275 static unsigned long vmemmap_list_free(unsigned long start
)
277 struct vmemmap_backing
*vmem_back
, *vmem_back_prev
;
279 vmem_back_prev
= vmem_back
= vmemmap_list
;
281 /* look for it with prev pointer recorded */
282 for (; vmem_back
; vmem_back
= vmem_back
->list
) {
283 if (vmem_back
->virt_addr
== start
)
285 vmem_back_prev
= vmem_back
;
288 if (unlikely(!vmem_back
))
291 /* remove it from vmemmap_list */
292 if (vmem_back
== vmemmap_list
) /* remove head */
293 vmemmap_list
= vmem_back
->list
;
295 vmem_back_prev
->list
= vmem_back
->list
;
297 /* next point to this freed entry */
298 vmem_back
->list
= next
;
302 return vmem_back
->phys
;
305 void __ref
vmemmap_free(unsigned long start
, unsigned long end
,
306 struct vmem_altmap
*altmap
)
308 unsigned long page_size
= 1 << mmu_psize_defs
[mmu_vmemmap_psize
].shift
;
309 unsigned long page_order
= get_order(page_size
);
310 unsigned long alt_start
= ~0, alt_end
= ~0;
311 unsigned long base_pfn
;
313 start
= ALIGN_DOWN(start
, page_size
);
315 alt_start
= altmap
->base_pfn
;
316 alt_end
= altmap
->base_pfn
+ altmap
->reserve
+
317 altmap
->free
+ altmap
->alloc
+ altmap
->align
;
320 pr_debug("vmemmap_free %lx...%lx\n", start
, end
);
322 for (; start
< end
; start
+= page_size
) {
323 unsigned long nr_pages
, addr
;
327 * We have already marked the subsection we are trying to remove
328 * invalid. So if we want to remove the vmemmap range, we
329 * need to make sure there is no subsection marked valid
332 if (vmemmap_populated(start
, page_size
))
335 addr
= vmemmap_list_free(start
);
339 page
= pfn_to_page(addr
>> PAGE_SHIFT
);
340 nr_pages
= 1 << page_order
;
341 base_pfn
= PHYS_PFN(addr
);
343 if (base_pfn
>= alt_start
&& base_pfn
< alt_end
) {
344 vmem_altmap_free(altmap
, nr_pages
);
345 } else if (PageReserved(page
)) {
346 /* allocated from bootmem */
347 if (page_size
< PAGE_SIZE
) {
349 * this shouldn't happen, but if it is
350 * the case, leave the memory there
355 free_reserved_page(page
++);
358 free_pages((unsigned long)(__va(addr
)), page_order
);
361 vmemmap_remove_mapping(start
, page_size
);
365 void register_page_bootmem_memmap(unsigned long section_nr
,
366 struct page
*start_page
, unsigned long size
)
370 #endif /* CONFIG_SPARSEMEM_VMEMMAP */
372 #ifdef CONFIG_PPC_BOOK3S_64
373 static bool disable_radix
= !IS_ENABLED(CONFIG_PPC_RADIX_MMU_DEFAULT
);
375 static int __init
parse_disable_radix(char *p
)
381 else if (kstrtobool(p
, &val
))
388 early_param("disable_radix", parse_disable_radix
);
391 * If we're running under a hypervisor, we need to check the contents of
392 * /chosen/ibm,architecture-vec-5 to see if the hypervisor is willing to do
393 * radix. If not, we clear the radix feature bit so we fall back to hash.
395 static void __init
early_check_vec5(void)
397 unsigned long root
, chosen
;
402 root
= of_get_flat_dt_root();
403 chosen
= of_get_flat_dt_subnode_by_name(root
, "chosen");
404 if (chosen
== -FDT_ERR_NOTFOUND
) {
405 cur_cpu_spec
->mmu_features
&= ~MMU_FTR_TYPE_RADIX
;
408 vec5
= of_get_flat_dt_prop(chosen
, "ibm,architecture-vec-5", &size
);
410 cur_cpu_spec
->mmu_features
&= ~MMU_FTR_TYPE_RADIX
;
413 if (size
<= OV5_INDX(OV5_MMU_SUPPORT
)) {
414 cur_cpu_spec
->mmu_features
&= ~MMU_FTR_TYPE_RADIX
;
418 /* Check for supported configuration */
419 mmu_supported
= vec5
[OV5_INDX(OV5_MMU_SUPPORT
)] &
420 OV5_FEAT(OV5_MMU_SUPPORT
);
421 if (mmu_supported
== OV5_FEAT(OV5_MMU_RADIX
)) {
422 /* Hypervisor only supports radix - check enabled && GTSE */
423 if (!early_radix_enabled()) {
424 pr_warn("WARNING: Ignoring cmdline option disable_radix\n");
426 if (!(vec5
[OV5_INDX(OV5_RADIX_GTSE
)] &
427 OV5_FEAT(OV5_RADIX_GTSE
))) {
428 cur_cpu_spec
->mmu_features
&= ~MMU_FTR_GTSE
;
430 cur_cpu_spec
->mmu_features
|= MMU_FTR_GTSE
;
431 /* Do radix anyway - the hypervisor said we had to */
432 cur_cpu_spec
->mmu_features
|= MMU_FTR_TYPE_RADIX
;
433 } else if (mmu_supported
== OV5_FEAT(OV5_MMU_HASH
)) {
434 /* Hypervisor only supports hash - disable radix */
435 cur_cpu_spec
->mmu_features
&= ~MMU_FTR_TYPE_RADIX
;
436 cur_cpu_spec
->mmu_features
&= ~MMU_FTR_GTSE
;
440 void __init
mmu_early_init_devtree(void)
442 /* Disable radix mode based on kernel command line. */
444 cur_cpu_spec
->mmu_features
&= ~MMU_FTR_TYPE_RADIX
;
447 * Check /chosen/ibm,architecture-vec-5 if running as a guest.
448 * When running bare-metal, we can use radix if we like
449 * even though the ibm,architecture-vec-5 property created by
450 * skiboot doesn't have the necessary bits set.
452 if (!(mfmsr() & MSR_HV
))
455 if (early_radix_enabled()) {
456 radix__early_init_devtree();
458 * We have finalized the translation we are going to use by now.
459 * Radix mode is not limited by RMA / VRMA addressing.
460 * Hence don't limit memblock allocations.
462 ppc64_rma_size
= ULONG_MAX
;
463 memblock_set_current_limit(MEMBLOCK_ALLOC_ANYWHERE
);
465 hash__early_init_devtree();
467 #endif /* CONFIG_PPC_BOOK3S_64 */