* Support for FDT in uImage format, error when using FDT from flash
authorMatthew McClintock <msm@freescale.com>
Wed, 16 Aug 2006 15:54:09 +0000 (10:54 -0500)
committerMatthew McClintock <msm@freescale.com>
Wed, 16 Aug 2006 15:54:09 +0000 (10:54 -0500)
Signed-off-by: Matthew McClintock <msm@freescale.com>
common/cmd_bootm.c
include/image.h
tools/mkimage.c

index f1c0eb4d183959e32d2f21a3e6180b73fefb8a01..6eb258ec2bf1feb86cc76c12a50cf44f48d9d46c 100644 (file)
@@ -528,7 +528,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
        void    (*kernel)(bd_t *, ulong, ulong, ulong, ulong);
        image_header_t *hdr = &header;
 #ifdef CONFIG_OF_FLAT_TREE
-       char    *of_flat_tree;
+       char    *of_flat_tree = NULL;
 #endif
 
        if ((s = getenv ("initrd_high")) != NULL) {
@@ -737,14 +737,73 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
        }
 
 #ifdef CONFIG_OF_FLAT_TREE
-       if (argc >= 3)
-       {
+       if(argc >= 3) { 
                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);
        }
 #endif
-
        if (!data) {
                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_FIRMWARE:  type = "Firmware";              break;
        case IH_TYPE_SCRIPT:    type = "Script";                break;
+       case IH_TYPE_FLATDT:    type = "Flat Device Tree";      break;
        default:                type = "Unknown Image";         break;
        }
 
index 139df0b2d1e783b836a81689a053071bd290f1a8..ea7e9531dc7c5ccfa63e62b7b11e589a8bf7de79 100644 (file)
 #define IH_TYPE_FIRMWARE       5       /* Firmware Image               */
 #define IH_TYPE_SCRIPT         6       /* Script file                  */
 #define IH_TYPE_FILESYSTEM     7       /* Filesystem Image (any type)  */
+#define IH_TYPE_FLATDT         8       /* Binary Flat Device Tree Blob */
 
 /*
  * Compression Types
index fea3e5bc6b3079e3d2a915829f04a83c832797fb..d6000e04bf533f10ed1dd01628d08797cb6a31ab 100644 (file)
@@ -130,6 +130,7 @@ table_entry_t type_name[] = {
     {  IH_TYPE_RAMDISK,    "ramdisk",    "RAMDisk Image",      },
     {  IH_TYPE_SCRIPT,     "script",     "Script",             },
     {  IH_TYPE_STANDALONE, "standalone", "Standalone Program", },
+    {  IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",   },
     {  -1,                 "",           "",                   },
 };