This function performs the same operation on each list element. Move
this processing into a separate function so that it can be called
without an alist

Signed-off-by: Simon Glass <[email protected]>
---

 boot/upl_write.c | 54 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/boot/upl_write.c b/boot/upl_write.c
index eed84832a42..a1ecb809cbc 100644
--- a/boot/upl_write.c
+++ b/boot/upl_write.c
@@ -143,6 +143,42 @@ static int ofnode_write_value(ofnode node, const char 
*prop,
        return 0;
 }
 
+/**
+ * encode_addr_size() - Write an address/size pair
+ *
+ * Writes an address and size into a buffer suitable for placing in a 
devicetree
+ * 'reg' property. This uses upl->addr/size_cells to determine the number of
+ * cells for each value
+ *
+ * @upl: UPL state
+ * @buf: Buffer to write to
+ * @size: Buffer size in bytes
+ * @reg: Region to process
+ * Returns: Number of bytes written, or -ENOSPC if the buffer is too small
+ */
+static int encode_addr_size(const struct upl *upl, char *buf, uint size,
+                           const struct memregion *reg)
+{
+       char *ptr = buf;
+
+       if (sizeof(fdt32_t) * (upl->addr_cells + upl->size_cells) > size)
+               return log_msg_ret("eas", -ENOSPC);
+
+       if (upl->addr_cells == 1)
+               *(u32 *)ptr = cpu_to_fdt32(reg->base);
+       else
+               *(u64 *)ptr = cpu_to_fdt64(reg->base);
+       ptr += upl->addr_cells * sizeof(u32);
+
+       if (upl->size_cells == 1)
+               *(u32 *)ptr = cpu_to_fdt32(reg->size);
+       else
+               *(u64 *)ptr = cpu_to_fdt64(reg->size);
+       ptr += upl->size_cells * sizeof(u32);
+
+       return ptr - buf;
+}
+
 /**
  * encode_reg() - Generate a set of addr/size pairs
  *
@@ -166,20 +202,12 @@ static int encode_reg(const struct upl *upl, char *buf, 
int size,
        for (i = 0; i < num_regions; i++) {
                const struct memregion *reg = alist_get(region, i,
                                                        struct memregion);
+               int ret;
 
-               if (upl->addr_cells == 1)
-                       *(u32 *)ptr = cpu_to_fdt32(reg->base);
-               else
-                       *(u64 *)ptr = cpu_to_fdt64(reg->base);
-               ptr += upl->addr_cells * sizeof(u32);
-
-               if (upl->size_cells == 1)
-                       *(u32 *)ptr = cpu_to_fdt32(reg->size);
-               else
-                       *(u64 *)ptr = cpu_to_fdt64(reg->size);
-               ptr += upl->size_cells * sizeof(u32);
-               if (ptr > end)
-                       return log_msg_ret("uer", -ENOSPC);
+               ret = encode_addr_size(upl, ptr, end - ptr, reg);
+               if (ret < 0)
+                       return log_msg_ret("uer", ret);
+               ptr += ret;
        }
 
        return ptr - buf;
-- 
2.43.0

Reply via email to