aboutsummaryrefslogtreecommitdiff
path: root/common/image.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/image.c')
-rw-r--r--common/image.c117
1 files changed, 85 insertions, 32 deletions
diff --git a/common/image.c b/common/image.c
index 690e0af6cb8..ea27b0ba5b6 100644
--- a/common/image.c
+++ b/common/image.c
@@ -490,9 +490,6 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
image_header_t *rd_hdr;
show_boot_progress (9);
-
- /* copy from dataflash if needed */
- rd_addr = gen_get_image (rd_addr);
rd_hdr = (image_header_t *)rd_addr;
if (!image_check_magic (rd_hdr)) {
@@ -540,7 +537,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
* @flag: command flag
* @argc: command argument count
* @argv: command argument list
- * @hdr: pointer to the posiibly multi componet kernel image
+ * @images: pointer to the bootm images strcture
* @verify: checksum verification flag
* @arch: expected ramdisk architecture
* @rd_start: pointer to a ulong variable, will hold ramdisk start address
@@ -558,56 +555,111 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
* board is reset if ramdisk image is found but corrupted
*/
void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
- image_header_t *hdr, int verify, uint8_t arch,
+ bootm_headers_t *images, int verify, uint8_t arch,
ulong *rd_start, ulong *rd_end)
{
- ulong rd_addr;
+ ulong rd_addr, rd_load;
ulong rd_data, rd_len;
image_header_t *rd_hdr;
+#if defined(CONFIG_FIT)
+ void *fit_hdr;
+ const char *fit_uname_config = NULL;
+ const char *fit_uname_ramdisk = NULL;
+ ulong default_addr;
+#endif
- if (argc >= 3) {
+ /*
+ * Look for a '-' which indicates to ignore the
+ * ramdisk argument
+ */
+ if ((argc >= 3) && (strcmp(argv[2], "-") == 0)) {
+ debug ("## Skipping init Ramdisk\n");
+ rd_len = rd_data = 0;
+ } else if (argc >= 3) {
+#if defined(CONFIG_FIT)
/*
- * Look for a '-' which indicates to ignore the
- * ramdisk argument
+ * 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 (strcmp(argv[2], "-") == 0) {
- debug ("## Skipping init Ramdisk\n");
- rd_len = rd_data = 0;
- } else {
- /*
- * Check if there is an initrd image at the
- * address provided in the second bootm argument
- */
- rd_addr = simple_strtoul (argv[2], NULL, 16);
- printf ("## Loading init Ramdisk Image at %08lx ...\n",
+ 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);
+ }
+
+ /* copy from dataflash if needed */
+ printf ("## Loading init Ramdisk Image at %08lx ...\n",
+ rd_addr);
+ rd_addr = gen_get_image (rd_addr);
+
+ /*
+ * Check if there is an initrd image at the
+ * address provided in the second bootm argument
+ * check image type, for FIT images get FIT node.
+ */
+ switch (gen_image_get_format ((void *)rd_addr)) {
+ case IMAGE_FORMAT_LEGACY:
+
+ debug ("* ramdisk: legacy format image\n");
rd_hdr = image_get_ramdisk (cmdtp, flag, argc, argv,
rd_addr, arch, verify);
rd_data = image_get_data (rd_hdr);
rd_len = image_get_data_size (rd_hdr);
+ rd_load = image_get_load (rd_hdr);
+ break;
+#if defined(CONFIG_FIT)
+ case IMAGE_FORMAT_FIT:
+ fit_hdr = (void *)rd_addr;
+ debug ("* ramdisk: FIT format image\n");
+ fit_unsupported_reset ("ramdisk");
+ do_reset (cmdtp, flag, argc, argv);
+#endif
+ default:
+ printf ("Wrong Image Format for %s command\n",
+ cmdtp->name);
+ rd_data = rd_len = 0;
+ }
#if defined(CONFIG_B2) || defined(CONFIG_EVB4510) || defined(CONFIG_ARMADILLO)
- /*
- *we need to copy the ramdisk to SRAM to let Linux boot
- */
- memmove ((void *)image_get_load (rd_hdr),
- (uchar *)rd_data, rd_len);
-
- rd_data = image_get_load (rd_hdr);
-#endif /* CONFIG_B2 || CONFIG_EVB4510 || CONFIG_ARMADILLO */
+ /*
+ * We need to copy the ramdisk to SRAM to let Linux boot
+ */
+ if (rd_data) {
+ memmove ((void *)rd_load, (uchar *)rd_data, rd_len);
+ rd_data = rd_load;
}
+#endif /* CONFIG_B2 || CONFIG_EVB4510 || CONFIG_ARMADILLO */
- } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
+ } else if (images->legacy_hdr_valid &&
+ image_check_type (images->legacy_hdr_os, IH_TYPE_MULTI)) {
/*
- * Now check if we have a multifile image
- * Get second entry data start address and len
+ * Now check if we have a legacy mult-component image,
+ * get second entry data start address and len.
*/
show_boot_progress (13);
printf ("## Loading init Ramdisk from multi component "
- "Image at %08lx ...\n", (ulong)hdr);
- image_multi_getimg (hdr, 1, &rd_data, &rd_len);
+ "Image at %08lx ...\n",
+ (ulong)images->legacy_hdr_os);
+
+ image_multi_getimg (images->legacy_hdr_os, 1, &rd_data, &rd_len);
} else {
/*
* no initrd image
@@ -904,6 +956,7 @@ inline int fit_parse_subimage (const char *spec, ulong addr_curr,
{
return fit_parse_spec (spec, ':', addr_curr, addr, image_name);
}
+
#endif /* CONFIG_FIT */
#endif /* USE_HOSTCC */