diff options
Diffstat (limited to 'arch/arm/mm/init.c')
-rw-r--r-- | arch/arm/mm/init.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 82c4b4217989..ab5c9abd5c34 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -64,10 +64,11 @@ static int __init parse_tag_initrd2(const struct tag *tag) | |||
64 | __tagtable(ATAG_INITRD2, parse_tag_initrd2); | 64 | __tagtable(ATAG_INITRD2, parse_tag_initrd2); |
65 | 65 | ||
66 | /* | 66 | /* |
67 | * This is used to pass memory configuration data from paging_init | 67 | * This keeps memory configuration data used by a couple memory |
68 | * to mem_init, and by show_mem() to skip holes in the memory map. | 68 | * initialization functions, as well as show_mem() for the skipping |
69 | * of holes in the memory map. It is populated by arm_add_memory(). | ||
69 | */ | 70 | */ |
70 | static struct meminfo meminfo = { 0, }; | 71 | struct meminfo meminfo; |
71 | 72 | ||
72 | void show_mem(void) | 73 | void show_mem(void) |
73 | { | 74 | { |
@@ -331,13 +332,12 @@ static void __init bootmem_free_node(int node, struct meminfo *mi) | |||
331 | free_area_init_node(node, zone_size, start_pfn, zhole_size); | 332 | free_area_init_node(node, zone_size, start_pfn, zhole_size); |
332 | } | 333 | } |
333 | 334 | ||
334 | void __init bootmem_init(struct meminfo *mi) | 335 | void __init bootmem_init(void) |
335 | { | 336 | { |
337 | struct meminfo *mi = &meminfo; | ||
336 | unsigned long memend_pfn = 0; | 338 | unsigned long memend_pfn = 0; |
337 | int node, initrd_node; | 339 | int node, initrd_node; |
338 | 340 | ||
339 | memcpy(&meminfo, mi, sizeof(meminfo)); | ||
340 | |||
341 | /* | 341 | /* |
342 | * Locate which node contains the ramdisk image, if any. | 342 | * Locate which node contains the ramdisk image, if any. |
343 | */ | 343 | */ |
@@ -394,20 +394,22 @@ void __init bootmem_init(struct meminfo *mi) | |||
394 | max_pfn = max_low_pfn = memend_pfn - PHYS_PFN_OFFSET; | 394 | max_pfn = max_low_pfn = memend_pfn - PHYS_PFN_OFFSET; |
395 | } | 395 | } |
396 | 396 | ||
397 | static inline void free_area(unsigned long addr, unsigned long end, char *s) | 397 | static inline int free_area(unsigned long pfn, unsigned long end, char *s) |
398 | { | 398 | { |
399 | unsigned int size = (end - addr) >> 10; | 399 | unsigned int pages = 0, size = (end - pfn) << (PAGE_SHIFT - 10); |
400 | 400 | ||
401 | for (; addr < end; addr += PAGE_SIZE) { | 401 | for (; pfn < end; pfn++) { |
402 | struct page *page = virt_to_page(addr); | 402 | struct page *page = pfn_to_page(pfn); |
403 | ClearPageReserved(page); | 403 | ClearPageReserved(page); |
404 | init_page_count(page); | 404 | init_page_count(page); |
405 | free_page(addr); | 405 | __free_page(page); |
406 | totalram_pages++; | 406 | pages++; |
407 | } | 407 | } |
408 | 408 | ||
409 | if (size && s) | 409 | if (size && s) |
410 | printk(KERN_INFO "Freeing %s memory: %dK\n", s, size); | 410 | printk(KERN_INFO "Freeing %s memory: %dK\n", s, size); |
411 | |||
412 | return pages; | ||
411 | } | 413 | } |
412 | 414 | ||
413 | static inline void | 415 | static inline void |
@@ -478,13 +480,9 @@ static void __init free_unused_memmap_node(int node, struct meminfo *mi) | |||
478 | */ | 480 | */ |
479 | void __init mem_init(void) | 481 | void __init mem_init(void) |
480 | { | 482 | { |
481 | unsigned int codepages, datapages, initpages; | 483 | unsigned int codesize, datasize, initsize; |
482 | int i, node; | 484 | int i, node; |
483 | 485 | ||
484 | codepages = &_etext - &_text; | ||
485 | datapages = &_end - &__data_start; | ||
486 | initpages = &__init_end - &__init_begin; | ||
487 | |||
488 | #ifndef CONFIG_DISCONTIGMEM | 486 | #ifndef CONFIG_DISCONTIGMEM |
489 | max_mapnr = virt_to_page(high_memory) - mem_map; | 487 | max_mapnr = virt_to_page(high_memory) - mem_map; |
490 | #endif | 488 | #endif |
@@ -501,7 +499,8 @@ void __init mem_init(void) | |||
501 | 499 | ||
502 | #ifdef CONFIG_SA1111 | 500 | #ifdef CONFIG_SA1111 |
503 | /* now that our DMA memory is actually so designated, we can free it */ | 501 | /* now that our DMA memory is actually so designated, we can free it */ |
504 | free_area(PAGE_OFFSET, (unsigned long)swapper_pg_dir, NULL); | 502 | totalram_pages += free_area(PHYS_PFN_OFFSET, |
503 | __phys_to_pfn(__pa(swapper_pg_dir)), NULL); | ||
505 | #endif | 504 | #endif |
506 | 505 | ||
507 | /* | 506 | /* |
@@ -509,18 +508,21 @@ void __init mem_init(void) | |||
509 | * real number of pages we have in this system | 508 | * real number of pages we have in this system |
510 | */ | 509 | */ |
511 | printk(KERN_INFO "Memory:"); | 510 | printk(KERN_INFO "Memory:"); |
512 | |||
513 | num_physpages = 0; | 511 | num_physpages = 0; |
514 | for (i = 0; i < meminfo.nr_banks; i++) { | 512 | for (i = 0; i < meminfo.nr_banks; i++) { |
515 | num_physpages += bank_pfn_size(&meminfo.bank[i]); | 513 | num_physpages += bank_pfn_size(&meminfo.bank[i]); |
516 | printk(" %ldMB", bank_phys_size(&meminfo.bank[i]) >> 20); | 514 | printk(" %ldMB", bank_phys_size(&meminfo.bank[i]) >> 20); |
517 | } | 515 | } |
518 | |||
519 | printk(" = %luMB total\n", num_physpages >> (20 - PAGE_SHIFT)); | 516 | printk(" = %luMB total\n", num_physpages >> (20 - PAGE_SHIFT)); |
517 | |||
518 | codesize = &_etext - &_text; | ||
519 | datasize = &_end - &__data_start; | ||
520 | initsize = &__init_end - &__init_begin; | ||
521 | |||
520 | printk(KERN_NOTICE "Memory: %luKB available (%dK code, " | 522 | printk(KERN_NOTICE "Memory: %luKB available (%dK code, " |
521 | "%dK data, %dK init)\n", | 523 | "%dK data, %dK init)\n", |
522 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | 524 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), |
523 | codepages >> 10, datapages >> 10, initpages >> 10); | 525 | codesize >> 10, datasize >> 10, initsize >> 10); |
524 | 526 | ||
525 | if (PAGE_SIZE >= 16384 && num_physpages <= 128) { | 527 | if (PAGE_SIZE >= 16384 && num_physpages <= 128) { |
526 | extern int sysctl_overcommit_memory; | 528 | extern int sysctl_overcommit_memory; |
@@ -535,11 +537,10 @@ void __init mem_init(void) | |||
535 | 537 | ||
536 | void free_initmem(void) | 538 | void free_initmem(void) |
537 | { | 539 | { |
538 | if (!machine_is_integrator() && !machine_is_cintegrator()) { | 540 | if (!machine_is_integrator() && !machine_is_cintegrator()) |
539 | free_area((unsigned long)(&__init_begin), | 541 | totalram_pages += free_area(__phys_to_pfn(__pa(&__init_begin)), |
540 | (unsigned long)(&__init_end), | 542 | __phys_to_pfn(__pa(&__init_end)), |
541 | "init"); | 543 | "init"); |
542 | } | ||
543 | } | 544 | } |
544 | 545 | ||
545 | #ifdef CONFIG_BLK_DEV_INITRD | 546 | #ifdef CONFIG_BLK_DEV_INITRD |
@@ -549,7 +550,9 @@ static int keep_initrd; | |||
549 | void free_initrd_mem(unsigned long start, unsigned long end) | 550 | void free_initrd_mem(unsigned long start, unsigned long end) |
550 | { | 551 | { |
551 | if (!keep_initrd) | 552 | if (!keep_initrd) |
552 | free_area(start, end, "initrd"); | 553 | totalram_pages += free_area(__phys_to_pfn(__pa(start)), |
554 | __phys_to_pfn(__pa(end)), | ||
555 | "initrd"); | ||
553 | } | 556 | } |
554 | 557 | ||
555 | static int __init keepinitrd_setup(char *__unused) | 558 | static int __init keepinitrd_setup(char *__unused) |