diff options
-rw-r--r-- | arch/mips/mm/init.c | 126 |
1 files changed, 63 insertions, 63 deletions
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c index 66d0f49c5bec..074ac5459026 100644 --- a/arch/mips/mm/init.c +++ b/arch/mips/mm/init.c | |||
@@ -252,6 +252,69 @@ void __init fixrange_init(unsigned long start, unsigned long end, | |||
252 | #endif | 252 | #endif |
253 | } | 253 | } |
254 | 254 | ||
255 | unsigned __weak platform_maar_init(unsigned num_pairs) | ||
256 | { | ||
257 | struct maar_config cfg[BOOT_MEM_MAP_MAX]; | ||
258 | unsigned i, num_configured, num_cfg = 0; | ||
259 | phys_addr_t skip; | ||
260 | |||
261 | for (i = 0; i < boot_mem_map.nr_map; i++) { | ||
262 | switch (boot_mem_map.map[i].type) { | ||
263 | case BOOT_MEM_RAM: | ||
264 | case BOOT_MEM_INIT_RAM: | ||
265 | break; | ||
266 | default: | ||
267 | continue; | ||
268 | } | ||
269 | |||
270 | skip = 0x10000 - (boot_mem_map.map[i].addr & 0xffff); | ||
271 | |||
272 | cfg[num_cfg].lower = boot_mem_map.map[i].addr; | ||
273 | cfg[num_cfg].lower += skip; | ||
274 | |||
275 | cfg[num_cfg].upper = cfg[num_cfg].lower; | ||
276 | cfg[num_cfg].upper += boot_mem_map.map[i].size - 1; | ||
277 | cfg[num_cfg].upper -= skip; | ||
278 | |||
279 | cfg[num_cfg].attrs = MIPS_MAAR_S; | ||
280 | num_cfg++; | ||
281 | } | ||
282 | |||
283 | num_configured = maar_config(cfg, num_cfg, num_pairs); | ||
284 | if (num_configured < num_cfg) | ||
285 | pr_warn("Not enough MAAR pairs (%u) for all bootmem regions (%u)\n", | ||
286 | num_pairs, num_cfg); | ||
287 | |||
288 | return num_configured; | ||
289 | } | ||
290 | |||
291 | static void maar_init(void) | ||
292 | { | ||
293 | unsigned num_maars, used, i; | ||
294 | |||
295 | if (!cpu_has_maar) | ||
296 | return; | ||
297 | |||
298 | /* Detect the number of MAARs */ | ||
299 | write_c0_maari(~0); | ||
300 | back_to_back_c0_hazard(); | ||
301 | num_maars = read_c0_maari() + 1; | ||
302 | |||
303 | /* MAARs should be in pairs */ | ||
304 | WARN_ON(num_maars % 2); | ||
305 | |||
306 | /* Configure the required MAARs */ | ||
307 | used = platform_maar_init(num_maars / 2); | ||
308 | |||
309 | /* Disable any further MAARs */ | ||
310 | for (i = (used * 2); i < num_maars; i++) { | ||
311 | write_c0_maari(i); | ||
312 | back_to_back_c0_hazard(); | ||
313 | write_c0_maar(0); | ||
314 | back_to_back_c0_hazard(); | ||
315 | } | ||
316 | } | ||
317 | |||
255 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 318 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
256 | int page_is_ram(unsigned long pagenr) | 319 | int page_is_ram(unsigned long pagenr) |
257 | { | 320 | { |
@@ -334,69 +397,6 @@ static inline void mem_init_free_highmem(void) | |||
334 | #endif | 397 | #endif |
335 | } | 398 | } |
336 | 399 | ||
337 | unsigned __weak platform_maar_init(unsigned num_pairs) | ||
338 | { | ||
339 | struct maar_config cfg[BOOT_MEM_MAP_MAX]; | ||
340 | unsigned i, num_configured, num_cfg = 0; | ||
341 | phys_addr_t skip; | ||
342 | |||
343 | for (i = 0; i < boot_mem_map.nr_map; i++) { | ||
344 | switch (boot_mem_map.map[i].type) { | ||
345 | case BOOT_MEM_RAM: | ||
346 | case BOOT_MEM_INIT_RAM: | ||
347 | break; | ||
348 | default: | ||
349 | continue; | ||
350 | } | ||
351 | |||
352 | skip = 0x10000 - (boot_mem_map.map[i].addr & 0xffff); | ||
353 | |||
354 | cfg[num_cfg].lower = boot_mem_map.map[i].addr; | ||
355 | cfg[num_cfg].lower += skip; | ||
356 | |||
357 | cfg[num_cfg].upper = cfg[num_cfg].lower; | ||
358 | cfg[num_cfg].upper += boot_mem_map.map[i].size - 1; | ||
359 | cfg[num_cfg].upper -= skip; | ||
360 | |||
361 | cfg[num_cfg].attrs = MIPS_MAAR_S; | ||
362 | num_cfg++; | ||
363 | } | ||
364 | |||
365 | num_configured = maar_config(cfg, num_cfg, num_pairs); | ||
366 | if (num_configured < num_cfg) | ||
367 | pr_warn("Not enough MAAR pairs (%u) for all bootmem regions (%u)\n", | ||
368 | num_pairs, num_cfg); | ||
369 | |||
370 | return num_configured; | ||
371 | } | ||
372 | |||
373 | static void maar_init(void) | ||
374 | { | ||
375 | unsigned num_maars, used, i; | ||
376 | |||
377 | if (!cpu_has_maar) | ||
378 | return; | ||
379 | |||
380 | /* Detect the number of MAARs */ | ||
381 | write_c0_maari(~0); | ||
382 | back_to_back_c0_hazard(); | ||
383 | num_maars = read_c0_maari() + 1; | ||
384 | |||
385 | /* MAARs should be in pairs */ | ||
386 | WARN_ON(num_maars % 2); | ||
387 | |||
388 | /* Configure the required MAARs */ | ||
389 | used = platform_maar_init(num_maars / 2); | ||
390 | |||
391 | /* Disable any further MAARs */ | ||
392 | for (i = (used * 2); i < num_maars; i++) { | ||
393 | write_c0_maari(i); | ||
394 | back_to_back_c0_hazard(); | ||
395 | write_c0_maar(0); | ||
396 | back_to_back_c0_hazard(); | ||
397 | } | ||
398 | } | ||
399 | |||
400 | void __init mem_init(void) | 400 | void __init mem_init(void) |
401 | { | 401 | { |
402 | #ifdef CONFIG_HIGHMEM | 402 | #ifdef CONFIG_HIGHMEM |