Lines Matching defs:fdt
10 #include <fdt.h>
15 static int fdt_sw_probe_(void *fdt)
17 if (fdt_magic(fdt) == FDT_MAGIC)
19 else if (fdt_magic(fdt) != FDT_SW_MAGIC)
24 #define FDT_SW_PROBE(fdt) \
27 if ((err = fdt_sw_probe_(fdt)) != 0) \
37 static int fdt_sw_probe_memrsv_(void *fdt)
39 int err = fdt_sw_probe_(fdt);
43 if (fdt_off_dt_strings(fdt) != 0)
48 #define FDT_SW_PROBE_MEMRSV(fdt) \
51 if ((err = fdt_sw_probe_memrsv_(fdt)) != 0) \
63 static int fdt_sw_probe_struct_(void *fdt)
65 int err = fdt_sw_probe_(fdt);
69 if (fdt_off_dt_strings(fdt) != fdt_totalsize(fdt))
74 #define FDT_SW_PROBE_STRUCT(fdt) \
77 if ((err = fdt_sw_probe_struct_(fdt)) != 0) \
81 static inline uint32_t sw_flags(void *fdt)
83 /* assert: (fdt_magic(fdt) == FDT_SW_MAGIC) */
84 return fdt_last_comp_version(fdt);
92 static void *fdt_grab_space_(void *fdt, size_t len)
94 int offset = fdt_size_dt_struct(fdt);
97 spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
98 - fdt_size_dt_strings(fdt);
103 fdt_set_size_dt_struct(fdt, offset + len);
104 return fdt_offset_ptr_w_(fdt, offset);
111 void *fdt = buf;
122 * magic and last_comp_version keep intermediate state during the fdt
123 * creation process, which is replaced with the proper FDT format by
128 fdt_set_magic(fdt, FDT_SW_MAGIC);
129 fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
130 fdt_set_last_comp_version(fdt, flags);
132 fdt_set_totalsize(fdt, bufsize);
134 fdt_set_off_mem_rsvmap(fdt, hdrsize);
135 fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
136 fdt_set_off_dt_strings(fdt, 0);
146 int fdt_resize(void *fdt, void *buf, int bufsize)
151 FDT_SW_PROBE(fdt);
153 headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
154 tailsize = fdt_size_dt_strings(fdt);
156 if ((headsize + tailsize) > fdt_totalsize(fdt))
162 oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize;
167 if (buf <= fdt) {
168 memmove(buf, fdt, headsize);
172 memmove(buf, fdt, headsize);
182 int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
187 FDT_SW_PROBE_MEMRSV(fdt);
189 offset = fdt_off_dt_struct(fdt);
190 if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
193 re = (struct fdt_reserve_entry *)((char *)fdt + offset);
197 fdt_set_off_dt_struct(fdt, offset + sizeof(*re));
202 int fdt_finish_reservemap(void *fdt)
204 int err = fdt_add_reservemap_entry(fdt, 0, 0);
209 fdt_set_off_dt_strings(fdt, fdt_totalsize(fdt));
213 int fdt_begin_node(void *fdt, const char *name)
218 FDT_SW_PROBE_STRUCT(fdt);
221 nh = fdt_grab_space_(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen));
230 int fdt_end_node(void *fdt)
234 FDT_SW_PROBE_STRUCT(fdt);
236 en = fdt_grab_space_(fdt, FDT_TAGSIZE);
244 static int fdt_add_string_(void *fdt, const char *s)
246 char *strtab = (char *)fdt + fdt_totalsize(fdt);
247 int strtabsize = fdt_size_dt_strings(fdt);
252 struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
253 if (fdt_totalsize(fdt) + offset < struct_top)
257 fdt_set_size_dt_strings(fdt, strtabsize + len);
262 static void fdt_del_last_string_(void *fdt, const char *s)
264 int strtabsize = fdt_size_dt_strings(fdt);
267 fdt_set_size_dt_strings(fdt, strtabsize - len);
270 static int fdt_find_add_string_(void *fdt, const char *s, int *allocated)
272 char *strtab = (char *)fdt + fdt_totalsize(fdt);
273 int strtabsize = fdt_size_dt_strings(fdt);
284 return fdt_add_string_(fdt, s);
287 int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
293 FDT_SW_PROBE_STRUCT(fdt);
296 if (sw_flags(fdt) & FDT_CREATE_FLAG_NO_NAME_DEDUP) {
298 nameoff = fdt_add_string_(fdt, name);
300 nameoff = fdt_find_add_string_(fdt, name, &allocated);
305 prop = fdt_grab_space_(fdt, sizeof(*prop) + FDT_TAGALIGN(len));
308 fdt_del_last_string_(fdt, name);
319 int fdt_property(void *fdt, const char *name, const void *val, int len)
324 ret = fdt_property_placeholder(fdt, name, len, &ptr);
331 int fdt_finish(void *fdt)
333 char *p = (char *)fdt;
339 FDT_SW_PROBE_STRUCT(fdt);
342 end = fdt_grab_space_(fdt, sizeof(*end));
348 oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
349 newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
350 memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
351 fdt_set_off_dt_strings(fdt, newstroffset);
355 while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) {
358 fdt_offset_ptr_w_(fdt, offset);
362 nameoff += fdt_size_dt_strings(fdt);
371 fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
374 fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
375 fdt_set_magic(fdt, FDT_MAGIC);