diff options
author | Alexandru Gagniuc <mr.nuke.me@gmail.com> | 2021-01-20 10:46:53 -0600 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-02-17 19:46:43 -0500 |
commit | 9e9aa0b473a3217796e7d76a51004af2f42161fd (patch) | |
tree | 2e3eb4e50e4395c2d4e21510baaed88f9584b805 | |
parent | e4928270a4ab758ecfe54c9b296a00470fdee335 (diff) | |
download | u-boot-9e9aa0b473a3217796e7d76a51004af2f42161fd.tar.gz |
spl: fit: Only look up FIT configuration node once
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>
-rw-r--r-- | common/spl/spl_fit.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index 78d25e160e..64e4e7ae53 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -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"); } |