Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | } |