powerpc: Fix bootm to boot up again with a Ramdisk
authorHeiko Schocher <hs@denx.de>
Thu, 11 Sep 2008 06:11:23 +0000 (08:11 +0200)
committerWolfgang Denk <wd@denx.de>
Sat, 13 Sep 2008 00:03:38 +0000 (02:03 +0200)
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 <hs@denx.de>
Acked-by: Kumar Gala <galak@kernel.crashing.org>
common/cmd_fdt.c
common/fdt_support.c
include/fdt.h
include/fdt_support.h
lib_ppc/bootm.c

index 0593bad024e77e8f2d483f8f8aa32d8491199fb0..288a5c4382729a7c4a9ed65bc5290a0dc2402d45 100644 (file)
@@ -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) {
index a7773aba0799cbce54dfe4820c2acc8ff645af0b..8ceeb0faa9d182ff3af838414aa70d1cda0b7afe 100644 (file)
@@ -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)
index 48ccfd9100002deb3aff35ee4f17bc7d232b25b2..c51212e05b4f41305c30682b61e62b11ecede12d 100644 (file)
@@ -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 */
index 424c3c6b7e0c804fc0fbf5acdedd5cb630759c20..ceaadc2bef75941cab02690528f057d6c5fe2e2c 100644 (file)
@@ -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);
index 348421fd30c4664f0d3986cd66476e4c50912829..38266e1da2176f94ce3bfae1c39866728f9d4a61 100644 (file)
@@ -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);
        }