58static int _fdt_blocks_misordered(
const void *fdt,
59 int mem_rsv_size,
int struct_size)
70static int _fdt_rw_check_header(
void *fdt)
80 fdt_set_version(fdt, 17);
85#define FDT_RW_CHECK_HEADER(fdt) \
88 if ((err = _fdt_rw_check_header(fdt)) != 0) \
92static inline int _fdt_data_size(
void *fdt)
97static int _fdt_splice(
void *fdt,
void *splicepoint,
int oldlen,
int newlen)
99 char *p = splicepoint;
100 char *end = (
char *)fdt + _fdt_data_size(fdt);
102 if (((p + oldlen) < p) || ((p + oldlen) > end))
104 if ((end - oldlen + newlen) > ((
char *)fdt +
fdt_totalsize(fdt)))
106 memmove(p + newlen, p + oldlen, end - p - oldlen);
113 int delta = (newn - oldn) *
sizeof(*p);
115 err = _fdt_splice(fdt, p, oldn *
sizeof(*p), newn *
sizeof(*p));
123static int _fdt_splice_struct(
void *fdt,
void *p,
124 int oldlen,
int newlen)
126 int delta = newlen - oldlen;
129 if ((err = _fdt_splice(fdt, p, oldlen, newlen)))
137static int _fdt_splice_string(
void *fdt,
int newlen)
139 void *p = (
char *)fdt
143 if ((err = _fdt_splice(fdt, p, 0, newlen)))
150static int _fdt_find_add_string(
void *fdt,
const char *s)
155 int len = strlen(s) + 1;
164 err = _fdt_splice_string(fdt, len);
169 return (
new - strtab);
180 err = _fdt_splice_mem_rsv(fdt, re, 0, 1);
199 err = _fdt_splice_mem_rsv(fdt, re, 1, 0);
205static int _fdt_resize_property(
void *fdt,
int nodeoffset,
const char *name,
211 *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
215 if ((err = _fdt_splice_struct(fdt, (*prop)->data,
FDT_TAGALIGN(oldlen),
223static int _fdt_add_property(
void *fdt,
int nodeoffset,
const char *name,
234 namestroff = _fdt_find_add_string(fdt, name);
238 *prop = _fdt_offset_ptr_w(fdt, nextoffset);
241 err = _fdt_splice_struct(fdt, *prop, 0, proplen);
263 newlen = strlen(name);
265 err = _fdt_splice_struct(fdt, namep,
FDT_TAGALIGN(oldlen+1),
270 memcpy(namep, name, newlen+1);
275 const void *
val,
int len)
282 err = _fdt_resize_property(fdt, nodeoffset, name,
len, &prop);
284 err = _fdt_add_property(fdt, nodeoffset, name,
len, &prop);
299 prop = fdt_get_property_w(fdt, nodeoffset, name, &
len);
304 return _fdt_splice_struct(fdt, prop, proplen, 0);
308 const char *name,
int namelen)
311 int offset, nextoffset;
332 nh = _fdt_offset_ptr_w(fdt, offset);
335 err = _fdt_splice_struct(fdt, nh, 0, nodelen);
363 return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
364 endoffset - nodeoffset, 0);
367static void _fdt_packblocks(
const char *old,
char *
new,
368 int mem_rsv_size,
int struct_size)
370 int mem_rsv_off, struct_off, strings_off;
373 struct_off = mem_rsv_off + mem_rsv_size;
374 strings_off = struct_off + struct_size;
377 fdt_set_off_mem_rsvmap(
new, mem_rsv_off);
380 fdt_set_off_dt_struct(
new, struct_off);
381 fdt_set_size_dt_struct(
new, struct_size);
385 fdt_set_off_dt_strings(
new, strings_off);
392 int mem_rsv_size, struct_size;
394 const char *fdtstart = fdt;
413 if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) {
418 fdt_set_version(buf, 17);
419 fdt_set_size_dt_struct(buf, struct_size);
420 fdt_set_totalsize(buf, bufsize);
428 if (bufsize < newsize)
434 if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) {
437 if ((tmp + newsize) > ((
char *)buf + bufsize))
441 _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size);
442 memmove(buf, tmp, newsize);
445 fdt_set_totalsize(buf, bufsize);
446 fdt_set_version(buf, 17);
447 fdt_set_last_comp_version(buf, 16);
462 fdt_set_totalsize(fdt, _fdt_data_size(fdt));
const char * _fdt_find_string(const char *strtab, int tabsize, const char *s)
int fdt_move(const void *fdt, void *buf, int bufsize)
int _fdt_check_node_offset(const void *fdt, int offset)
uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
const char * fdt_get_name(const void *fdt, int nodeoffset, int *len)
int fdt_subnode_offset_namelen(const void *fdt, int offset, const char *name, int namelen)
int fdt_num_mem_rsv(const void *fdt)
int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
int fdt_del_mem_rsv(void *fdt, int n)
int fdt_delprop(void *fdt, int nodeoffset, const char *name)
#define FDT_RW_CHECK_HEADER(fdt)
int fdt_add_subnode_namelen(void *fdt, int parentoffset, const char *name, int namelen)
int fdt_open_into(const void *fdt, void *buf, int bufsize)
int fdt_del_node(void *fdt, int nodeoffset)
int fdt_set_name(void *fdt, int nodeoffset, const char *name)
int fdt_setprop(void *fdt, int nodeoffset, const char *name, const void *val, int len)
int _fdt_node_end_offset(void *fdt, int offset)
#define fdt_totalsize(fdt)
#define FDT_ERR_BADOFFSET
#define fdt_size_dt_struct(fdt)
#define fdt_off_dt_strings(fdt)
#define fdt_size_dt_strings(fdt)
#define FDT_ERR_BADVERSION
#define fdt_off_mem_rsvmap(fdt)
#define fdt_boot_cpuid_phys(fdt)
#define FDT_ERR_BADLAYOUT
#define fdt_off_dt_struct(fdt)
#define FDT_CHECK_HEADER(fdt)