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