
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 sjg@chromium.org ---
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;