[U-Boot] [PATCH v2] powerpc: Fix bootm to boot up again with a Ramdisk

Patch http://git.denx.de/?p=u-boot.git;a=commitdiff;h=2a1a2cb6e2b87ee550e6f27b647d...
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.
Signed-off-by: Heiko Schocher hs@denx.de ---
changes sinse last patch:
- added comments from Wolfgang Denk
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); }

On Sep 10, 2008, at 4:34 AM, Heiko Schocher wrote:
Patch http://git.denx.de/?p=u-boot.git;a=commitdiff;h=2a1a2cb6e2b87ee550e6f27b647d...
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.
Signed-off-by: Heiko Schocher hs@denx.de
changes sinse last patch:
- added comments from Wolfgang Denk
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(-)
it would be nice in either the commit message or a comment how you came to the value of FDT_RAMDISK_OVERHEAD.
- k

Patch http://git.denx.de/?p=u-boot.git;a=commitdiff;h=2a1a2cb6e2b87ee550e6f27b647d...
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@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); }

On Sep 11, 2008, at 1:11 AM, Heiko Schocher wrote:
Patch http://git.denx.de/?p=u-boot.git;a=commitdiff;h=2a1a2cb6e2b87ee550e6f27b647d...
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@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(-)
Acked-by: Kumar Gala galak@kernel.crashing.org
- k

Dear Heiko Schocher,
In message 48C8B68B.5050603@denx.de you wrote:
Patch http://git.denx.de/?p=u-boot.git;a=commitdiff;h=2a1a2cb6e2b87ee550e6f27b647d...
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@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(-)
Applied, thanks.
Best regards,
Wolfgang Denk
participants (3)
-
Heiko Schocher
-
Kumar Gala
-
Wolfgang Denk