
Hello Kumar,
When we call fdt_chosen in bootm we get a dummy mem reserve added for the ramdisk location before its relocated. We need to delete that mem reserve before we call fdt_initrd() for the final fixup.
Signed-off-by: Kumar Gala galak@kernel.crashing.org
lib_ppc/bootm.c | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c index 348421f..c801021 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -180,8 +180,22 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
#if defined(CONFIG_OF_LIBFDT) /* fixup the initrd now that we know where it should be */
- if ((of_flat_tree) && (initrd_start && initrd_end))
- if ((of_flat_tree) && (initrd_start && initrd_end)) {
uint64_t addr, size;
int total = fdt_num_mem_rsv(of_flat_tree);
int j;
/* The call to fdt_chosen created a dummy mem rsv, delete it */
for (j = 0; j < total; j++) {
fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
if (addr == images->rd_start) {
fdt_del_mem_rsv(of_flat_tree, j);
break;
}
}
- fdt_initrd(of_flat_tree, initrd_start, initrd_end, 1);
- }
#endif debug ("## Transferring control to Linux (at address %08lx) ...\n", (ulong)kernel); -- 1.5.5.1
Hmm... OK, now the code will do the same as before, but is this optimal?
Why must we do a
a) dummy mem reservation b) search for it c) delete it d) make the right mem reservation?
Think the steps a) - c) are useless ...
Please have a look at the following patch, it deletes the steps a) - c) and fixes the fdt chosen command ...
[PATCH] 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 which was set up in fdt_chosen, and this stopped Linux from booting with a Ramdisk. This patch fixes this, by deleting the useless dummy mem reservation.
Signed-off-by: Heiko Schocher hs@denx.de --- common/cmd_fdt.c | 3 ++- common/fdt_support.c | 4 +--- include/fdt_support.h | 2 +- lib_ppc/bootm.c | 5 +++-- 4 files changed, 7 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_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..d581493 100644 --- a/lib_ppc/bootm.c +++ b/lib_ppc/bootm.c @@ -145,8 +145,9 @@ 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) { + /* we dont have to pass anymore the dummy initrd info! + we'll add this later, immediately with the right values. */ + if (fdt_chosen(of_flat_tree, 0) < 0) { puts ("ERROR: "); puts ("/chosen node create failed"); puts (" - must RESET the board to recover.\n");