diff options
-rw-r--r-- | arch/sh/kernel/setup.c | 8 | ||||
-rw-r--r-- | arch/sh/mm/Kconfig | 10 | ||||
-rw-r--r-- | arch/sh/mm/init.c | 29 | ||||
-rw-r--r-- | include/asm-sh/sparsemem.h | 16 |
4 files changed, 38 insertions, 25 deletions
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index 6f1ea9b33374..3241a6274b81 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -128,6 +128,7 @@ void __init setup_bootmem_allocator(unsigned long start_pfn) | |||
128 | bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, | 128 | bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, |
129 | min_low_pfn, max_low_pfn); | 129 | min_low_pfn, max_low_pfn); |
130 | 130 | ||
131 | add_active_range(0, min_low_pfn, max_low_pfn); | ||
131 | register_bootmem_low_pages(); | 132 | register_bootmem_low_pages(); |
132 | 133 | ||
133 | node_set_online(0); | 134 | node_set_online(0); |
@@ -192,6 +193,7 @@ static void __init setup_memory(void) | |||
192 | */ | 193 | */ |
193 | start_pfn = PFN_UP(__pa(_end)); | 194 | start_pfn = PFN_UP(__pa(_end)); |
194 | setup_bootmem_allocator(start_pfn); | 195 | setup_bootmem_allocator(start_pfn); |
196 | sparse_memory_present_with_active_regions(0); | ||
195 | } | 197 | } |
196 | #else | 198 | #else |
197 | extern void __init setup_memory(void); | 199 | extern void __init setup_memory(void); |
@@ -250,8 +252,9 @@ void __init setup_arch(char **cmdline_p) | |||
250 | min_low_pfn = __MEMORY_START >> PAGE_SHIFT; | 252 | min_low_pfn = __MEMORY_START >> PAGE_SHIFT; |
251 | 253 | ||
252 | nodes_clear(node_online_map); | 254 | nodes_clear(node_online_map); |
255 | |||
256 | /* Setup bootmem with available RAM */ | ||
253 | setup_memory(); | 257 | setup_memory(); |
254 | paging_init(); | ||
255 | sparse_init(); | 258 | sparse_init(); |
256 | 259 | ||
257 | #ifdef CONFIG_DUMMY_CONSOLE | 260 | #ifdef CONFIG_DUMMY_CONSOLE |
@@ -261,8 +264,9 @@ void __init setup_arch(char **cmdline_p) | |||
261 | /* Perform the machine specific initialisation */ | 264 | /* Perform the machine specific initialisation */ |
262 | if (likely(sh_mv.mv_setup)) | 265 | if (likely(sh_mv.mv_setup)) |
263 | sh_mv.mv_setup(cmdline_p); | 266 | sh_mv.mv_setup(cmdline_p); |
264 | } | ||
265 | 267 | ||
268 | paging_init(); | ||
269 | } | ||
266 | 270 | ||
267 | static const char *cpu_name[] = { | 271 | static const char *cpu_name[] = { |
268 | [CPU_SH7206] = "SH7206", [CPU_SH7619] = "SH7619", | 272 | [CPU_SH7206] = "SH7206", [CPU_SH7619] = "SH7619", |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 00f64c41edba..46fd212b3ed6 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -300,6 +300,13 @@ config NODES_SHIFT | |||
300 | config ARCH_FLATMEM_ENABLE | 300 | config ARCH_FLATMEM_ENABLE |
301 | def_bool y | 301 | def_bool y |
302 | 302 | ||
303 | config ARCH_SPARSEMEM_ENABLE | ||
304 | def_bool y | ||
305 | select SPARSEMEM_STATIC | ||
306 | |||
307 | config ARCH_SPARSEMEM_DEFAULT | ||
308 | def_bool y | ||
309 | |||
303 | config MAX_ACTIVE_REGIONS | 310 | config MAX_ACTIVE_REGIONS |
304 | int | 311 | int |
305 | default "1" | 312 | default "1" |
@@ -307,6 +314,9 @@ config MAX_ACTIVE_REGIONS | |||
307 | config ARCH_POPULATES_NODE_MAP | 314 | config ARCH_POPULATES_NODE_MAP |
308 | def_bool y | 315 | def_bool y |
309 | 316 | ||
317 | config ARCH_SELECT_MEMORY_MODEL | ||
318 | def_bool y | ||
319 | |||
310 | choice | 320 | choice |
311 | prompt "Kernel page size" | 321 | prompt "Kernel page size" |
312 | default PAGE_SIZE_4KB | 322 | default PAGE_SIZE_4KB |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index e0e644ff3204..1589466f9f87 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -36,14 +36,11 @@ void show_mem(void) | |||
36 | show_free_areas(); | 36 | show_free_areas(); |
37 | 37 | ||
38 | for_each_online_pgdat(pgdat) { | 38 | for_each_online_pgdat(pgdat) { |
39 | struct page *page, *end; | 39 | unsigned long flags, i; |
40 | unsigned long flags; | ||
41 | 40 | ||
42 | pgdat_resize_lock(pgdat, &flags); | 41 | pgdat_resize_lock(pgdat, &flags); |
43 | page = pgdat->node_mem_map; | 42 | for (i = 0; i < pgdat->node_spanned_pages; i++) { |
44 | end = page + pgdat->node_spanned_pages; | 43 | struct page *page = pgdat_page_nr(pgdat, i); |
45 | |||
46 | do { | ||
47 | total++; | 44 | total++; |
48 | if (PageReserved(page)) | 45 | if (PageReserved(page)) |
49 | reserved++; | 46 | reserved++; |
@@ -55,9 +52,7 @@ void show_mem(void) | |||
55 | free++; | 52 | free++; |
56 | else | 53 | else |
57 | shared += page_count(page) - 1; | 54 | shared += page_count(page) - 1; |
58 | page++; | 55 | } |
59 | } while (page < end); | ||
60 | |||
61 | pgdat_resize_unlock(pgdat, &flags); | 56 | pgdat_resize_unlock(pgdat, &flags); |
62 | } | 57 | } |
63 | 58 | ||
@@ -169,15 +164,11 @@ void __init paging_init(void) | |||
169 | low = pgdat->bdata->node_low_pfn; | 164 | low = pgdat->bdata->node_low_pfn; |
170 | 165 | ||
171 | max_zone_pfns[ZONE_NORMAL] = low; | 166 | max_zone_pfns[ZONE_NORMAL] = low; |
172 | add_active_range(nid, start_pfn, low); | ||
173 | 167 | ||
174 | printk("Node %u: start_pfn = 0x%lx, low = 0x%lx\n", | 168 | printk("Node %u: start_pfn = 0x%lx, low = 0x%lx\n", |
175 | nid, start_pfn, low); | 169 | nid, start_pfn, low); |
176 | 170 | ||
177 | free_area_init_nodes(max_zone_pfns); | 171 | free_area_init_nodes(max_zone_pfns); |
178 | |||
179 | printk("Node %u: mem_map starts at %p\n", | ||
180 | pgdat->node_id, pgdat->node_mem_map); | ||
181 | } | 172 | } |
182 | } | 173 | } |
183 | 174 | ||
@@ -185,16 +176,13 @@ static struct kcore_list kcore_mem, kcore_vmalloc; | |||
185 | 176 | ||
186 | void __init mem_init(void) | 177 | void __init mem_init(void) |
187 | { | 178 | { |
188 | int codesize, reservedpages, datasize, initsize; | 179 | int codesize, datasize, initsize; |
189 | int nid; | 180 | int nid; |
190 | 181 | ||
191 | reservedpages = 0; | ||
192 | |||
193 | for_each_online_node(nid) { | 182 | for_each_online_node(nid) { |
194 | pg_data_t *pgdat = NODE_DATA(nid); | 183 | pg_data_t *pgdat = NODE_DATA(nid); |
195 | unsigned long node_pages = 0; | 184 | unsigned long node_pages = 0; |
196 | void *node_high_memory; | 185 | void *node_high_memory; |
197 | int i; | ||
198 | 186 | ||
199 | num_physpages += pgdat->node_present_pages; | 187 | num_physpages += pgdat->node_present_pages; |
200 | 188 | ||
@@ -203,10 +191,6 @@ void __init mem_init(void) | |||
203 | 191 | ||
204 | totalram_pages += node_pages; | 192 | totalram_pages += node_pages; |
205 | 193 | ||
206 | for (i = 0; i < node_pages; i++) | ||
207 | if (PageReserved(pgdat->node_mem_map + i)) | ||
208 | reservedpages++; | ||
209 | |||
210 | node_high_memory = (void *)((pgdat->node_start_pfn + | 194 | node_high_memory = (void *)((pgdat->node_start_pfn + |
211 | pgdat->node_spanned_pages) << | 195 | pgdat->node_spanned_pages) << |
212 | PAGE_SHIFT); | 196 | PAGE_SHIFT); |
@@ -239,11 +223,10 @@ void __init mem_init(void) | |||
239 | VMALLOC_END - VMALLOC_START); | 223 | VMALLOC_END - VMALLOC_START); |
240 | 224 | ||
241 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, " | 225 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, " |
242 | "%dk reserved, %dk data, %dk init)\n", | 226 | "%dk data, %dk init)\n", |
243 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | 227 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), |
244 | totalram_pages << (PAGE_SHIFT-10), | 228 | totalram_pages << (PAGE_SHIFT-10), |
245 | codesize >> 10, | 229 | codesize >> 10, |
246 | reservedpages << (PAGE_SHIFT-10), | ||
247 | datasize >> 10, | 230 | datasize >> 10, |
248 | initsize >> 10); | 231 | initsize >> 10); |
249 | 232 | ||
diff --git a/include/asm-sh/sparsemem.h b/include/asm-sh/sparsemem.h new file mode 100644 index 000000000000..547a540b6667 --- /dev/null +++ b/include/asm-sh/sparsemem.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef __ASM_SH_SPARSEMEM_H | ||
2 | #define __ASM_SH_SPARSEMEM_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | /* | ||
6 | * SECTION_SIZE_BITS 2^N: how big each section will be | ||
7 | * MAX_PHYSADDR_BITS 2^N: how much physical address space we have | ||
8 | * MAX_PHYSMEM_BITS 2^N: how much memory we can have in that space | ||
9 | */ | ||
10 | #define SECTION_SIZE_BITS 26 | ||
11 | #define MAX_PHYSADDR_BITS 32 | ||
12 | #define MAX_PHYSMEM_BITS 32 | ||
13 | |||
14 | #endif | ||
15 | |||
16 | #endif /* __ASM_SH_SPARSEMEM_H */ | ||