Lines Matching defs:fdt

8 #include <fdt.h>
13 static int fdt_sw_probe_(void *fdt)
16 if (fdt_magic(fdt) == FDT_MAGIC)
18 else if (fdt_magic(fdt) != FDT_SW_MAGIC)
25 #define FDT_SW_PROBE(fdt) \
28 if ((err = fdt_sw_probe_(fdt)) != 0) \
38 static int fdt_sw_probe_memrsv_(void *fdt)
40 int err = fdt_sw_probe_(fdt);
44 if (!can_assume(VALID_INPUT) && fdt_off_dt_strings(fdt) != 0)
49 #define FDT_SW_PROBE_MEMRSV(fdt) \
52 if ((err = fdt_sw_probe_memrsv_(fdt)) != 0) \
64 static int fdt_sw_probe_struct_(void *fdt)
66 int err = fdt_sw_probe_(fdt);
71 fdt_off_dt_strings(fdt) != fdt_totalsize(fdt))
76 #define FDT_SW_PROBE_STRUCT(fdt) \
79 if ((err = fdt_sw_probe_struct_(fdt)) != 0) \
83 static inline uint32_t sw_flags(void *fdt)
85 /* assert: (fdt_magic(fdt) == FDT_SW_MAGIC) */
86 return fdt_last_comp_version(fdt);
94 static void *fdt_grab_space_(void *fdt, size_t len)
96 unsigned int offset = fdt_size_dt_struct(fdt);
99 spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
100 - fdt_size_dt_strings(fdt);
105 fdt_set_size_dt_struct(fdt, offset + len);
106 return fdt_offset_ptr_w_(fdt, offset);
113 void *fdt = buf;
124 * magic and last_comp_version keep intermediate state during the fdt
130 fdt_set_magic(fdt, FDT_SW_MAGIC);
131 fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
132 fdt_set_last_comp_version(fdt, flags);
134 fdt_set_totalsize(fdt, bufsize);
136 fdt_set_off_mem_rsvmap(fdt, hdrsize);
137 fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
138 fdt_set_off_dt_strings(fdt, 0);
148 int fdt_resize(void *fdt, void *buf, int bufsize)
153 FDT_SW_PROBE(fdt);
158 headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
159 tailsize = fdt_size_dt_strings(fdt);
162 headsize + tailsize > fdt_totalsize(fdt))
168 oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize;
173 if (buf <= fdt) {
174 memmove(buf, fdt, headsize);
178 memmove(buf, fdt, headsize);
188 int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
193 FDT_SW_PROBE_MEMRSV(fdt);
195 offset = fdt_off_dt_struct(fdt);
196 if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
199 re = (struct fdt_reserve_entry *)((char *)fdt + offset);
203 fdt_set_off_dt_struct(fdt, offset + sizeof(*re));
208 int fdt_finish_reservemap(void *fdt)
210 int err = fdt_add_reservemap_entry(fdt, 0, 0);
215 fdt_set_off_dt_strings(fdt, fdt_totalsize(fdt));
219 int fdt_begin_node(void *fdt, const char *name)
224 FDT_SW_PROBE_STRUCT(fdt);
227 nh = fdt_grab_space_(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen));
236 int fdt_end_node(void *fdt)
240 FDT_SW_PROBE_STRUCT(fdt);
242 en = fdt_grab_space_(fdt, FDT_TAGSIZE);
250 static int fdt_add_string_(void *fdt, const char *s)
252 char *strtab = (char *)fdt + fdt_totalsize(fdt);
253 unsigned int strtabsize = fdt_size_dt_strings(fdt);
258 struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
259 if (fdt_totalsize(fdt) - offset < struct_top)
263 fdt_set_size_dt_strings(fdt, strtabsize + len);
268 static void fdt_del_last_string_(void *fdt, const char *s)
270 int strtabsize = fdt_size_dt_strings(fdt);
273 fdt_set_size_dt_strings(fdt, strtabsize - len);
276 static int fdt_find_add_string_(void *fdt, const char *s, int *allocated)
278 char *strtab = (char *)fdt + fdt_totalsize(fdt);
279 int strtabsize = fdt_size_dt_strings(fdt);
290 return fdt_add_string_(fdt, s);
293 int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
299 FDT_SW_PROBE_STRUCT(fdt);
302 if (sw_flags(fdt) & FDT_CREATE_FLAG_NO_NAME_DEDUP) {
304 nameoff = fdt_add_string_(fdt, name);
306 nameoff = fdt_find_add_string_(fdt, name, &allocated);
311 prop = fdt_grab_space_(fdt, sizeof(*prop) + FDT_TAGALIGN(len));
314 fdt_del_last_string_(fdt, name);
325 int fdt_property(void *fdt, const char *name, const void *val, int len)
330 ret = fdt_property_placeholder(fdt, name, len, &ptr);
337 int fdt_finish(void *fdt)
339 char *p = (char *)fdt;
345 FDT_SW_PROBE_STRUCT(fdt);
348 end = fdt_grab_space_(fdt, sizeof(*end));
354 oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
355 newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
356 memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
357 fdt_set_off_dt_strings(fdt, newstroffset);
361 while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) {
364 fdt_offset_ptr_w_(fdt, offset);
368 nameoff += fdt_size_dt_strings(fdt);
377 fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
380 fdt_set_last_comp_version(fdt, FDT_LAST_COMPATIBLE_VERSION);
381 fdt_set_magic(fdt, FDT_MAGIC);