diff options
Diffstat (limited to 'arch/mn10300/mm/init.c')
-rw-r--r-- | arch/mn10300/mm/init.c | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/arch/mn10300/mm/init.c b/arch/mn10300/mm/init.c new file mode 100644 index 000000000000..8c5d88c7b90a --- /dev/null +++ b/arch/mn10300/mm/init.c | |||
@@ -0,0 +1,160 @@ | |||
1 | /* MN10300 Memory management initialisation | ||
2 | * | ||
3 | * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd. | ||
4 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | ||
5 | * Modified by David Howells (dhowells@redhat.com) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public Licence | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the Licence, or (at your option) any later version. | ||
11 | */ | ||
12 | #include <linux/signal.h> | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/errno.h> | ||
16 | #include <linux/string.h> | ||
17 | #include <linux/types.h> | ||
18 | #include <linux/ptrace.h> | ||
19 | #include <linux/mman.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/fs.h> | ||
22 | #include <linux/mm.h> | ||
23 | #include <linux/swap.h> | ||
24 | #include <linux/smp.h> | ||
25 | #include <linux/init.h> | ||
26 | #include <linux/initrd.h> | ||
27 | #include <linux/highmem.h> | ||
28 | #include <linux/pagemap.h> | ||
29 | #include <linux/bootmem.h> | ||
30 | |||
31 | #include <asm/processor.h> | ||
32 | #include <asm/system.h> | ||
33 | #include <asm/uaccess.h> | ||
34 | #include <asm/pgtable.h> | ||
35 | #include <asm/pgalloc.h> | ||
36 | #include <asm/dma.h> | ||
37 | #include <asm/tlb.h> | ||
38 | #include <asm/sections.h> | ||
39 | |||
40 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
41 | |||
42 | unsigned long highstart_pfn, highend_pfn; | ||
43 | |||
44 | /* | ||
45 | * set up paging | ||
46 | */ | ||
47 | void __init paging_init(void) | ||
48 | { | ||
49 | unsigned long zones_size[MAX_NR_ZONES] = {0,}; | ||
50 | pte_t *ppte; | ||
51 | int loop; | ||
52 | |||
53 | /* main kernel space -> RAM mapping is handled as 1:1 transparent by | ||
54 | * the MMU */ | ||
55 | memset(swapper_pg_dir, 0, sizeof(swapper_pg_dir)); | ||
56 | memset(kernel_vmalloc_ptes, 0, sizeof(kernel_vmalloc_ptes)); | ||
57 | |||
58 | /* load the VMALLOC area PTE table addresses into the kernel PGD */ | ||
59 | ppte = kernel_vmalloc_ptes; | ||
60 | for (loop = VMALLOC_START / (PAGE_SIZE * PTRS_PER_PTE); | ||
61 | loop < VMALLOC_END / (PAGE_SIZE * PTRS_PER_PTE); | ||
62 | loop++ | ||
63 | ) { | ||
64 | set_pgd(swapper_pg_dir + loop, __pgd(__pa(ppte) | _PAGE_TABLE)); | ||
65 | ppte += PAGE_SIZE / sizeof(pte_t); | ||
66 | } | ||
67 | |||
68 | /* declare the sizes of the RAM zones (only use the normal zone) */ | ||
69 | zones_size[ZONE_NORMAL] = | ||
70 | (contig_page_data.bdata->node_low_pfn) - | ||
71 | (contig_page_data.bdata->node_boot_start >> PAGE_SHIFT); | ||
72 | |||
73 | /* pass the memory from the bootmem allocator to the main allocator */ | ||
74 | free_area_init(zones_size); | ||
75 | |||
76 | __flush_tlb_all(); | ||
77 | } | ||
78 | |||
79 | /* | ||
80 | * transfer all the memory from the bootmem allocator to the runtime allocator | ||
81 | */ | ||
82 | void __init mem_init(void) | ||
83 | { | ||
84 | int codesize, reservedpages, datasize, initsize; | ||
85 | int tmp; | ||
86 | |||
87 | if (!mem_map) | ||
88 | BUG(); | ||
89 | |||
90 | #define START_PFN (contig_page_data.bdata->node_boot_start >> PAGE_SHIFT) | ||
91 | #define MAX_LOW_PFN (contig_page_data.bdata->node_low_pfn) | ||
92 | |||
93 | max_mapnr = num_physpages = MAX_LOW_PFN - START_PFN; | ||
94 | high_memory = (void *) __va(MAX_LOW_PFN * PAGE_SIZE); | ||
95 | |||
96 | /* clear the zero-page */ | ||
97 | memset(empty_zero_page, 0, PAGE_SIZE); | ||
98 | |||
99 | /* this will put all low memory onto the freelists */ | ||
100 | totalram_pages += free_all_bootmem(); | ||
101 | |||
102 | reservedpages = 0; | ||
103 | for (tmp = 0; tmp < num_physpages; tmp++) | ||
104 | if (PageReserved(&mem_map[tmp])) | ||
105 | reservedpages++; | ||
106 | |||
107 | codesize = (unsigned long) &_etext - (unsigned long) &_stext; | ||
108 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; | ||
109 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; | ||
110 | |||
111 | printk(KERN_INFO | ||
112 | "Memory: %luk/%luk available" | ||
113 | " (%dk kernel code, %dk reserved, %dk data, %dk init," | ||
114 | " %ldk highmem)\n", | ||
115 | (unsigned long) nr_free_pages() << (PAGE_SHIFT - 10), | ||
116 | max_mapnr << (PAGE_SHIFT - 10), | ||
117 | codesize >> 10, | ||
118 | reservedpages << (PAGE_SHIFT - 10), | ||
119 | datasize >> 10, | ||
120 | initsize >> 10, | ||
121 | (unsigned long) (totalhigh_pages << (PAGE_SHIFT - 10)) | ||
122 | ); | ||
123 | } | ||
124 | |||
125 | /* | ||
126 | * | ||
127 | */ | ||
128 | void free_init_pages(char *what, unsigned long begin, unsigned long end) | ||
129 | { | ||
130 | unsigned long addr; | ||
131 | |||
132 | for (addr = begin; addr < end; addr += PAGE_SIZE) { | ||
133 | ClearPageReserved(virt_to_page(addr)); | ||
134 | init_page_count(virt_to_page(addr)); | ||
135 | memset((void *) addr, 0xcc, PAGE_SIZE); | ||
136 | free_page(addr); | ||
137 | totalram_pages++; | ||
138 | } | ||
139 | printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10); | ||
140 | } | ||
141 | |||
142 | /* | ||
143 | * recycle memory containing stuff only required for initialisation | ||
144 | */ | ||
145 | void free_initmem(void) | ||
146 | { | ||
147 | free_init_pages("unused kernel memory", | ||
148 | (unsigned long) &__init_begin, | ||
149 | (unsigned long) &__init_end); | ||
150 | } | ||
151 | |||
152 | /* | ||
153 | * dispose of the memory on which the initial ramdisk resided | ||
154 | */ | ||
155 | #ifdef CONFIG_BLK_DEV_INITRD | ||
156 | void free_initrd_mem(unsigned long start, unsigned long end) | ||
157 | { | ||
158 | free_init_pages("initrd memory", start, end); | ||
159 | } | ||
160 | #endif | ||