aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/sh/include/asm/page.h2
-rw-r--r--arch/sh/kernel/machine_kexec.c20
-rw-r--r--arch/sh/kernel/setup.c63
3 files changed, 40 insertions, 45 deletions
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h
index 0152c040f6c3..fb703d120d09 100644
--- a/arch/sh/include/asm/page.h
+++ b/arch/sh/include/asm/page.h
@@ -49,7 +49,7 @@
49 49
50extern unsigned long shm_align_mask; 50extern unsigned long shm_align_mask;
51extern unsigned long max_low_pfn, min_low_pfn; 51extern unsigned long max_low_pfn, min_low_pfn;
52extern unsigned long memory_start, memory_end; 52extern unsigned long memory_start, memory_end, memory_limit;
53 53
54static inline unsigned long 54static inline unsigned long
55pages_do_alias(unsigned long addr1, unsigned long addr2) 55pages_do_alias(unsigned long addr1, unsigned long addr2)
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c
index f0f049caa6e2..7f68fc0e89e8 100644
--- a/arch/sh/kernel/machine_kexec.c
+++ b/arch/sh/kernel/machine_kexec.c
@@ -169,7 +169,8 @@ void __init reserve_crashkernel(void)
169 169
170 crash_size = PAGE_ALIGN(crashk_res.end - crashk_res.start + 1); 170 crash_size = PAGE_ALIGN(crashk_res.end - crashk_res.start + 1);
171 if (!crashk_res.start) { 171 if (!crashk_res.start) {
172 crashk_res.start = lmb_alloc(crash_size, PAGE_SIZE); 172 unsigned long max = lmb_end_of_DRAM() - memory_limit;
173 crashk_res.start = __lmb_alloc_base(crash_size, PAGE_SIZE, max);
173 if (!crashk_res.start) { 174 if (!crashk_res.start) {
174 pr_err("crashkernel allocation failed\n"); 175 pr_err("crashkernel allocation failed\n");
175 goto disable; 176 goto disable;
@@ -183,15 +184,22 @@ void __init reserve_crashkernel(void)
183 } 184 }
184 } 185 }
185 186
186 pr_info("Reserving %ldMB of memory at %ldMB " 187 crashk_res.end = crashk_res.start + crash_size - 1;
188
189 /*
190 * Crash kernel trumps memory limit
191 */
192 if ((lmb_end_of_DRAM() - memory_limit) <= crashk_res.end) {
193 memory_limit = 0;
194 pr_info("Disabled memory limit for crashkernel\n");
195 }
196
197 pr_info("Reserving %ldMB of memory at 0x%08lx "
187 "for crashkernel (System RAM: %ldMB)\n", 198 "for crashkernel (System RAM: %ldMB)\n",
188 (unsigned long)(crash_size >> 20), 199 (unsigned long)(crash_size >> 20),
189 (unsigned long)(crashk_res.start >> 20), 200 (unsigned long)(crashk_res.start),
190 (unsigned long)(lmb_phys_mem_size() >> 20)); 201 (unsigned long)(lmb_phys_mem_size() >> 20));
191 202
192 crashk_res.end = crashk_res.start + crash_size - 1;
193 insert_resource(&iomem_resource, &crashk_res);
194
195 return; 203 return;
196 204
197disable: 205disable:
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
index 2c9ab2842765..f6a2db12ad78 100644
--- a/arch/sh/kernel/setup.c
+++ b/arch/sh/kernel/setup.c
@@ -95,6 +95,7 @@ unsigned long memory_start;
95EXPORT_SYMBOL(memory_start); 95EXPORT_SYMBOL(memory_start);
96unsigned long memory_end = 0; 96unsigned long memory_end = 0;
97EXPORT_SYMBOL(memory_end); 97EXPORT_SYMBOL(memory_end);
98unsigned long memory_limit = 0;
98 99
99static struct resource mem_resources[MAX_NUMNODES]; 100static struct resource mem_resources[MAX_NUMNODES];
100 101
@@ -102,21 +103,12 @@ int l1i_cache_shape, l1d_cache_shape, l2_cache_shape;
102 103
103static int __init early_parse_mem(char *p) 104static int __init early_parse_mem(char *p)
104{ 105{
105 unsigned long size; 106 if (!p)
107 return 1;
106 108
107 memory_start = (unsigned long)__va(__MEMORY_START); 109 memory_limit = PAGE_ALIGN(memparse(p, &p));
108 size = memparse(p, &p);
109
110 if (size > __MEMORY_SIZE) {
111 printk(KERN_ERR
112 "Using mem= to increase the size of kernel memory "
113 "is not allowed.\n"
114 " Recompile the kernel with the correct value for "
115 "CONFIG_MEMORY_SIZE.\n");
116 return 0;
117 }
118 110
119 memory_end = memory_start + size; 111 pr_notice("Memory limited to %ldMB\n", memory_limit >> 20);
120 112
121 return 0; 113 return 0;
122} 114}
@@ -252,7 +244,7 @@ void __init do_init_bootmem(void)
252{ 244{
253 unsigned long bootmap_size; 245 unsigned long bootmap_size;
254 unsigned long bootmap_pages, bootmem_paddr; 246 unsigned long bootmap_pages, bootmem_paddr;
255 u64 total_pages = (lmb_end_of_DRAM() - __MEMORY_START) >> PAGE_SHIFT; 247 u64 total_pages = lmb_phys_mem_size() >> PAGE_SHIFT;
256 int i; 248 int i;
257 249
258 bootmap_pages = bootmem_bootmap_pages(total_pages); 250 bootmap_pages = bootmem_bootmap_pages(total_pages);
@@ -277,12 +269,6 @@ void __init do_init_bootmem(void)
277 } 269 }
278 270
279 /* 271 /*
280 * Handle additional early reservations
281 */
282 check_for_initrd();
283 reserve_crashkernel();
284
285 /*
286 * Add all physical memory to the bootmem map and mark each 272 * Add all physical memory to the bootmem map and mark each
287 * area as present. 273 * area as present.
288 */ 274 */
@@ -299,7 +285,7 @@ void __init do_init_bootmem(void)
299 sparse_memory_present_with_active_regions(0); 285 sparse_memory_present_with_active_regions(0);
300} 286}
301 287
302static void __init setup_memory(void) 288static void __init early_reserve_mem(void)
303{ 289{
304 unsigned long start_pfn; 290 unsigned long start_pfn;
305 291
@@ -326,11 +312,11 @@ static void __init setup_memory(void)
326 if (CONFIG_ZERO_PAGE_OFFSET != 0) 312 if (CONFIG_ZERO_PAGE_OFFSET != 0)
327 lmb_reserve(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET); 313 lmb_reserve(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET);
328 314
329 lmb_analyze(); 315 /*
330 lmb_dump_all(); 316 * Handle additional early reservations
331 317 */
332 do_init_bootmem(); 318 check_for_initrd();
333 plat_mem_setup(); 319 reserve_crashkernel();
334} 320}
335 321
336/* 322/*
@@ -397,10 +383,6 @@ void __init setup_arch(char **cmdline_p)
397 bss_resource.start = virt_to_phys(__bss_start); 383 bss_resource.start = virt_to_phys(__bss_start);
398 bss_resource.end = virt_to_phys(_ebss)-1; 384 bss_resource.end = virt_to_phys(_ebss)-1;
399 385
400 memory_start = (unsigned long)__va(__MEMORY_START);
401 if (!memory_end)
402 memory_end = memory_start + __MEMORY_SIZE;
403
404#ifdef CONFIG_CMDLINE_OVERWRITE 386#ifdef CONFIG_CMDLINE_OVERWRITE
405 strlcpy(command_line, CONFIG_CMDLINE, sizeof(command_line)); 387 strlcpy(command_line, CONFIG_CMDLINE, sizeof(command_line));
406#else 388#else
@@ -417,8 +399,6 @@ void __init setup_arch(char **cmdline_p)
417 399
418 parse_early_param(); 400 parse_early_param();
419 401
420 uncached_init();
421
422 plat_early_device_setup(); 402 plat_early_device_setup();
423 403
424 /* Let earlyprintk output early console messages */ 404 /* Let earlyprintk output early console messages */
@@ -429,21 +409,28 @@ void __init setup_arch(char **cmdline_p)
429 sh_mv_setup(); 409 sh_mv_setup();
430 sh_mv.mv_mem_init(); 410 sh_mv.mv_mem_init();
431 411
432 /* 412 early_reserve_mem();
433 * Find the highest page frame number we have available 413
434 */ 414 lmb_enforce_memory_limit(memory_limit);
435 max_pfn = PFN_DOWN(__pa(memory_end)); 415 lmb_analyze();
416
417 lmb_dump_all();
436 418
437 /* 419 /*
438 * Determine low and high memory ranges: 420 * Determine low and high memory ranges:
439 */ 421 */
440 max_low_pfn = max_pfn; 422 max_low_pfn = max_pfn = lmb_end_of_DRAM() >> PAGE_SHIFT;
441 min_low_pfn = __MEMORY_START >> PAGE_SHIFT; 423 min_low_pfn = __MEMORY_START >> PAGE_SHIFT;
442 424
443 nodes_clear(node_online_map); 425 nodes_clear(node_online_map);
444 426
427 memory_start = (unsigned long)__va(__MEMORY_START);
428 memory_end = memory_start + (memory_limit ?: lmb_phys_mem_size());
429
430 uncached_init();
445 pmb_init(); 431 pmb_init();
446 setup_memory(); 432 do_init_bootmem();
433 plat_mem_setup();
447 sparse_init(); 434 sparse_init();
448 435
449#ifdef CONFIG_DUMMY_CONSOLE 436#ifdef CONFIG_DUMMY_CONSOLE