Support fitimage configuration nodes without populated compatible fields Yocto fit image recipe does not populate the compatible field in the generated ITS file configuration nodes. Barebox is thus only able to load the default configuration preventing the use of variant based bootloader update bundles. If the compatible match fails, fall through using a global variable boot.fitnode allowing a match against the configuration node name. This allows variant boards to pick the correct configuration. --- common/image-fit.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/common/image-fit.c b/common/image-fit.c index a410632d70..f92e813a8b 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -7,6 +7,7 @@ #define pr_fmt(fmt) "FIT: " fmt #include <common.h> +#include <environment.h> #include <init.h> #include <bootm.h> #include <libfile.h> @@ -663,6 +664,7 @@ static int fit_find_compatible_unit(struct device_node *conf_node, struct device_node *barebox_root; const char *machine; int ret; + const char *config_node; barebox_root = of_get_root_node(); if (!barebox_root) @@ -680,6 +682,22 @@ static int fit_find_compatible_unit(struct device_node *conf_node, } } + /* + * If the match against compatible in config node does not match + * (or is missing as in Yocto fitimage recipe) + * check for matching node name using global.boot.fitnode + */ + config_node = getenv("global.boot.fitnode"); + if (config_node) { + for_each_child_of_node (conf_node, child) { + if (strcmp(child->name, config_node) == 0) { + *unit = child->name; + pr_info("matching node name unit '%s' found\n", *unit); + return 0; + } + } + } + default_unit: pr_info("No match found. Trying default.\n"); if (of_property_read_string(conf_node, "default", unit) == 0) -- 2.34.1