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