bootm: Use selected configuration for ramdisk and fdt
authorSimon Glass <sjg@chromium.org>
Thu, 11 Jul 2013 06:08:10 +0000 (23:08 -0700)
committerTom Rini <trini@ti.com>
Fri, 12 Jul 2013 14:32:39 +0000 (10:32 -0400)
If a specific configuraion is selected by the bootm command, e.g. with
'bootm 84000000#recoveryconf' we must honour this for not just the kernel,
but also the ramdisk and FDT.

In the conversion to using a common fit_image_load() function for loading
images from FITs (commits a51ec63 and 53f375f) this feature was lost.
Reinstate it by passing the selected configuration back from
fit_image_load() to boot_get_kernel(), then use this configuration
(which is stored in images->fit_uname_cfg) in both boot_get_ramdisk()
and boot_get_fdt().

Signed-off-by: Simon Glass <sjg@chromium.org>
common/cmd_bootm.c
common/image-fdt.c
common/image-fit.c
common/image.c
include/image.h

index 9985531452cdde79211f87f34cef999d471b4313..2694c664a409a5fe7ebd0914a82c58f84dd7fe4d 100644 (file)
@@ -988,7 +988,7 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
        case IMAGE_FORMAT_FIT:
                os_noffset = fit_image_load(images, FIT_KERNEL_PROP,
                                img_addr,
-                               &fit_uname_kernel, fit_uname_config,
+                               &fit_uname_kernel, &fit_uname_config,
                                IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
                                BOOTSTAGE_ID_FIT_KERNEL_START,
                                FIT_LOAD_IGNORED, os_data, os_len);
@@ -997,6 +997,7 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
 
                images->fit_hdr_os = map_sysmem(img_addr, 0);
                images->fit_uname_os = fit_uname_kernel;
+               images->fit_uname_cfg = fit_uname_config;
                images->fit_noffset_os = os_noffset;
                break;
 #endif
index d99f444de126813476f371d5cebcfdd28281073c..203404afb46219c6390956aa4de83f6f5d5b7d6f 100644 (file)
@@ -243,7 +243,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
        ulong           load, load_end;
        void            *buf;
 #if defined(CONFIG_FIT)
-       const char      *fit_uname_config = NULL;
+       const char      *fit_uname_config = images->fit_uname_cfg;
        const char      *fit_uname_fdt = NULL;
        ulong           default_addr;
        int             fdt_noffset;
@@ -367,7 +367,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                                fdt_noffset = fit_image_load(images,
                                        FIT_FDT_PROP,
                                        fdt_addr, &fit_uname_fdt,
-                                       fit_uname_config,
+                                       &fit_uname_config,
                                        arch, IH_TYPE_FLATDT,
                                        BOOTSTAGE_ID_FIT_FDT_START,
                                        FIT_LOAD_OPTIONAL, &load, &len);
index b75e119d930e5d70d6ac703f70bbef50687ee21d..e28dd054743811a4cb408650d9fdde85fef34fd6 100644 (file)
@@ -1478,12 +1478,13 @@ int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
 }
 
 int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
-                  const char **fit_unamep, const char *fit_uname_config,
+                  const char **fit_unamep, const char **fit_uname_configp,
                   int arch, int image_type, int bootstage_id,
                   enum fit_load_op load_op, ulong *datap, ulong *lenp)
 {
        int cfg_noffset, noffset;
        const char *fit_uname;
+       const char *fit_uname_config;
        const void *fit;
        const void *buf;
        size_t size;
@@ -1493,6 +1494,7 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
 
        fit = map_sysmem(addr, 0);
        fit_uname = fit_unamep ? *fit_unamep : NULL;
+       fit_uname_config = fit_uname_configp ? *fit_uname_configp : NULL;
        printf("## Loading %s from FIT Image at %08lx ...\n", prop_name, addr);
 
        bootstage_mark(bootstage_id + BOOTSTAGE_SUB_FORMAT);
@@ -1658,6 +1660,8 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
        *lenp = len;
        if (fit_unamep)
                *fit_unamep = (char *)fit_uname;
+       if (fit_uname_configp)
+               *fit_uname_configp = (char *)fit_uname_config;
 
        return noffset;
 }
index 1be384f26a85964d6b6b84a110b65038e89467a8..327006e5aa1e51035adb37f114e20faf143261cd 100644 (file)
@@ -811,7 +811,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
        char *end;
 #endif
 #if defined(CONFIG_FIT)
-       const char      *fit_uname_config = NULL;
+       const char      *fit_uname_config = images->fit_uname_cfg;
        const char      *fit_uname_ramdisk = NULL;
        ulong           default_addr;
        int             rd_noffset;
@@ -907,7 +907,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
                case IMAGE_FORMAT_FIT:
                        rd_noffset = fit_image_load(images, FIT_RAMDISK_PROP,
                                        rd_addr, &fit_uname_ramdisk,
-                                       fit_uname_config, arch,
+                                       &fit_uname_config, arch,
                                        IH_TYPE_RAMDISK,
                                        BOOTSTAGE_ID_FIT_RD_START,
                                        FIT_LOAD_REQUIRED, &rd_data, &rd_len);
index 9c3e46f32fe39a44c7c2e9514193ece6b4bff854..7b0108f32076f907e8f27f6566bac85588ebc933 100644 (file)
@@ -439,8 +439,9 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
  * @param fit_unamep   On entry this is the requested image name
  *                     (e.g. "kernel@1") or NULL to use the default. On exit
  *                     points to the selected image name
- * @param fit_uname_config     Requested configuration name, or NULL for the
- *                     default
+ * @param fit_uname_configp    On entry this is the requested configuration
+ *                     name (e.g. "conf@1") or NULL to use the default. On
+ *                     exit points to the selected configuration name.
  * @param arch         Expected architecture (IH_ARCH_...)
  * @param image_type   Required image type (IH_TYPE_...). If this is
  *                     IH_TYPE_KERNEL then we allow IH_TYPE_KERNEL_NOLOAD
@@ -453,7 +454,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
  * @param lenp         Returns length of loaded image
  */
 int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
-                  const char **fit_unamep, const char *fit_uname_config,
+                  const char **fit_unamep, const char **fit_uname_configp,
                   int arch, int image_type, int bootstage_id,
                   enum fit_load_op load_op, ulong *datap, ulong *lenp);