1/* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License as published by 4 * the Free Software Foundation; either version 2 of the License, or 5 * (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software 14 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 15 */ 16 17#ifndef FLATDEVTREE_H 18#define FLATDEVTREE_H 19 20#include "flatdevtree_env.h" 21 22/* Definitions used by the flattened device tree */ 23#define OF_DT_HEADER 0xd00dfeed /* marker */ 24#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */ 25#define OF_DT_END_NODE 0x2 /* End node */ 26#define OF_DT_PROP 0x3 /* Property: name off, size, content */ 27#define OF_DT_NOP 0x4 /* nop */ 28#define OF_DT_END 0x9 29 30#define OF_DT_VERSION 0x10 31 32struct boot_param_header { 33 u32 magic; /* magic word OF_DT_HEADER */ 34 u32 totalsize; /* total size of DT block */ 35 u32 off_dt_struct; /* offset to structure */ 36 u32 off_dt_strings; /* offset to strings */ 37 u32 off_mem_rsvmap; /* offset to memory reserve map */ 38 u32 version; /* format version */ 39 u32 last_comp_version; /* last compatible version */ 40 /* version 2 fields below */ 41 u32 boot_cpuid_phys; /* Physical CPU id we're booting on */ 42 /* version 3 fields below */ 43 u32 dt_strings_size; /* size of the DT strings block */ 44}; 45 46struct ft_reserve { 47 u64 start; 48 u64 len; 49}; 50 51struct ft_region { 52 char *start; 53 unsigned long size; 54}; 55 56enum ft_rgn_id { 57 FT_RSVMAP, 58 FT_STRUCT, 59 FT_STRINGS, 60 FT_N_REGION 61}; 62 63#define FT_MAX_DEPTH 50 64 65struct ft_cxt { 66 struct boot_param_header *bph; 67 int max_size; /* maximum size of tree */ 68 int isordered; /* everything in standard order */ 69 void *(*realloc)(void *, unsigned long); 70 char *str_anchor; 71 char *p; /* current insertion point in structs */ 72 struct ft_region rgn[FT_N_REGION]; 73 void *genealogy[FT_MAX_DEPTH+1]; 74 char **node_tbl; 75 unsigned int node_max; 76 unsigned int nodes_used; 77}; 78 79int ft_begin_node(struct ft_cxt *cxt, const char *name); 80void ft_end_node(struct ft_cxt *cxt); 81 82void ft_begin_tree(struct ft_cxt *cxt); 83void ft_end_tree(struct ft_cxt *cxt); 84 85void ft_nop(struct ft_cxt *cxt); 86int ft_prop(struct ft_cxt *cxt, const char *name, 87 const void *data, unsigned int sz); 88int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str); 89int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val); 90void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size, 91 void *(*realloc_fn)(void *, unsigned long)); 92int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size, 93 unsigned int max_find_device, 94 void *(*realloc_fn)(void *, unsigned long)); 95int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size); 96 97void ft_dump_blob(const void *bphp); 98void ft_merge_blob(struct ft_cxt *cxt, void *blob); 99void *ft_find_device(struct ft_cxt *cxt, const char *srch_path); 100void *ft_find_device_rel(struct ft_cxt *cxt, const void *top, 101 const char *srch_path); 102void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path); 103int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname, 104 void *buf, const unsigned int buflen); 105int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname, 106 const void *buf, const unsigned int buflen); 107void *ft_get_parent(struct ft_cxt *cxt, const void *phandle); 108void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev, 109 const char *propname, const char *propval, 110 int proplen); 111void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name); 112 113#endif /* FLATDEVTREE_H */ 114