init.c 24.4 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
P
Palmer Dabbelt 已提交
2 3
/*
 * Copyright (C) 2012 Regents of the University of California
4
 * Copyright (C) 2019 Western Digital Corporation or its affiliates.
N
Nick Kossifidis 已提交
5 6
 * Copyright (C) 2020 FORTH-ICS/CARV
 *  Nick Kossifidis <mick@ics.forth.gr>
P
Palmer Dabbelt 已提交
7 8 9 10 11
 */

#include <linux/init.h>
#include <linux/mm.h>
#include <linux/memblock.h>
M
Mike Rapoport 已提交
12
#include <linux/initrd.h>
P
Palmer Dabbelt 已提交
13
#include <linux/swap.h>
14
#include <linux/swiotlb.h>
C
Christoph Hellwig 已提交
15
#include <linux/sizes.h>
16
#include <linux/of_fdt.h>
17
#include <linux/of_reserved_mem.h>
18
#include <linux/libfdt.h>
Z
Zong Li 已提交
19
#include <linux/set_memory.h>
K
Kefeng Wang 已提交
20
#include <linux/dma-map-ops.h>
N
Nick Kossifidis 已提交
21
#include <linux/crash_dump.h>
P
Palmer Dabbelt 已提交
22

23
#include <asm/fixmap.h>
P
Palmer Dabbelt 已提交
24 25
#include <asm/tlbflush.h>
#include <asm/sections.h>
26
#include <asm/soc.h>
P
Palmer Dabbelt 已提交
27
#include <asm/io.h>
Z
Zong Li 已提交
28
#include <asm/ptdump.h>
29
#include <asm/numa.h>
P
Palmer Dabbelt 已提交
30

31 32
#include "../kernel/head.h"

33 34 35 36 37 38
struct kernel_mapping kernel_map __ro_after_init;
EXPORT_SYMBOL(kernel_map);
#ifdef CONFIG_XIP_KERNEL
#define kernel_map	(*(struct kernel_mapping *)XIP_FIXUP(&kernel_map))
#endif

V
Vitaly Wool 已提交
39
#ifdef CONFIG_XIP_KERNEL
40
extern char _xiprom[], _exiprom[];
V
Vitaly Wool 已提交
41
#endif
42

43 44 45 46
unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
							__page_aligned_bss;
EXPORT_SYMBOL(empty_zero_page);

47
extern char _start[];
A
Anup Patel 已提交
48
#define DTB_EARLY_BASE_VA      PGDIR_SIZE
V
Vitaly Wool 已提交
49 50
void *_dtb_early_va __initdata;
uintptr_t _dtb_early_pa __initdata;
51

52 53 54 55 56 57 58 59
struct pt_alloc_ops {
	pte_t *(*get_pte_virt)(phys_addr_t pa);
	phys_addr_t (*alloc_pte)(uintptr_t va);
#ifndef __PAGETABLE_PMD_FOLDED
	pmd_t *(*get_pmd_virt)(phys_addr_t pa);
	phys_addr_t (*alloc_pmd)(uintptr_t va);
#endif
};
60

61
static phys_addr_t dma32_phys_limit __initdata;
K
Kefeng Wang 已提交
62

P
Palmer Dabbelt 已提交
63 64
static void __init zone_sizes_init(void)
{
C
Christoph Hellwig 已提交
65
	unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, };
P
Palmer Dabbelt 已提交
66

67
#ifdef CONFIG_ZONE_DMA32
K
Kefeng Wang 已提交
68
	max_zone_pfns[ZONE_DMA32] = PFN_DOWN(dma32_phys_limit);
69
#endif
C
Christoph Hellwig 已提交
70 71
	max_zone_pfns[ZONE_NORMAL] = max_low_pfn;

72
	free_area_init(max_zone_pfns);
P
Palmer Dabbelt 已提交
73 74
}

75
#if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM)
Y
Yash Shah 已提交
76 77 78 79 80 81 82 83 84 85 86 87
static inline void print_mlk(char *name, unsigned long b, unsigned long t)
{
	pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld kB)\n", name, b, t,
		  (((t) - (b)) >> 10));
}

static inline void print_mlm(char *name, unsigned long b, unsigned long t)
{
	pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld MB)\n", name, b, t,
		  (((t) - (b)) >> 20));
}

88
static void __init print_vm_layout(void)
Y
Yash Shah 已提交
89 90 91 92 93 94 95 96 97 98 99 100
{
	pr_notice("Virtual kernel memory layout:\n");
	print_mlk("fixmap", (unsigned long)FIXADDR_START,
		  (unsigned long)FIXADDR_TOP);
	print_mlm("pci io", (unsigned long)PCI_IO_START,
		  (unsigned long)PCI_IO_END);
	print_mlm("vmemmap", (unsigned long)VMEMMAP_START,
		  (unsigned long)VMEMMAP_END);
	print_mlm("vmalloc", (unsigned long)VMALLOC_START,
		  (unsigned long)VMALLOC_END);
	print_mlm("lowmem", (unsigned long)PAGE_OFFSET,
		  (unsigned long)high_memory);
101 102 103 104
#ifdef CONFIG_64BIT
	print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR,
		  (unsigned long)ADDRESS_SPACE_END);
#endif
Y
Yash Shah 已提交
105 106 107 108 109
}
#else
static void print_vm_layout(void) { }
#endif /* CONFIG_DEBUG_VM */

P
Palmer Dabbelt 已提交
110 111 112 113 114 115
void __init mem_init(void)
{
#ifdef CONFIG_FLATMEM
	BUG_ON(!mem_map);
#endif /* CONFIG_FLATMEM */

116 117 118 119 120 121 122
#ifdef CONFIG_SWIOTLB
	if (swiotlb_force == SWIOTLB_FORCE ||
	    max_pfn > PFN_DOWN(dma32_phys_limit))
		swiotlb_init(1);
	else
		swiotlb_force = SWIOTLB_NO_FORCE;
#endif
P
Palmer Dabbelt 已提交
123
	high_memory = (void *)(__va(PFN_PHYS(max_low_pfn)));
124
	memblock_free_all();
P
Palmer Dabbelt 已提交
125

Y
Yash Shah 已提交
126
	print_vm_layout();
P
Palmer Dabbelt 已提交
127 128
}

129
/*
130 131 132 133 134
 * The default maximal physical memory size is -PAGE_OFFSET for 32-bit kernel,
 * whereas for 64-bit kernel, the end of the virtual address space is occupied
 * by the modules/BPF/kernel mappings which reduces the available size of the
 * linear mapping.
 * Limit the memory size via mem.
135
 */
136 137 138
#ifdef CONFIG_64BIT
static phys_addr_t memory_limit = -PAGE_OFFSET - SZ_4G;
#else
139
static phys_addr_t memory_limit = -PAGE_OFFSET;
140
#endif
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

static int __init early_mem(char *p)
{
	u64 size;

	if (!p)
		return 1;

	size = memparse(p, &p) & PAGE_MASK;
	memory_limit = min_t(u64, size, memory_limit);

	pr_notice("Memory limited to %lldMB\n", (u64)memory_limit >> 20);

	return 0;
}
early_param("mem", early_mem);

158
static void __init setup_bootmem(void)
159
{
160 161
	phys_addr_t vmlinux_end = __pa_symbol(&_end);
	phys_addr_t vmlinux_start = __pa_symbol(&_start);
A
Atish Patra 已提交
162
	phys_addr_t max_mapped_addr = __pa(~(ulong)0);
163
	phys_addr_t dram_end;
164

V
Vitaly Wool 已提交
165 166 167 168
#ifdef CONFIG_XIP_KERNEL
	vmlinux_start = __pa_symbol(&_sdata);
#endif

169
	memblock_enforce_memory_limit(memory_limit);
170

171 172
	/*
	 * Reserve from the start of the kernel to the end of the kernel
173 174 175 176
	 */
#if defined(CONFIG_64BIT) && defined(CONFIG_STRICT_KERNEL_RWX)
	/*
	 * Make sure we align the reservation on PMD_SIZE since we will
177 178 179
	 * map the kernel in the linear mapping as read-only: we do not want
	 * any allocation to happen between _end and the next pmd aligned page.
	 */
180 181 182
	vmlinux_end = (vmlinux_end + PMD_SIZE - 1) & PMD_MASK;
#endif
	memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
183

184
	dram_end = memblock_end_of_DRAM();
B
Bin Meng 已提交
185

A
Atish Patra 已提交
186 187 188 189 190 191 192 193 194
	/*
	 * memblock allocator is not aware of the fact that last 4K bytes of
	 * the addressable memory can not be mapped because of IS_ERR_VALUE
	 * macro. Make sure that last 4k bytes are not usable by memblock
	 * if end of dram is equal to maximum addressable memory.
	 */
	if (max_mapped_addr == (dram_end - 1))
		memblock_set_current_limit(max_mapped_addr - 4096);

K
Kefeng Wang 已提交
195 196 197
	min_low_pfn = PFN_UP(memblock_start_of_DRAM());
	max_low_pfn = max_pfn = PFN_DOWN(dram_end);

K
Kefeng Wang 已提交
198
	dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn));
199
	set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET);
200

201
	reserve_initrd_mem();
202
	/*
203 204 205
	 * If DTB is built in, no need to reserve its memblock.
	 * Otherwise, do reserve it but avoid using
	 * early_init_fdt_reserve_self() since __pa() does
206 207
	 * not work for DTB pointers that are fixmap addresses
	 */
208 209
	if (!IS_ENABLED(CONFIG_BUILTIN_DTB))
		memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va));
210

211
	early_init_fdt_scan_reserved_mem();
K
Kefeng Wang 已提交
212
	dma_contiguous_reserve(dma32_phys_limit);
213 214
	memblock_allow_resize();
}
215

C
Christoph Hellwig 已提交
216
#ifdef CONFIG_MMU
217
static struct pt_alloc_ops _pt_ops __initdata;
V
Vitaly Wool 已提交
218 219 220 221 222 223

#ifdef CONFIG_XIP_KERNEL
#define pt_ops (*(struct pt_alloc_ops *)XIP_FIXUP(&_pt_ops))
#else
#define pt_ops _pt_ops
#endif
224

225
unsigned long pfn_base __ro_after_init;
226 227
EXPORT_SYMBOL(pfn_base);

228
pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss;
229
pgd_t trampoline_pg_dir[PTRS_PER_PGD] __page_aligned_bss;
230
static pte_t fixmap_pte[PTRS_PER_PTE] __page_aligned_bss;
231

232
pgd_t early_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE);
233

V
Vitaly Wool 已提交
234 235 236 237 238 239
#ifdef CONFIG_XIP_KERNEL
#define trampoline_pg_dir      ((pgd_t *)XIP_FIXUP(trampoline_pg_dir))
#define fixmap_pte             ((pte_t *)XIP_FIXUP(fixmap_pte))
#define early_pg_dir           ((pgd_t *)XIP_FIXUP(early_pg_dir))
#endif /* CONFIG_XIP_KERNEL */

240 241 242 243 244 245 246 247 248
void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t prot)
{
	unsigned long addr = __fix_to_virt(idx);
	pte_t *ptep;

	BUG_ON(idx <= FIX_HOLE || idx >= __end_of_fixed_addresses);

	ptep = &fixmap_pte[pte_index(addr)];

249
	if (pgprot_val(prot))
250
		set_pte(ptep, pfn_pte(phys >> PAGE_SHIFT, prot));
251
	else
252
		pte_clear(&init_mm, addr, ptep);
253
	local_flush_tlb_page(addr);
254 255
}

256
static inline pte_t *__init get_pte_virt_early(phys_addr_t pa)
257
{
258
	return (pte_t *)((uintptr_t)pa);
259 260
}

261 262 263 264 265 266
static inline pte_t *__init get_pte_virt_fixmap(phys_addr_t pa)
{
	clear_fixmap(FIX_PTE);
	return (pte_t *)set_fixmap_offset(FIX_PTE, pa);
}

267
static inline pte_t *__init get_pte_virt_late(phys_addr_t pa)
268 269 270 271 272
{
	return (pte_t *) __va(pa);
}

static inline phys_addr_t __init alloc_pte_early(uintptr_t va)
273 274 275 276 277
{
	/*
	 * We only create PMD or PGD early mappings so we
	 * should never reach here with MMU disabled.
	 */
278 279
	BUG();
}
280

281 282
static inline phys_addr_t __init alloc_pte_fixmap(uintptr_t va)
{
283 284 285
	return memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
}

286
static phys_addr_t __init alloc_pte_late(uintptr_t va)
287 288 289 290
{
	unsigned long vaddr;

	vaddr = __get_free_page(GFP_KERNEL);
291 292
	BUG_ON(!vaddr || !pgtable_pte_page_ctor(virt_to_page(vaddr)));

293 294 295
	return __pa(vaddr);
}

296 297 298 299
static void __init create_pte_mapping(pte_t *ptep,
				      uintptr_t va, phys_addr_t pa,
				      phys_addr_t sz, pgprot_t prot)
{
300
	uintptr_t pte_idx = pte_index(va);
301 302 303

	BUG_ON(sz != PAGE_SIZE);

304 305
	if (pte_none(ptep[pte_idx]))
		ptep[pte_idx] = pfn_pte(PFN_DOWN(pa), prot);
306 307 308 309
}

#ifndef __PAGETABLE_PMD_FOLDED

310 311 312 313
static pmd_t trampoline_pmd[PTRS_PER_PMD] __page_aligned_bss;
static pmd_t fixmap_pmd[PTRS_PER_PMD] __page_aligned_bss;
static pmd_t early_pmd[PTRS_PER_PMD] __initdata __aligned(PAGE_SIZE);
static pmd_t early_dtb_pmd[PTRS_PER_PMD] __initdata __aligned(PAGE_SIZE);
314

V
Vitaly Wool 已提交
315 316 317 318 319 320
#ifdef CONFIG_XIP_KERNEL
#define trampoline_pmd ((pmd_t *)XIP_FIXUP(trampoline_pmd))
#define fixmap_pmd     ((pmd_t *)XIP_FIXUP(fixmap_pmd))
#define early_pmd      ((pmd_t *)XIP_FIXUP(early_pmd))
#endif /* CONFIG_XIP_KERNEL */

321
static pmd_t *__init get_pmd_virt_early(phys_addr_t pa)
322
{
323 324
	/* Before MMU is enabled */
	return (pmd_t *)((uintptr_t)pa);
325 326
}

327
static pmd_t *__init get_pmd_virt_fixmap(phys_addr_t pa)
328
{
329 330 331
	clear_fixmap(FIX_PMD);
	return (pmd_t *)set_fixmap_offset(FIX_PMD, pa);
}
332

333
static pmd_t *__init get_pmd_virt_late(phys_addr_t pa)
334 335 336
{
	return (pmd_t *) __va(pa);
}
337

338 339
static phys_addr_t __init alloc_pmd_early(uintptr_t va)
{
340
	BUG_ON((va - kernel_map.virt_addr) >> PGDIR_SHIFT);
341

342
	return (uintptr_t)early_pmd;
343 344
}

345 346 347 348 349
static phys_addr_t __init alloc_pmd_fixmap(uintptr_t va)
{
	return memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
}

350
static phys_addr_t __init alloc_pmd_late(uintptr_t va)
351 352 353 354 355 356 357 358
{
	unsigned long vaddr;

	vaddr = __get_free_page(GFP_KERNEL);
	BUG_ON(!vaddr);
	return __pa(vaddr);
}

359 360 361 362 363 364
static void __init create_pmd_mapping(pmd_t *pmdp,
				      uintptr_t va, phys_addr_t pa,
				      phys_addr_t sz, pgprot_t prot)
{
	pte_t *ptep;
	phys_addr_t pte_phys;
365
	uintptr_t pmd_idx = pmd_index(va);
366 367

	if (sz == PMD_SIZE) {
368 369
		if (pmd_none(pmdp[pmd_idx]))
			pmdp[pmd_idx] = pfn_pmd(PFN_DOWN(pa), prot);
370 371 372
		return;
	}

373
	if (pmd_none(pmdp[pmd_idx])) {
374
		pte_phys = pt_ops.alloc_pte(va);
375
		pmdp[pmd_idx] = pfn_pmd(PFN_DOWN(pte_phys), PAGE_TABLE);
376
		ptep = pt_ops.get_pte_virt(pte_phys);
377 378
		memset(ptep, 0, PAGE_SIZE);
	} else {
379
		pte_phys = PFN_PHYS(_pmd_pfn(pmdp[pmd_idx]));
380
		ptep = pt_ops.get_pte_virt(pte_phys);
381 382 383 384 385 386
	}

	create_pte_mapping(ptep, va, pa, sz, prot);
}

#define pgd_next_t		pmd_t
387 388
#define alloc_pgd_next(__va)	pt_ops.alloc_pmd(__va)
#define get_pgd_next_virt(__pa)	pt_ops.get_pmd_virt(__pa)
389 390 391 392 393
#define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot)	\
	create_pmd_mapping(__nextp, __va, __pa, __sz, __prot)
#define fixmap_pgd_next		fixmap_pmd
#else
#define pgd_next_t		pte_t
394 395
#define alloc_pgd_next(__va)	pt_ops.alloc_pte(__va)
#define get_pgd_next_virt(__pa)	pt_ops.get_pte_virt(__pa)
396 397 398 399 400
#define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot)	\
	create_pte_mapping(__nextp, __va, __pa, __sz, __prot)
#define fixmap_pgd_next		fixmap_pte
#endif

A
Atish Patra 已提交
401
void __init create_pgd_mapping(pgd_t *pgdp,
402 403 404 405 406
				      uintptr_t va, phys_addr_t pa,
				      phys_addr_t sz, pgprot_t prot)
{
	pgd_next_t *nextp;
	phys_addr_t next_phys;
407
	uintptr_t pgd_idx = pgd_index(va);
408 409

	if (sz == PGDIR_SIZE) {
410 411
		if (pgd_val(pgdp[pgd_idx]) == 0)
			pgdp[pgd_idx] = pfn_pgd(PFN_DOWN(pa), prot);
412 413 414
		return;
	}

415
	if (pgd_val(pgdp[pgd_idx]) == 0) {
416
		next_phys = alloc_pgd_next(va);
417
		pgdp[pgd_idx] = pfn_pgd(PFN_DOWN(next_phys), PAGE_TABLE);
418 419 420
		nextp = get_pgd_next_virt(next_phys);
		memset(nextp, 0, PAGE_SIZE);
	} else {
421
		next_phys = PFN_PHYS(_pgd_pfn(pgdp[pgd_idx]));
422 423 424 425 426 427 428 429
		nextp = get_pgd_next_virt(next_phys);
	}

	create_pgd_next_mapping(nextp, va, pa, sz, prot);
}

static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)
{
430 431 432
	/* Upgrade to PMD_SIZE mappings whenever possible */
	if ((base & (PMD_SIZE - 1)) || (size & (PMD_SIZE - 1)))
		return PAGE_SIZE;
433

434
	return PMD_SIZE;
435 436
}

V
Vitaly Wool 已提交
437 438 439 440 441 442 443 444 445 446 447 448 449
#ifdef CONFIG_XIP_KERNEL
/* called from head.S with MMU off */
asmlinkage void __init __copy_data(void)
{
	void *from = (void *)(&_sdata);
	void *end = (void *)(&_end);
	void *to = (void *)CONFIG_PHYS_RAM_BASE;
	size_t sz = (size_t)(end - from + 1);

	memcpy(to, from, sz);
}
#endif

450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
#ifdef CONFIG_STRICT_KERNEL_RWX
static __init pgprot_t pgprot_from_va(uintptr_t va)
{
	if (is_va_kernel_text(va))
		return PAGE_KERNEL_READ_EXEC;

	/*
	 * In 64-bit kernel, the kernel mapping is outside the linear mapping so
	 * we must protect its linear mapping alias from being executed and
	 * written.
	 * And rodata section is marked readonly in mark_rodata_ro.
	 */
	if (IS_ENABLED(CONFIG_64BIT) && is_va_kernel_lm_alias_text(va))
		return PAGE_KERNEL_READ;

	return PAGE_KERNEL;
}

void mark_rodata_ro(void)
{
	set_kernel_memory(__start_rodata, _data, set_memory_ro);
	if (IS_ENABLED(CONFIG_64BIT))
		set_kernel_memory(lm_alias(__start_rodata), lm_alias(_data),
				  set_memory_ro);

	debug_checkwx();
}
#else
static __init pgprot_t pgprot_from_va(uintptr_t va)
{
	if (IS_ENABLED(CONFIG_64BIT) && !is_kernel_mapping(va))
		return PAGE_KERNEL;

	return PAGE_KERNEL_EXEC;
}
#endif /* CONFIG_STRICT_KERNEL_RWX */

487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
/*
 * setup_vm() is called from head.S with MMU-off.
 *
 * Following requirements should be honoured for setup_vm() to work
 * correctly:
 * 1) It should use PC-relative addressing for accessing kernel symbols.
 *    To achieve this we always use GCC cmodel=medany.
 * 2) The compiler instrumentation for FTRACE will not work for setup_vm()
 *    so disable compiler instrumentation when FTRACE is enabled.
 *
 * Currently, the above requirements are honoured by using custom CFLAGS
 * for init.o in mm/Makefile.
 */

#ifndef __riscv_cmodel_medany
502
#error "setup_vm() is called from head.S before relocate so it should not use absolute addressing."
503 504
#endif

V
Vitaly Wool 已提交
505
#ifdef CONFIG_XIP_KERNEL
506 507
static void __init create_kernel_page_table(pgd_t *pgdir, uintptr_t map_size,
					    __always_unused bool early)
V
Vitaly Wool 已提交
508 509 510 511
{
	uintptr_t va, end_va;

	/* Map the flash resident part */
512 513
	end_va = kernel_map.virt_addr + kernel_map.xiprom_sz;
	for (va = kernel_map.virt_addr; va < end_va; va += map_size)
V
Vitaly Wool 已提交
514
		create_pgd_mapping(pgdir, va,
515
				   kernel_map.xiprom + (va - kernel_map.virt_addr),
V
Vitaly Wool 已提交
516 517 518
				   map_size, PAGE_KERNEL_EXEC);

	/* Map the data in RAM */
519 520
	end_va = kernel_map.virt_addr + XIP_OFFSET + kernel_map.size;
	for (va = kernel_map.virt_addr + XIP_OFFSET; va < end_va; va += map_size)
V
Vitaly Wool 已提交
521
		create_pgd_mapping(pgdir, va,
522
				   kernel_map.phys_addr + (va - (kernel_map.virt_addr + XIP_OFFSET)),
V
Vitaly Wool 已提交
523 524 525
				   map_size, PAGE_KERNEL);
}
#else
526 527
static void __init create_kernel_page_table(pgd_t *pgdir, uintptr_t map_size,
					    bool early)
528 529 530
{
	uintptr_t va, end_va;

531 532
	end_va = kernel_map.virt_addr + kernel_map.size;
	for (va = kernel_map.virt_addr; va < end_va; va += map_size)
533
		create_pgd_mapping(pgdir, va,
534
				   kernel_map.phys_addr + (va - kernel_map.virt_addr),
535 536 537
				   map_size,
				   early ?
					PAGE_KERNEL_EXEC : pgprot_from_va(va));
538
}
V
Vitaly Wool 已提交
539
#endif
540

541
asmlinkage void __init setup_vm(uintptr_t dtb_pa)
542
{
V
Vitaly Wool 已提交
543
	uintptr_t __maybe_unused pa;
544
	uintptr_t map_size;
A
Atish Patra 已提交
545 546 547
#ifndef __PAGETABLE_PMD_FOLDED
	pmd_t fix_bmap_spmd, fix_bmap_epmd;
#endif
548

549 550
	kernel_map.virt_addr = KERNEL_LINK_ADDR;

V
Vitaly Wool 已提交
551
#ifdef CONFIG_XIP_KERNEL
552 553
	kernel_map.xiprom = (uintptr_t)CONFIG_XIP_PHYS_ADDR;
	kernel_map.xiprom_sz = (uintptr_t)(&_exiprom) - (uintptr_t)(&_xiprom);
V
Vitaly Wool 已提交
554

555 556
	kernel_map.phys_addr = (uintptr_t)CONFIG_PHYS_RAM_BASE;
	kernel_map.size = (uintptr_t)(&_end) - (uintptr_t)(&_sdata);
V
Vitaly Wool 已提交
557

558
	kernel_map.va_kernel_xip_pa_offset = kernel_map.virt_addr - kernel_map.xiprom;
V
Vitaly Wool 已提交
559
#else
560 561
	kernel_map.phys_addr = (uintptr_t)(&_start);
	kernel_map.size = (uintptr_t)(&_end) - kernel_map.phys_addr;
V
Vitaly Wool 已提交
562
#endif
563

564
	kernel_map.va_pa_offset = PAGE_OFFSET - kernel_map.phys_addr;
565
#ifdef CONFIG_64BIT
566
	kernel_map.va_kernel_pa_offset = kernel_map.virt_addr - kernel_map.phys_addr;
567 568
#endif

569
	pfn_base = PFN_DOWN(kernel_map.phys_addr);
570

571 572 573 574
	/*
	 * Enforce boot alignment requirements of RV32 and
	 * RV64 by only allowing PMD or PGD mappings.
	 */
575
	map_size = PMD_SIZE;
576 577 578

	/* Sanity check alignment and size */
	BUG_ON((PAGE_OFFSET % PGDIR_SIZE) != 0);
579
	BUG_ON((kernel_map.phys_addr % map_size) != 0);
580

581 582 583 584 585 586
	pt_ops.alloc_pte = alloc_pte_early;
	pt_ops.get_pte_virt = get_pte_virt_early;
#ifndef __PAGETABLE_PMD_FOLDED
	pt_ops.alloc_pmd = alloc_pmd_early;
	pt_ops.get_pmd_virt = get_pmd_virt_early;
#endif
587 588 589
	/* Setup early PGD for fixmap */
	create_pgd_mapping(early_pg_dir, FIXADDR_START,
			   (uintptr_t)fixmap_pgd_next, PGDIR_SIZE, PAGE_TABLE);
590 591

#ifndef __PAGETABLE_PMD_FOLDED
592 593 594 595
	/* Setup fixmap PMD */
	create_pmd_mapping(fixmap_pmd, FIXADDR_START,
			   (uintptr_t)fixmap_pte, PMD_SIZE, PAGE_TABLE);
	/* Setup trampoline PGD and PMD */
596
	create_pgd_mapping(trampoline_pg_dir, kernel_map.virt_addr,
597
			   (uintptr_t)trampoline_pmd, PGDIR_SIZE, PAGE_TABLE);
V
Vitaly Wool 已提交
598
#ifdef CONFIG_XIP_KERNEL
599 600
	create_pmd_mapping(trampoline_pmd, kernel_map.virt_addr,
			   kernel_map.xiprom, PMD_SIZE, PAGE_KERNEL_EXEC);
V
Vitaly Wool 已提交
601
#else
602 603
	create_pmd_mapping(trampoline_pmd, kernel_map.virt_addr,
			   kernel_map.phys_addr, PMD_SIZE, PAGE_KERNEL_EXEC);
V
Vitaly Wool 已提交
604
#endif
605 606
#else
	/* Setup trampoline PGD */
607 608
	create_pgd_mapping(trampoline_pg_dir, kernel_map.virt_addr,
			   kernel_map.phys_addr, PGDIR_SIZE, PAGE_KERNEL_EXEC);
609
#endif
610

611
	/*
612
	 * Setup early PGD covering entire kernel which will allow
613 614 615
	 * us to reach paging_init(). We map all memory banks later
	 * in setup_vm_final() below.
	 */
616
	create_kernel_page_table(early_pg_dir, map_size, true);
617

618 619 620 621
#ifndef __PAGETABLE_PMD_FOLDED
	/* Setup early PMD for DTB */
	create_pgd_mapping(early_pg_dir, DTB_EARLY_BASE_VA,
			   (uintptr_t)early_dtb_pmd, PGDIR_SIZE, PAGE_TABLE);
622
#ifndef CONFIG_BUILTIN_DTB
623 624 625 626 627 628 629
	/* Create two consecutive PMD mappings for FDT early scan */
	pa = dtb_pa & ~(PMD_SIZE - 1);
	create_pmd_mapping(early_dtb_pmd, DTB_EARLY_BASE_VA,
			   pa, PMD_SIZE, PAGE_KERNEL);
	create_pmd_mapping(early_dtb_pmd, DTB_EARLY_BASE_VA + PMD_SIZE,
			   pa + PMD_SIZE, PMD_SIZE, PAGE_KERNEL);
	dtb_early_va = (void *)DTB_EARLY_BASE_VA + (dtb_pa & (PMD_SIZE - 1));
630
#else /* CONFIG_BUILTIN_DTB */
631 632 633 634 635 636
#ifdef CONFIG_64BIT
	/*
	 * __va can't be used since it would return a linear mapping address
	 * whereas dtb_early_va will be used before setup_vm_final installs
	 * the linear mapping.
	 */
V
Vitaly Wool 已提交
637
	dtb_early_va = kernel_mapping_pa_to_va(XIP_FIXUP(dtb_pa));
638
#else
639
	dtb_early_va = __va(dtb_pa);
640
#endif /* CONFIG_64BIT */
641
#endif /* CONFIG_BUILTIN_DTB */
642
#else
643
#ifndef CONFIG_BUILTIN_DTB
A
Anup Patel 已提交
644 645 646 647 648 649 650
	/* Create two consecutive PGD mappings for FDT early scan */
	pa = dtb_pa & ~(PGDIR_SIZE - 1);
	create_pgd_mapping(early_pg_dir, DTB_EARLY_BASE_VA,
			   pa, PGDIR_SIZE, PAGE_KERNEL);
	create_pgd_mapping(early_pg_dir, DTB_EARLY_BASE_VA + PGDIR_SIZE,
			   pa + PGDIR_SIZE, PGDIR_SIZE, PAGE_KERNEL);
	dtb_early_va = (void *)DTB_EARLY_BASE_VA + (dtb_pa & (PGDIR_SIZE - 1));
651
#else /* CONFIG_BUILTIN_DTB */
652
#ifdef CONFIG_64BIT
V
Vitaly Wool 已提交
653
	dtb_early_va = kernel_mapping_pa_to_va(XIP_FIXUP(dtb_pa));
654
#else
655
	dtb_early_va = __va(dtb_pa);
656
#endif /* CONFIG_64BIT */
657
#endif /* CONFIG_BUILTIN_DTB */
658
#endif
659
	dtb_early_pa = dtb_pa;
A
Atish Patra 已提交
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689

	/*
	 * Bootime fixmap only can handle PMD_SIZE mapping. Thus, boot-ioremap
	 * range can not span multiple pmds.
	 */
	BUILD_BUG_ON((__fix_to_virt(FIX_BTMAP_BEGIN) >> PMD_SHIFT)
		     != (__fix_to_virt(FIX_BTMAP_END) >> PMD_SHIFT));

#ifndef __PAGETABLE_PMD_FOLDED
	/*
	 * Early ioremap fixmap is already created as it lies within first 2MB
	 * of fixmap region. We always map PMD_SIZE. Thus, both FIX_BTMAP_END
	 * FIX_BTMAP_BEGIN should lie in the same pmd. Verify that and warn
	 * the user if not.
	 */
	fix_bmap_spmd = fixmap_pmd[pmd_index(__fix_to_virt(FIX_BTMAP_BEGIN))];
	fix_bmap_epmd = fixmap_pmd[pmd_index(__fix_to_virt(FIX_BTMAP_END))];
	if (pmd_val(fix_bmap_spmd) != pmd_val(fix_bmap_epmd)) {
		WARN_ON(1);
		pr_warn("fixmap btmap start [%08lx] != end [%08lx]\n",
			pmd_val(fix_bmap_spmd), pmd_val(fix_bmap_epmd));
		pr_warn("fix_to_virt(FIX_BTMAP_BEGIN): %08lx\n",
			fix_to_virt(FIX_BTMAP_BEGIN));
		pr_warn("fix_to_virt(FIX_BTMAP_END):   %08lx\n",
			fix_to_virt(FIX_BTMAP_END));

		pr_warn("FIX_BTMAP_END:       %d\n", FIX_BTMAP_END);
		pr_warn("FIX_BTMAP_BEGIN:     %d\n", FIX_BTMAP_BEGIN);
	}
#endif
690
}
691

692 693 694 695
static void __init setup_vm_final(void)
{
	uintptr_t va, map_size;
	phys_addr_t pa, start, end;
696
	u64 i;
697

698 699 700 701 702 703 704 705 706 707
	/**
	 * MMU is enabled at this point. But page table setup is not complete yet.
	 * fixmap page table alloc functions should be used at this point
	 */
	pt_ops.alloc_pte = alloc_pte_fixmap;
	pt_ops.get_pte_virt = get_pte_virt_fixmap;
#ifndef __PAGETABLE_PMD_FOLDED
	pt_ops.alloc_pmd = alloc_pmd_fixmap;
	pt_ops.get_pmd_virt = get_pmd_virt_fixmap;
#endif
708 709
	/* Setup swapper PGD for fixmap */
	create_pgd_mapping(swapper_pg_dir, FIXADDR_START,
710
			   __pa_symbol(fixmap_pgd_next),
711
			   PGDIR_SIZE, PAGE_TABLE);
712

713
	/* Map all memory banks in the linear mapping */
714
	for_each_mem_range(i, &start, &end) {
715 716 717 718 719
		if (start >= end)
			break;
		if (start <= __pa(PAGE_OFFSET) &&
		    __pa(PAGE_OFFSET) < end)
			start = __pa(PAGE_OFFSET);
720 721
		if (end >= __pa(PAGE_OFFSET) + memory_limit)
			end = __pa(PAGE_OFFSET) + memory_limit;
722 723 724 725

		map_size = best_map_size(start, end - start);
		for (pa = start; pa < end; pa += map_size) {
			va = (uintptr_t)__va(pa);
726

727 728
			create_pgd_mapping(swapper_pg_dir, va, pa, map_size,
					   pgprot_from_va(va));
729
		}
730
	}
731

732 733
#ifdef CONFIG_64BIT
	/* Map the kernel */
734
	create_kernel_page_table(swapper_pg_dir, PMD_SIZE, false);
735 736
#endif

737 738 739 740 741
	/* Clear fixmap PTE and PMD mappings */
	clear_fixmap(FIX_PTE);
	clear_fixmap(FIX_PMD);

	/* Move to swapper page table */
742
	csr_write(CSR_SATP, PFN_DOWN(__pa_symbol(swapper_pg_dir)) | SATP_MODE);
743
	local_flush_tlb_all();
744 745 746 747 748 749 750 751

	/* generic page allocation functions must be used to setup page table */
	pt_ops.alloc_pte = alloc_pte_late;
	pt_ops.get_pte_virt = get_pte_virt_late;
#ifndef __PAGETABLE_PMD_FOLDED
	pt_ops.alloc_pmd = alloc_pmd_late;
	pt_ops.get_pmd_virt = get_pmd_virt_late;
#endif
752
}
C
Christoph Hellwig 已提交
753 754 755 756
#else
asmlinkage void __init setup_vm(uintptr_t dtb_pa)
{
	dtb_early_va = (void *)dtb_pa;
757
	dtb_early_pa = dtb_pa;
C
Christoph Hellwig 已提交
758 759 760 761 762 763
}

static inline void setup_vm_final(void)
{
}
#endif /* CONFIG_MMU */
764

N
Nick Kossifidis 已提交
765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781
#ifdef CONFIG_KEXEC_CORE
/*
 * reserve_crashkernel() - reserves memory for crash kernel
 *
 * This function reserves memory area given in "crashkernel=" kernel command
 * line parameter. The memory reserved is used by dump capture kernel when
 * primary kernel is crashing.
 */
static void __init reserve_crashkernel(void)
{
	unsigned long long crash_base = 0;
	unsigned long long crash_size = 0;
	unsigned long search_start = memblock_start_of_DRAM();
	unsigned long search_end = memblock_end_of_DRAM();

	int ret = 0;

782 783 784 785 786 787 788 789 790 791 792 793
	/*
	 * Don't reserve a region for a crash kernel on a crash kernel
	 * since it doesn't make much sense and we have limited memory
	 * resources.
	 */
#ifdef CONFIG_CRASH_DUMP
	if (is_kdump_kernel()) {
		pr_info("crashkernel: ignoring reservation request\n");
		return;
	}
#endif

N
Nick Kossifidis 已提交
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841
	ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
				&crash_size, &crash_base);
	if (ret || !crash_size)
		return;

	crash_size = PAGE_ALIGN(crash_size);

	if (crash_base == 0) {
		/*
		 * Current riscv boot protocol requires 2MB alignment for
		 * RV64 and 4MB alignment for RV32 (hugepage size)
		 */
		crash_base = memblock_find_in_range(search_start, search_end,
						    crash_size, PMD_SIZE);

		if (crash_base == 0) {
			pr_warn("crashkernel: couldn't allocate %lldKB\n",
				crash_size >> 10);
			return;
		}
	} else {
		/* User specifies base address explicitly. */
		if (!memblock_is_region_memory(crash_base, crash_size)) {
			pr_warn("crashkernel: requested region is not memory\n");
			return;
		}

		if (memblock_is_region_reserved(crash_base, crash_size)) {
			pr_warn("crashkernel: requested region is reserved\n");
			return;
		}


		if (!IS_ALIGNED(crash_base, PMD_SIZE)) {
			pr_warn("crashkernel: requested region is misaligned\n");
			return;
		}
	}
	memblock_reserve(crash_base, crash_size);

	pr_info("crashkernel: reserved 0x%016llx - 0x%016llx (%lld MB)\n",
		crash_base, crash_base + crash_size, crash_size >> 20);

	crashk_res.start = crash_base;
	crashk_res.end = crash_base + crash_size - 1;
}
#endif /* CONFIG_KEXEC_CORE */

842 843 844 845 846 847 848 849 850 851
#ifdef CONFIG_CRASH_DUMP
/*
 * We keep track of the ELF core header of the crashed
 * kernel with a reserved-memory region with compatible
 * string "linux,elfcorehdr". Here we register a callback
 * to populate elfcorehdr_addr/size when this region is
 * present. Note that this region will be marked as
 * reserved once we call early_init_fdt_scan_reserved_mem()
 * later on.
 */
852
static int __init elfcore_hdr_setup(struct reserved_mem *rmem)
853 854 855 856 857 858 859 860 861
{
	elfcorehdr_addr = rmem->base;
	elfcorehdr_size = rmem->size;
	return 0;
}

RESERVEDMEM_OF_DECLARE(elfcorehdr, "linux,elfcorehdr", elfcore_hdr_setup);
#endif

862 863
void __init paging_init(void)
{
864
	setup_bootmem();
865
	setup_vm_final();
866 867 868 869
}

void __init misc_mem_init(void)
{
K
Kefeng Wang 已提交
870
	early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
871
	arch_numa_init();
872
	sparse_init();
873
	zone_sizes_init();
N
Nick Kossifidis 已提交
874 875 876
#ifdef CONFIG_KEXEC_CORE
	reserve_crashkernel();
#endif
877
	memblock_dump_all();
878
}
L
Logan Gunthorpe 已提交
879

880
#ifdef CONFIG_SPARSEMEM_VMEMMAP
L
Logan Gunthorpe 已提交
881 882 883
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
			       struct vmem_altmap *altmap)
{
884
	return vmemmap_populate_basepages(start, end, node, NULL);
L
Logan Gunthorpe 已提交
885 886
}
#endif