init.c 23.7 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>
22
#include <linux/hugetlb.h>
P
Palmer Dabbelt 已提交
23

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

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

34 35 36 37 38 39
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

40 41 42
phys_addr_t phys_ram_base __ro_after_init;
EXPORT_SYMBOL(phys_ram_base);

V
Vitaly Wool 已提交
43
#ifdef CONFIG_XIP_KERNEL
44
extern char _xiprom[], _exiprom[], __data_loc;
V
Vitaly Wool 已提交
45
#endif
46

47 48 49 50
unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
							__page_aligned_bss;
EXPORT_SYMBOL(empty_zero_page);

51
extern char _start[];
A
Anup Patel 已提交
52
#define DTB_EARLY_BASE_VA      PGDIR_SIZE
V
Vitaly Wool 已提交
53 54
void *_dtb_early_va __initdata;
uintptr_t _dtb_early_pa __initdata;
55

56 57 58 59 60 61 62 63
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
};
64

65
static phys_addr_t dma32_phys_limit __initdata;
K
Kefeng Wang 已提交
66

P
Palmer Dabbelt 已提交
67 68
static void __init zone_sizes_init(void)
{
C
Christoph Hellwig 已提交
69
	unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, };
P
Palmer Dabbelt 已提交
70

71
#ifdef CONFIG_ZONE_DMA32
K
Kefeng Wang 已提交
72
	max_zone_pfns[ZONE_DMA32] = PFN_DOWN(dma32_phys_limit);
73
#endif
C
Christoph Hellwig 已提交
74 75
	max_zone_pfns[ZONE_NORMAL] = max_low_pfn;

76
	free_area_init(max_zone_pfns);
P
Palmer Dabbelt 已提交
77 78
}

79
#if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM)
Y
Yash Shah 已提交
80 81 82 83 84 85 86 87 88 89 90 91
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));
}

92
static void __init print_vm_layout(void)
Y
Yash Shah 已提交
93 94 95 96 97 98 99 100 101 102 103 104
{
	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);
105 106 107 108
#ifdef CONFIG_64BIT
	print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR,
		  (unsigned long)ADDRESS_SPACE_END);
#endif
Y
Yash Shah 已提交
109 110 111 112 113
}
#else
static void print_vm_layout(void) { }
#endif /* CONFIG_DEBUG_VM */

P
Palmer Dabbelt 已提交
114 115 116 117 118 119
void __init mem_init(void)
{
#ifdef CONFIG_FLATMEM
	BUG_ON(!mem_map);
#endif /* CONFIG_FLATMEM */

120 121 122 123 124 125 126
#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 已提交
127
	high_memory = (void *)(__va(PFN_PHYS(max_low_pfn)));
128
	memblock_free_all();
P
Palmer Dabbelt 已提交
129

Y
Yash Shah 已提交
130
	print_vm_layout();
P
Palmer Dabbelt 已提交
131 132
}

133
/*
134 135 136 137 138
 * 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.
139
 */
140 141 142
#ifdef CONFIG_64BIT
static phys_addr_t memory_limit = -PAGE_OFFSET - SZ_4G;
#else
143
static phys_addr_t memory_limit = -PAGE_OFFSET;
144
#endif
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161

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);

162
static void __init setup_bootmem(void)
163
{
164 165
	phys_addr_t vmlinux_end = __pa_symbol(&_end);
	phys_addr_t vmlinux_start = __pa_symbol(&_start);
166
	phys_addr_t __maybe_unused max_mapped_addr;
167
	phys_addr_t phys_ram_end;
168

V
Vitaly Wool 已提交
169 170 171 172
#ifdef CONFIG_XIP_KERNEL
	vmlinux_start = __pa_symbol(&_sdata);
#endif

173
	memblock_enforce_memory_limit(memory_limit);
174

175 176
	/*
	 * Reserve from the start of the kernel to the end of the kernel
177 178 179 180
	 */
#if defined(CONFIG_64BIT) && defined(CONFIG_STRICT_KERNEL_RWX)
	/*
	 * Make sure we align the reservation on PMD_SIZE since we will
181 182 183
	 * 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.
	 */
184 185 186
	vmlinux_end = (vmlinux_end + PMD_SIZE - 1) & PMD_MASK;
#endif
	memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start);
187

B
Bin Meng 已提交
188

189
	phys_ram_end = memblock_end_of_DRAM();
190
#ifndef CONFIG_64BIT
191 192 193
#ifndef CONFIG_XIP_KERNEL
	phys_ram_base = memblock_start_of_DRAM();
#endif
A
Atish Patra 已提交
194 195 196 197
	/*
	 * 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
198 199 200
	 * if end of dram is equal to maximum addressable memory.  For 64-bit
	 * kernel, this problem can't happen here as the end of the virtual
	 * address space is occupied by the kernel mapping then this check must
201
	 * be done as soon as the kernel mapping base address is determined.
A
Atish Patra 已提交
202
	 */
203
	max_mapped_addr = __pa(~(ulong)0);
204
	if (max_mapped_addr == (phys_ram_end - 1))
A
Atish Patra 已提交
205
		memblock_set_current_limit(max_mapped_addr - 4096);
206
#endif
A
Atish Patra 已提交
207

208 209
	min_low_pfn = PFN_UP(phys_ram_base);
	max_low_pfn = max_pfn = PFN_DOWN(phys_ram_end);
K
Kefeng Wang 已提交
210

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

214
	reserve_initrd_mem();
215
	/*
216 217 218
	 * 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
219 220
	 * not work for DTB pointers that are fixmap addresses
	 */
221 222
	if (!IS_ENABLED(CONFIG_BUILTIN_DTB))
		memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va));
223

224
	early_init_fdt_scan_reserved_mem();
K
Kefeng Wang 已提交
225
	dma_contiguous_reserve(dma32_phys_limit);
226 227
	if (IS_ENABLED(CONFIG_64BIT))
		hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT);
228 229
	memblock_allow_resize();
}
230

C
Christoph Hellwig 已提交
231
#ifdef CONFIG_MMU
232
static struct pt_alloc_ops _pt_ops __initdata;
V
Vitaly Wool 已提交
233 234 235 236 237 238

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

240 241
unsigned long riscv_pfn_base __ro_after_init;
EXPORT_SYMBOL(riscv_pfn_base);
242

243
pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss;
244
pgd_t trampoline_pg_dir[PTRS_PER_PGD] __page_aligned_bss;
245
static pte_t fixmap_pte[PTRS_PER_PTE] __page_aligned_bss;
246

247
pgd_t early_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE);
248
static pmd_t __maybe_unused early_dtb_pmd[PTRS_PER_PMD] __initdata __aligned(PAGE_SIZE);
249

V
Vitaly Wool 已提交
250 251 252 253 254 255
#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 */

256 257 258 259 260 261 262 263 264
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)];

265
	if (pgprot_val(prot))
266
		set_pte(ptep, pfn_pte(phys >> PAGE_SHIFT, prot));
267
	else
268
		pte_clear(&init_mm, addr, ptep);
269
	local_flush_tlb_page(addr);
270 271
}

272
static inline pte_t *__init get_pte_virt_early(phys_addr_t pa)
273
{
274
	return (pte_t *)((uintptr_t)pa);
275 276
}

277 278 279 280 281 282
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);
}

283
static inline pte_t *__init get_pte_virt_late(phys_addr_t pa)
284 285 286 287 288
{
	return (pte_t *) __va(pa);
}

static inline phys_addr_t __init alloc_pte_early(uintptr_t va)
289 290 291 292 293
{
	/*
	 * We only create PMD or PGD early mappings so we
	 * should never reach here with MMU disabled.
	 */
294 295
	BUG();
}
296

297 298
static inline phys_addr_t __init alloc_pte_fixmap(uintptr_t va)
{
299 300 301
	return memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
}

302
static phys_addr_t __init alloc_pte_late(uintptr_t va)
303 304 305 306
{
	unsigned long vaddr;

	vaddr = __get_free_page(GFP_KERNEL);
307 308
	BUG_ON(!vaddr || !pgtable_pte_page_ctor(virt_to_page(vaddr)));

309 310 311
	return __pa(vaddr);
}

312 313 314 315
static void __init create_pte_mapping(pte_t *ptep,
				      uintptr_t va, phys_addr_t pa,
				      phys_addr_t sz, pgprot_t prot)
{
316
	uintptr_t pte_idx = pte_index(va);
317 318 319

	BUG_ON(sz != PAGE_SIZE);

320 321
	if (pte_none(ptep[pte_idx]))
		ptep[pte_idx] = pfn_pte(PFN_DOWN(pa), prot);
322 323 324 325
}

#ifndef __PAGETABLE_PMD_FOLDED

326 327 328
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);
329

V
Vitaly Wool 已提交
330 331 332 333 334 335
#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 */

336
static pmd_t *__init get_pmd_virt_early(phys_addr_t pa)
337
{
338 339
	/* Before MMU is enabled */
	return (pmd_t *)((uintptr_t)pa);
340 341
}

342
static pmd_t *__init get_pmd_virt_fixmap(phys_addr_t pa)
343
{
344 345 346
	clear_fixmap(FIX_PMD);
	return (pmd_t *)set_fixmap_offset(FIX_PMD, pa);
}
347

348
static pmd_t *__init get_pmd_virt_late(phys_addr_t pa)
349 350 351
{
	return (pmd_t *) __va(pa);
}
352

353 354
static phys_addr_t __init alloc_pmd_early(uintptr_t va)
{
355
	BUG_ON((va - kernel_map.virt_addr) >> PGDIR_SHIFT);
356

357
	return (uintptr_t)early_pmd;
358 359
}

360 361 362 363 364
static phys_addr_t __init alloc_pmd_fixmap(uintptr_t va)
{
	return memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
}

365
static phys_addr_t __init alloc_pmd_late(uintptr_t va)
366 367 368 369 370 371 372 373
{
	unsigned long vaddr;

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

374 375 376 377 378 379
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;
380
	uintptr_t pmd_idx = pmd_index(va);
381 382

	if (sz == PMD_SIZE) {
383 384
		if (pmd_none(pmdp[pmd_idx]))
			pmdp[pmd_idx] = pfn_pmd(PFN_DOWN(pa), prot);
385 386 387
		return;
	}

388
	if (pmd_none(pmdp[pmd_idx])) {
389
		pte_phys = pt_ops.alloc_pte(va);
390
		pmdp[pmd_idx] = pfn_pmd(PFN_DOWN(pte_phys), PAGE_TABLE);
391
		ptep = pt_ops.get_pte_virt(pte_phys);
392 393
		memset(ptep, 0, PAGE_SIZE);
	} else {
394
		pte_phys = PFN_PHYS(_pmd_pfn(pmdp[pmd_idx]));
395
		ptep = pt_ops.get_pte_virt(pte_phys);
396 397 398 399 400 401
	}

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

#define pgd_next_t		pmd_t
402 403
#define alloc_pgd_next(__va)	pt_ops.alloc_pmd(__va)
#define get_pgd_next_virt(__pa)	pt_ops.get_pmd_virt(__pa)
404 405 406 407 408
#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
409 410
#define alloc_pgd_next(__va)	pt_ops.alloc_pte(__va)
#define get_pgd_next_virt(__pa)	pt_ops.get_pte_virt(__pa)
411 412 413
#define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot)	\
	create_pte_mapping(__nextp, __va, __pa, __sz, __prot)
#define fixmap_pgd_next		fixmap_pte
414
#define create_pmd_mapping(__pmdp, __va, __pa, __sz, __prot)
415 416
#endif

A
Atish Patra 已提交
417
void __init create_pgd_mapping(pgd_t *pgdp,
418 419 420 421 422
				      uintptr_t va, phys_addr_t pa,
				      phys_addr_t sz, pgprot_t prot)
{
	pgd_next_t *nextp;
	phys_addr_t next_phys;
423
	uintptr_t pgd_idx = pgd_index(va);
424 425

	if (sz == PGDIR_SIZE) {
426 427
		if (pgd_val(pgdp[pgd_idx]) == 0)
			pgdp[pgd_idx] = pfn_pgd(PFN_DOWN(pa), prot);
428 429 430
		return;
	}

431
	if (pgd_val(pgdp[pgd_idx]) == 0) {
432
		next_phys = alloc_pgd_next(va);
433
		pgdp[pgd_idx] = pfn_pgd(PFN_DOWN(next_phys), PAGE_TABLE);
434 435 436
		nextp = get_pgd_next_virt(next_phys);
		memset(nextp, 0, PAGE_SIZE);
	} else {
437
		next_phys = PFN_PHYS(_pgd_pfn(pgdp[pgd_idx]));
438 439 440 441 442 443 444 445
		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)
{
446 447 448
	/* Upgrade to PMD_SIZE mappings whenever possible */
	if ((base & (PMD_SIZE - 1)) || (size & (PMD_SIZE - 1)))
		return PAGE_SIZE;
449

450
	return PMD_SIZE;
451 452
}

V
Vitaly Wool 已提交
453 454 455 456
#ifdef CONFIG_XIP_KERNEL
/* called from head.S with MMU off */
asmlinkage void __init __copy_data(void)
{
457
	void *from = (void *)(&__data_loc);
V
Vitaly Wool 已提交
458
	void *to = (void *)CONFIG_PHYS_RAM_BASE;
459
	size_t sz = (size_t)((uintptr_t)(&_end) - (uintptr_t)(&_sdata));
V
Vitaly Wool 已提交
460 461 462 463 464

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

465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
#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 */

502 503 504 505 506 507 508 509 510 511 512 513 514 515 516
/*
 * 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
517
#error "setup_vm() is called from head.S before relocate so it should not use absolute addressing."
518 519
#endif

V
Vitaly Wool 已提交
520
#ifdef CONFIG_XIP_KERNEL
521
static void __init create_kernel_page_table(pgd_t *pgdir,
522
					    __always_unused bool early)
V
Vitaly Wool 已提交
523 524 525 526
{
	uintptr_t va, end_va;

	/* Map the flash resident part */
527
	end_va = kernel_map.virt_addr + kernel_map.xiprom_sz;
528
	for (va = kernel_map.virt_addr; va < end_va; va += PMD_SIZE)
V
Vitaly Wool 已提交
529
		create_pgd_mapping(pgdir, va,
530
				   kernel_map.xiprom + (va - kernel_map.virt_addr),
531
				   PMD_SIZE, PAGE_KERNEL_EXEC);
V
Vitaly Wool 已提交
532 533

	/* Map the data in RAM */
534
	end_va = kernel_map.virt_addr + XIP_OFFSET + kernel_map.size;
535
	for (va = kernel_map.virt_addr + XIP_OFFSET; va < end_va; va += PMD_SIZE)
V
Vitaly Wool 已提交
536
		create_pgd_mapping(pgdir, va,
537
				   kernel_map.phys_addr + (va - (kernel_map.virt_addr + XIP_OFFSET)),
538
				   PMD_SIZE, PAGE_KERNEL);
V
Vitaly Wool 已提交
539 540
}
#else
541
static void __init create_kernel_page_table(pgd_t *pgdir, bool early)
542 543 544
{
	uintptr_t va, end_va;

545
	end_va = kernel_map.virt_addr + kernel_map.size;
546
	for (va = kernel_map.virt_addr; va < end_va; va += PMD_SIZE)
547
		create_pgd_mapping(pgdir, va,
548
				   kernel_map.phys_addr + (va - kernel_map.virt_addr),
549
				   PMD_SIZE,
550 551
				   early ?
					PAGE_KERNEL_EXEC : pgprot_from_va(va));
552
}
V
Vitaly Wool 已提交
553
#endif
554

555 556 557 558 559 560
/*
 * Setup a 4MB mapping that encompasses the device tree: for 64-bit kernel,
 * this means 2 PMD entries whereas for 32-bit kernel, this is only 1 PGDIR
 * entry.
 */
static void __init create_fdt_early_page_table(pgd_t *pgdir, uintptr_t dtb_pa)
561
{
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
#ifndef CONFIG_BUILTIN_DTB
	uintptr_t pa = dtb_pa & ~(PMD_SIZE - 1);

	create_pgd_mapping(early_pg_dir, DTB_EARLY_BASE_VA,
			   IS_ENABLED(CONFIG_64BIT) ? (uintptr_t)early_dtb_pmd : pa,
			   PGDIR_SIZE,
			   IS_ENABLED(CONFIG_64BIT) ? PAGE_TABLE : PAGE_KERNEL);

	if (IS_ENABLED(CONFIG_64BIT)) {
		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));
#else
	/*
	 * For 64-bit kernel, __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. For 32-bit kernel, as the
	 * kernel is mapped in the linear mapping, that makes no difference.
	 */
	dtb_early_va = kernel_mapping_pa_to_va(XIP_FIXUP(dtb_pa));
A
Atish Patra 已提交
586
#endif
587

588 589 590
	dtb_early_pa = dtb_pa;
}

591
asmlinkage void __init setup_vm(uintptr_t dtb_pa)
592
{
593
	pmd_t __maybe_unused fix_bmap_spmd, fix_bmap_epmd;
594

595 596
	kernel_map.virt_addr = KERNEL_LINK_ADDR;

V
Vitaly Wool 已提交
597
#ifdef CONFIG_XIP_KERNEL
598 599
	kernel_map.xiprom = (uintptr_t)CONFIG_XIP_PHYS_ADDR;
	kernel_map.xiprom_sz = (uintptr_t)(&_exiprom) - (uintptr_t)(&_xiprom);
V
Vitaly Wool 已提交
600

601
	phys_ram_base = CONFIG_PHYS_RAM_BASE;
602 603
	kernel_map.phys_addr = (uintptr_t)CONFIG_PHYS_RAM_BASE;
	kernel_map.size = (uintptr_t)(&_end) - (uintptr_t)(&_sdata);
V
Vitaly Wool 已提交
604

605
	kernel_map.va_kernel_xip_pa_offset = kernel_map.virt_addr - kernel_map.xiprom;
V
Vitaly Wool 已提交
606
#else
607 608
	kernel_map.phys_addr = (uintptr_t)(&_start);
	kernel_map.size = (uintptr_t)(&_end) - kernel_map.phys_addr;
V
Vitaly Wool 已提交
609
#endif
610 611
	kernel_map.va_pa_offset = PAGE_OFFSET - kernel_map.phys_addr;
	kernel_map.va_kernel_pa_offset = kernel_map.virt_addr - kernel_map.phys_addr;
612

613
	riscv_pfn_base = PFN_DOWN(kernel_map.phys_addr);
614 615 616

	/* Sanity check alignment and size */
	BUG_ON((PAGE_OFFSET % PGDIR_SIZE) != 0);
617
	BUG_ON((kernel_map.phys_addr % PMD_SIZE) != 0);
618

619 620 621 622 623 624 625 626
#ifdef CONFIG_64BIT
	/*
	 * The last 4K bytes of the addressable memory can not be mapped because
	 * of IS_ERR_VALUE macro.
	 */
	BUG_ON((kernel_map.virt_addr + kernel_map.size) > ADDRESS_SPACE_END - SZ_4K);
#endif

627 628 629 630 631 632
	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
633 634 635
	/* Setup early PGD for fixmap */
	create_pgd_mapping(early_pg_dir, FIXADDR_START,
			   (uintptr_t)fixmap_pgd_next, PGDIR_SIZE, PAGE_TABLE);
636 637

#ifndef __PAGETABLE_PMD_FOLDED
638 639 640 641
	/* Setup fixmap PMD */
	create_pmd_mapping(fixmap_pmd, FIXADDR_START,
			   (uintptr_t)fixmap_pte, PMD_SIZE, PAGE_TABLE);
	/* Setup trampoline PGD and PMD */
642
	create_pgd_mapping(trampoline_pg_dir, kernel_map.virt_addr,
643
			   (uintptr_t)trampoline_pmd, PGDIR_SIZE, PAGE_TABLE);
V
Vitaly Wool 已提交
644
#ifdef CONFIG_XIP_KERNEL
645 646
	create_pmd_mapping(trampoline_pmd, kernel_map.virt_addr,
			   kernel_map.xiprom, PMD_SIZE, PAGE_KERNEL_EXEC);
V
Vitaly Wool 已提交
647
#else
648 649
	create_pmd_mapping(trampoline_pmd, kernel_map.virt_addr,
			   kernel_map.phys_addr, PMD_SIZE, PAGE_KERNEL_EXEC);
V
Vitaly Wool 已提交
650
#endif
651 652
#else
	/* Setup trampoline PGD */
653 654
	create_pgd_mapping(trampoline_pg_dir, kernel_map.virt_addr,
			   kernel_map.phys_addr, PGDIR_SIZE, PAGE_KERNEL_EXEC);
655
#endif
656

657
	/*
658
	 * Setup early PGD covering entire kernel which will allow
659 660 661
	 * us to reach paging_init(). We map all memory banks later
	 * in setup_vm_final() below.
	 */
662
	create_kernel_page_table(early_pg_dir, true);
663

664 665
	/* Setup early mapping for FDT early scan */
	create_fdt_early_page_table(early_pg_dir, dtb_pa);
A
Atish Patra 已提交
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695

	/*
	 * 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
696
}
697

698 699 700 701
static void __init setup_vm_final(void)
{
	uintptr_t va, map_size;
	phys_addr_t pa, start, end;
702
	u64 i;
703

704 705 706 707 708 709 710 711 712 713
	/**
	 * 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
714 715
	/* Setup swapper PGD for fixmap */
	create_pgd_mapping(swapper_pg_dir, FIXADDR_START,
716
			   __pa_symbol(fixmap_pgd_next),
717
			   PGDIR_SIZE, PAGE_TABLE);
718

719
	/* Map all memory banks in the linear mapping */
720
	for_each_mem_range(i, &start, &end) {
721 722 723 724 725
		if (start >= end)
			break;
		if (start <= __pa(PAGE_OFFSET) &&
		    __pa(PAGE_OFFSET) < end)
			start = __pa(PAGE_OFFSET);
726 727
		if (end >= __pa(PAGE_OFFSET) + memory_limit)
			end = __pa(PAGE_OFFSET) + memory_limit;
728 729 730 731

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

733 734
			create_pgd_mapping(swapper_pg_dir, va, pa, map_size,
					   pgprot_from_va(va));
735
		}
736
	}
737

738 739
#ifdef CONFIG_64BIT
	/* Map the kernel */
740
	create_kernel_page_table(swapper_pg_dir, false);
741 742
#endif

743 744 745 746 747
	/* Clear fixmap PTE and PMD mappings */
	clear_fixmap(FIX_PTE);
	clear_fixmap(FIX_PMD);

	/* Move to swapper page table */
748
	csr_write(CSR_SATP, PFN_DOWN(__pa_symbol(swapper_pg_dir)) | SATP_MODE);
749
	local_flush_tlb_all();
750 751 752 753 754 755 756 757

	/* 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
758
}
C
Christoph Hellwig 已提交
759 760 761 762
#else
asmlinkage void __init setup_vm(uintptr_t dtb_pa)
{
	dtb_early_va = (void *)dtb_pa;
763
	dtb_early_pa = dtb_pa;
C
Christoph Hellwig 已提交
764 765 766 767 768 769
}

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

N
Nick Kossifidis 已提交
771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
#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;

788 789 790 791 792 793 794 795 796 797 798 799
	/*
	 * 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 已提交
800 801 802 803 804 805 806
	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);

807 808 809 810
	if (crash_base) {
		search_start = crash_base;
		search_end = crash_base + crash_size;
	}
N
Nick Kossifidis 已提交
811

812 813 814 815 816 817 818 819 820 821
	/*
	 * Current riscv boot protocol requires 2MB alignment for
	 * RV64 and 4MB alignment for RV32 (hugepage size)
	 */
	crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
					       search_start, search_end);
	if (crash_base == 0) {
		pr_warn("crashkernel: couldn't allocate %lldKB\n",
			crash_size >> 10);
		return;
N
Nick Kossifidis 已提交
822 823 824 825 826 827 828 829 830 831
	}

	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 */

832 833
void __init paging_init(void)
{
834
	setup_bootmem();
835
	setup_vm_final();
836 837 838 839
}

void __init misc_mem_init(void)
{
K
Kefeng Wang 已提交
840
	early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
841
	arch_numa_init();
842
	sparse_init();
843
	zone_sizes_init();
N
Nick Kossifidis 已提交
844 845 846
#ifdef CONFIG_KEXEC_CORE
	reserve_crashkernel();
#endif
847
	memblock_dump_all();
848
}
L
Logan Gunthorpe 已提交
849

850
#ifdef CONFIG_SPARSEMEM_VMEMMAP
L
Logan Gunthorpe 已提交
851 852 853
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
			       struct vmem_altmap *altmap)
{
854
	return vmemmap_populate_basepages(start, end, node, NULL);
L
Logan Gunthorpe 已提交
855 856
}
#endif