Blame view

scripts/dtc/dtc.c 5.82 KB
a4da2e3ec   David Gibson   [POWERPC] Merge d...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  /*
   * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
   *
   *
   * 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, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
   *                                                                   USA
   */
  
  #include "dtc.h"
  #include "srcpos.h"
  
  #include "version_gen.h"
  
  /*
   * Command line options
   */
  int quiet;		/* Level of quietness */
  int reservenum;		/* Number of memory reservation slots */
  int minsize;		/* Minimum blob size */
  int padsize;		/* Additional padding to blob */
  
  char *join_path(const char *path, const char *name)
  {
  	int lenp = strlen(path);
  	int lenn = strlen(name);
  	int len;
  	int needslash = 1;
  	char *str;
  
  	len = lenp + lenn + 2;
  	if ((lenp > 0) && (path[lenp-1] == '/')) {
  		needslash = 0;
  		len--;
  	}
  
  	str = xmalloc(len);
  	memcpy(str, path, lenp);
  	if (needslash) {
  		str[lenp] = '/';
  		lenp++;
  	}
  	memcpy(str+lenp, name, lenn+1);
  	return str;
  }
ed95d7450   David Gibson   powerpc: Update i...
57
  static void fill_fullpaths(struct node *tree, const char *prefix)
a4da2e3ec   David Gibson   [POWERPC] Merge d...
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  {
  	struct node *child;
  	const char *unit;
  
  	tree->fullpath = join_path(prefix, tree->name);
  
  	unit = strchr(tree->name, '@');
  	if (unit)
  		tree->basenamelen = unit - tree->name;
  	else
  		tree->basenamelen = strlen(tree->name);
  
  	for_each_child(tree, child)
  		fill_fullpaths(child, tree->fullpath);
  }
  
  static void  __attribute__ ((noreturn)) usage(void)
  {
  	fprintf(stderr, "Usage:
  ");
  	fprintf(stderr, "\tdtc [options] <input file>
  ");
  	fprintf(stderr, "
  Options:
  ");
  	fprintf(stderr, "\t-h
  ");
  	fprintf(stderr, "\t\tThis help text
  ");
  	fprintf(stderr, "\t-q
  ");
  	fprintf(stderr, "\t\tQuiet: -q suppress warnings, -qq errors, -qqq all
  ");
  	fprintf(stderr, "\t-I <input format>
  ");
  	fprintf(stderr, "\t\tInput formats are:
  ");
  	fprintf(stderr, "\t\t\tdts - device tree source text
  ");
  	fprintf(stderr, "\t\t\tdtb - device tree blob
  ");
  	fprintf(stderr, "\t\t\tfs - /proc/device-tree style directory
  ");
  	fprintf(stderr, "\t-o <output file>
  ");
  	fprintf(stderr, "\t-O <output format>
  ");
  	fprintf(stderr, "\t\tOutput formats are:
  ");
  	fprintf(stderr, "\t\t\tdts - device tree source text
  ");
  	fprintf(stderr, "\t\t\tdtb - device tree blob
  ");
  	fprintf(stderr, "\t\t\tasm - assembler source
  ");
  	fprintf(stderr, "\t-V <output version>
  ");
  	fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb
  \t\tand asm output only)
  ", DEFAULT_FDT_VERSION);
  	fprintf(stderr, "\t-R <number>
  ");
  	fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for 
  \t\tdtb and asm output only)
  ");
  	fprintf(stderr, "\t-S <bytes>
  ");
  	fprintf(stderr, "\t\tMake the blob at least <bytes> long (extra space)
  ");
  	fprintf(stderr, "\t-p <bytes>
  ");
  	fprintf(stderr, "\t\tAdd padding to the blob of <bytes> long (extra space)
  ");
  	fprintf(stderr, "\t-b <number>
  ");
  	fprintf(stderr, "\t\tSet the physical boot cpu
  ");
  	fprintf(stderr, "\t-f
  ");
  	fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors
  ");
  	fprintf(stderr, "\t-v
  ");
  	fprintf(stderr, "\t\tPrint DTC version and exit
  ");
ed95d7450   David Gibson   powerpc: Update i...
143
  	exit(3);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
144
145
146
147
148
149
150
151
152
153
154
  }
  
  int main(int argc, char *argv[])
  {
  	struct boot_info *bi;
  	const char *inform = "dts";
  	const char *outform = "dts";
  	const char *outname = "-";
  	int force = 0, check = 0;
  	const char *arg;
  	int opt;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
155
156
  	FILE *outf = NULL;
  	int outversion = DEFAULT_FDT_VERSION;
ed95d7450   David Gibson   powerpc: Update i...
157
  	long long cmdline_boot_cpuid = -1;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  
  	quiet      = 0;
  	reservenum = 0;
  	minsize    = 0;
  	padsize    = 0;
  
  	while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:v")) != EOF) {
  		switch (opt) {
  		case 'I':
  			inform = optarg;
  			break;
  		case 'O':
  			outform = optarg;
  			break;
  		case 'o':
  			outname = optarg;
  			break;
  		case 'V':
  			outversion = strtol(optarg, NULL, 0);
  			break;
  		case 'R':
  			reservenum = strtol(optarg, NULL, 0);
  			break;
  		case 'S':
  			minsize = strtol(optarg, NULL, 0);
  			break;
  		case 'p':
  			padsize = strtol(optarg, NULL, 0);
  			break;
  		case 'f':
  			force = 1;
  			break;
  		case 'c':
  			check = 1;
  			break;
  		case 'q':
  			quiet++;
  			break;
  		case 'b':
ed95d7450   David Gibson   powerpc: Update i...
197
  			cmdline_boot_cpuid = strtoll(optarg, NULL, 0);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
198
199
  			break;
  		case 'v':
ed95d7450   David Gibson   powerpc: Update i...
200
201
202
  			printf("Version: %s
  ", DTC_VERSION);
  			exit(0);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
203
204
205
206
207
208
209
210
211
212
213
214
215
216
  		case 'h':
  		default:
  			usage();
  		}
  	}
  
  	if (argc > (optind+1))
  		usage();
  	else if (argc < (optind+1))
  		arg = "-";
  	else
  		arg = argv[optind];
  
  	/* minsize and padsize are mutually exclusive */
ed95d7450   David Gibson   powerpc: Update i...
217
  	if (minsize && padsize)
a4da2e3ec   David Gibson   [POWERPC] Merge d...
218
219
  		die("Can't set both -p and -S
  ");
a4da2e3ec   David Gibson   [POWERPC] Merge d...
220
221
222
223
  
  	fprintf(stderr, "DTC: %s->%s  on file \"%s\"
  ",
  		inform, outform, arg);
ed95d7450   David Gibson   powerpc: Update i...
224
  	if (streq(inform, "dts"))
a4da2e3ec   David Gibson   [POWERPC] Merge d...
225
  		bi = dt_from_source(arg);
ed95d7450   David Gibson   powerpc: Update i...
226
  	else if (streq(inform, "fs"))
a4da2e3ec   David Gibson   [POWERPC] Merge d...
227
  		bi = dt_from_fs(arg);
ed95d7450   David Gibson   powerpc: Update i...
228
229
230
  	else if(streq(inform, "dtb"))
  		bi = dt_from_blob(arg);
  	else
a4da2e3ec   David Gibson   [POWERPC] Merge d...
231
232
  		die("Unknown input format \"%s\"
  ", inform);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
233

ed95d7450   David Gibson   powerpc: Update i...
234
235
  	if (cmdline_boot_cpuid != -1)
  		bi->boot_cpuid_phys = cmdline_boot_cpuid;
a4da2e3ec   David Gibson   [POWERPC] Merge d...
236

ed95d7450   David Gibson   powerpc: Update i...
237
238
  	fill_fullpaths(bi->dt, "");
  	process_checks(force, bi);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
239

a4da2e3ec   David Gibson   [POWERPC] Merge d...
240
241
242
243
244
245
246
247
248
249
250
251
252
253
  
  	if (streq(outname, "-")) {
  		outf = stdout;
  	} else {
  		outf = fopen(outname, "w");
  		if (! outf)
  			die("Couldn't open output file %s: %s
  ",
  			    outname, strerror(errno));
  	}
  
  	if (streq(outform, "dts")) {
  		dt_to_source(outf, bi);
  	} else if (streq(outform, "dtb")) {
ed95d7450   David Gibson   powerpc: Update i...
254
  		dt_to_blob(outf, bi, outversion);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
255
  	} else if (streq(outform, "asm")) {
ed95d7450   David Gibson   powerpc: Update i...
256
  		dt_to_asm(outf, bi, outversion);
a4da2e3ec   David Gibson   [POWERPC] Merge d...
257
258
259
260
261
262
263
264
265
  	} else if (streq(outform, "null")) {
  		/* do nothing */
  	} else {
  		die("Unknown output format \"%s\"
  ", outform);
  	}
  
  	exit(0);
  }