From: Heiko Schocher Date: Thu, 11 Sep 2008 06:11:23 +0000 (+0200) Subject: powerpc: Fix bootm to boot up again with a Ramdisk X-Git-Tag: v2008.10-rc2~6 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=56844a22b76c719e600047e23b80465a44d76abd;p=u-boot powerpc: Fix bootm to boot up again with a Ramdisk Commit 2a1a2cb6 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 Acked-by: Kumar Gala --- diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 0593bad024..288a5c4382 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 a7773aba07..8ceeb0faa9 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 48ccfd9100..c51212e05b 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 424c3c6b7e..ceaadc2bef 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -28,7 +28,7 @@ #include -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 348421fd30..38266e1da2 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); }