aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2005-11-02 17:34:20 -0500
committerPaul Mackerras <paulus@samba.org>2005-11-07 19:16:41 -0500
commita82765b6eee3d1267ded3320ca67b39fe1844599 (patch)
tree2b9273f931724303d1c1c968684bed0146e2da61
parent24bfb00123e82a2e70bd115277d922438813515b (diff)
[PATCH] powerpc: Fix ppc32 initrd
OK, the Fedora ppc32 and ppc64 kernels should both be arch/powerpc by tomorrow. They're booting on G5, POWER5, and my powerbook. I'll test pmac SMP and Pegasos later -- but pmac smp is known broken in arch/ppc anyway, and I'll live with a potential Pegasos regression for now; it wasn't supported officially in FC4 either. I needed to fix ppc32 initrd -- we were never setting initrd_start. Signed-off-by: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--arch/powerpc/kernel/setup-common.c40
-rw-r--r--arch/powerpc/kernel/setup_32.c1
-rw-r--r--arch/powerpc/kernel/setup_64.c37
3 files changed, 41 insertions, 37 deletions
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index d43fa8c0e5ac..e22856ecb5a0 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -405,6 +405,46 @@ static int __init set_preferred_console(void)
405console_initcall(set_preferred_console); 405console_initcall(set_preferred_console);
406#endif /* CONFIG_PPC_MULTIPLATFORM */ 406#endif /* CONFIG_PPC_MULTIPLATFORM */
407 407
408void __init check_for_initrd(void)
409{
410#ifdef CONFIG_BLK_DEV_INITRD
411 unsigned long *prop;
412
413 DBG(" -> check_for_initrd()\n");
414
415 if (of_chosen) {
416 prop = (unsigned long *)get_property(of_chosen,
417 "linux,initrd-start", NULL);
418 if (prop != NULL) {
419 initrd_start = (unsigned long)__va(*prop);
420 prop = (unsigned long *)get_property(of_chosen,
421 "linux,initrd-end", NULL);
422 if (prop != NULL) {
423 initrd_end = (unsigned long)__va(*prop);
424 initrd_below_start_ok = 1;
425 } else
426 initrd_start = 0;
427 }
428 }
429
430 /* If we were passed an initrd, set the ROOT_DEV properly if the values
431 * look sensible. If not, clear initrd reference.
432 */
433 if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
434 initrd_end > initrd_start)
435 ROOT_DEV = Root_RAM0;
436 else {
437 printk("Bogus initrd %08lx %08lx\n", initrd_start, initrd_end);
438 initrd_start = initrd_end = 0;
439 }
440
441 if (initrd_start)
442 printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
443
444 DBG(" <- check_for_initrd()\n");
445#endif /* CONFIG_BLK_DEV_INITRD */
446}
447
408#ifdef CONFIG_SMP 448#ifdef CONFIG_SMP
409 449
410/** 450/**
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
index b45eedbb4b3a..3af2631e3fab 100644
--- a/arch/powerpc/kernel/setup_32.c
+++ b/arch/powerpc/kernel/setup_32.c
@@ -286,6 +286,7 @@ void __init setup_arch(char **cmdline_p)
286 loops_per_jiffy = 500000000 / HZ; 286 loops_per_jiffy = 500000000 / HZ;
287 287
288 unflatten_device_tree(); 288 unflatten_device_tree();
289 check_for_initrd();
289 finish_device_tree(); 290 finish_device_tree();
290 291
291 smp_setup_cpu_maps(); 292 smp_setup_cpu_maps();
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 785fd9d7b386..0471e843b6c5 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -395,43 +395,6 @@ static void __init initialize_cache_info(void)
395 DBG(" <- initialize_cache_info()\n"); 395 DBG(" <- initialize_cache_info()\n");
396} 396}
397 397
398static void __init check_for_initrd(void)
399{
400#ifdef CONFIG_BLK_DEV_INITRD
401 u64 *prop;
402
403 DBG(" -> check_for_initrd()\n");
404
405 if (of_chosen) {
406 prop = (u64 *)get_property(of_chosen,
407 "linux,initrd-start", NULL);
408 if (prop != NULL) {
409 initrd_start = (unsigned long)__va(*prop);
410 prop = (u64 *)get_property(of_chosen,
411 "linux,initrd-end", NULL);
412 if (prop != NULL) {
413 initrd_end = (unsigned long)__va(*prop);
414 initrd_below_start_ok = 1;
415 } else
416 initrd_start = 0;
417 }
418 }
419
420 /* If we were passed an initrd, set the ROOT_DEV properly if the values
421 * look sensible. If not, clear initrd reference.
422 */
423 if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
424 initrd_end > initrd_start)
425 ROOT_DEV = Root_RAM0;
426 else
427 initrd_start = initrd_end = 0;
428
429 if (initrd_start)
430 printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
431
432 DBG(" <- check_for_initrd()\n");
433#endif /* CONFIG_BLK_DEV_INITRD */
434}
435 398
436/* 399/*
437 * Do some initial setup of the system. The parameters are those which 400 * Do some initial setup of the system. The parameters are those which