Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/powerpc/mm/init_32.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* PowerPC version
4
* Copyright (C) 1995-1996 Gary Thomas ([email protected])
5
*
6
* Modifications by Paul Mackerras (PowerMac) ([email protected])
7
* and Cort Dougan (PReP) ([email protected])
8
* Copyright (C) 1996 Paul Mackerras
9
* PPC44x/36-bit changes by Matt Porter ([email protected])
10
*
11
* Derived from "arch/i386/mm/init.c"
12
* Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
13
*/
14
15
#include <linux/module.h>
16
#include <linux/sched.h>
17
#include <linux/kernel.h>
18
#include <linux/errno.h>
19
#include <linux/string.h>
20
#include <linux/types.h>
21
#include <linux/mm.h>
22
#include <linux/stddef.h>
23
#include <linux/init.h>
24
#include <linux/highmem.h>
25
#include <linux/initrd.h>
26
#include <linux/pagemap.h>
27
#include <linux/memblock.h>
28
#include <linux/gfp.h>
29
#include <linux/slab.h>
30
#include <linux/hugetlb.h>
31
32
#include <asm/io.h>
33
#include <asm/mmu.h>
34
#include <asm/smp.h>
35
#include <asm/machdep.h>
36
#include <asm/btext.h>
37
#include <asm/tlb.h>
38
#include <asm/sections.h>
39
#include <asm/hugetlb.h>
40
#include <asm/kup.h>
41
#include <asm/kasan.h>
42
#include <asm/fixmap.h>
43
44
#include <mm/mmu_decl.h>
45
46
#if defined(CONFIG_KERNEL_START_BOOL) || defined(CONFIG_LOWMEM_SIZE_BOOL)
47
/* The amount of lowmem must be within 0xF0000000 - KERNELBASE. */
48
#if (CONFIG_LOWMEM_SIZE > (0xF0000000 - PAGE_OFFSET))
49
#error "You must adjust CONFIG_LOWMEM_SIZE or CONFIG_KERNEL_START"
50
#endif
51
#endif
52
#define MAX_LOW_MEM CONFIG_LOWMEM_SIZE
53
54
phys_addr_t total_memory;
55
phys_addr_t total_lowmem;
56
57
#ifdef CONFIG_RELOCATABLE
58
/* Used in __va()/__pa() */
59
long long virt_phys_offset;
60
EXPORT_SYMBOL(virt_phys_offset);
61
#endif
62
63
phys_addr_t lowmem_end_addr;
64
65
int boot_mapsize;
66
#ifdef CONFIG_PPC_PMAC
67
unsigned long agp_special_page;
68
EXPORT_SYMBOL(agp_special_page);
69
#endif
70
71
void MMU_init(void);
72
73
/* max amount of low RAM to map in */
74
unsigned long __max_low_memory = MAX_LOW_MEM;
75
76
/*
77
* MMU_init sets up the basic memory mappings for the kernel,
78
* including both RAM and possibly some I/O regions,
79
* and sets up the page tables and the MMU hardware ready to go.
80
*/
81
void __init MMU_init(void)
82
{
83
if (ppc_md.progress)
84
ppc_md.progress("MMU:enter", 0x111);
85
86
total_lowmem = total_memory = memblock_end_of_DRAM() - memstart_addr;
87
lowmem_end_addr = memstart_addr + total_lowmem;
88
89
#ifdef CONFIG_PPC_85xx
90
/* Freescale Book-E parts expect lowmem to be mapped by fixed TLB
91
* entries, so we need to adjust lowmem to match the amount we can map
92
* in the fixed entries */
93
adjust_total_lowmem();
94
#endif /* CONFIG_PPC_85xx */
95
96
if (total_lowmem > __max_low_memory) {
97
total_lowmem = __max_low_memory;
98
lowmem_end_addr = memstart_addr + total_lowmem;
99
#ifndef CONFIG_HIGHMEM
100
total_memory = total_lowmem;
101
memblock_enforce_memory_limit(total_lowmem);
102
#endif /* CONFIG_HIGHMEM */
103
}
104
105
/* Initialize the MMU hardware */
106
if (ppc_md.progress)
107
ppc_md.progress("MMU:hw init", 0x300);
108
MMU_init_hw();
109
110
/* Map in all of RAM starting at KERNELBASE */
111
if (ppc_md.progress)
112
ppc_md.progress("MMU:mapin", 0x301);
113
mapin_ram();
114
115
/* Initialize early top-down ioremap allocator */
116
ioremap_bot = IOREMAP_TOP;
117
118
if (ppc_md.progress)
119
ppc_md.progress("MMU:exit", 0x211);
120
121
/* From now on, btext is no longer BAT mapped if it was at all */
122
#ifdef CONFIG_BOOTX_TEXT
123
btext_unmap();
124
#endif
125
126
kasan_mmu_init();
127
128
setup_kup();
129
130
update_mmu_feature_fixups(MMU_FTR_KUAP);
131
132
/* Shortly after that, the entire linear mapping will be available */
133
memblock_set_current_limit(lowmem_end_addr);
134
}
135
136