diff options
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/mm/init.c | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c index 802bdd32aa2b..c52497bb102a 100644 --- a/arch/mips/mm/init.c +++ b/arch/mips/mm/init.c | |||
@@ -139,10 +139,36 @@ void __init fixrange_init(unsigned long start, unsigned long end, | |||
139 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 139 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
140 | extern void pagetable_init(void); | 140 | extern void pagetable_init(void); |
141 | 141 | ||
142 | static int __init page_is_ram(unsigned long pagenr) | ||
143 | { | ||
144 | int i; | ||
145 | |||
146 | for (i = 0; i < boot_mem_map.nr_map; i++) { | ||
147 | unsigned long addr, end; | ||
148 | |||
149 | if (boot_mem_map.map[i].type != BOOT_MEM_RAM) | ||
150 | /* not usable memory */ | ||
151 | continue; | ||
152 | |||
153 | addr = PFN_UP(boot_mem_map.map[i].addr); | ||
154 | end = PFN_DOWN(boot_mem_map.map[i].addr + | ||
155 | boot_mem_map.map[i].size); | ||
156 | |||
157 | if (pagenr >= addr && pagenr < end) | ||
158 | return 1; | ||
159 | } | ||
160 | |||
161 | return 0; | ||
162 | } | ||
163 | |||
142 | void __init paging_init(void) | 164 | void __init paging_init(void) |
143 | { | 165 | { |
144 | unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0}; | 166 | unsigned long zones_size[] = { [0 ... MAX_NR_ZONES - 1] = 0 }; |
145 | unsigned long max_dma, high, low; | 167 | unsigned long max_dma, high, low; |
168 | #ifndef CONFIG_FLATMEM | ||
169 | unsigned long zholes_size[] = { [0 ... MAX_NR_ZONES - 1] = 0 }; | ||
170 | unsigned long i, j, pfn; | ||
171 | #endif | ||
146 | 172 | ||
147 | pagetable_init(); | 173 | pagetable_init(); |
148 | 174 | ||
@@ -174,29 +200,16 @@ void __init paging_init(void) | |||
174 | zones_size[ZONE_HIGHMEM] = high - low; | 200 | zones_size[ZONE_HIGHMEM] = high - low; |
175 | #endif | 201 | #endif |
176 | 202 | ||
203 | #ifdef CONFIG_FLATMEM | ||
177 | free_area_init(zones_size); | 204 | free_area_init(zones_size); |
178 | } | 205 | #else |
179 | 206 | pfn = 0; | |
180 | static inline int page_is_ram(unsigned long pagenr) | 207 | for (i = 0; i < MAX_NR_ZONES; i++) |
181 | { | 208 | for (j = 0; j < zones_size[i]; j++, pfn++) |
182 | int i; | 209 | if (!page_is_ram(pfn)) |
183 | 210 | zholes_size[i]++; | |
184 | for (i = 0; i < boot_mem_map.nr_map; i++) { | 211 | free_area_init_node(0, NODE_DATA(0), zones_size, 0, zholes_size); |
185 | unsigned long addr, end; | 212 | #endif |
186 | |||
187 | if (boot_mem_map.map[i].type != BOOT_MEM_RAM) | ||
188 | /* not usable memory */ | ||
189 | continue; | ||
190 | |||
191 | addr = PFN_UP(boot_mem_map.map[i].addr); | ||
192 | end = PFN_DOWN(boot_mem_map.map[i].addr + | ||
193 | boot_mem_map.map[i].size); | ||
194 | |||
195 | if (pagenr >= addr && pagenr < end) | ||
196 | return 1; | ||
197 | } | ||
198 | |||
199 | return 0; | ||
200 | } | 213 | } |
201 | 214 | ||
202 | static struct kcore_list kcore_mem, kcore_vmalloc; | 215 | static struct kcore_list kcore_mem, kcore_vmalloc; |
@@ -213,9 +226,9 @@ void __init mem_init(void) | |||
213 | #ifdef CONFIG_DISCONTIGMEM | 226 | #ifdef CONFIG_DISCONTIGMEM |
214 | #error "CONFIG_HIGHMEM and CONFIG_DISCONTIGMEM dont work together yet" | 227 | #error "CONFIG_HIGHMEM and CONFIG_DISCONTIGMEM dont work together yet" |
215 | #endif | 228 | #endif |
216 | max_mapnr = num_physpages = highend_pfn; | 229 | max_mapnr = highend_pfn; |
217 | #else | 230 | #else |
218 | max_mapnr = num_physpages = max_low_pfn; | 231 | max_mapnr = max_low_pfn; |
219 | #endif | 232 | #endif |
220 | high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); | 233 | high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); |
221 | 234 | ||
@@ -229,6 +242,7 @@ void __init mem_init(void) | |||
229 | if (PageReserved(pfn_to_page(tmp))) | 242 | if (PageReserved(pfn_to_page(tmp))) |
230 | reservedpages++; | 243 | reservedpages++; |
231 | } | 244 | } |
245 | num_physpages = ram; | ||
232 | 246 | ||
233 | #ifdef CONFIG_HIGHMEM | 247 | #ifdef CONFIG_HIGHMEM |
234 | for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { | 248 | for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { |
@@ -247,6 +261,7 @@ void __init mem_init(void) | |||
247 | totalhigh_pages++; | 261 | totalhigh_pages++; |
248 | } | 262 | } |
249 | totalram_pages += totalhigh_pages; | 263 | totalram_pages += totalhigh_pages; |
264 | num_physpages += totalhigh_pages; | ||
250 | #endif | 265 | #endif |
251 | 266 | ||
252 | codesize = (unsigned long) &_etext - (unsigned long) &_text; | 267 | codesize = (unsigned long) &_etext - (unsigned long) &_text; |