diff options
| author | Wolfgang Denk <wd@pollux.denx.de> | 2006-10-26 16:18:49 +0200 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2006-10-26 16:18:49 +0200 | 
| commit | b9e9adce0bbbfdb47a816f25cc1f1d3a1b2cd14b (patch) | |
| tree | 17882f63483994687e3e990a2cfca918bfa20aa8 | |
| parent | 5e3b0bc19f07ed277d85324ad0427642c8981baf (diff) | |
| parent | c76f951a747cfb87ba826ef45b5aea82d5b5dbb4 (diff) | |
| download | olio-uboot-2014.01-b9e9adce0bbbfdb47a816f25cc1f1d3a1b2cd14b.tar.xz olio-uboot-2014.01-b9e9adce0bbbfdb47a816f25cc1f1d3a1b2cd14b.zip | |
Merge with git://git.kernel.org/pub/scm/boot/u-boot/galak/u-boot.git#device_tree
| -rw-r--r-- | common/cmd_bootm.c | 61 | 
1 files changed, 55 insertions, 6 deletions
| diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index e8895c68e..ab3c32ca3 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -531,6 +531,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  	image_header_t *hdr = &header;  #ifdef CONFIG_OF_FLAT_TREE  	char	*of_flat_tree = NULL; +	ulong	of_data = 0;  #endif  	if ((s = getenv ("initrd_high")) != NULL) { @@ -745,11 +746,8 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  		if  (*(ulong *)of_flat_tree == OF_DT_HEADER) {  #ifndef CFG_NO_FLASH -			if (addr2info((ulong)of_flat_tree) != NULL) { -				printf ("Cannot modify flat device tree stored in flash\n" \ -					"Copy to memory before using the bootm command\n"); -				return; -			} +			if (addr2info((ulong)of_flat_tree) != NULL) +				of_data = (ulong)of_flat_tree;  #endif  		} else if (ntohl(hdr->ih_magic) == IH_MAGIC) {  			printf("## Flat Device Tree Image at %08lX\n", hdr); @@ -804,7 +802,39 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  		}  		printf ("   Booting using flat device tree at 0x%x\n",  				of_flat_tree); -	} else if(getenv("disable_of") == NULL) { +	} else if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1]) && (len_ptr[2])) { +		u_long tail    = ntohl(len_ptr[0]) % 4; +		int i; + +		/* skip kernel length, initrd length, and terminator */ +		of_data = (ulong)(&len_ptr[3]); +		/* skip any additional image length fields */ +		for (i=2; len_ptr[i]; ++i) +			of_data += 4; +		/* add kernel length, and align */ +		of_data += ntohl(len_ptr[0]); +		if (tail) { +			of_data += 4 - tail; +		} + +		/* add initrd length, and align */ +		tail = ntohl(len_ptr[1]) % 4; +		of_data += ntohl(len_ptr[1]); +		if (tail) { +			of_data += 4 - tail; +		} + +		if (((struct boot_param_header *)of_data)->magic != OF_DT_HEADER) { +			printf ("ERROR: image is not a flat device tree\n"); +			return; +		} + +		if (((struct boot_param_header *)of_data)->totalsize != ntohl(len_ptr[2])) { +			printf ("ERROR: flat device tree size does not agree with image\n"); +			return; +		} + +	} else if (getenv("disable_of") == NULL) {  		printf ("ERROR: bootm needs flat device tree as third argument\n");  		return;  	} @@ -900,6 +930,25 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,  	(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);  #else +	/* move of_flat_tree if needed */ +	if (of_data) { +		ulong of_start, of_len; +		of_len = ((struct boot_param_header *)of_data)->totalsize; +		/* provide extra 8k pad */ +		if (initrd_start) +			of_start = initrd_start - of_len - 8192; +		else +			of_start  = (ulong)kbd - of_len - 8192; +		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); +		memmove ((void *)of_start, (void *)of_data, of_len); +	} +  	ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);  	/* ft_dump_blob(of_flat_tree); */ |