Pull out the code which creates a new memory-node into its own function,
since several functions have similar logic.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 boot/upl_write.c | 66 ++++++++++++++++++++++++++++++++++--------------
 1 file changed, 47 insertions(+), 19 deletions(-)

diff --git a/boot/upl_write.c b/boot/upl_write.c
index 7d637c15ba0..6e9f67f686f 100644
--- a/boot/upl_write.c
+++ b/boot/upl_write.c
@@ -287,6 +287,48 @@ static int buffer_addr_size(const struct upl *upl, char 
*buf, int size,
        return ptr - buf;
 }
 
+/**
+ * write_mem_node() - Write a memory node and reg property
+ *
+ * Creates a new node and then adds a 'reg' property within it, listing each of
+ * the memory regions in @mem
+ *
+ * @upl: UPL state
+ * @parent: Parent node for the new node
+ * @mem: List of memory regions to write (struct memregion)
+ * @leaf: Name of memory node (so name is <leaf>@<unit_address>)
+ * @nodep: Returns the created node
+ * Returns 0 if OK, -ve on error
+ */
+static int write_mem_node(const struct upl *upl, ofnode parent,
+                         const struct alist *mem, const char *leaf,
+                         ofnode *nodep)
+{
+       char buf[mem->count * sizeof(64) * 2];
+       const struct memregion *first;
+       char name[26];
+       ofnode node;
+       int ret, len;
+
+       if (!mem->count) {
+               log_debug("Memory '%s' has no regions\n", leaf);
+               return log_msg_ret("reg", -EINVAL);
+       }
+       first = alist_get(mem, 0, struct memregion);
+       sprintf(name, "%s@0x%lx", leaf, first->base);
+       ret = ofnode_add_subnode(parent, name, &node);
+       if (ret)
+               return log_msg_ret("wmn", ret);
+
+       len = buffer_addr_size(upl, buf, sizeof(buf), mem->count, mem);
+       ret = ofnode_write_prop(node, UPLP_REG, buf, len, true);
+       if (ret)
+               return log_msg_ret("wm1", ret);
+       *nodep = node;
+
+       return 0;
+}
+
 /**
  * add_upl_memory() - Add /memory nodes to the tree
  *
@@ -301,29 +343,15 @@ static int add_upl_memory(const struct upl *upl, ofnode 
root)
        for (i = 0; i < upl->mem.count; i++) {
                const struct upl_mem *mem = alist_get(&upl->mem, i,
                                                      struct upl_mem);
-               char buf[mem->region.count * sizeof(64) * 2];
-               const struct memregion *first;
-               char name[26];
-               int ret, len;
                ofnode node;
+               int ret;
 
-               if (!mem->region.count) {
-                       log_debug("Memory %d has no regions\n", i);
-                       return log_msg_ret("reg", -EINVAL);
-               }
-               first = alist_get(&mem->region, 0, struct memregion);
-               sprintf(name, UPLN_MEMORY "@0x%lx", first->base);
-               ret = ofnode_add_subnode(root, name, &node);
+               ret = write_mem_node(upl, root, &mem->region, UPLN_MEMORY,
+                                    &node);
                if (ret)
-                       return log_msg_ret("mem", ret);
+                       return log_msg_ret("ume", ret);
 
-               len = buffer_addr_size(upl, buf, sizeof(buf), mem->region.count,
-                                      &mem->region);
-               if (len < 0)
-                       return log_msg_ret("buf", len);
-
-               ret = ofnode_write_prop(node, UPLP_REG, buf, len, true);
-               if (!ret && mem->hotpluggable)
+               if (mem->hotpluggable)
                        ret = ofnode_write_bool(node, UPLP_HOTPLUGGABLE,
                                                mem->hotpluggable);
                if (ret)
-- 
2.43.0

Reply via email to