[new uImage] Correct raw FDT blob handlig when CONFIG_FIT is disabled
authorMarian Balakowicz <m8@semihalf.com>
Wed, 27 Feb 2008 10:02:26 +0000 (11:02 +0100)
committerMarian Balakowicz <m8@semihalf.com>
Wed, 27 Feb 2008 10:02:26 +0000 (11:02 +0100)
Dual format image code must properly handle all three FDT passing methods:
- raw FDT blob passed
- FDT blob embedded in the legacy uImage
- FDT blob embedded in the new uImage

This patch enables proper raw FDT handling when no FIT imaeg support
is compiled in. This is a bit tricky as we must dected FIT format even
when FIT uImage handling is not enabled as both FIT uImages and raw FDT
blobs use tha same low level format (libfdt).

Signed-off-by: Marian Balakowicz <m8@semihalf.com>
common/image.c
include/image.h
lib_ppc/bootm.c

index 5ca77b9667b3311e5c6b51d2a3fb34946f8dd75c..c689b0ee62a5ae860012ead2226cbf4e98fb92e2 100644 (file)
@@ -375,6 +375,10 @@ void image_print_contents (image_header_t *hdr)
  * gen_image_get_format() checks whether provided address points to a valid
  * legacy or FIT image.
  *
+ * New uImage format and FDT blob are based on a libfdt. FDT blob
+ * may be passed directly or embedded in a FIT image. In both situations
+ * gen_image_get_format() must be able to dectect libfdt header.
+ *
  * returns:
  *     image format type or IMAGE_FORMAT_INVALID if no image is present
  */
@@ -382,14 +386,14 @@ int gen_image_get_format (void *img_addr)
 {
        ulong           format = IMAGE_FORMAT_INVALID;
        image_header_t  *hdr;
-#if defined(CONFIG_FIT)
+#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
        char            *fit_hdr;
 #endif
 
        hdr = (image_header_t *)img_addr;
        if (image_check_magic(hdr))
                format = IMAGE_FORMAT_LEGACY;
-#if defined(CONFIG_FIT)
+#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
        else {
                fit_hdr = (char *)img_addr;
                if (fdt_check_header (fit_hdr) == 0)
index 1bc090a1cbf8ec58de06a87b9e61acc8050bc479..08566eacec72b58797adcde1df55c9261f9d0eaa 100644 (file)
@@ -376,8 +376,9 @@ const char* image_get_comp_name (uint8_t comp);
 void image_print_contents (image_header_t *hdr);
 
 #define IMAGE_FORMAT_INVALID   0x00
-#define IMAGE_FORMAT_LEGACY    0x01
-#define IMAGE_FORMAT_FIT       0x02
+#define IMAGE_FORMAT_LEGACY    0x01    /* legacy image_header based format */
+#define IMAGE_FORMAT_FIT       0x02    /* new, libfdt based format */
+
 int gen_image_get_format (void *img_addr);
 ulong gen_get_image (ulong img_addr);
 
index ad05bc5d8e25372d2a2359976d7a958482bc1bd7..d80d69ab2edb27512f930bfdc0a20ee185cd1af5 100644 (file)
@@ -357,11 +357,15 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
 
                        fdt_blob = (char *)image_get_load (fdt_hdr);
                        break;
-#if defined(CONFIG_FIT)
                case IMAGE_FORMAT_FIT:
-
-                       /* check FDT blob vs FIT hdr */
-                       if (fit_uname_config || fit_uname_fdt) {
+                       /*
+                        * This case will catch both: new uImage format
+                        * (libfdt based) and raw FDT blob (also libfdt
+                        * based).
+                        */
+#if defined(CONFIG_FIT)
+                       /* check FDT blob vs FIT blob */
+                       if (0) { /* FIXME: call FIT format verification */
                                /*
                                 * FIT image
                                 */
@@ -369,15 +373,17 @@ static void get_fdt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                                debug ("*  fdt: FIT format image\n");
                                fit_unsupported_reset ("PPC fdt");
                                do_reset (cmdtp, flag, argc, argv);
-                       } else {
+                       } else
+#endif
+                       {
                                /*
                                 * FDT blob
                                 */
+                               debug ("*  fdt: raw FDT blob\n");
                                printf ("## Flattened Device Tree blob at %08lx\n", fdt_blob);
                                fdt_blob = (char *)fdt_addr;
                        }
                        break;
-#endif
                default:
                        fdt_error ("Did not find a cmdline Flattened Device Tree");
                        do_reset (cmdtp, flag, argc, argv);