diff options
Diffstat (limited to 'arch/cris/mm/init.c')
-rw-r--r-- | arch/cris/mm/init.c | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/arch/cris/mm/init.c b/arch/cris/mm/init.c new file mode 100644 index 000000000000..31a0018b525a --- /dev/null +++ b/arch/cris/mm/init.c | |||
@@ -0,0 +1,225 @@ | |||
1 | /* | ||
2 | * linux/arch/cris/mm/init.c | ||
3 | * | ||
4 | * Copyright (C) 1995 Linus Torvalds | ||
5 | * Copyright (C) 2000,2001 Axis Communications AB | ||
6 | * | ||
7 | * Authors: Bjorn Wesen (bjornw@axis.com) | ||
8 | * | ||
9 | * $Log: init.c,v $ | ||
10 | * Revision 1.11 2004/05/28 09:28:56 starvik | ||
11 | * Calculation of loops_per_usec moved because initalization order has changed | ||
12 | * in Linux 2.6. | ||
13 | * | ||
14 | * Revision 1.10 2004/05/14 07:58:05 starvik | ||
15 | * Merge of changes from 2.4 | ||
16 | * | ||
17 | * Revision 1.9 2003/07/04 08:27:54 starvik | ||
18 | * Merge of Linux 2.5.74 | ||
19 | * | ||
20 | * Revision 1.8 2003/04/09 05:20:48 starvik | ||
21 | * Merge of Linux 2.5.67 | ||
22 | * | ||
23 | * Revision 1.7 2003/01/22 06:48:38 starvik | ||
24 | * Fixed warnings issued by GCC 3.2.1 | ||
25 | * | ||
26 | * Revision 1.6 2002/12/11 14:44:48 starvik | ||
27 | * Extracted v10 (ETRAX 100LX) specific stuff to arch/cris/arch-v10/mm | ||
28 | * | ||
29 | * Revision 1.5 2002/11/18 07:37:37 starvik | ||
30 | * Added cache bug workaround (from Linux 2.4) | ||
31 | * | ||
32 | * Revision 1.4 2002/11/13 15:40:24 starvik | ||
33 | * Removed the page table cache stuff (as done in other archs) | ||
34 | * | ||
35 | * Revision 1.3 2002/11/05 06:45:13 starvik | ||
36 | * Merge of Linux 2.5.45 | ||
37 | * | ||
38 | * Revision 1.2 2001/12/18 13:35:22 bjornw | ||
39 | * Applied the 2.4.13->2.4.16 CRIS patch to 2.5.1 (is a copy of 2.4.15). | ||
40 | * | ||
41 | * Revision 1.31 2001/11/13 16:22:00 bjornw | ||
42 | * Skip calculating totalram and sharedram in si_meminfo | ||
43 | * | ||
44 | * Revision 1.30 2001/11/12 19:02:10 pkj | ||
45 | * Fixed compiler warnings. | ||
46 | * | ||
47 | * Revision 1.29 2001/07/25 16:09:50 bjornw | ||
48 | * val->sharedram will stay 0 | ||
49 | * | ||
50 | * Revision 1.28 2001/06/28 16:30:17 bjornw | ||
51 | * Oops. This needs to wait until 2.4.6 is merged | ||
52 | * | ||
53 | * Revision 1.27 2001/06/28 14:04:07 bjornw | ||
54 | * Fill in sharedram | ||
55 | * | ||
56 | * Revision 1.26 2001/06/18 06:36:02 hp | ||
57 | * Enable free_initmem of __init-type pages | ||
58 | * | ||
59 | * Revision 1.25 2001/06/13 00:02:23 bjornw | ||
60 | * Use a separate variable to store the current pgd to avoid races in schedule | ||
61 | * | ||
62 | * Revision 1.24 2001/05/15 00:52:20 hp | ||
63 | * Only map segment 0xa as seg if CONFIG_JULIETTE | ||
64 | * | ||
65 | * Revision 1.23 2001/04/04 14:35:40 bjornw | ||
66 | * * Removed get_pte_slow and friends (2.4.3 change) | ||
67 | * * Removed bad_pmd handling (2.4.3 change) | ||
68 | * | ||
69 | * Revision 1.22 2001/04/04 13:38:04 matsfg | ||
70 | * Moved ioremap to a separate function instead | ||
71 | * | ||
72 | * Revision 1.21 2001/03/27 09:28:33 bjornw | ||
73 | * ioremap used too early - lets try it in mem_init instead | ||
74 | * | ||
75 | * Revision 1.20 2001/03/23 07:39:21 starvik | ||
76 | * Corrected according to review remarks | ||
77 | * | ||
78 | * Revision 1.19 2001/03/15 14:25:17 bjornw | ||
79 | * More general shadow registers and ioremaped addresses for external I/O | ||
80 | * | ||
81 | * Revision 1.18 2001/02/23 12:46:44 bjornw | ||
82 | * * 0xc was not CSE1; 0x8 is, same as uncached flash, so we move the uncached | ||
83 | * flash during CRIS_LOW_MAP from 0xe to 0x8 so both the flash and the I/O | ||
84 | * is mapped straight over (for !CRIS_LOW_MAP the uncached flash is still 0xe) | ||
85 | * | ||
86 | * Revision 1.17 2001/02/22 15:05:21 bjornw | ||
87 | * Map 0x9 straight over during LOW_MAP to allow for memory mapped LEDs | ||
88 | * | ||
89 | * Revision 1.16 2001/02/22 15:02:35 bjornw | ||
90 | * Map 0xc straight over during LOW_MAP to allow for memory mapped I/O | ||
91 | * | ||
92 | * Revision 1.15 2001/01/10 21:12:10 bjornw | ||
93 | * loops_per_sec -> loops_per_jiffy | ||
94 | * | ||
95 | * Revision 1.14 2000/11/22 16:23:20 bjornw | ||
96 | * Initialize totalhigh counters to 0 to make /proc/meminfo look nice. | ||
97 | * | ||
98 | * Revision 1.13 2000/11/21 16:37:51 bjornw | ||
99 | * Temporarily disable initmem freeing | ||
100 | * | ||
101 | * Revision 1.12 2000/11/21 13:55:07 bjornw | ||
102 | * Use CONFIG_CRIS_LOW_MAP for the low VM map instead of explicit CPU type | ||
103 | * | ||
104 | * Revision 1.11 2000/10/06 12:38:22 bjornw | ||
105 | * Cast empty_bad_page correctly (should really be of * type from the start.. | ||
106 | * | ||
107 | * Revision 1.10 2000/10/04 16:53:57 bjornw | ||
108 | * Fix memory-map due to LX features | ||
109 | * | ||
110 | * Revision 1.9 2000/09/13 15:47:49 bjornw | ||
111 | * Wrong count in reserved-pages loop | ||
112 | * | ||
113 | * Revision 1.8 2000/09/13 14:35:10 bjornw | ||
114 | * 2.4.0-test8 added a new arg to free_area_init_node | ||
115 | * | ||
116 | * Revision 1.7 2000/08/17 15:35:55 bjornw | ||
117 | * 2.4.0-test6 removed MAP_NR and inserted virt_to_page | ||
118 | * | ||
119 | * | ||
120 | */ | ||
121 | |||
122 | #include <linux/init.h> | ||
123 | #include <linux/bootmem.h> | ||
124 | #include <asm/tlb.h> | ||
125 | |||
126 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
127 | |||
128 | unsigned long empty_zero_page; | ||
129 | |||
130 | extern char _stext, _edata, _etext; /* From linkerscript */ | ||
131 | extern char __init_begin, __init_end; | ||
132 | |||
133 | void | ||
134 | show_mem(void) | ||
135 | { | ||
136 | int i,free = 0,total = 0,cached = 0, reserved = 0, nonshared = 0; | ||
137 | int shared = 0; | ||
138 | |||
139 | printk("\nMem-info:\n"); | ||
140 | show_free_areas(); | ||
141 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | ||
142 | i = max_mapnr; | ||
143 | while (i-- > 0) { | ||
144 | total++; | ||
145 | if (PageReserved(mem_map+i)) | ||
146 | reserved++; | ||
147 | else if (PageSwapCache(mem_map+i)) | ||
148 | cached++; | ||
149 | else if (!page_count(mem_map+i)) | ||
150 | free++; | ||
151 | else if (page_count(mem_map+i) == 1) | ||
152 | nonshared++; | ||
153 | else | ||
154 | shared += page_count(mem_map+i) - 1; | ||
155 | } | ||
156 | printk("%d pages of RAM\n",total); | ||
157 | printk("%d free pages\n",free); | ||
158 | printk("%d reserved pages\n",reserved); | ||
159 | printk("%d pages nonshared\n",nonshared); | ||
160 | printk("%d pages shared\n",shared); | ||
161 | printk("%d pages swap cached\n",cached); | ||
162 | } | ||
163 | |||
164 | void __init | ||
165 | mem_init(void) | ||
166 | { | ||
167 | int codesize, reservedpages, datasize, initsize; | ||
168 | unsigned long tmp; | ||
169 | |||
170 | if(!mem_map) | ||
171 | BUG(); | ||
172 | |||
173 | /* max/min_low_pfn was set by setup.c | ||
174 | * now we just copy it to some other necessary places... | ||
175 | * | ||
176 | * high_memory was also set in setup.c | ||
177 | */ | ||
178 | |||
179 | max_mapnr = num_physpages = max_low_pfn - min_low_pfn; | ||
180 | |||
181 | /* this will put all memory onto the freelists */ | ||
182 | totalram_pages = free_all_bootmem(); | ||
183 | |||
184 | reservedpages = 0; | ||
185 | for (tmp = 0; tmp < max_mapnr; tmp++) { | ||
186 | /* | ||
187 | * Only count reserved RAM pages | ||
188 | */ | ||
189 | if (PageReserved(mem_map + tmp)) | ||
190 | reservedpages++; | ||
191 | } | ||
192 | |||
193 | codesize = (unsigned long) &_etext - (unsigned long) &_stext; | ||
194 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; | ||
195 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; | ||
196 | |||
197 | printk(KERN_INFO | ||
198 | "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, " | ||
199 | "%dk init)\n" , | ||
200 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | ||
201 | max_mapnr << (PAGE_SHIFT-10), | ||
202 | codesize >> 10, | ||
203 | reservedpages << (PAGE_SHIFT-10), | ||
204 | datasize >> 10, | ||
205 | initsize >> 10 | ||
206 | ); | ||
207 | } | ||
208 | |||
209 | /* free the pages occupied by initialization code */ | ||
210 | |||
211 | void | ||
212 | free_initmem(void) | ||
213 | { | ||
214 | unsigned long addr; | ||
215 | |||
216 | addr = (unsigned long)(&__init_begin); | ||
217 | for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { | ||
218 | ClearPageReserved(virt_to_page(addr)); | ||
219 | set_page_count(virt_to_page(addr), 1); | ||
220 | free_page(addr); | ||
221 | totalram_pages++; | ||
222 | } | ||
223 | printk (KERN_INFO "Freeing unused kernel memory: %luk freed\n", | ||
224 | (unsigned long)((&__init_end - &__init_begin) >> 10)); | ||
225 | } | ||