[U-Boot] [PATCH v3] powerpc: Fix bootm to boot up again with a Ramdisk
Heiko Schocher
hs at denx.de
Thu Sep 11 08:11:23 CEST 2008
Patch
http://git.denx.de/?p=u-boot.git;a=commitdiff;h=2a1a2cb6e2b87ee550e6f27b647d23331dfd5e1b#patch3
didnt remove the dummy mem reservation in fdt_chosen, and
this stopped Linux from booting with a Ramdisk. This patch
fixes this, by deleting the useless dummy mem reservation.
When booting with a Ramdisk, a fix offset FDT_RAMDISK_OVERHEAD
is now added to of_size, so we dont need anymore a dummy
mem reservation.
I measured the value of FDT_RAMDISK_OVERHEAD on a MPC8270
based system (=0x44 bytes) and rounded it up to 0x80).
Signed-off-by: Heiko Schocher <hs at denx.de>
---
common/cmd_fdt.c | 3 ++-
common/fdt_support.c | 4 +---
include/fdt.h | 2 ++
include/fdt_support.h | 2 +-
lib_ppc/bootm.c | 5 +++--
5 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c
index 0593bad..288a5c4 100644
--- a/common/cmd_fdt.c
+++ b/common/cmd_fdt.c
@@ -450,7 +450,8 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
initrd_end = simple_strtoul(argv[3], NULL, 16);
}
- fdt_chosen(working_fdt, initrd_start, initrd_end, 1);
+ fdt_chosen(working_fdt, 1);
+ fdt_initrd(working_fdt, initrd_start, initrd_end, 1);
}
/* resize the fdt */
else if (strncmp(argv[1], "re", 2) == 0) {
diff --git a/common/fdt_support.c b/common/fdt_support.c
index a7773ab..8ceeb0f 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -165,7 +165,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)
return 0;
}
-int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
+int fdt_chosen(void *fdt, int force)
{
int nodeoffset;
int err;
@@ -215,8 +215,6 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
}
}
- fdt_initrd(fdt, initrd_start, initrd_end, force);
-
#ifdef CONFIG_OF_STDOUT_VIA_ALIAS
path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL);
if ((path == NULL) || force)
diff --git a/include/fdt.h b/include/fdt.h
index 48ccfd9..c51212e 100644
--- a/include/fdt.h
+++ b/include/fdt.h
@@ -57,4 +57,6 @@ struct fdt_property {
#define FDT_V16_SIZE FDT_V3_SIZE
#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))
+/* adding a ramdisk needs 0x44 bytes in version 2008.10 */
+#define FDT_RAMDISK_OVERHEAD 0x80
#endif /* _FDT_H */
diff --git a/include/fdt_support.h b/include/fdt_support.h
index 424c3c6..ceaadc2 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -28,7 +28,7 @@
#include <fdt.h>
-int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force);
+int fdt_chosen(void *fdt, int force);
int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force);
void do_fixup_by_path(void *fdt, const char *path, const char *prop,
const void *val, int len, int create);
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index 348421f..38266e1 100644
--- a/lib_ppc/bootm.c
+++ b/lib_ppc/bootm.c
@@ -145,8 +145,7 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
* if the user wants it (the logic is in the subroutines).
*/
if (of_size) {
- /* pass in dummy initrd info, we'll fix up later */
- if (fdt_chosen(of_flat_tree, images->rd_start, images->rd_end, 0) < 0) {
+ if (fdt_chosen(of_flat_tree, 0) < 0) {
puts ("ERROR: ");
puts ("/chosen node create failed");
puts (" - must RESET the board to recover.\n");
@@ -169,6 +168,8 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
goto error;
of_size = ret;
+ if ((of_flat_tree) && (initrd_start && initrd_end))
+ of_size += FDT_RAMDISK_OVERHEAD;
/* Create a new LMB reservation */
lmb_reserve(lmb, (ulong)of_flat_tree, of_size);
}
--
1.5.6.1
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
More information about the U-Boot
mailing list