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 <[EMAIL PROTECTED]> > --- > 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=2a1a2cb6e2b87ee550e6f27b647d23331dfd5e1b#patch3 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 <[EMAIL PROTECTED]> --- 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"); -- 1.5.4.1 bye Heiko -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot