image: Use fit_image_load() to load FDT
authorSimon Glass <sjg@chromium.org>
Thu, 16 May 2013 13:53:23 +0000 (13:53 +0000)
committerTom Rini <trini@ti.com>
Tue, 4 Jun 2013 20:06:31 +0000 (16:06 -0400)
Use the new common code to load a flat device tree. Also fix up a few casts
so that this code works with sandbox. Other than that the functionality
should not change.

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

index 15f4599..d2b5cce 100644 (file)
@@ -306,7 +306,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
 
 #if defined(CONFIG_OF_LIBFDT)
                /* find flattened device tree */
-               ret = boot_get_fdt(flag, argc, argv, &images,
+               ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,
                                   &images.ft_addr, &images.ft_len);
                if (ret) {
                        puts("Could not find a valid device tree\n");
@@ -1820,7 +1820,7 @@ static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc,
 
 #if defined(CONFIG_OF_LIBFDT)
        /* find flattened device tree */
-       ret = boot_get_fdt(flag, argc, argv, images,
+       ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, images,
                           &images->ft_addr, &images->ft_len);
        if (ret) {
                puts("Could not find a valid device tree\n");
index 158c9cf..0d421d9 100644 (file)
@@ -211,51 +211,11 @@ error:
        return 1;
 }
 
-#if defined(CONFIG_FIT)
-/**
- * fit_check_fdt - verify FIT format FDT subimage
- * @fit_hdr: pointer to the FIT  header
- * fdt_noffset: FDT subimage node offset within FIT image
- * @verify: data CRC verification flag
- *
- * fit_check_fdt() verifies integrity of the FDT subimage and from
- * specified FIT image.
- *
- * returns:
- *     1, on success
- *     0, on failure
- */
-static int fit_check_fdt(const void *fit, int fdt_noffset, int verify)
-{
-       fit_image_print(fit, fdt_noffset, "   ");
-
-       if (verify) {
-               puts("   Verifying Hash Integrity ... ");
-               if (!fit_image_verify(fit, fdt_noffset)) {
-                       fdt_error("Bad Data Hash");
-                       return 0;
-               }
-               puts("OK\n");
-       }
-
-       if (!fit_image_check_type(fit, fdt_noffset, IH_TYPE_FLATDT)) {
-               fdt_error("Not a FDT image");
-               return 0;
-       }
-
-       if (!fit_image_check_comp(fit, fdt_noffset, IH_COMP_NONE)) {
-               fdt_error("FDT image is compressed");
-               return 0;
-       }
-
-       return 1;
-}
-#endif
-
 /**
  * boot_get_fdt - main fdt handling routine
  * @argc: command argument count
  * @argv: command argument list
+ * @arch: architecture (IH_ARCH_...)
  * @images: pointer to the bootm images structure
  * @of_flat_tree: pointer to a char* variable, will hold fdt start address
  * @of_size: pointer to a ulong variable, will hold fdt length
@@ -273,24 +233,20 @@ static int fit_check_fdt(const void *fit, int fdt_noffset, int verify)
  *     1, if fdt image is found but corrupted
  *     of_flat_tree and of_size are set to 0 if no fdt exists
  */
-int boot_get_fdt(int flag, int argc, char * const argv[],
+int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                bootm_headers_t *images, char **of_flat_tree, ulong *of_size)
 {
        const image_header_t *fdt_hdr;
        ulong           fdt_addr;
        char            *fdt_blob = NULL;
        ulong           image_start, image_data, image_end;
-       ulong           load_start, load_end;
+       ulong           load, load_end;
        void            *buf;
 #if defined(CONFIG_FIT)
-       void            *fit_hdr;
        const char      *fit_uname_config = NULL;
        const char      *fit_uname_fdt = NULL;
        ulong           default_addr;
-       int             cfg_noffset;
        int             fdt_noffset;
-       const void      *data;
-       size_t          size;
 #endif
 
        *of_flat_tree = NULL;
@@ -333,31 +289,15 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                         * command argument
                         */
                        fdt_addr = map_to_sysmem(images->fit_hdr_os);
-                       fit_uname_config = images->fit_uname_cfg;
-                       debug("*  fdt: using config '%s' from image at 0x%08lx\n",
-                             fit_uname_config, fdt_addr);
-
-                       /*
-                        * Check whether configuration has FDT blob defined,
-                        * if not quit silently.
-                        */
-                       fit_hdr = images->fit_hdr_os;
-                       cfg_noffset = fit_conf_get_node(fit_hdr,
-                                       fit_uname_config);
-                       if (cfg_noffset < 0) {
-                               debug("*  fdt: no such config\n");
+                       fdt_noffset = fit_get_node_from_config(images,
+                                                              FIT_FDT_PROP,
+                                                              fdt_addr);
+                       if (fdt_noffset == -ENOLINK)
                                return 0;
-                       }
-
-                       fdt_noffset = fit_conf_get_fdt_node(fit_hdr,
-                                       cfg_noffset);
-                       if (fdt_noffset < 0) {
-                               debug("*  fdt: no fdt in config\n");
-                               return 0;
-                       }
+                       else if (fdt_noffset < 0)
+                               return 1;
                }
 #endif
-
                debug("## Checking for 'FDT'/'FDT Image' at %08lx\n",
                      fdt_addr);
 
@@ -387,29 +327,28 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                        image_data = (ulong)image_get_data(fdt_hdr);
                        image_end = image_get_image_end(fdt_hdr);
 
-                       load_start = image_get_load(fdt_hdr);
-                       load_end = load_start + image_get_data_size(fdt_hdr);
+                       load = image_get_load(fdt_hdr);
+                       load_end = load + image_get_data_size(fdt_hdr);
 
-                       if (load_start == image_start ||
-                           load_start == image_data) {
+                       if (load == image_start ||
+                           load == image_data) {
                                fdt_blob = (char *)image_data;
                                break;
                        }
 
-                       if ((load_start < image_end) &&
-                           (load_end > image_start)) {
+                       if ((load < image_end) && (load_end > image_start)) {
                                fdt_error("fdt overwritten");
                                goto error;
                        }
 
                        debug("   Loading FDT from 0x%08lx to 0x%08lx\n",
-                             image_data, load_start);
+                             image_data, load);
 
-                       memmove((void *)load_start,
+                       memmove((void *)load,
                                (void *)image_data,
                                image_get_data_size(fdt_hdr));
 
-                       fdt_blob = (char *)load_start;
+                       fdt_addr = load;
                        break;
                case IMAGE_FORMAT_FIT:
                        /*
@@ -420,107 +359,20 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
 #if defined(CONFIG_FIT)
                        /* check FDT blob vs FIT blob */
                        if (fit_check_format(buf)) {
-                               /*
-                                * FIT image
-                                */
-                               fit_hdr = buf;
-                               printf("## Flattened Device Tree from FIT Image at %08lx\n",
-                                      fdt_addr);
-
-                               if (!fit_uname_fdt) {
-                                       /*
-                                        * no FDT blob image node unit name,
-                                        * try to get config node first. If
-                                        * config unit node name is NULL
-                                        * fit_conf_get_node() will try to
-                                        * find default config node
-                                        */
-                                       cfg_noffset = fit_conf_get_node(fit_hdr,
-                                                       fit_uname_config);
-
-                                       if (cfg_noffset < 0) {
-                                               fdt_error("Could not find configuration node\n");
-                                               goto error;
-                                       }
-
-                                       fit_uname_config = fdt_get_name(fit_hdr,
-                                                       cfg_noffset, NULL);
-                                       printf("   Using '%s' configuration\n",
-                                              fit_uname_config);
-
-                                       fdt_noffset = fit_conf_get_fdt_node(
-                                                       fit_hdr,
-                                                       cfg_noffset);
-                                       fit_uname_fdt = fit_get_name(fit_hdr,
-                                                       fdt_noffset, NULL);
-                               } else {
-                                       /*
-                                        * get FDT component image node
-                                        * offset
-                                        */
-                                       fdt_noffset = fit_image_get_node(
-                                                               fit_hdr,
-                                                               fit_uname_fdt);
-                               }
-                               if (fdt_noffset < 0) {
-                                       fdt_error("Could not find subimage node\n");
-                                       goto error;
-                               }
-
-                               printf("   Trying '%s' FDT blob subimage\n",
-                                      fit_uname_fdt);
-
-                               if (!fit_check_fdt(fit_hdr, fdt_noffset,
-                                                  images->verify))
-                                       goto error;
-
-                               /* get ramdisk image data address and length */
-                               if (fit_image_get_data(fit_hdr, fdt_noffset,
-                                                      &data, &size)) {
-                                       fdt_error("Could not find FDT subimage data");
-                                       goto error;
-                               }
+                               ulong load, len;
 
-                               /*
-                                * verify that image data is a proper FDT
-                                * blob
-                                */
-                               if (fdt_check_header((char *)data) != 0) {
-                                       fdt_error("Subimage data is not a FTD");
-                                       goto error;
-                               }
-
-                               /*
-                                * move image data to the load address,
-                                * make sure we don't overwrite initial image
-                                */
-                               image_start = (ulong)fit_hdr;
-                               image_end = fit_get_end(fit_hdr);
-
-                               if (fit_image_get_load(fit_hdr, fdt_noffset,
-                                                      &load_start) == 0) {
-                                       load_end = load_start + size;
+                               fdt_noffset = fit_image_load(images,
+                                       FIT_FDT_PROP,
+                                       fdt_addr, &fit_uname_fdt,
+                                       fit_uname_config,
+                                       arch, IH_TYPE_FLATDT,
+                                       BOOTSTAGE_ID_FIT_FDT_START,
+                                       FIT_LOAD_OPTIONAL, &load, &len);
 
-                                       if ((load_start < image_end) &&
-                                           (load_end > image_start)) {
-                                               fdt_error("FDT overwritten");
-                                               goto error;
-                                       }
-
-                                       printf("   Loading FDT from 0x%08lx to 0x%08lx\n",
-                                              (ulong)data, load_start);
-
-                                       memmove((void *)load_start,
-                                               (void *)data, size);
-
-                                       fdt_blob = (char *)load_start;
-                               } else {
-                                       fdt_blob = (char *)data;
-                               }
-
-                               images->fit_hdr_fdt = fit_hdr;
+                               images->fit_hdr_fdt = map_sysmem(fdt_addr, 0);
                                images->fit_uname_fdt = fit_uname_fdt;
                                images->fit_noffset_fdt = fdt_noffset;
+                               fdt_addr = load;
                                break;
                        } else
 #endif
@@ -528,7 +380,6 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                                /*
                                 * FDT blob
                                 */
-                               fdt_blob = buf;
                                debug("*  fdt: raw FDT blob\n");
                                printf("## Flattened Device Tree blob at %08lx\n",
                                       (long)fdt_addr);
@@ -539,8 +390,8 @@ int boot_get_fdt(int flag, int argc, char * const argv[],
                        goto error;
                }
 
-               printf("   Booting using the fdt blob at 0x%p\n", fdt_blob);
-
+               printf("   Booting using the fdt blob at %#08lx\n", fdt_addr);
+               fdt_blob = map_sysmem(fdt_addr, 0);
        } else if (images->legacy_hdr_valid &&
                        image_check_type(&images->legacy_hdr_os_copy,
                                         IH_TYPE_MULTI)) {
index 16fb196..15c92be 100644 (file)
@@ -1371,25 +1371,6 @@ int fit_conf_get_kernel_node(const void *fit, int noffset)
 }
 
 /**
- * fit_conf_get_fdt_node - get fdt image node offset that corresponds to
- * a given configuration
- * @fit: pointer to the FIT format image header
- * @noffset: configuration node offset
- *
- * fit_conf_get_fdt_node() retrives fdt image node unit name from
- * configuration FIT_KERNEL_PROP property and translates it to the node
- * offset.
- *
- * returns:
- *     image node offset when found (>=0)
- *     negative number on failure (FDT_ERR_* code)
- */
-int fit_conf_get_fdt_node(const void *fit, int noffset)
-{
-       return fit_conf_get_prop_node(fit, noffset, FIT_FDT_PROP);
-}
-
-/**
  * fit_conf_print - prints out the FIT configuration details
  * @fit: pointer to the FIT format image header
  * @noffset: offset of the configuration node
index 28a1470..3695c62 100644 (file)
@@ -484,8 +484,9 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
 int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
                        ulong addr);
 
-int boot_get_fdt(int flag, int argc, char * const argv[],
-               bootm_headers_t *images, char **of_flat_tree, ulong *of_size);
+int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
+                bootm_headers_t *images,
+                char **of_flat_tree, ulong *of_size);
 void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
 int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
 
@@ -777,7 +778,6 @@ int fit_check_format(const void *fit);
 int fit_conf_find_compat(const void *fit, const void *fdt);
 int fit_conf_get_node(const void *fit, const char *conf_uname);
 int fit_conf_get_kernel_node(const void *fit, int noffset);
-int fit_conf_get_fdt_node(const void *fit, int noffset);
 
 /**
  * fit_conf_get_prop_node() - Get node refered to by a configuration