Lines Matching full:fdt
53 #include <fdt.h>
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()