kernel: generic: use chosen bootconf in FIT partition parser
authorDaniel Golle <daniel@makrotopia.org>
Mon, 21 Mar 2022 23:31:38 +0000 (23:31 +0000)
committerDaniel Golle <daniel@makrotopia.org>
Mon, 21 Mar 2022 23:48:09 +0000 (23:48 +0000)
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>
target/linux/generic/files/block/partitions/fit.c

index fa73e64af81e1fdcf901d891f8fddb0f42972e79..89b5fb3454f0b69cdcfe53958169fb2a6f9c48a9 100644 (file)
@@ -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;
@@ -144,15 +152,15 @@ 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;
        }
@@ -160,7 +168,8 @@ int parse_fit_partitions(struct parsed_partitions *state, u64 fit_start_sector,
        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);