diff options
| author | Heiko Schocher <hs@denx.de> | 2008-09-11 08:11:23 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2008-09-13 02:03:38 +0200 | 
| commit | 56844a22b76c719e600047e23b80465a44d76abd (patch) | |
| tree | 1a2776838726eee8f4f1ac1f389a0f25a30f162e | |
| parent | fc9c1727b5b3483ce49c3cb668e8332fb001b8a7 (diff) | |
| download | olio-uboot-2014.01-56844a22b76c719e600047e23b80465a44d76abd.tar.xz olio-uboot-2014.01-56844a22b76c719e600047e23b80465a44d76abd.zip | |
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 <hs@denx.de>
Acked-by: Kumar Gala <galak@kernel.crashing.org>
| -rw-r--r-- | common/cmd_fdt.c | 3 | ||||
| -rw-r--r-- | common/fdt_support.c | 4 | ||||
| -rw-r--r-- | include/fdt.h | 2 | ||||
| -rw-r--r-- | include/fdt_support.h | 2 | ||||
| -rw-r--r-- | 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 0593bad02..288a5c438 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 a7773aba0..8ceeb0faa 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 48ccfd910..c51212e05 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 424c3c6b7..ceaadc2be 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 348421fd3..38266e1da 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);  	} |