Support for FDT in uImage format, error when using FDT from flash
Signed-off-by: Matthew McClintock <msm@freescale.com>
This commit is contained in:
		
							parent
							
								
									681fc61c4c
								
							
						
					
					
						commit
						87a449c8ac
					
				|  | @ -528,7 +528,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag, | ||||||
| 	void	(*kernel)(bd_t *, ulong, ulong, ulong, ulong); | 	void	(*kernel)(bd_t *, ulong, ulong, ulong, ulong); | ||||||
| 	image_header_t *hdr = &header; | 	image_header_t *hdr = &header; | ||||||
| #ifdef CONFIG_OF_FLAT_TREE | #ifdef CONFIG_OF_FLAT_TREE | ||||||
| 	char	*of_flat_tree; | 	char	*of_flat_tree = NULL; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	if ((s = getenv ("initrd_high")) != NULL) { | 	if ((s = getenv ("initrd_high")) != NULL) { | ||||||
|  | @ -737,14 +737,73 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_OF_FLAT_TREE | #ifdef CONFIG_OF_FLAT_TREE | ||||||
| 	if (argc >= 3) | 	if(argc >= 3) { | ||||||
| 	{ |  | ||||||
| 		of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16); | 		of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16); | ||||||
| 		printf ("Booting using flat device tree at 0x%x\n", | 		hdr = (image_header_t *)of_flat_tree; | ||||||
|  | 
 | ||||||
|  | 		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; | ||||||
|  | 			} | ||||||
|  | #endif | ||||||
|  | 		} else if (ntohl(hdr->ih_magic) == IH_MAGIC) { | ||||||
|  | 			printf("## Flat Device Tree Image at %08lX\n", hdr); | ||||||
|  | 			print_image_hdr(hdr); | ||||||
|  | 
 | ||||||
|  | 			if ((ntohl(hdr->ih_load) <  ((unsigned long)hdr + ntohl(hdr->ih_size) + sizeof(hdr))) && | ||||||
|  | 			   ((ntohl(hdr->ih_load) + ntohl(hdr->ih_size)) > (unsigned long)hdr)) { | ||||||
|  | 				printf ("ERROR: Load address overwrites Flat Device Tree uImage\n"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			printf("   Verifying Checksum ... "); | ||||||
|  | 			memmove (&header, (char *)hdr, sizeof(image_header_t)); | ||||||
|  | 			checksum = ntohl(header.ih_hcrc); | ||||||
|  | 			header.ih_hcrc = 0; | ||||||
|  | 
 | ||||||
|  | 			if(checksum != crc32(0, (uchar *)&header, sizeof(image_header_t))) { | ||||||
|  | 				printf("ERROR: Flat Device Tree header checksum is invalid\n"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			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)) { | ||||||
|  | 				printf("ERROR: Flat Device Tree checksum is invalid\n"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			printf("OK\n"); | ||||||
|  | 
 | ||||||
|  | 			if (ntohl(hdr->ih_type) != IH_TYPE_FLATDT) { | ||||||
|  | 				printf ("ERROR: uImage not Flat Device Tree type\n"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			if (ntohl(hdr->ih_comp) != IH_COMP_NONE) { | ||||||
|  | 				printf("ERROR: uImage is not uncompressed\n"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			if (*((ulong *)(of_flat_tree + sizeof(image_header_t))) != OF_DT_HEADER) { | ||||||
|  | 				printf ("ERROR: uImage data is not a flat device tree\n"); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			memmove((void *)ntohl(hdr->ih_load), | ||||||
|  | 		       		(void *)(of_flat_tree + sizeof(image_header_t)), | ||||||
|  | 				ntohl(hdr->ih_size)); | ||||||
|  | 			of_flat_tree = (char *)ntohl(hdr->ih_load); | ||||||
|  | 		} else { | ||||||
|  | 			printf ("Did not find a flat flat device tree at address %08lX\n", of_flat_tree); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		printf ("   Booting using flat device tree at 0x%x\n", | ||||||
| 				of_flat_tree); | 				of_flat_tree); | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
| 
 |  | ||||||
| 	if (!data) { | 	if (!data) { | ||||||
| 		debug ("No initrd\n"); | 		debug ("No initrd\n"); | ||||||
| 	} | 	} | ||||||
|  | @ -1272,6 +1331,7 @@ print_type (image_header_t *hdr) | ||||||
| 	case IH_TYPE_MULTI:	type = "Multi-File Image";	break; | 	case IH_TYPE_MULTI:	type = "Multi-File Image";	break; | ||||||
| 	case IH_TYPE_FIRMWARE:	type = "Firmware";		break; | 	case IH_TYPE_FIRMWARE:	type = "Firmware";		break; | ||||||
| 	case IH_TYPE_SCRIPT:	type = "Script";		break; | 	case IH_TYPE_SCRIPT:	type = "Script";		break; | ||||||
|  | 	case IH_TYPE_FLATDT:	type = "Flat Device Tree";	break; | ||||||
| 	default:		type = "Unknown Image";		break; | 	default:		type = "Unknown Image";		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -124,6 +124,7 @@ | ||||||
| #define IH_TYPE_FIRMWARE	5	/* Firmware Image		*/ | #define IH_TYPE_FIRMWARE	5	/* Firmware Image		*/ | ||||||
| #define IH_TYPE_SCRIPT		6	/* Script file			*/ | #define IH_TYPE_SCRIPT		6	/* Script file			*/ | ||||||
| #define IH_TYPE_FILESYSTEM	7	/* Filesystem Image (any type)	*/ | #define IH_TYPE_FILESYSTEM	7	/* Filesystem Image (any type)	*/ | ||||||
|  | #define IH_TYPE_FLATDT		8	/* Binary Flat Device Tree Blob	*/ | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Compression Types |  * Compression Types | ||||||
|  |  | ||||||
|  | @ -130,6 +130,7 @@ table_entry_t type_name[] = { | ||||||
|     {	IH_TYPE_RAMDISK,    "ramdisk",	  "RAMDisk Image",	}, |     {	IH_TYPE_RAMDISK,    "ramdisk",	  "RAMDisk Image",	}, | ||||||
|     {	IH_TYPE_SCRIPT,     "script",	  "Script",		}, |     {	IH_TYPE_SCRIPT,     "script",	  "Script",		}, | ||||||
|     {	IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, |     {	IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, | ||||||
|  |     {	IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",	}, | ||||||
|     {	-1,		    "",		  "",			}, |     {	-1,		    "",		  "",			}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue