diff options
Diffstat (limited to 'common/cmd_bootm.c')
| -rw-r--r-- | common/cmd_bootm.c | 61 | 
1 files changed, 50 insertions, 11 deletions
| diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 2721216bf..a6499e8dd 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -37,6 +37,7 @@  #if defined(CONFIG_OF_LIBFDT)  #include <fdt.h>  #include <libfdt.h> +#include <fdt_support.h>  #endif  #if defined(CONFIG_OF_FLAT_TREE)  #include <ft_build.h> @@ -748,7 +749,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  		of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16);  		hdr = (image_header_t *)of_flat_tree;  #if defined(CONFIG_OF_LIBFDT) -		if (be32_to_cpu(fdt_magic(of_flat_tree)) == FDT_MAGIC) { +		if (fdt_check_header(of_flat_tree) == 0) {  #else  		if (*(ulong *)of_flat_tree == OF_DT_HEADER) {  #endif @@ -778,9 +779,8 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  			checksum = ntohl(hdr->ih_dcrc);  			addr = (ulong)((uchar *)(hdr) + sizeof(image_header_t)); -			len = ntohl(hdr->ih_size); -			if(checksum != crc32(0, (uchar *)addr, len)) { +			if(checksum != crc32(0, (uchar *)addr, ntohl(hdr->ih_size))) {  				printf("ERROR: Flat Device Tree checksum is invalid\n");  				return;  			} @@ -795,7 +795,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  				return;  			}  #if defined(CONFIG_OF_LIBFDT) -			if (be32_to_cpu(fdt_magic(of_flat_tree + sizeof(image_header_t))) != FDT_MAGIC) { +			if (fdt_check_header(of_flat_tree + sizeof(image_header_t)) == 0) {  #else  			if (*((ulong *)(of_flat_tree + sizeof(image_header_t))) != OF_DT_HEADER) {  #endif @@ -836,7 +836,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  		}  #if defined(CONFIG_OF_LIBFDT) -		if (be32_to_cpu(fdt_magic(of_data)) != FDT_MAGIC) { +		if (fdt_check_header((void *)of_data) != 0) {  #else  		if (((struct boot_param_header *)of_data)->magic != OF_DT_HEADER) {  #endif @@ -937,23 +937,44 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  	if (of_data) {  		int err;  		ulong of_start, of_len; +  		of_len = be32_to_cpu(fdt_totalsize(of_data)); -		/* provide extra 8k pad */ +		/* position on a 4K boundary before the initrd/kbd */  		if (initrd_start) -			of_start = initrd_start - of_len - 8192; +			of_start = initrd_start - of_len;  		else -			of_start  = (ulong)kbd - of_len - 8192; +			of_start  = (ulong)kbd - of_len;  		of_start &= ~(4096 - 1);	/* align on page */  		debug ("## device tree at 0x%08lX ... 0x%08lX (len=%ld=0x%lX)\n",  			of_data, of_data + of_len - 1, of_len, of_len); - +		of_flat_tree = (char *)of_start;  		printf ("   Loading Device Tree to %08lx, end %08lx ... ",  			of_start, of_start + of_len - 1); -		err = fdt_open_into(of_start, of_data, of_len); +		err = fdt_open_into((void *)of_start, (void *)of_data, of_len);  		if (err != 0) { -			printf ("libfdt: %s\n", fdt_strerror(err)); +			printf ("libfdt: %s " __FILE__ " %d\n", fdt_strerror(err), __LINE__);  		} +		/* +		 * Add the chosen node if it doesn't exist, add the env and bd_t +		 * if the user wants it (the logic is in the subroutines). +		 */ +		if (fdt_chosen(of_flat_tree, initrd_start, initrd_end, 0) < 0) { +				printf("Failed creating the /chosen node (0x%08X), aborting.\n", of_flat_tree); +				return; +		} +#ifdef CONFIG_OF_HAS_UBOOT_ENV +		if (fdt_env(of_flat_tree) < 0) { +				printf("Failed creating the /u-boot-env node, aborting.\n"); +				return; +		} +#endif +#ifdef CONFIG_OF_HAS_BD_T +		if (fdt_bd_t(of_flat_tree) < 0) { +				printf("Failed creating the /bd_t node, aborting.\n"); +				return; +		} +#endif  	}  #endif  #if defined(CONFIG_OF_FLAT_TREE) @@ -1004,6 +1025,24 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  	ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);  	/* ft_dump_blob(of_flat_tree); */  #endif +#if defined(CONFIG_OF_LIBFDT) +	if (fdt_chosen(of_flat_tree, initrd_start, initrd_end, 0) < 0) { +		printf("Failed creating the /chosen node (0x%08X), aborting.\n", of_flat_tree); +		return; +	} +#ifdef CONFIG_OF_HAS_UBOOT_ENV +	if (fdt_env(of_flat_tree) < 0) { +		printf("Failed creating the /u-boot-env node, aborting.\n"); +		return; +	} +#endif +#ifdef CONFIG_OF_HAS_BD_T +	if (fdt_bd_t(of_flat_tree) < 0) { +		printf("Failed creating the /bd_t node, aborting.\n"); +		return; +	} +#endif +#endif /* if defined(CONFIG_OF_LIBFDT) */  	(*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);  #endif |