* MA 02111-1307 USA
*/
-#define DEBUG
#ifndef USE_HOSTCC
#include <common.h>
#endif
#if defined(CONFIG_FIT)
+#include <u-boot/md5.h>
#include <sha1.h>
static int fit_check_ramdisk (const void *fit, int os_noffset,
int verify);
#else
#include "mkimage.h"
+#include <u-boot/md5.h>
#include <time.h>
#include <image.h>
#endif /* !USE_HOSTCC*/
return tmp;
}
-#ifdef CFG_SDRAM_BASE
+#if defined(CFG_SDRAM_BASE)
return CFG_SDRAM_BASE;
+#elif defined(CONFIG_ARM)
+ return gd->bd->bi_dram[0].start;
#else
return 0;
#endif
return tmp;
}
+#if defined(CONFIG_ARM)
+ return gd->bd->bi_dram[0].size;
+#else
return gd->bd->bi_memsize;
+#endif
}
void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
return ram_addr;
}
+/**
+ * fit_has_config - check if there is a valid FIT configuration
+ * @images: pointer to the bootm command headers structure
+ *
+ * fit_has_config() checks if there is a FIT configuration in use
+ * (if FTI support is present).
+ *
+ * returns:
+ * 0, no FIT support or no configuration found
+ * 1, configuration found
+ */
+int genimg_has_config (bootm_headers_t *images)
+{
+#if defined(CONFIG_FIT)
+ if (images->fit_uname_cfg)
+ return 1;
+#endif
+ return 0;
+}
+
/**
* boot_get_ramdisk - main ramdisk handling routine
* @argc: command argument count
const char *fit_uname_ramdisk = NULL;
ulong default_addr;
int rd_noffset;
- int conf_noffset;
+ int cfg_noffset;
const void *data;
size_t size;
#endif
if ((argc >= 3) && (strcmp(argv[2], "-") == 0)) {
debug ("## Skipping init Ramdisk\n");
rd_len = rd_data = 0;
- } else if (argc >= 3) {
+ } else if (argc >= 3 || genimg_has_config (images)) {
#if defined(CONFIG_FIT)
- /*
- * If the init ramdisk comes from the FIT image and the FIT image
- * address is omitted in the command line argument, try to use
- * os FIT image address or default load address.
- */
- if (images->fit_uname_os)
- default_addr = (ulong)images->fit_hdr_os;
- else
- default_addr = load_addr;
-
- if (fit_parse_conf (argv[2], default_addr,
- &rd_addr, &fit_uname_config)) {
- debug ("* ramdisk: config '%s' from image at 0x%08lx\n",
- fit_uname_config, rd_addr);
- } else if (fit_parse_subimage (argv[2], default_addr,
- &rd_addr, &fit_uname_ramdisk)) {
- debug ("* ramdisk: subimage '%s' from image at 0x%08lx\n",
- fit_uname_ramdisk, rd_addr);
- } else
+ if (argc >= 3) {
+ /*
+ * If the init ramdisk comes from the FIT image and
+ * the FIT image address is omitted in the command
+ * line argument, try to use os FIT image address or
+ * default load address.
+ */
+ if (images->fit_uname_os)
+ default_addr = (ulong)images->fit_hdr_os;
+ else
+ default_addr = load_addr;
+
+ if (fit_parse_conf (argv[2], default_addr,
+ &rd_addr, &fit_uname_config)) {
+ debug ("* ramdisk: config '%s' from image at 0x%08lx\n",
+ fit_uname_config, rd_addr);
+ } else if (fit_parse_subimage (argv[2], default_addr,
+ &rd_addr, &fit_uname_ramdisk)) {
+ debug ("* ramdisk: subimage '%s' from image at 0x%08lx\n",
+ fit_uname_ramdisk, rd_addr);
+ } else
#endif
- {
- rd_addr = simple_strtoul(argv[2], NULL, 16);
- debug ("* ramdisk: cmdline image address = 0x%08lx\n",
- rd_addr);
+ {
+ rd_addr = simple_strtoul(argv[2], NULL, 16);
+ debug ("* ramdisk: cmdline image address = 0x%08lx\n",
+ rd_addr);
+ }
+#if defined(CONFIG_FIT)
+ } else {
+ /* use FIT configuration provided in first bootm
+ * command argument
+ */
+ rd_addr = (ulong)images->fit_hdr_os;
+ fit_uname_config = images->fit_uname_cfg;
+ debug ("* ramdisk: using config '%s' from image at 0x%08lx\n",
+ fit_uname_config, rd_addr);
+
+ /*
+ * Check whether configuration has ramdisk defined,
+ * if not, don't try to use it, quit silently.
+ */
+ fit_hdr = (void *)rd_addr;
+ cfg_noffset = fit_conf_get_node (fit_hdr, fit_uname_config);
+ if (cfg_noffset < 0) {
+ debug ("* ramdisk: no such config\n");
+ return 0;
+ }
+
+ rd_noffset = fit_conf_get_ramdisk_node (fit_hdr, cfg_noffset);
+ if (rd_noffset < 0) {
+ debug ("* ramdisk: no ramdisk in config\n");
+ return 0;
+ }
}
+#endif
/* copy from dataflash if needed */
rd_addr = genimg_get_image (rd_addr);
* fit_conf_get_node() will try to find default config node
*/
show_boot_progress (122);
- conf_noffset = fit_conf_get_node (fit_hdr, fit_uname_config);
- if (conf_noffset < 0) {
+ cfg_noffset = fit_conf_get_node (fit_hdr, fit_uname_config);
+ if (cfg_noffset < 0) {
+ puts ("Could not find configuration node\n");
show_boot_progress (-122);
return 0;
}
+ fit_uname_config = fdt_get_name (fit_hdr, cfg_noffset, NULL);
+ printf (" Using '%s' configuration\n", fit_uname_config);
- rd_noffset = fit_conf_get_ramdisk_node (fit_hdr, conf_noffset);
+ rd_noffset = fit_conf_get_ramdisk_node (fit_hdr, cfg_noffset);
fit_uname_ramdisk = fit_get_name (fit_hdr, rd_noffset, NULL);
} else {
/* get ramdisk component image node offset */
rd_noffset = fit_image_get_node (fit_hdr, fit_uname_ramdisk);
}
if (rd_noffset < 0) {
+ puts ("Could not find subimage node\n");
show_boot_progress (-124);
return 0;
}
#endif /* CONFIG_B2 || CONFIG_EVB4510 || CONFIG_ARMADILLO */
} else if (images->legacy_hdr_valid &&
- image_check_type (images->legacy_hdr_os, IH_TYPE_MULTI)) {
+ image_check_type (&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) {
/*
* Now check if we have a legacy mult-component image,
* get second entry data start address and len.
return 0;
}
-#if defined(CONFIG_PPC) || defined(CONFIG_M68K)
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC)
/**
* boot_ramdisk_high - relocate init ramdisk
* @lmb: pointer to lmb handle, will be used for memory mgmt
(unsigned char *) value);
*value_len = 20;
} else if (strcmp (algo, "md5") == 0 ) {
- printf ("MD5 not supported\n");
- *value_len = 0;
+ md5 ((unsigned char *)data, data_len, value);
+ *value_len = 16;
} else {
debug ("Unsupported hash alogrithm\n");
return -1;
/**
* fit_conf_print - prints out the FIT configuration details
* @fit: pointer to the FIT format image header
- * @conf_noffset: offset of the configuration node
+ * @noffset: offset of the configuration node
* @p: pointer to prefix string
*
* fit_conf_print() lists all mandatory properies for the processed