summaryrefslogtreecommitdiff
path: root/lib/binman.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2019-12-07 07:41:34 +0300
committerBin Meng <bmeng.cn@gmail.com>2019-12-15 03:48:33 +0300
commit3c10dc95bdd0706ff85ffdc25ecd6381c3d51e4c (patch)
treefe9a2f30a15fdf3fc36fb7c7194a568b981e4024 /lib/binman.c
parent553cb06887825314e74a9bdac337467c77d1db88 (diff)
downloadu-boot-3c10dc95bdd0706ff85ffdc25ecd6381c3d51e4c.tar.xz
binman: Add a library to access binman entries
SPL and TPL can access information about binman entries using link-time symbols but this is not available in U-Boot proper. Of course it could be made available, but the intention is to just read the device tree. Add support for this, so that U-Boot can locate entries. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'lib/binman.c')
-rw-r--r--lib/binman.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/binman.c b/lib/binman.c
new file mode 100644
index 0000000000..1774bdf2e5
--- /dev/null
+++ b/lib/binman.c
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: Intel
+/*
+ * Access to binman information at runtime
+ *
+ * Copyright 2019 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <binman.h>
+#include <dm.h>
+
+struct binman_info {
+ ofnode image;
+};
+
+static struct binman_info *binman;
+
+int binman_entry_find(const char *name, struct binman_entry *entry)
+{
+ ofnode node;
+ int ret;
+
+ node = ofnode_find_subnode(binman->image, name);
+ if (!ofnode_valid(node))
+ return log_msg_ret("no binman node", -ENOENT);
+
+ ret = ofnode_read_u32(node, "image-pos", &entry->image_pos);
+ if (ret)
+ return log_msg_ret("bad binman node1", ret);
+ ret = ofnode_read_u32(node, "size", &entry->size);
+ if (ret)
+ return log_msg_ret("bad binman node2", ret);
+
+ return 0;
+}
+
+int binman_init(void)
+{
+ binman = malloc(sizeof(struct binman_info));
+ if (!binman)
+ return log_msg_ret("space for binman", -ENOMEM);
+ binman->image = ofnode_path("/binman");
+ if (!ofnode_valid(binman->image))
+ return log_msg_ret("binman node", -EINVAL);
+
+ return 0;
+}