aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/sh/kernel/setup.c8
-rw-r--r--arch/sh/mm/Kconfig10
-rw-r--r--arch/sh/mm/init.c29
-rw-r--r--include/asm-sh/sparsemem.h16
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
197extern void __init setup_memory(void); 199extern 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
267static const char *cpu_name[] = { 271static 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
300config ARCH_FLATMEM_ENABLE 300config ARCH_FLATMEM_ENABLE
301 def_bool y 301 def_bool y
302 302
303config ARCH_SPARSEMEM_ENABLE
304 def_bool y
305 select SPARSEMEM_STATIC
306
307config ARCH_SPARSEMEM_DEFAULT
308 def_bool y
309
303config MAX_ACTIVE_REGIONS 310config MAX_ACTIVE_REGIONS
304 int 311 int
305 default "1" 312 default "1"
@@ -307,6 +314,9 @@ config MAX_ACTIVE_REGIONS
307config ARCH_POPULATES_NODE_MAP 314config ARCH_POPULATES_NODE_MAP
308 def_bool y 315 def_bool y
309 316
317config ARCH_SELECT_MEMORY_MODEL
318 def_bool y
319
310choice 320choice
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
186void __init mem_init(void) 177void __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 */