generic: use only first element in bootconf for uImage.FIT

Now that it is possible to load several device tree overlays by
appending their config names to bootconf the uImage.FIT partition
parser need to discard everything after the first '#' character in
bootconf when looking up the config node to be used.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
Daniel Golle 2023-06-04 18:21:29 +01:00
parent 6b01d40bfe
commit 07bca1adaa

View File

@ -84,13 +84,13 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector,
const u32 *image_offset_be, *image_len_be, *image_pos_be; const u32 *image_offset_be, *image_len_be, *image_pos_be;
int ret = 1, node, images, config; int ret = 1, node, images, config;
const char *image_name, *image_type, *image_description, *config_default, const char *image_name, *image_type, *image_description, *config_default,
*config_description, *config_loadables; *config_description, *config_loadables, *bootconf_c;
int image_name_len, image_type_len, image_description_len, config_default_len, int image_name_len, image_type_len, image_description_len, config_default_len,
config_description_len, config_loadables_len; config_description_len, config_loadables_len, bootconf_len;
sector_t start_sect, nr_sects; sector_t start_sect, nr_sects;
size_t label_min; size_t label_min;
struct device_node *np = NULL; struct device_node *np = NULL;
const char *bootconf; char *bootconf = NULL, *bootconf_term;
const char *loadable; const char *loadable;
const char *select_rootfs = NULL; const char *select_rootfs = NULL;
bool found; bool found;
@ -143,10 +143,17 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector,
return -ENOMEM; return -ENOMEM;
np = of_find_node_by_path("/chosen"); np = of_find_node_by_path("/chosen");
if (np) if (np) {
bootconf = of_get_property(np, "u-boot,bootconf", NULL); bootconf_c = of_get_property(np, "u-boot,bootconf", &bootconf_len);
else if (bootconf_c && bootconf_len)
bootconf = NULL; bootconf = kmemdup_nul(bootconf_c, bootconf_len, GFP_KERNEL);
}
if (bootconf) {
bootconf_term = strchr(bootconf, '#');
if (bootconf_term)
*bootconf_term = '\0';
}
config = fdt_path_offset(fit, FIT_CONFS_PATH); config = fdt_path_offset(fit, FIT_CONFS_PATH);
if (config < 0) { if (config < 0) {
@ -285,6 +292,7 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector,
strlcat(state->pp_buf, tmp, PAGE_SIZE); strlcat(state->pp_buf, tmp, PAGE_SIZE);
} }
ret_out: ret_out:
kfree(bootconf);
kfree(fit); kfree(fit);
return ret; return ret;
} }