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>
* gen_image_get_format() checks whether provided address points to a valid
* legacy or FIT image.
*
* 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
*/
* returns:
* image format type or IMAGE_FORMAT_INVALID if no image is present
*/
{
ulong format = IMAGE_FORMAT_INVALID;
image_header_t *hdr;
{
ulong format = IMAGE_FORMAT_INVALID;
image_header_t *hdr;
+#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;
char *fit_hdr;
#endif
hdr = (image_header_t *)img_addr;
if (image_check_magic(hdr))
format = IMAGE_FORMAT_LEGACY;
+#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
else {
fit_hdr = (char *)img_addr;
if (fdt_check_header (fit_hdr) == 0)
else {
fit_hdr = (char *)img_addr;
if (fdt_check_header (fit_hdr) == 0)
void image_print_contents (image_header_t *hdr);
#define IMAGE_FORMAT_INVALID 0x00
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);
int gen_image_get_format (void *img_addr);
ulong gen_get_image (ulong img_addr);
fdt_blob = (char *)image_get_load (fdt_hdr);
break;
fdt_blob = (char *)image_get_load (fdt_hdr);
break;
-
- /* 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 */
debug ("* fdt: FIT format image\n");
fit_unsupported_reset ("PPC fdt");
do_reset (cmdtp, flag, argc, argv);
debug ("* fdt: FIT format image\n");
fit_unsupported_reset ("PPC fdt");
do_reset (cmdtp, flag, argc, argv);
+ debug ("* fdt: raw FDT blob\n");
printf ("## Flattened Device Tree blob at %08lx\n", fdt_blob);
fdt_blob = (char *)fdt_addr;
}
break;
printf ("## Flattened Device Tree blob at %08lx\n", fdt_blob);
fdt_blob = (char *)fdt_addr;
}
break;
default:
fdt_error ("Did not find a cmdline Flattened Device Tree");
do_reset (cmdtp, flag, argc, argv);
default:
fdt_error ("Did not find a cmdline Flattened Device Tree");
do_reset (cmdtp, flag, argc, argv);