Lines Matching defs: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_check_header(void *fdt)
72 FDT_CHECK_HEADER(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_CHECK_HEADER(fdt) \
88 if ((err = _fdt_rw_check_header(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 ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt)))
110 static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p,
115 err = _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p));
118 fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta);
119 fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
123 static int _fdt_splice_struct(void *fdt, void *p,
129 if ((err = _fdt_splice(fdt, p, oldlen, newlen)))
132 fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta);
133 fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
137 static int _fdt_splice_string(void *fdt, int newlen)
139 void *p = (char *)fdt
140 + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
143 if ((err = _fdt_splice(fdt, p, 0, newlen)))
146 fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);
150 static int _fdt_find_add_string(void *fdt, const char *s)
152 char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
158 p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s);
163 new = strtab + fdt_size_dt_strings(fdt);
164 err = _fdt_splice_string(fdt, len);
172 int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
177 FDT_RW_CHECK_HEADER(fdt);
179 re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
180 err = _fdt_splice_mem_rsv(fdt, re, 0, 1);
189 int fdt_del_mem_rsv(void *fdt, int n)
191 struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);
194 FDT_RW_CHECK_HEADER(fdt);
196 if (n >= fdt_num_mem_rsv(fdt))
199 err = _fdt_splice_mem_rsv(fdt, re, 1, 0);
205 static 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),
223 static int _fdt_add_property(void *fdt, int nodeoffset, const char *name,
231 if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0)
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);
251 int fdt_set_name(void *fdt, int nodeoffset, const char *name)
257 FDT_RW_CHECK_HEADER(fdt);
259 namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen);
265 err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1),
274 int fdt_setprop(void *fdt, int nodeoffset, const char *name,
280 FDT_RW_CHECK_HEADER(fdt);
282 err = _fdt_resize_property(fdt, nodeoffset, name, len, &prop);
284 err = _fdt_add_property(fdt, nodeoffset, name, len, &prop);
292 int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
298 FDT_RW_CHECK_HEADER(fdt);
300 prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
303 err = _fdt_splice_struct(fdt, prop->data,
311 err = _fdt_add_property(fdt, nodeoffset, name, len, &prop);
319 int fdt_delprop(void *fdt, int nodeoffset, const char *name)
324 FDT_RW_CHECK_HEADER(fdt);
326 prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
331 return _fdt_splice_struct(fdt, prop, proplen, 0);
334 int fdt_add_subnode_namelen(void *fdt, int parentoffset,
344 FDT_RW_CHECK_HEADER(fdt);
346 offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
353 fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
356 tag = fdt_next_tag(fdt, offset, &nextoffset);
359 nh = _fdt_offset_ptr_w(fdt, offset);
362 err = _fdt_splice_struct(fdt, nh, 0, nodelen);
375 int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
377 return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name));
380 int fdt_del_node(void *fdt, int nodeoffset)
384 FDT_RW_CHECK_HEADER(fdt);
386 endoffset = _fdt_node_end_offset(fdt, nodeoffset);
390 return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
416 int fdt_open_into(const void *fdt, void *buf, int bufsize)
421 const char *fdtstart = fdt;
422 const char *fdtend = fdtstart + fdt_totalsize(fdt);
425 FDT_CHECK_HEADER(fdt);
427 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
430 if (fdt_version(fdt) >= 17) {
431 struct_size = fdt_size_dt_struct(fdt);
434 while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
440 if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) {
442 err = fdt_move(fdt, buf, bufsize);
453 + struct_size + fdt_size_dt_strings(fdt);
468 _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size);
475 fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt));
480 int fdt_pack(void *fdt)
484 FDT_RW_CHECK_HEADER(fdt);
486 mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
488 _fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt));
489 fdt_set_totalsize(fdt, _fdt_data_size(fdt));