X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=common%2Fimage.c;h=d218f2f88ba77397fd69b24e8e6f17cd9dde1954;hb=5e3dca577b7c1bf58bd2b48449b18b7e7dcd8e04;hp=f29614b9e223381243389dbf1722711c1580c23c;hpb=1372cce2b9040fb640e5032b84e3a033a22d6ff0;p=oweals%2Fu-boot.git diff --git a/common/image.c b/common/image.c index f29614b9e2..d218f2f88b 100644 --- a/common/image.c +++ b/common/image.c @@ -23,7 +23,6 @@ * MA 02111-1307 USA */ -#define DEBUG #ifndef USE_HOSTCC #include @@ -54,6 +53,7 @@ #endif #if defined(CONFIG_FIT) +#include #include static int fit_check_ramdisk (const void *fit, int os_noffset, @@ -70,6 +70,7 @@ static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, int verify); #else #include "mkimage.h" +#include #include #include #endif /* !USE_HOSTCC*/ @@ -463,8 +464,10 @@ ulong getenv_bootm_low(void) 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 @@ -478,7 +481,11 @@ ulong getenv_bootm_size(void) 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) @@ -737,6 +744,26 @@ ulong genimg_get_image (ulong img_addr) 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 @@ -771,7 +798,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, 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 @@ -786,33 +813,63 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, 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); @@ -859,13 +916,16 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, * 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 */ @@ -873,6 +933,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, 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; } @@ -922,7 +983,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, #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. @@ -953,7 +1014,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, 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 @@ -1880,8 +1941,8 @@ static int calculate_hash (const void *data, int data_len, const char *algo, (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; @@ -2394,7 +2455,7 @@ int fit_conf_get_fdt_node (const void *fit, int noffset) /** * 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