]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
binman: Allow reading entries from a subnode
authorSimon Glass <sjg@chromium.org>
Thu, 14 Jan 2021 03:29:57 +0000 (20:29 -0700)
committerTom Rini <trini@konsulko.com>
Wed, 27 Jan 2021 22:03:16 +0000 (17:03 -0500)
Some images may have multiple copies of the same thing, e.g. two versions
of the read/write U-Boots. It is necessary to read data from one or other
of these under selection of the verified-boot logic. Add a function to
select the subnode to use.

Signed-off-by: Simon Glass <sjg@chromium.org>
include/binman.h
lib/binman.c

index 8b89a9666d5940bfdba8694928e3c2dc58c4e607..5958dfb44852062175038ec9cf01fd86b961bbb9 100644 (file)
@@ -70,6 +70,20 @@ int binman_entry_find(const char *name, struct binman_entry *entry);
  */
 ofnode binman_section_find_node(const char *name);
 
+/**
+ * binman_select_subnode() - Select a subnode to use to find entries
+ *
+ * Normally binman selects the top-level node for future entry requests, such as
+ * binman_entry_find(). This function allows a subnode to be chosen instead.
+ *
+ * @name: Name of subnode, typically a section. This must be in the top-level
+ *     binman node
+ * @return 0 if OK, -EINVAL if there is no /binman node, -ECHILD if multiple
+ *     images are being used but the first image is not available, -ENOENT if
+ *     the requested subnode cannot be found
+ */
+int binman_select_subnode(const char *name);
+
 /**
  * binman_init() - Set up the binman symbol information
  *
index b6d9dff5b7cd3f4050f0dc70a30c8ec5a2435b3b..f415df30545254bd59f871ab89bb5b039a7128c0 100644 (file)
@@ -116,6 +116,24 @@ int binman_get_rom_offset(void)
        return binman->rom_offset;
 }
 
+int binman_select_subnode(const char *name)
+{
+       ofnode node;
+       int ret;
+
+       ret = find_image_node(&node);
+       if (ret)
+               return log_msg_ret("main", -ENOENT);
+       node = ofnode_find_subnode(node, name);
+       if (!ofnode_valid(node))
+               return log_msg_ret("node", -ENOENT);
+       binman->image = node;
+       log_debug("binman: Selected image subnode '%s'\n",
+                 ofnode_get_name(binman->image));
+
+       return 0;
+}
+
 int binman_init(void)
 {
        int ret;