Lines Matching refs:fdt

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