aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/dtc/dtc.h
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2009-04-30 01:25:53 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-05-02 19:52:26 -0400
commit9fffb55f66127b52c937ede5196ebfa0c0d50bce (patch)
tree11664fb82734ba8dcde9556b8d47e780451a740a /scripts/dtc/dtc.h
parentafc1e702e8e8355faa712d4e90d9afe26a4995a5 (diff)
Move dtc and libfdt sources from arch/powerpc/boot to scripts/dtc
The powerpc kernel always requires an Open Firmware like device tree to supply device information. On systems without OF, this comes from a flattened device tree blob. This blob is usually generated by dtc, a tool which compiles a text description of the device tree into the flattened format used by the kernel. Sometimes, the bootwrapper makes small changes to the pre-compiled device tree blob (e.g. filling in the size of RAM). To do this it uses the libfdt library. Because these are only used on powerpc, the code for both these tools is included under arch/powerpc/boot (these were imported and are periodically updated from the upstream dtc tree). However, the microblaze architecture, currently being prepared for merging to mainline also uses dtc to produce device tree blobs. A few other archs have also mentioned some interest in using dtc. Therefore, this patch moves dtc and libfdt from arch/powerpc into scripts, where it can be used by any architecture. The vast bulk of this patch is a literal move, the rest is adjusting the various Makefiles to use dtc and libfdt correctly from their new locations. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/dtc/dtc.h')
-rw-r--r--scripts/dtc/dtc.h246
1 files changed, 246 insertions, 0 deletions
diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h
new file mode 100644
index 000000000000..08d54c870086
--- /dev/null
+++ b/scripts/dtc/dtc.h
@@ -0,0 +1,246 @@
1#ifndef _DTC_H
2#define _DTC_H
3
4/*
5 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
6 *
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21 * USA
22 */
23
24#include <stdio.h>
25#include <string.h>
26#include <stdlib.h>
27#include <stdint.h>
28#include <stdarg.h>
29#include <assert.h>
30#include <ctype.h>
31#include <errno.h>
32#include <unistd.h>
33
34#include <libfdt_env.h>
35#include <fdt.h>
36
37#define DEFAULT_FDT_VERSION 17
38/*
39 * Command line options
40 */
41extern int quiet; /* Level of quietness */
42extern int reservenum; /* Number of memory reservation slots */
43extern int minsize; /* Minimum blob size */
44extern int padsize; /* Additional padding to blob */
45
46static inline void __attribute__((noreturn)) die(char * str, ...)
47{
48 va_list ap;
49
50 va_start(ap, str);
51 fprintf(stderr, "FATAL ERROR: ");
52 vfprintf(stderr, str, ap);
53 exit(1);
54}
55
56static inline void *xmalloc(size_t len)
57{
58 void *new = malloc(len);
59
60 if (! new)
61 die("malloc() failed\n");
62
63 return new;
64}
65
66static inline void *xrealloc(void *p, size_t len)
67{
68 void *new = realloc(p, len);
69
70 if (! new)
71 die("realloc() failed (len=%d)\n", len);
72
73 return new;
74}
75
76typedef uint32_t cell_t;
77
78
79#define streq(a, b) (strcmp((a), (b)) == 0)
80#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
81
82#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
83#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
84
85/* Data blobs */
86enum markertype {
87 REF_PHANDLE,
88 REF_PATH,
89 LABEL,
90};
91
92struct marker {
93 enum markertype type;
94 int offset;
95 char *ref;
96 struct marker *next;
97};
98
99struct data {
100 int len;
101 char *val;
102 struct marker *markers;
103};
104
105
106#define empty_data ((struct data){ /* all .members = 0 or NULL */ })
107
108#define for_each_marker(m) \
109 for (; (m); (m) = (m)->next)
110#define for_each_marker_of_type(m, t) \
111 for_each_marker(m) \
112 if ((m)->type == (t))
113
114void data_free(struct data d);
115
116struct data data_grow_for(struct data d, int xlen);
117
118struct data data_copy_mem(const char *mem, int len);
119struct data data_copy_escape_string(const char *s, int len);
120struct data data_copy_file(FILE *f, size_t len);
121
122struct data data_append_data(struct data d, const void *p, int len);
123struct data data_insert_at_marker(struct data d, struct marker *m,
124 const void *p, int len);
125struct data data_merge(struct data d1, struct data d2);
126struct data data_append_cell(struct data d, cell_t word);
127struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
128struct data data_append_addr(struct data d, uint64_t addr);
129struct data data_append_byte(struct data d, uint8_t byte);
130struct data data_append_zeroes(struct data d, int len);
131struct data data_append_align(struct data d, int align);
132
133struct data data_add_marker(struct data d, enum markertype type, char *ref);
134
135int data_is_one_string(struct data d);
136
137/* DT constraints */
138
139#define MAX_PROPNAME_LEN 31
140#define MAX_NODENAME_LEN 31
141
142/* Live trees */
143struct property {
144 char *name;
145 struct data val;
146
147 struct property *next;
148
149 char *label;
150};
151
152struct node {
153 char *name;
154 struct property *proplist;
155 struct node *children;
156
157 struct node *parent;
158 struct node *next_sibling;
159
160 char *fullpath;
161 int basenamelen;
162
163 cell_t phandle;
164 int addr_cells, size_cells;
165
166 char *label;
167};
168
169#define for_each_property(n, p) \
170 for ((p) = (n)->proplist; (p); (p) = (p)->next)
171
172#define for_each_child(n, c) \
173 for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
174
175struct property *build_property(char *name, struct data val, char *label);
176struct property *chain_property(struct property *first, struct property *list);
177struct property *reverse_properties(struct property *first);
178
179struct node *build_node(struct property *proplist, struct node *children);
180struct node *name_node(struct node *node, char *name, char *label);
181struct node *chain_node(struct node *first, struct node *list);
182
183void add_property(struct node *node, struct property *prop);
184void add_child(struct node *parent, struct node *child);
185
186const char *get_unitname(struct node *node);
187struct property *get_property(struct node *node, const char *propname);
188cell_t propval_cell(struct property *prop);
189struct node *get_subnode(struct node *node, const char *nodename);
190struct node *get_node_by_path(struct node *tree, const char *path);
191struct node *get_node_by_label(struct node *tree, const char *label);
192struct node *get_node_by_phandle(struct node *tree, cell_t phandle);
193struct node *get_node_by_ref(struct node *tree, const char *ref);
194cell_t get_node_phandle(struct node *root, struct node *node);
195
196/* Boot info (tree plus memreserve information */
197
198struct reserve_info {
199 struct fdt_reserve_entry re;
200
201 struct reserve_info *next;
202
203 char *label;
204};
205
206struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len, char *label);
207struct reserve_info *chain_reserve_entry(struct reserve_info *first,
208 struct reserve_info *list);
209struct reserve_info *add_reserve_entry(struct reserve_info *list,
210 struct reserve_info *new);
211
212
213struct boot_info {
214 struct reserve_info *reservelist;
215 struct node *dt; /* the device tree */
216 uint32_t boot_cpuid_phys;
217};
218
219struct boot_info *build_boot_info(struct reserve_info *reservelist,
220 struct node *tree, uint32_t boot_cpuid_phys);
221
222/* Checks */
223
224void process_checks(int force, struct boot_info *bi);
225
226/* Flattened trees */
227
228void dt_to_blob(FILE *f, struct boot_info *bi, int version);
229void dt_to_asm(FILE *f, struct boot_info *bi, int version);
230
231struct boot_info *dt_from_blob(const char *fname);
232
233/* Tree source */
234
235void dt_to_source(FILE *f, struct boot_info *bi);
236struct boot_info *dt_from_source(const char *f);
237
238/* FS trees */
239
240struct boot_info *dt_from_fs(const char *dirname);
241
242/* misc */
243
244char *join_path(const char *path, const char *name);
245
246#endif /* _DTC_H */