| /* | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License as published by | |
| * the Free Software Foundation; either version 2 of the License, or | |
| * (at your option) any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program; if not, write to the Free Software | |
| * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
| */ | |
| #ifndef FLATDEVTREE_H | |
| #define FLATDEVTREE_H | |
| #include "flatdevtree_env.h" | |
| /* Definitions used by the flattened device tree */ | |
| #define OF_DT_HEADER 0xd00dfeed /* marker */ | |
| #define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */ | |
| #define OF_DT_END_NODE 0x2 /* End node */ | |
| #define OF_DT_PROP 0x3 /* Property: name off, size, content */ | |
| #define OF_DT_NOP 0x4 /* nop */ | |
| #define OF_DT_END 0x9 | |
| #define OF_DT_VERSION 0x10 | |
| struct boot_param_header { | |
| u32 magic; /* magic word OF_DT_HEADER */ | |
| u32 totalsize; /* total size of DT block */ | |
| u32 off_dt_struct; /* offset to structure */ | |
| u32 off_dt_strings; /* offset to strings */ | |
| u32 off_mem_rsvmap; /* offset to memory reserve map */ | |
| u32 version; /* format version */ | |
| u32 last_comp_version; /* last compatible version */ | |
| /* version 2 fields below */ | |
| u32 boot_cpuid_phys; /* Physical CPU id we're booting on */ | |
| /* version 3 fields below */ | |
| u32 dt_strings_size; /* size of the DT strings block */ | |
| }; | |
| struct ft_reserve { | |
| u64 start; | |
| u64 len; | |
| }; | |
| struct ft_region { | |
| char *start; | |
| unsigned long size; | |
| }; | |
| enum ft_rgn_id { | |
| FT_RSVMAP, | |
| FT_STRUCT, | |
| FT_STRINGS, | |
| FT_N_REGION | |
| }; | |
| #define FT_MAX_DEPTH 50 | |
| struct ft_cxt { | |
| struct boot_param_header *bph; | |
| int max_size; /* maximum size of tree */ | |
| int isordered; /* everything in standard order */ | |
| void *(*realloc)(void *, unsigned long); | |
| char *str_anchor; | |
| char *p; /* current insertion point in structs */ | |
| struct ft_region rgn[FT_N_REGION]; | |
| void *genealogy[FT_MAX_DEPTH+1]; | |
| char **node_tbl; | |
| unsigned int node_max; | |
| unsigned int nodes_used; | |
| }; | |
| char *ft_begin_node(struct ft_cxt *cxt, const char *name); | |
| void ft_end_node(struct ft_cxt *cxt); | |
| void ft_begin_tree(struct ft_cxt *cxt); | |
| void ft_end_tree(struct ft_cxt *cxt); | |
| void ft_nop(struct ft_cxt *cxt); | |
| int ft_prop(struct ft_cxt *cxt, const char *name, | |
| const void *data, unsigned int sz); | |
| int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str); | |
| int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val); | |
| void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size, | |
| void *(*realloc_fn)(void *, unsigned long)); | |
| int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size, | |
| unsigned int max_find_device, | |
| void *(*realloc_fn)(void *, unsigned long)); | |
| int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size); | |
| void ft_dump_blob(const void *bphp); | |
| void ft_merge_blob(struct ft_cxt *cxt, void *blob); | |
| void *ft_find_device(struct ft_cxt *cxt, const void *top, | |
| const char *srch_path); | |
| void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path); | |
| int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname, | |
| void *buf, const unsigned int buflen); | |
| int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname, | |
| const void *buf, const unsigned int buflen); | |
| void *ft_get_parent(struct ft_cxt *cxt, const void *phandle); | |
| void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev, | |
| const char *propname, const char *propval, | |
| int proplen); | |
| void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name); | |
| char *ft_get_path(struct ft_cxt *cxt, const void *phandle, char *buf, int len); | |
| #endif /* FLATDEVTREE_H */ |