diff options
Diffstat (limited to 'arch/arm/mm/init.c')
-rw-r--r-- | arch/arm/mm/init.c | 50 |
1 files changed, 17 insertions, 33 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index ad722f1208a5..9a5cdc01fcdf 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -99,6 +99,9 @@ void show_mem(unsigned int filter) | |||
99 | printk("Mem-info:\n"); | 99 | printk("Mem-info:\n"); |
100 | show_free_areas(filter); | 100 | show_free_areas(filter); |
101 | 101 | ||
102 | if (filter & SHOW_MEM_FILTER_PAGE_COUNT) | ||
103 | return; | ||
104 | |||
102 | for_each_bank (i, mi) { | 105 | for_each_bank (i, mi) { |
103 | struct membank *bank = &mi->bank[i]; | 106 | struct membank *bank = &mi->bank[i]; |
104 | unsigned int pfn1, pfn2; | 107 | unsigned int pfn1, pfn2; |
@@ -424,24 +427,6 @@ void __init bootmem_init(void) | |||
424 | max_pfn = max_high - PHYS_PFN_OFFSET; | 427 | max_pfn = max_high - PHYS_PFN_OFFSET; |
425 | } | 428 | } |
426 | 429 | ||
427 | static inline int free_area(unsigned long pfn, unsigned long end, char *s) | ||
428 | { | ||
429 | unsigned int pages = 0, size = (end - pfn) << (PAGE_SHIFT - 10); | ||
430 | |||
431 | for (; pfn < end; pfn++) { | ||
432 | struct page *page = pfn_to_page(pfn); | ||
433 | ClearPageReserved(page); | ||
434 | init_page_count(page); | ||
435 | __free_page(page); | ||
436 | pages++; | ||
437 | } | ||
438 | |||
439 | if (size && s) | ||
440 | printk(KERN_INFO "Freeing %s memory: %dK\n", s, size); | ||
441 | |||
442 | return pages; | ||
443 | } | ||
444 | |||
445 | /* | 430 | /* |
446 | * Poison init memory with an undefined instruction (ARM) or a branch to an | 431 | * Poison init memory with an undefined instruction (ARM) or a branch to an |
447 | * undefined instruction (Thumb). | 432 | * undefined instruction (Thumb). |
@@ -534,6 +519,14 @@ static void __init free_unused_memmap(struct meminfo *mi) | |||
534 | #endif | 519 | #endif |
535 | } | 520 | } |
536 | 521 | ||
522 | #ifdef CONFIG_HIGHMEM | ||
523 | static inline void free_area_high(unsigned long pfn, unsigned long end) | ||
524 | { | ||
525 | for (; pfn < end; pfn++) | ||
526 | free_highmem_page(pfn_to_page(pfn)); | ||
527 | } | ||
528 | #endif | ||
529 | |||
537 | static void __init free_highpages(void) | 530 | static void __init free_highpages(void) |
538 | { | 531 | { |
539 | #ifdef CONFIG_HIGHMEM | 532 | #ifdef CONFIG_HIGHMEM |
@@ -569,8 +562,7 @@ static void __init free_highpages(void) | |||
569 | if (res_end > end) | 562 | if (res_end > end) |
570 | res_end = end; | 563 | res_end = end; |
571 | if (res_start != start) | 564 | if (res_start != start) |
572 | totalhigh_pages += free_area(start, res_start, | 565 | free_area_high(start, res_start); |
573 | NULL); | ||
574 | start = res_end; | 566 | start = res_end; |
575 | if (start == end) | 567 | if (start == end) |
576 | break; | 568 | break; |
@@ -578,9 +570,8 @@ static void __init free_highpages(void) | |||
578 | 570 | ||
579 | /* And now free anything which remains */ | 571 | /* And now free anything which remains */ |
580 | if (start < end) | 572 | if (start < end) |
581 | totalhigh_pages += free_area(start, end, NULL); | 573 | free_area_high(start, end); |
582 | } | 574 | } |
583 | totalram_pages += totalhigh_pages; | ||
584 | #endif | 575 | #endif |
585 | } | 576 | } |
586 | 577 | ||
@@ -609,8 +600,7 @@ void __init mem_init(void) | |||
609 | 600 | ||
610 | #ifdef CONFIG_SA1111 | 601 | #ifdef CONFIG_SA1111 |
611 | /* now that our DMA memory is actually so designated, we can free it */ | 602 | /* now that our DMA memory is actually so designated, we can free it */ |
612 | totalram_pages += free_area(PHYS_PFN_OFFSET, | 603 | free_reserved_area(__va(PHYS_PFN_OFFSET), swapper_pg_dir, 0, NULL); |
613 | __phys_to_pfn(__pa(swapper_pg_dir)), NULL); | ||
614 | #endif | 604 | #endif |
615 | 605 | ||
616 | free_highpages(); | 606 | free_highpages(); |
@@ -738,16 +728,12 @@ void free_initmem(void) | |||
738 | extern char __tcm_start, __tcm_end; | 728 | extern char __tcm_start, __tcm_end; |
739 | 729 | ||
740 | poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start); | 730 | poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start); |
741 | totalram_pages += free_area(__phys_to_pfn(__pa(&__tcm_start)), | 731 | free_reserved_area(&__tcm_start, &__tcm_end, 0, "TCM link"); |
742 | __phys_to_pfn(__pa(&__tcm_end)), | ||
743 | "TCM link"); | ||
744 | #endif | 732 | #endif |
745 | 733 | ||
746 | poison_init_mem(__init_begin, __init_end - __init_begin); | 734 | poison_init_mem(__init_begin, __init_end - __init_begin); |
747 | if (!machine_is_integrator() && !machine_is_cintegrator()) | 735 | if (!machine_is_integrator() && !machine_is_cintegrator()) |
748 | totalram_pages += free_area(__phys_to_pfn(__pa(__init_begin)), | 736 | free_initmem_default(0); |
749 | __phys_to_pfn(__pa(__init_end)), | ||
750 | "init"); | ||
751 | } | 737 | } |
752 | 738 | ||
753 | #ifdef CONFIG_BLK_DEV_INITRD | 739 | #ifdef CONFIG_BLK_DEV_INITRD |
@@ -758,9 +744,7 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
758 | { | 744 | { |
759 | if (!keep_initrd) { | 745 | if (!keep_initrd) { |
760 | poison_init_mem((void *)start, PAGE_ALIGN(end) - start); | 746 | poison_init_mem((void *)start, PAGE_ALIGN(end) - start); |
761 | totalram_pages += free_area(__phys_to_pfn(__pa(start)), | 747 | free_reserved_area(start, end, 0, "initrd"); |
762 | __phys_to_pfn(__pa(end)), | ||
763 | "initrd"); | ||
764 | } | 748 | } |
765 | } | 749 | } |
766 | 750 | ||