Skip to content

Commit

Permalink
kernel: generic: use chosen bootconf in FIT partition parser
Browse files Browse the repository at this point in the history
If the selected boot configuration is stored by U-Boot in '/chosen'
node as 'bootconf' attribute, use that configuration to resolve the
block device used as rootfs. Fall back to use the default configuration
in case 'bootconf' is not present.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
  • Loading branch information
dangowrt committed Mar 21, 2022
1 parent dfc3ea6 commit 503f3b9
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions target/linux/generic/files/block/partitions/fit.c
Expand Up @@ -87,6 +87,14 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector,
config_description_len, config_loadables_len;
sector_t start_sect, nr_sects;
size_t label_min;
struct device_node *np = NULL;
const char *bootconf;

np = of_find_node_by_path("/chosen");
if (np)
bootconf = of_get_property(np, "bootconf", NULL);
else
bootconf = NULL;

if (fit_start_sector % (1<<(PAGE_SHIFT - SECTOR_SHIFT)))
return -ERANGE;
Expand Down Expand Up @@ -144,23 +152,24 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector,

config_default = fdt_getprop(fit, config, FIT_DEFAULT_PROP, &config_default_len);

if (!config_default) {
if (!config_default && !bootconf) {
printk(KERN_ERR "FIT: Cannot find default configuration\n");
ret = -ENOENT;
goto ret_out;
}

node = fdt_subnode_offset(fit, config, config_default);
node = fdt_subnode_offset(fit, config, bootconf?:config_default);
if (node < 0) {
printk(KERN_ERR "FIT: Cannot find %s node: %d\n", config_default, node);
printk(KERN_ERR "FIT: Cannot find %s node: %d\n", bootconf?:config_default, node);
ret = -ENOENT;
goto ret_out;
}

config_description = fdt_getprop(fit, node, FIT_DESC_PROP, &config_description_len);
config_loadables = fdt_getprop(fit, node, FIT_LOADABLE_PROP, &config_loadables_len);

printk(KERN_DEBUG "FIT: Default configuration: \"%s\"%s%s%s\n", config_default,
printk(KERN_DEBUG "FIT: %s configuration: \"%s\"%s%s%s\n",
bootconf?"Selected":"Default", bootconf?:config_default,
config_description?" (":"", config_description?:"", config_description?")":"");

images = fdt_path_offset(fit, FIT_IMAGES_PATH);
Expand Down

0 comments on commit 503f3b9

Please sign in to comment.