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