]> git.sur5r.net Git - u-boot/blobdiff - libfdt/fdt_rw.c
Fix merge problems
[u-boot] / libfdt / fdt_rw.c
index dfe5628a33a011b37dd43c3c849c52b0110f01d5..95a5c2c62bee3888d7d13daf726b7f435d378c2a 100644 (file)
  */
 #include "libfdt_env.h"
 
+#ifndef USE_HOSTCC
 #include <fdt.h>
 #include <libfdt.h>
+#else
+#include "fdt_host.h"
+#endif
 
 #include "libfdt_internal.h"
 
@@ -69,10 +73,8 @@ static int _blocks_misordered(const void *fdt,
 
 static int rw_check_header(void *fdt)
 {
-       int err;
+       CHECK_HEADER(fdt);
 
-       if ((err = fdt_check_header(fdt)))
-               return err;
        if (fdt_version(fdt) < 17)
                return -FDT_ERR_BADVERSION;
        if (_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry),
@@ -174,8 +176,7 @@ int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
        struct fdt_reserve_entry *re;
        int err;
 
-       if ((err = rw_check_header(fdt)))
-               return err;
+       RW_CHECK_HEADER(fdt);
 
        re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
        err = _blob_splice_mem_rsv(fdt, re, 0, 1);
@@ -192,8 +193,8 @@ int fdt_del_mem_rsv(void *fdt, int n)
        struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);
        int err;
 
-       if ((err = rw_check_header(fdt)))
-               return err;
+       RW_CHECK_HEADER(fdt);
+
        if (n >= fdt_num_mem_rsv(fdt))
                return -FDT_ERR_NOTFOUND;
 
@@ -225,15 +226,13 @@ static int _resize_property(void *fdt, int nodeoffset, const char *name, int len
 static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
                         struct fdt_property **prop)
 {
-       uint32_t tag;
        int proplen;
        int nextoffset;
        int namestroff;
        int err;
 
-       tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
-       if (tag != FDT_BEGIN_NODE)
-               return -FDT_ERR_BADOFFSET;
+       if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0)
+               return nextoffset;
 
        namestroff = _find_add_string(fdt, name);
        if (namestroff < 0)
@@ -252,14 +251,36 @@ static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
        return 0;
 }
 
+int fdt_set_name(void *fdt, int nodeoffset, const char *name)
+{
+       char *namep;
+       int oldlen, newlen;
+       int err;
+
+       RW_CHECK_HEADER(fdt);
+
+       namep = (char *)fdt_get_name(fdt, nodeoffset, &oldlen);
+       if (!namep)
+               return oldlen;
+
+       newlen = strlen(name);
+
+       err = _blob_splice_struct(fdt, namep, ALIGN(oldlen+1, FDT_TAGSIZE),
+                                 ALIGN(newlen+1, FDT_TAGSIZE));
+       if (err)
+               return err;
+
+       memcpy(namep, name, newlen+1);
+       return 0;
+}
+
 int fdt_setprop(void *fdt, int nodeoffset, const char *name,
                const void *val, int len)
 {
        struct fdt_property *prop;
        int err;
 
-       if ((err = rw_check_header(fdt)))
-               return err;
+       RW_CHECK_HEADER(fdt);
 
        err = _resize_property(fdt, nodeoffset, name, len, &prop);
        if (err == -FDT_ERR_NOTFOUND)
@@ -309,7 +330,7 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
        do {
                offset = nextoffset;
                tag = fdt_next_tag(fdt, offset, &nextoffset);
-       } while (tag == FDT_PROP);
+       } while ((tag == FDT_PROP) || (tag == FDT_NOP));
 
        nh = _fdt_offset_ptr_w(fdt, offset);
        nodelen = sizeof(*nh) + ALIGN(namelen+1, FDT_TAGSIZE) + FDT_TAGSIZE;
@@ -358,12 +379,12 @@ static void _packblocks(const void *fdt, void *buf,
        memmove(buf + mem_rsv_off, fdt + fdt_off_mem_rsvmap(fdt), mem_rsv_size);
        fdt_set_off_mem_rsvmap(buf, mem_rsv_off);
 
-       memcpy(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size);
+       memmove(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size);
        fdt_set_off_dt_struct(buf, struct_off);
        fdt_set_size_dt_struct(buf, struct_size);
 
-       memcpy(buf + strings_off, fdt + fdt_off_dt_strings(fdt),
-              fdt_size_dt_strings(fdt));
+       memmove(buf + strings_off, fdt + fdt_off_dt_strings(fdt),
+               fdt_size_dt_strings(fdt));
        fdt_set_off_dt_strings(buf, strings_off);
        fdt_set_size_dt_strings(buf, fdt_size_dt_strings(fdt));
 }
@@ -375,9 +396,7 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
        int newsize;
        void *tmp;
 
-       err = fdt_check_header(fdt);
-       if (err)
-               return err;
+       CHECK_HEADER(fdt);
 
        mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
                * sizeof(struct fdt_reserve_entry);
@@ -432,11 +451,8 @@ int fdt_open_into(const void *fdt, void *buf, int bufsize)
 int fdt_pack(void *fdt)
 {
        int mem_rsv_size;
-       int err;
 
-       err = rw_check_header(fdt);
-       if (err)
-               return err;
+       RW_CHECK_HEADER(fdt);
 
        mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
                * sizeof(struct fdt_reserve_entry);