Lines Matching refs:fdt
58 static int _fdt_blocks_misordered(const void *fdt, in _fdt_blocks_misordered() argument
61 return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8)) in _fdt_blocks_misordered()
62 || (fdt_off_dt_struct(fdt) < in _fdt_blocks_misordered()
63 (fdt_off_mem_rsvmap(fdt) + mem_rsv_size)) in _fdt_blocks_misordered()
64 || (fdt_off_dt_strings(fdt) < in _fdt_blocks_misordered()
65 (fdt_off_dt_struct(fdt) + struct_size)) in _fdt_blocks_misordered()
66 || (fdt_totalsize(fdt) < in _fdt_blocks_misordered()
67 (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); in _fdt_blocks_misordered()
70 static int _fdt_rw_check_header(void *fdt) in _fdt_rw_check_header() argument
72 FDT_CHECK_HEADER(fdt); in _fdt_rw_check_header()
74 if (fdt_version(fdt) < 17) in _fdt_rw_check_header()
76 if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry), in _fdt_rw_check_header()
77 fdt_size_dt_struct(fdt))) in _fdt_rw_check_header()
79 if (fdt_version(fdt) > 17) in _fdt_rw_check_header()
80 fdt_set_version(fdt, 17); in _fdt_rw_check_header()
85 #define FDT_RW_CHECK_HEADER(fdt) \ argument
88 if ((__err = _fdt_rw_check_header(fdt)) != 0) \
92 static inline int _fdt_data_size(void *fdt) in _fdt_data_size() argument
94 return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); in _fdt_data_size()
97 static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen) in _fdt_splice() argument
100 char *end = (char *)fdt + _fdt_data_size(fdt); in _fdt_splice()
104 if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt)) in _fdt_splice()
106 if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt))) in _fdt_splice()
112 static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p, in _fdt_splice_mem_rsv() argument
117 err = _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p)); in _fdt_splice_mem_rsv()
120 fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta); in _fdt_splice_mem_rsv()
121 fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); in _fdt_splice_mem_rsv()
125 static int _fdt_splice_struct(void *fdt, void *p, in _fdt_splice_struct() argument
131 if ((err = _fdt_splice(fdt, p, oldlen, newlen))) in _fdt_splice_struct()
134 fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta); in _fdt_splice_struct()
135 fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); in _fdt_splice_struct()
139 static int _fdt_splice_string(void *fdt, int newlen) in _fdt_splice_string() argument
141 void *p = (char *)fdt in _fdt_splice_string()
142 + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); in _fdt_splice_string()
145 if ((err = _fdt_splice(fdt, p, 0, newlen))) in _fdt_splice_string()
148 fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen); in _fdt_splice_string()
152 static int _fdt_find_add_string(void *fdt, const char *s) in _fdt_find_add_string() argument
154 char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); in _fdt_find_add_string()
160 p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s); in _fdt_find_add_string()
165 new = strtab + fdt_size_dt_strings(fdt); in _fdt_find_add_string()
166 err = _fdt_splice_string(fdt, len); in _fdt_find_add_string()
174 int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size) in fdt_add_mem_rsv() argument
179 FDT_RW_CHECK_HEADER(fdt); in fdt_add_mem_rsv()
181 re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt)); in fdt_add_mem_rsv()
182 err = _fdt_splice_mem_rsv(fdt, re, 0, 1); in fdt_add_mem_rsv()
191 int fdt_del_mem_rsv(void *fdt, int n) in fdt_del_mem_rsv() argument
193 struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n); in fdt_del_mem_rsv()
195 FDT_RW_CHECK_HEADER(fdt); in fdt_del_mem_rsv()
197 if (n >= fdt_num_mem_rsv(fdt)) in fdt_del_mem_rsv()
200 return _fdt_splice_mem_rsv(fdt, re, 1, 0); in fdt_del_mem_rsv()
203 static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name, in _fdt_resize_property() argument
209 *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); in _fdt_resize_property()
213 if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen), in _fdt_resize_property()
221 static int _fdt_add_property(void *fdt, int nodeoffset, const char *name, in _fdt_add_property() argument
229 if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0) in _fdt_add_property()
232 namestroff = _fdt_find_add_string(fdt, name); in _fdt_add_property()
236 *prop = _fdt_offset_ptr_w(fdt, nextoffset); in _fdt_add_property()
239 err = _fdt_splice_struct(fdt, *prop, 0, proplen); in _fdt_add_property()
249 int fdt_set_name(void *fdt, int nodeoffset, const char *name) in fdt_set_name() argument
255 FDT_RW_CHECK_HEADER(fdt); in fdt_set_name()
257 namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen); in fdt_set_name()
263 err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1), in fdt_set_name()
272 int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, in fdt_setprop_placeholder() argument
278 FDT_RW_CHECK_HEADER(fdt); in fdt_setprop_placeholder()
280 err = _fdt_resize_property(fdt, nodeoffset, name, len, &prop); in fdt_setprop_placeholder()
282 err = _fdt_add_property(fdt, nodeoffset, name, len, &prop); in fdt_setprop_placeholder()
290 int fdt_setprop(void *fdt, int nodeoffset, const char *name, in fdt_setprop() argument
296 err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data); in fdt_setprop()
305 int fdt_appendprop(void *fdt, int nodeoffset, const char *name, in fdt_appendprop() argument
311 FDT_RW_CHECK_HEADER(fdt); in fdt_appendprop()
313 prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); in fdt_appendprop()
316 err = _fdt_splice_struct(fdt, prop->data, in fdt_appendprop()
324 err = _fdt_add_property(fdt, nodeoffset, name, len, &prop); in fdt_appendprop()
332 int fdt_delprop(void *fdt, int nodeoffset, const char *name) in fdt_delprop() argument
337 FDT_RW_CHECK_HEADER(fdt); in fdt_delprop()
339 prop = fdt_get_property_w(fdt, nodeoffset, name, &len); in fdt_delprop()
344 return _fdt_splice_struct(fdt, prop, proplen, 0); in fdt_delprop()
347 int fdt_add_subnode_namelen(void *fdt, int parentoffset, in fdt_add_subnode_namelen() argument
357 FDT_RW_CHECK_HEADER(fdt); in fdt_add_subnode_namelen()
359 offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen); in fdt_add_subnode_namelen()
366 fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */ in fdt_add_subnode_namelen()
369 tag = fdt_next_tag(fdt, offset, &nextoffset); in fdt_add_subnode_namelen()
372 nh = _fdt_offset_ptr_w(fdt, offset); in fdt_add_subnode_namelen()
375 err = _fdt_splice_struct(fdt, nh, 0, nodelen); in fdt_add_subnode_namelen()
388 int fdt_add_subnode(void *fdt, int parentoffset, const char *name) in fdt_add_subnode() argument
390 return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name)); in fdt_add_subnode()
393 int fdt_del_node(void *fdt, int nodeoffset) in fdt_del_node() argument
397 FDT_RW_CHECK_HEADER(fdt); in fdt_del_node()
399 endoffset = _fdt_node_end_offset(fdt, nodeoffset); in fdt_del_node()
403 return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset), in fdt_del_node()
429 int fdt_open_into(const void *fdt, void *buf, int bufsize) in fdt_open_into() argument
434 const char *fdtstart = fdt; in fdt_open_into()
435 const char *fdtend = fdtstart + fdt_totalsize(fdt); in fdt_open_into()
438 FDT_CHECK_HEADER(fdt); in fdt_open_into()
440 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) in fdt_open_into()
443 if (fdt_version(fdt) >= 17) { in fdt_open_into()
444 struct_size = fdt_size_dt_struct(fdt); in fdt_open_into()
447 while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END) in fdt_open_into()
453 if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) { in fdt_open_into()
455 err = fdt_move(fdt, buf, bufsize); in fdt_open_into()
466 + struct_size + fdt_size_dt_strings(fdt); in fdt_open_into()
481 _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size); in fdt_open_into()
488 fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt)); in fdt_open_into()
493 int fdt_pack(void *fdt) in fdt_pack() argument
497 FDT_RW_CHECK_HEADER(fdt); in fdt_pack()
499 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) in fdt_pack()
501 _fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt)); in fdt_pack()
502 fdt_set_totalsize(fdt, _fdt_data_size(fdt)); in fdt_pack()