This patch makes use of realloc functions added to libfdt.
Now the tool can insert a new node or property or extend a property with
new value greater than original size.

Without this patch fdtput tool complains with FDT_ERR_NOSPACE when we
try to add a node/property or extend the value of a property.

Signed-off-by: Srinivas Kandagatla <[email protected]>
---
 fdtput.c |   30 +++++++++++++++++-------------
 1 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/fdtput.c b/fdtput.c
index f2197f5..8e80f37 100644
--- a/fdtput.c
+++ b/fdtput.c
@@ -131,19 +131,20 @@ static int encode_value(struct display_info *disp, char 
**arg, int arg_count,
        return 0;
 }
 
-static int store_key_value(void *blob, const char *node_name,
+static int store_key_value(void **blob, const char *node_name,
                const char *property, const char *buf, int len)
 {
        int node;
        int err;
 
-       node = fdt_path_offset(blob, node_name);
+       node = fdt_path_offset(*blob, node_name);
        if (node < 0) {
                report_error(node_name, -1, node);
                return -1;
        }
 
-       err = fdt_setprop(blob, node, property, buf, len);
+       fdt_realloc_property(blob, node, property, len);
+       err = fdt_setprop(*blob, node, property, buf, len);
        if (err) {
                report_error(property, -1, err);
                return -1;
@@ -161,7 +162,7 @@ static int store_key_value(void *blob, const char 
*node_name,
  * @param in_path      Path to process
  * @return 0 if ok, -1 on error
  */
-static int create_paths(void *blob, const char *in_path)
+static int create_paths(void **blob, const char *in_path)
 {
        const char *path = in_path;
        const char *sep;
@@ -177,10 +178,11 @@ static int create_paths(void *blob, const char *in_path)
                if (!sep)
                        sep = path + strlen(path);
 
-               node = fdt_subnode_offset_namelen(blob, offset, path,
+               node = fdt_subnode_offset_namelen(*blob, offset, path,
                                sep - path);
                if (node == -FDT_ERR_NOTFOUND) {
-                       node = fdt_add_subnode_namelen(blob, offset, path,
+                       fdt_realloc_node(blob, path);
+                       node = fdt_add_subnode_namelen(*blob, offset, path,
                                                       sep - path);
                }
                if (node < 0) {
@@ -203,7 +205,7 @@ static int create_paths(void *blob, const char *in_path)
  * @param node_name    Name of node to create
  * @return new node offset if found, or -1 on failure
  */
-static int create_node(void *blob, const char *node_name)
+static int create_node(void **blob, const char *node_name)
 {
        int node = 0;
        char *p;
@@ -216,14 +218,15 @@ static int create_node(void *blob, const char *node_name)
        *p = '\0';
 
        if (p > node_name) {
-               node = fdt_path_offset(blob, node_name);
+               node = fdt_path_offset(*blob, node_name);
                if (node < 0) {
                        report_error(node_name, -1, node);
                        return -1;
                }
        }
 
-       node = fdt_add_subnode(blob, node, p + 1);
+       fdt_realloc_node(blob, p + 1);
+       node = fdt_add_subnode(*blob, node, p + 1);
        if (node < 0) {
                report_error(p + 1, -1, node);
                return -1;
@@ -250,18 +253,19 @@ static int do_fdtput(struct display_info *disp, const 
char *filename,
                 * store them into the property.
                 */
                assert(arg_count >= 2);
-               if (disp->auto_path && create_paths(blob, *arg))
+               if (disp->auto_path && create_paths((void **)&blob, *arg))
                        return -1;
                if (encode_value(disp, arg + 2, arg_count - 2, &value, &len) ||
-                       store_key_value(blob, *arg, arg[1], value, len))
+                       store_key_value((void **)&blob, *arg,
+                                                       arg[1], value, len))
                        ret = -1;
                break;
        case OPER_CREATE_NODE:
                for (; ret >= 0 && arg_count--; arg++) {
                        if (disp->auto_path)
-                               ret = create_paths(blob, *arg);
+                               ret = create_paths((void **)&blob, *arg);
                        else
-                               ret = create_node(blob, *arg);
+                               ret = create_node((void **)&blob, *arg);
                }
                break;
        }
-- 
1.7.6.5

_______________________________________________
devicetree-discuss mailing list
[email protected]
https://lists.ozlabs.org/listinfo/devicetree-discuss

Reply via email to