]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
spl: fit: Only look up FIT configuration node once
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>
Wed, 20 Jan 2021 16:46:53 +0000 (10:46 -0600)
committerTom Rini <trini@konsulko.com>
Thu, 18 Feb 2021 00:46:43 +0000 (19:46 -0500)
The configuration node a sub node under "/configurations", which
describes the components to load from "/images". We only need to
locate this node once.

However, for each component, spl_fit_get_image_name() would parse the
FIT image, looking for the correct node. Such work duplication is not
necessary. Instead, once the node is found, cache it, and re-use it.

Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/spl/spl_fit.c

index 78d25e160e88d7173516825cc028f1b322f5214d..64e4e7ae5318811cbbae6cb7222da61574fa231c 100644 (file)
@@ -31,6 +31,7 @@ struct spl_fit_info {
        const void *fit;        /* Pointer to a valid FIT blob */
        size_t ext_data_offset; /* Offset to FIT external data (end of FIT) */
        int images_node;        /* FDT offset to "/images" node */
+       int conf_node;          /* FDT offset to selected configuration node */
 };
 
 __weak void board_spl_fit_post_load(const void *fit)
@@ -84,15 +85,10 @@ static int spl_fit_get_image_name(const struct spl_fit_info *ctx,
        struct udevice *sysinfo;
        const char *name, *str;
        __maybe_unused int node;
-       int conf_node;
        int len, i;
        bool found = true;
 
-       conf_node = fit_find_config_node(ctx->fit);
-       if (conf_node < 0)
-               return conf_node;
-
-       name = fdt_getprop(ctx->fit, conf_node, type, &len);
+       name = fdt_getprop(ctx->fit, ctx->conf_node, type, &len);
        if (!name) {
                debug("cannot find property '%s': %d\n", type, len);
                return -EINVAL;
@@ -551,12 +547,15 @@ static int spl_simple_fit_read(struct spl_fit_info *ctx,
 
 static int spl_simple_fit_parse(struct spl_fit_info *ctx)
 {
-       if (IS_ENABLED(CONFIG_SPL_FIT_SIGNATURE)) {
-               int conf_offset = fit_find_config_node(ctx->fit);
+       /* Find the correct subnode under "/configurations" */
+       ctx->conf_node = fit_find_config_node(ctx->fit);
+       if (ctx->conf_node < 0)
+               return -EINVAL;
 
+       if (IS_ENABLED(CONFIG_SPL_FIT_SIGNATURE)) {
                printf("## Checking hash(es) for config %s ... ",
-                      fit_get_name(ctx->fit, conf_offset, NULL));
-               if (fit_config_verify(ctx->fit, conf_offset))
+                      fit_get_name(ctx->fit, ctx->conf_node, NULL));
+               if (fit_config_verify(ctx->fit, ctx->conf_node))
                        return -EPERM;
                puts("OK\n");
        }