aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2007-05-23 04:48:36 -0400
committerPaul Mundt <lethal@hera.kernel.org>2007-06-07 22:43:43 -0400
commitdfbb9042801eaeb4df9015bb86224291a39a0f52 (patch)
treefc762c923fbc48bd724e648ccb415307ba17086c /arch
parent5900711ad7173b1cf3ee72eb21572e20b263ca0d (diff)
sh: sparsemem support.
This implements basic sparsemem support for SH. Presently this only uses static sparsemem, and we still permit explicit selection of flatmem. Those boards that want sparsemem can select it as usual. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/sh/kernel/setup.c8
-rw-r--r--arch/sh/mm/Kconfig10
-rw-r--r--arch/sh/mm/init.c29
3 files changed, 22 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