diff options
Diffstat (limited to 'arch/arm/mm/init.c')
-rw-r--r-- | arch/arm/mm/init.c | 113 |
1 files changed, 99 insertions, 14 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index a04ffbbbe253..7829cb5425f5 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/setup.h> | 23 | #include <asm/setup.h> |
24 | #include <asm/sizes.h> | 24 | #include <asm/sizes.h> |
25 | #include <asm/tlb.h> | 25 | #include <asm/tlb.h> |
26 | #include <asm/fixmap.h> | ||
26 | 27 | ||
27 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
28 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
@@ -32,19 +33,21 @@ | |||
32 | static unsigned long phys_initrd_start __initdata = 0; | 33 | static unsigned long phys_initrd_start __initdata = 0; |
33 | static unsigned long phys_initrd_size __initdata = 0; | 34 | static unsigned long phys_initrd_size __initdata = 0; |
34 | 35 | ||
35 | static void __init early_initrd(char **p) | 36 | static int __init early_initrd(char *p) |
36 | { | 37 | { |
37 | unsigned long start, size; | 38 | unsigned long start, size; |
39 | char *endp; | ||
38 | 40 | ||
39 | start = memparse(*p, p); | 41 | start = memparse(p, &endp); |
40 | if (**p == ',') { | 42 | if (*endp == ',') { |
41 | size = memparse((*p) + 1, p); | 43 | size = memparse(endp + 1, NULL); |
42 | 44 | ||
43 | phys_initrd_start = start; | 45 | phys_initrd_start = start; |
44 | phys_initrd_size = size; | 46 | phys_initrd_size = size; |
45 | } | 47 | } |
48 | return 0; | ||
46 | } | 49 | } |
47 | __early_param("initrd=", early_initrd); | 50 | early_param("initrd", early_initrd); |
48 | 51 | ||
49 | static int __init parse_tag_initrd(const struct tag *tag) | 52 | static int __init parse_tag_initrd(const struct tag *tag) |
50 | { | 53 | { |
@@ -560,7 +563,7 @@ static void __init free_unused_memmap_node(int node, struct meminfo *mi) | |||
560 | */ | 563 | */ |
561 | void __init mem_init(void) | 564 | void __init mem_init(void) |
562 | { | 565 | { |
563 | unsigned int codesize, datasize, initsize; | 566 | unsigned long reserved_pages, free_pages; |
564 | int i, node; | 567 | int i, node; |
565 | 568 | ||
566 | #ifndef CONFIG_DISCONTIGMEM | 569 | #ifndef CONFIG_DISCONTIGMEM |
@@ -596,6 +599,33 @@ void __init mem_init(void) | |||
596 | totalram_pages += totalhigh_pages; | 599 | totalram_pages += totalhigh_pages; |
597 | #endif | 600 | #endif |
598 | 601 | ||
602 | reserved_pages = free_pages = 0; | ||
603 | |||
604 | for_each_online_node(node) { | ||
605 | pg_data_t *n = NODE_DATA(node); | ||
606 | struct page *map = pgdat_page_nr(n, 0) - n->node_start_pfn; | ||
607 | |||
608 | for_each_nodebank(i, &meminfo, node) { | ||
609 | struct membank *bank = &meminfo.bank[i]; | ||
610 | unsigned int pfn1, pfn2; | ||
611 | struct page *page, *end; | ||
612 | |||
613 | pfn1 = bank_pfn_start(bank); | ||
614 | pfn2 = bank_pfn_end(bank); | ||
615 | |||
616 | page = map + pfn1; | ||
617 | end = map + pfn2; | ||
618 | |||
619 | do { | ||
620 | if (PageReserved(page)) | ||
621 | reserved_pages++; | ||
622 | else if (!page_count(page)) | ||
623 | free_pages++; | ||
624 | page++; | ||
625 | } while (page < end); | ||
626 | } | ||
627 | } | ||
628 | |||
599 | /* | 629 | /* |
600 | * Since our memory may not be contiguous, calculate the | 630 | * Since our memory may not be contiguous, calculate the |
601 | * real number of pages we have in this system | 631 | * real number of pages we have in this system |
@@ -608,16 +638,71 @@ void __init mem_init(void) | |||
608 | } | 638 | } |
609 | printk(" = %luMB total\n", num_physpages >> (20 - PAGE_SHIFT)); | 639 | printk(" = %luMB total\n", num_physpages >> (20 - PAGE_SHIFT)); |
610 | 640 | ||
611 | codesize = _etext - _text; | 641 | printk(KERN_NOTICE "Memory: %luk/%luk available, %luk reserved, %luK highmem\n", |
612 | datasize = _end - _data; | 642 | nr_free_pages() << (PAGE_SHIFT-10), |
613 | initsize = __init_end - __init_begin; | 643 | free_pages << (PAGE_SHIFT-10), |
614 | 644 | reserved_pages << (PAGE_SHIFT-10), | |
615 | printk(KERN_NOTICE "Memory: %luKB available (%dK code, " | ||
616 | "%dK data, %dK init, %luK highmem)\n", | ||
617 | nr_free_pages() << (PAGE_SHIFT-10), codesize >> 10, | ||
618 | datasize >> 10, initsize >> 10, | ||
619 | totalhigh_pages << (PAGE_SHIFT-10)); | 645 | totalhigh_pages << (PAGE_SHIFT-10)); |
620 | 646 | ||
647 | #define MLK(b, t) b, t, ((t) - (b)) >> 10 | ||
648 | #define MLM(b, t) b, t, ((t) - (b)) >> 20 | ||
649 | #define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), SZ_1K) | ||
650 | |||
651 | printk(KERN_NOTICE "Virtual kernel memory layout:\n" | ||
652 | " vector : 0x%08lx - 0x%08lx (%4ld kB)\n" | ||
653 | " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" | ||
654 | #ifdef CONFIG_MMU | ||
655 | " DMA : 0x%08lx - 0x%08lx (%4ld MB)\n" | ||
656 | #endif | ||
657 | " vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n" | ||
658 | " lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n" | ||
659 | #ifdef CONFIG_HIGHMEM | ||
660 | " pkmap : 0x%08lx - 0x%08lx (%4ld MB)\n" | ||
661 | #endif | ||
662 | " modules : 0x%08lx - 0x%08lx (%4ld MB)\n" | ||
663 | " .init : 0x%p" " - 0x%p" " (%4d kB)\n" | ||
664 | " .text : 0x%p" " - 0x%p" " (%4d kB)\n" | ||
665 | " .data : 0x%p" " - 0x%p" " (%4d kB)\n", | ||
666 | |||
667 | MLK(UL(CONFIG_VECTORS_BASE), UL(CONFIG_VECTORS_BASE) + | ||
668 | (PAGE_SIZE)), | ||
669 | MLK(FIXADDR_START, FIXADDR_TOP), | ||
670 | #ifdef CONFIG_MMU | ||
671 | MLM(CONSISTENT_BASE, CONSISTENT_END), | ||
672 | #endif | ||
673 | MLM(VMALLOC_START, VMALLOC_END), | ||
674 | MLM(PAGE_OFFSET, (unsigned long)high_memory), | ||
675 | #ifdef CONFIG_HIGHMEM | ||
676 | MLM(PKMAP_BASE, (PKMAP_BASE) + (LAST_PKMAP) * | ||
677 | (PAGE_SIZE)), | ||
678 | #endif | ||
679 | MLM(MODULES_VADDR, MODULES_END), | ||
680 | |||
681 | MLK_ROUNDUP(__init_begin, __init_end), | ||
682 | MLK_ROUNDUP(_text, _etext), | ||
683 | MLK_ROUNDUP(_data, _edata)); | ||
684 | |||
685 | #undef MLK | ||
686 | #undef MLM | ||
687 | #undef MLK_ROUNDUP | ||
688 | |||
689 | /* | ||
690 | * Check boundaries twice: Some fundamental inconsistencies can | ||
691 | * be detected at build time already. | ||
692 | */ | ||
693 | #ifdef CONFIG_MMU | ||
694 | BUILD_BUG_ON(VMALLOC_END > CONSISTENT_BASE); | ||
695 | BUG_ON(VMALLOC_END > CONSISTENT_BASE); | ||
696 | |||
697 | BUILD_BUG_ON(TASK_SIZE > MODULES_VADDR); | ||
698 | BUG_ON(TASK_SIZE > MODULES_VADDR); | ||
699 | #endif | ||
700 | |||
701 | #ifdef CONFIG_HIGHMEM | ||
702 | BUILD_BUG_ON(PKMAP_BASE + LAST_PKMAP * PAGE_SIZE > PAGE_OFFSET); | ||
703 | BUG_ON(PKMAP_BASE + LAST_PKMAP * PAGE_SIZE > PAGE_OFFSET); | ||
704 | #endif | ||
705 | |||
621 | if (PAGE_SIZE >= 16384 && num_physpages <= 128) { | 706 | if (PAGE_SIZE >= 16384 && num_physpages <= 128) { |
622 | extern int sysctl_overcommit_memory; | 707 | extern int sysctl_overcommit_memory; |
623 | /* | 708 | /* |