[openwrt/openwrt] kernel: generic: use chosen bootconf in FIT partition parser

LEDE Commits lede-commits at lists.infradead.org
Mon Mar 21 16:48:55 PDT 2022


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/503f3b9f0e9693bb983a0f259aa4ba106a690140

commit 503f3b9f0e9693bb983a0f259aa4ba106a690140
Author: Daniel Golle <daniel at makrotopia.org>
AuthorDate: Mon Mar 21 23:31:38 2022 +0000

    kernel: generic: use chosen bootconf in FIT partition parser
    
    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 at makrotopia.org>
---
 target/linux/generic/files/block/partitions/fit.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/target/linux/generic/files/block/partitions/fit.c b/target/linux/generic/files/block/partitions/fit.c
index fa73e64af8..89b5fb3454 100644
--- a/target/linux/generic/files/block/partitions/fit.c
+++ b/target/linux/generic/files/block/partitions/fit.c
@@ -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);




More information about the lede-commits mailing list