xref: /aosp_15_r20/system/libufdt/include/libufdt.h (revision 13e8728f0cffde9369df671f7b293a048a99c7ed)
1*13e8728fSAndroid Build Coastguard Worker /*
2*13e8728fSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*13e8728fSAndroid Build Coastguard Worker  *
4*13e8728fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*13e8728fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*13e8728fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*13e8728fSAndroid Build Coastguard Worker  *
8*13e8728fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*13e8728fSAndroid Build Coastguard Worker  *
10*13e8728fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*13e8728fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*13e8728fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*13e8728fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*13e8728fSAndroid Build Coastguard Worker  * limitations under the License.
15*13e8728fSAndroid Build Coastguard Worker  */
16*13e8728fSAndroid Build Coastguard Worker 
17*13e8728fSAndroid Build Coastguard Worker #ifndef LIBUFDT_H
18*13e8728fSAndroid Build Coastguard Worker #define LIBUFDT_H
19*13e8728fSAndroid Build Coastguard Worker 
20*13e8728fSAndroid Build Coastguard Worker #include "libufdt_sysdeps.h"
21*13e8728fSAndroid Build Coastguard Worker #include "ufdt_types.h"
22*13e8728fSAndroid Build Coastguard Worker 
23*13e8728fSAndroid Build Coastguard Worker /*
24*13e8728fSAndroid Build Coastguard Worker  * BEGIN of ufdt_node methods
25*13e8728fSAndroid Build Coastguard Worker  */
26*13e8728fSAndroid Build Coastguard Worker 
27*13e8728fSAndroid Build Coastguard Worker /*
28*13e8728fSAndroid Build Coastguard Worker  * Allocates spaces for new ufdt_node who represents a fdt node at fdt_tag_ptr.
29*13e8728fSAndroid Build Coastguard Worker  * In order to get name pointer, it's necessary to give the pointer to the
30*13e8728fSAndroid Build Coastguard Worker  * entire fdt it belongs to.
31*13e8728fSAndroid Build Coastguard Worker  *
32*13e8728fSAndroid Build Coastguard Worker  *
33*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to the newly created ufdt_node or
34*13e8728fSAndroid Build Coastguard Worker  *          NULL if dto_malloc failed
35*13e8728fSAndroid Build Coastguard Worker  */
36*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_node_construct(void *fdtp, fdt32_t *fdt_tag_ptr,
37*13e8728fSAndroid Build Coastguard Worker                                       struct ufdt_node_pool *pool);
38*13e8728fSAndroid Build Coastguard Worker 
39*13e8728fSAndroid Build Coastguard Worker /*
40*13e8728fSAndroid Build Coastguard Worker  * Frees all nodes in the subtree rooted at *node.
41*13e8728fSAndroid Build Coastguard Worker  */
42*13e8728fSAndroid Build Coastguard Worker void ufdt_node_destruct(struct ufdt_node *node, struct ufdt_node_pool *pool);
43*13e8728fSAndroid Build Coastguard Worker 
44*13e8728fSAndroid Build Coastguard Worker /*
45*13e8728fSAndroid Build Coastguard Worker  * Adds the child as a subnode of the parent.
46*13e8728fSAndroid Build Coastguard Worker  * It's been done by add entries in parent->prop_list or node_list depending on
47*13e8728fSAndroid Build Coastguard Worker  * the tag type of child.
48*13e8728fSAndroid Build Coastguard Worker  *
49*13e8728fSAndroid Build Coastguard Worker  * @return: 0 if success
50*13e8728fSAndroid Build Coastguard Worker  *          < 0 otherwise
51*13e8728fSAndroid Build Coastguard Worker  *
52*13e8728fSAndroid Build Coastguard Worker  * @Time: O(1) w.h.p.
53*13e8728fSAndroid Build Coastguard Worker  */
54*13e8728fSAndroid Build Coastguard Worker int ufdt_node_add_child(struct ufdt_node *parent, struct ufdt_node *child);
55*13e8728fSAndroid Build Coastguard Worker 
56*13e8728fSAndroid Build Coastguard Worker /* BEGIN of FDT_PROP related functions .*/
57*13e8728fSAndroid Build Coastguard Worker 
58*13e8728fSAndroid Build Coastguard Worker /*
59*13e8728fSAndroid Build Coastguard Worker  * Gets pointer to FDT_PROP subnode of node with name equals to name[0..len-1]
60*13e8728fSAndroid Build Coastguard Worker  *
61*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to the subnode or
62*13e8728fSAndroid Build Coastguard Worker  *          NULL if no such subnode.
63*13e8728fSAndroid Build Coastguard Worker  *
64*13e8728fSAndroid Build Coastguard Worker  * @Time: O(len = length of name) w.h.p.
65*13e8728fSAndroid Build Coastguard Worker  */
66*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_node_get_property_by_name_len(
67*13e8728fSAndroid Build Coastguard Worker     const struct ufdt_node *node, const char *name, int len);
68*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_node_get_property_by_name(const struct ufdt_node *node,
69*13e8728fSAndroid Build Coastguard Worker                                                  const char *name);
70*13e8728fSAndroid Build Coastguard Worker 
71*13e8728fSAndroid Build Coastguard Worker /*
72*13e8728fSAndroid Build Coastguard Worker  * Gets the pointer to the FDT_PROP node's data in the corresponding fdt.
73*13e8728fSAndroid Build Coastguard Worker  * Also writes the length of such data to *out_len if out_len is not NULL.
74*13e8728fSAndroid Build Coastguard Worker  *
75*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to some data located in fdt or
76*13e8728fSAndroid Build Coastguard Worker  *          NULL if *node is not a FDT_PROP
77*13e8728fSAndroid Build Coastguard Worker  */
78*13e8728fSAndroid Build Coastguard Worker char *ufdt_node_get_fdt_prop_data(const struct ufdt_node *node, int *out_len);
79*13e8728fSAndroid Build Coastguard Worker 
80*13e8728fSAndroid Build Coastguard Worker /*
81*13e8728fSAndroid Build Coastguard Worker  * Gets pointer to FDT_PROP node's data in fdt with name equals to
82*13e8728fSAndroid Build Coastguard Worker  * name[0..len-1], which is a subnode of *node.
83*13e8728fSAndroid Build Coastguard Worker  * It's actually a composition of ufdt_node_get_property_by_name and
84*13e8728fSAndroid Build Coastguard Worker  * ufdt_node_get_fdt_prop_data
85*13e8728fSAndroid Build Coastguard Worker  *
86*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to some data located in fdt or
87*13e8728fSAndroid Build Coastguard Worker  *          NULL if no such subnode.
88*13e8728fSAndroid Build Coastguard Worker  *
89*13e8728fSAndroid Build Coastguard Worker  * @Time: O(len = length of name) w.h.p.
90*13e8728fSAndroid Build Coastguard Worker  */
91*13e8728fSAndroid Build Coastguard Worker char *ufdt_node_get_fdt_prop_data_by_name_len(const struct ufdt_node *node,
92*13e8728fSAndroid Build Coastguard Worker                                               const char *name, int len,
93*13e8728fSAndroid Build Coastguard Worker                                               int *out_len);
94*13e8728fSAndroid Build Coastguard Worker char *ufdt_node_get_fdt_prop_data_by_name(const struct ufdt_node *node,
95*13e8728fSAndroid Build Coastguard Worker                                           const char *name, int *out_len);
96*13e8728fSAndroid Build Coastguard Worker 
97*13e8728fSAndroid Build Coastguard Worker /* END of FDT_PROP related functions .*/
98*13e8728fSAndroid Build Coastguard Worker 
99*13e8728fSAndroid Build Coastguard Worker /*
100*13e8728fSAndroid Build Coastguard Worker  * Gets pointer to FDT_BEGIN_NODE subnode of node with name equals to
101*13e8728fSAndroid Build Coastguard Worker  * name[0..len-1].
102*13e8728fSAndroid Build Coastguard Worker  *
103*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to the subnode or
104*13e8728fSAndroid Build Coastguard Worker  *          NULL if no such subnode.
105*13e8728fSAndroid Build Coastguard Worker  *
106*13e8728fSAndroid Build Coastguard Worker  * @Time: O(len = length of name) w.h.p.
107*13e8728fSAndroid Build Coastguard Worker  */
108*13e8728fSAndroid Build Coastguard Worker 
109*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_node_get_subnode_by_name_len(const struct ufdt_node *node,
110*13e8728fSAndroid Build Coastguard Worker                                                     const char *name, int len);
111*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_node_get_subnode_by_name(const struct ufdt_node *node,
112*13e8728fSAndroid Build Coastguard Worker                                                 const char *name);
113*13e8728fSAndroid Build Coastguard Worker 
114*13e8728fSAndroid Build Coastguard Worker /*
115*13e8728fSAndroid Build Coastguard Worker  * Gets the pointer to FDT_NODE node whose relative path to *node is
116*13e8728fSAndroid Build Coastguard Worker  * path[0..len-1].
117*13e8728fSAndroid Build Coastguard Worker  * Note that the relative path doesn't support parent node like:
118*13e8728fSAndroid Build Coastguard Worker  * "../path/to/node".
119*13e8728fSAndroid Build Coastguard Worker  *
120*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to the node or
121*13e8728fSAndroid Build Coastguard Worker  *          NULL if no such node.
122*13e8728fSAndroid Build Coastguard Worker  *
123*13e8728fSAndroid Build Coastguard Worker  * @Time: O(len = length of path) w.h.p.
124*13e8728fSAndroid Build Coastguard Worker  */
125*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_node_get_node_by_path_len(const struct ufdt_node *node,
126*13e8728fSAndroid Build Coastguard Worker                                                  const char *path, int len);
127*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_node_get_node_by_path(const struct ufdt_node *node,
128*13e8728fSAndroid Build Coastguard Worker                                              const char *path);
129*13e8728fSAndroid Build Coastguard Worker 
130*13e8728fSAndroid Build Coastguard Worker /*
131*13e8728fSAndroid Build Coastguard Worker  * Gets the phandle value of the node if it has.
132*13e8728fSAndroid Build Coastguard Worker  *
133*13e8728fSAndroid Build Coastguard Worker  * @return: phandle value of that node or
134*13e8728fSAndroid Build Coastguard Worker  *          0 if *node is not FDT_NODE or there's no "phandle"/"linux,phandle"
135*13e8728fSAndroid Build Coastguard Worker  *          property.
136*13e8728fSAndroid Build Coastguard Worker  *
137*13e8728fSAndroid Build Coastguard Worker  * @Time: O(1) w.h.p.
138*13e8728fSAndroid Build Coastguard Worker  */
139*13e8728fSAndroid Build Coastguard Worker uint32_t ufdt_node_get_phandle(const struct ufdt_node *node);
140*13e8728fSAndroid Build Coastguard Worker 
141*13e8728fSAndroid Build Coastguard Worker /*
142*13e8728fSAndroid Build Coastguard Worker  * END of ufdt_node methods
143*13e8728fSAndroid Build Coastguard Worker  */
144*13e8728fSAndroid Build Coastguard Worker 
145*13e8728fSAndroid Build Coastguard Worker /*
146*13e8728fSAndroid Build Coastguard Worker  * BEGIN of ufdt methods.
147*13e8728fSAndroid Build Coastguard Worker  */
148*13e8728fSAndroid Build Coastguard Worker 
149*13e8728fSAndroid Build Coastguard Worker /*
150*13e8728fSAndroid Build Coastguard Worker  * Constructs a ufdt whose base fdt is fdtp.
151*13e8728fSAndroid Build Coastguard Worker  * Note that this function doesn't construct the entire tree.
152*13e8728fSAndroid Build Coastguard Worker  * To get the whole tree please call `ufdt_from_fdt(fdtp, fdt_size)`
153*13e8728fSAndroid Build Coastguard Worker  *
154*13e8728fSAndroid Build Coastguard Worker  * @return: an empty ufdt with base fdtp = fdtp
155*13e8728fSAndroid Build Coastguard Worker  */
156*13e8728fSAndroid Build Coastguard Worker struct ufdt *ufdt_construct(void *fdtp, struct ufdt_node_pool *pool);
157*13e8728fSAndroid Build Coastguard Worker 
158*13e8728fSAndroid Build Coastguard Worker /*
159*13e8728fSAndroid Build Coastguard Worker  * Frees the space occupied by the ufdt, including all ufdt_nodes
160*13e8728fSAndroid Build Coastguard Worker  * with ufdt_static_phandle_table.
161*13e8728fSAndroid Build Coastguard Worker  */
162*13e8728fSAndroid Build Coastguard Worker void ufdt_destruct(struct ufdt *tree, struct ufdt_node_pool *pool);
163*13e8728fSAndroid Build Coastguard Worker 
164*13e8728fSAndroid Build Coastguard Worker /*
165*13e8728fSAndroid Build Coastguard Worker  * Add a fdt into this ufdt.
166*13e8728fSAndroid Build Coastguard Worker  * Note that this function just add the given fdtp into this ufdt,
167*13e8728fSAndroid Build Coastguard Worker  * and doesn't create any node.
168*13e8728fSAndroid Build Coastguard Worker  *
169*13e8728fSAndroid Build Coastguard Worker  * @return: 0 if success.
170*13e8728fSAndroid Build Coastguard Worker  */
171*13e8728fSAndroid Build Coastguard Worker int ufdt_add_fdt(struct ufdt *tree, void *fdtp);
172*13e8728fSAndroid Build Coastguard Worker 
173*13e8728fSAndroid Build Coastguard Worker /*
174*13e8728fSAndroid Build Coastguard Worker  * Calculate the offset in the string tables of the given string.
175*13e8728fSAndroid Build Coastguard Worker  * All string tables will be concatenated in reversed order.
176*13e8728fSAndroid Build Coastguard Worker  *
177*13e8728fSAndroid Build Coastguard Worker  * @return: The offset is a negative number, base on the end position of
178*13e8728fSAndroid Build Coastguard Worker  *          all concatenated string tables
179*13e8728fSAndroid Build Coastguard Worker  *          Return 0 if not in any string table.
180*13e8728fSAndroid Build Coastguard Worker  */
181*13e8728fSAndroid Build Coastguard Worker int ufdt_get_string_off(const struct ufdt *tree, const char *s);
182*13e8728fSAndroid Build Coastguard Worker 
183*13e8728fSAndroid Build Coastguard Worker /*
184*13e8728fSAndroid Build Coastguard Worker  * Gets the pointer to the ufdt_node in tree with phandle = phandle.
185*13e8728fSAndroid Build Coastguard Worker  * The function do a binary search in tree->phandle_table.
186*13e8728fSAndroid Build Coastguard Worker  *
187*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to the target ufdt_node
188*13e8728fSAndroid Build Coastguard Worker  *          NULL if no ufdt_node has phandle = phandle
189*13e8728fSAndroid Build Coastguard Worker  *
190*13e8728fSAndroid Build Coastguard Worker  * @Time: O(log(# of nodes in tree)) = O(log(size of underlying fdt))
191*13e8728fSAndroid Build Coastguard Worker  */
192*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_get_node_by_phandle(struct ufdt *tree, uint32_t phandle);
193*13e8728fSAndroid Build Coastguard Worker 
194*13e8728fSAndroid Build Coastguard Worker /*
195*13e8728fSAndroid Build Coastguard Worker  * Gets the pointer to the ufdt_node in tree with absolute path =
196*13e8728fSAndroid Build Coastguard Worker  * path[0..len-1].
197*13e8728fSAndroid Build Coastguard Worker  * Absolute path has form "/path/to/node" or "some_alias/to/node".
198*13e8728fSAndroid Build Coastguard Worker  * In later example, some_alias is a property in "/aliases" with data is a path
199*13e8728fSAndroid Build Coastguard Worker  * to some node X. Then the funcion will return node with relative
200*13e8728fSAndroid Build Coastguard Worker  * path = "to/node" w.r.t. X.
201*13e8728fSAndroid Build Coastguard Worker  *
202*13e8728fSAndroid Build Coastguard Worker  * @return: a pointer to the target ufdt_node or
203*13e8728fSAndroid Build Coastguard Worker  *          NULL if such dnt doesn't exist.
204*13e8728fSAndroid Build Coastguard Worker  *
205*13e8728fSAndroid Build Coastguard Worker  * @Time: O(len = length of path) w.h.p.
206*13e8728fSAndroid Build Coastguard Worker  */
207*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_get_node_by_path_len(struct ufdt *tree, const char *path,
208*13e8728fSAndroid Build Coastguard Worker                                             int len);
209*13e8728fSAndroid Build Coastguard Worker struct ufdt_node *ufdt_get_node_by_path(struct ufdt *tree, const char *path);
210*13e8728fSAndroid Build Coastguard Worker 
211*13e8728fSAndroid Build Coastguard Worker /*
212*13e8728fSAndroid Build Coastguard Worker  * Determines whether node->name equals to name[0..len-1]
213*13e8728fSAndroid Build Coastguard Worker  *
214*13e8728fSAndroid Build Coastguard Worker  * @return: true if they're equal.
215*13e8728fSAndroid Build Coastguard Worker  *          false otherwise
216*13e8728fSAndroid Build Coastguard Worker  */
217*13e8728fSAndroid Build Coastguard Worker bool ufdt_node_name_eq(const struct ufdt_node *node, const char *name, int len);
218*13e8728fSAndroid Build Coastguard Worker 
219*13e8728fSAndroid Build Coastguard Worker /*
220*13e8728fSAndroid Build Coastguard Worker  * Merges tree_b into tree_a with tree_b has all nodes except root disappeared.
221*13e8728fSAndroid Build Coastguard Worker  * Overwrite property in tree_a if there's one with same name in tree_b.
222*13e8728fSAndroid Build Coastguard Worker  * Otherwise add the property to tree_a.
223*13e8728fSAndroid Build Coastguard Worker  * For subnodes with the same name, recursively run this function.
224*13e8728fSAndroid Build Coastguard Worker  *
225*13e8728fSAndroid Build Coastguard Worker  * Ex:
226*13e8728fSAndroid Build Coastguard Worker  * tree_a : ta {
227*13e8728fSAndroid Build Coastguard Worker  *  b = "b";
228*13e8728fSAndroid Build Coastguard Worker  *  c = "c";
229*13e8728fSAndroid Build Coastguard Worker  *  d {
230*13e8728fSAndroid Build Coastguard Worker  *    e = "g";
231*13e8728fSAndroid Build Coastguard Worker  *  };
232*13e8728fSAndroid Build Coastguard Worker  * };
233*13e8728fSAndroid Build Coastguard Worker  *
234*13e8728fSAndroid Build Coastguard Worker  * tree_b : tb {
235*13e8728fSAndroid Build Coastguard Worker  *  c = "C";
236*13e8728fSAndroid Build Coastguard Worker  *  g = "G";
237*13e8728fSAndroid Build Coastguard Worker  *  d {
238*13e8728fSAndroid Build Coastguard Worker  *    da = "dad";
239*13e8728fSAndroid Build Coastguard Worker  *  };
240*13e8728fSAndroid Build Coastguard Worker  *  h {
241*13e8728fSAndroid Build Coastguard Worker  *    hh = "HH";
242*13e8728fSAndroid Build Coastguard Worker  *  };
243*13e8728fSAndroid Build Coastguard Worker  * };
244*13e8728fSAndroid Build Coastguard Worker  *
245*13e8728fSAndroid Build Coastguard Worker  * The resulting trees will be:
246*13e8728fSAndroid Build Coastguard Worker  *
247*13e8728fSAndroid Build Coastguard Worker  * tree_a : ta {
248*13e8728fSAndroid Build Coastguard Worker  *  b = "b";
249*13e8728fSAndroid Build Coastguard Worker  *  c = "C";
250*13e8728fSAndroid Build Coastguard Worker  *  g = "G";
251*13e8728fSAndroid Build Coastguard Worker  *  d {
252*13e8728fSAndroid Build Coastguard Worker  *    da = "dad";
253*13e8728fSAndroid Build Coastguard Worker  *    e = "g";
254*13e8728fSAndroid Build Coastguard Worker  *  };
255*13e8728fSAndroid Build Coastguard Worker  *  h {
256*13e8728fSAndroid Build Coastguard Worker  *    hh = "HH";
257*13e8728fSAndroid Build Coastguard Worker  *  };
258*13e8728fSAndroid Build Coastguard Worker  * };
259*13e8728fSAndroid Build Coastguard Worker  *
260*13e8728fSAndroid Build Coastguard Worker  * tree_b : tb {
261*13e8728fSAndroid Build Coastguard Worker  * };
262*13e8728fSAndroid Build Coastguard Worker  *
263*13e8728fSAndroid Build Coastguard Worker  *
264*13e8728fSAndroid Build Coastguard Worker  * @return: 0 if merge success
265*13e8728fSAndroid Build Coastguard Worker  *          < 0 otherwise
266*13e8728fSAndroid Build Coastguard Worker  *
267*13e8728fSAndroid Build Coastguard Worker  * @Time: O(# of nodes in tree_b + total length of all names in tree_b) w.h.p.
268*13e8728fSAndroid Build Coastguard Worker  */
269*13e8728fSAndroid Build Coastguard Worker int ufdt_node_merge_into(struct ufdt_node *node_a, struct ufdt_node *node_b,
270*13e8728fSAndroid Build Coastguard Worker                          struct ufdt_node_pool *pool);
271*13e8728fSAndroid Build Coastguard Worker 
272*13e8728fSAndroid Build Coastguard Worker /*
273*13e8728fSAndroid Build Coastguard Worker  * END of ufdt methods.
274*13e8728fSAndroid Build Coastguard Worker  */
275*13e8728fSAndroid Build Coastguard Worker 
276*13e8728fSAndroid Build Coastguard Worker /*
277*13e8728fSAndroid Build Coastguard Worker  * BEGIN of ufdt output functions
278*13e8728fSAndroid Build Coastguard Worker  */
279*13e8728fSAndroid Build Coastguard Worker 
280*13e8728fSAndroid Build Coastguard Worker /*
281*13e8728fSAndroid Build Coastguard Worker  * Builds the ufdt for FDT pointed by fdtp.
282*13e8728fSAndroid Build Coastguard Worker  *
283*13e8728fSAndroid Build Coastguard Worker  * @return: the ufdt T representing fdtp or
284*13e8728fSAndroid Build Coastguard Worker  *          T with T.fdtp == NULL if fdtp is unvalid.
285*13e8728fSAndroid Build Coastguard Worker  *
286*13e8728fSAndroid Build Coastguard Worker  * @Time: O(fdt_size + nlogn) where n = # of nodes in fdt.
287*13e8728fSAndroid Build Coastguard Worker  */
288*13e8728fSAndroid Build Coastguard Worker struct ufdt *ufdt_from_fdt(void *fdtp, size_t fdt_size,
289*13e8728fSAndroid Build Coastguard Worker                            struct ufdt_node_pool *pool);
290*13e8728fSAndroid Build Coastguard Worker 
291*13e8728fSAndroid Build Coastguard Worker /*
292*13e8728fSAndroid Build Coastguard Worker  * Sequentially dumps the whole ufdt to FDT buffer fdtp with buffer size
293*13e8728fSAndroid Build Coastguard Worker  * buf_size.
294*13e8728fSAndroid Build Coastguard Worker  *
295*13e8728fSAndroid Build Coastguard Worker  * Basically using functions provided by libfdt/fdt_sw.c.
296*13e8728fSAndroid Build Coastguard Worker  *
297*13e8728fSAndroid Build Coastguard Worker  * @return: 0 if successfully dump or
298*13e8728fSAndroid Build Coastguard Worker  *          < 0 otherwise
299*13e8728fSAndroid Build Coastguard Worker  *
300*13e8728fSAndroid Build Coastguard Worker  * @Time: O(total length of all names + # of nodes in tree)
301*13e8728fSAndroid Build Coastguard Worker  */
302*13e8728fSAndroid Build Coastguard Worker int ufdt_to_fdt(const struct ufdt *tree, void *buf, int buf_size);
303*13e8728fSAndroid Build Coastguard Worker 
304*13e8728fSAndroid Build Coastguard Worker /*
305*13e8728fSAndroid Build Coastguard Worker  * prints the entire subtree rooted at *node in form:
306*13e8728fSAndroid Build Coastguard Worker  * NODE :[node name]:
307*13e8728fSAndroid Build Coastguard Worker  *   PROP :[prop name]:
308*13e8728fSAndroid Build Coastguard Worker  *   ...
309*13e8728fSAndroid Build Coastguard Worker  *   NODE :[subnode1 name]:
310*13e8728fSAndroid Build Coastguard Worker  *     ...
311*13e8728fSAndroid Build Coastguard Worker  *   NODE :[subnode1 name]:
312*13e8728fSAndroid Build Coastguard Worker  *     ...
313*13e8728fSAndroid Build Coastguard Worker  *   ...
314*13e8728fSAndroid Build Coastguard Worker  * There're (depth * TAB_SIZE) spaces in front of each line.
315*13e8728fSAndroid Build Coastguard Worker  */
316*13e8728fSAndroid Build Coastguard Worker void ufdt_node_print(const struct ufdt_node *node, int depth);
317*13e8728fSAndroid Build Coastguard Worker 
318*13e8728fSAndroid Build Coastguard Worker /*
319*13e8728fSAndroid Build Coastguard Worker  * It's just ufdt_node_print(tree->root, 0).
320*13e8728fSAndroid Build Coastguard Worker  */
321*13e8728fSAndroid Build Coastguard Worker void ufdt_print(struct ufdt *tree);
322*13e8728fSAndroid Build Coastguard Worker 
323*13e8728fSAndroid Build Coastguard Worker /*
324*13e8728fSAndroid Build Coastguard Worker  * END of ufdt output functions
325*13e8728fSAndroid Build Coastguard Worker  */
326*13e8728fSAndroid Build Coastguard Worker 
327*13e8728fSAndroid Build Coastguard Worker #endif /* LIBUFDT_H */
328