summaryrefslogtreecommitdiff
path: root/common/spl/spl_fit.c
diff options
context:
space:
mode:
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>2021-01-20 19:46:53 +0300
committerTom Rini <trini@konsulko.com>2021-02-18 03:46:43 +0300
commit9e9aa0b473a3217796e7d76a51004af2f42161fd (patch)
tree2e3eb4e50e4395c2d4e21510baaed88f9584b805 /common/spl/spl_fit.c
parente4928270a4ab758ecfe54c9b296a00470fdee335 (diff)
downloadu-boot-9e9aa0b473a3217796e7d76a51004af2f42161fd.tar.xz
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>
Diffstat (limited to 'common/spl/spl_fit.c')
-rw-r--r--common/spl/spl_fit.c19
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");
}