return 0;\r
}\r
\r
+int fdt_resize(void *fdt, void *buf, int bufsize)\r
+{\r
+ size_t headsize, tailsize;\r
+ char *oldtail, *newtail;\r
+\r
+ FDT_SW_CHECK_HEADER(fdt);\r
+\r
+ headsize = fdt_off_dt_struct(fdt);\r
+ tailsize = fdt_size_dt_strings(fdt);\r
+\r
+ if ((headsize + tailsize) > bufsize)\r
+ return -FDT_ERR_NOSPACE;\r
+\r
+ oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize;\r
+ newtail = (char *)buf + bufsize - tailsize;\r
+\r
+ /* Two cases to avoid clobbering data if the old and new\r
+ * buffers partially overlap */\r
+ if (buf <= fdt) {\r
+ memmove(buf, fdt, headsize);\r
+ memmove(newtail, oldtail, tailsize);\r
+ } else {\r
+ memmove(newtail, oldtail, tailsize);\r
+ memmove(buf, fdt, headsize);\r
+ }\r
+\r
+ fdt_set_off_dt_strings(buf, bufsize);\r
+ fdt_set_totalsize(buf, bufsize);\r
+\r
+ return 0;\r
+}\r
+\r
int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)\r
{\r
struct fdt_reserve_entry *re;\r
return offset;\r
}\r
\r
-int fdt_property(void *fdt, const char *name, const void *val, int len)\r
+int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)\r
{\r
struct fdt_property *prop;\r
int nameoff;\r
prop->tag = cpu_to_fdt32(FDT_PROP);\r
prop->nameoff = cpu_to_fdt32(nameoff);\r
prop->len = cpu_to_fdt32(len);\r
- memcpy(prop->data, val, len);\r
+ *valp = prop->data;\r
+ return 0;\r
+}\r
+\r
+int fdt_property(void *fdt, const char *name, const void *val, int len)\r
+{\r
+ void *ptr;\r
+ int ret;\r
+\r
+ ret = fdt_property_placeholder(fdt, name, len, &ptr);\r
+ if (ret)\r
+ return ret;\r
+ memcpy(ptr, val, len);\r
return 0;\r
}\r
\r