xref: /aosp_15_r20/external/dtc/dtc.c (revision cd60bc56d4bea3af4ec04523e4d71c2b272c8aff)
1*cd60bc56SAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*cd60bc56SAndroid Build Coastguard Worker /*
3*cd60bc56SAndroid Build Coastguard Worker  * (C) Copyright David Gibson <[email protected]>, IBM Corporation.  2005.
4*cd60bc56SAndroid Build Coastguard Worker  */
5*cd60bc56SAndroid Build Coastguard Worker 
6*cd60bc56SAndroid Build Coastguard Worker #include <sys/stat.h>
7*cd60bc56SAndroid Build Coastguard Worker 
8*cd60bc56SAndroid Build Coastguard Worker #include "dtc.h"
9*cd60bc56SAndroid Build Coastguard Worker #include "srcpos.h"
10*cd60bc56SAndroid Build Coastguard Worker 
11*cd60bc56SAndroid Build Coastguard Worker /*
12*cd60bc56SAndroid Build Coastguard Worker  * Command line options
13*cd60bc56SAndroid Build Coastguard Worker  */
14*cd60bc56SAndroid Build Coastguard Worker int quiet;		/* Level of quietness */
15*cd60bc56SAndroid Build Coastguard Worker unsigned int reservenum;/* Number of memory reservation slots */
16*cd60bc56SAndroid Build Coastguard Worker int minsize;		/* Minimum blob size */
17*cd60bc56SAndroid Build Coastguard Worker int padsize;		/* Additional padding to blob */
18*cd60bc56SAndroid Build Coastguard Worker int alignsize;		/* Additional padding to blob accroding to the alignsize */
19*cd60bc56SAndroid Build Coastguard Worker int phandle_format = PHANDLE_EPAPR;	/* Use linux,phandle or phandle properties */
20*cd60bc56SAndroid Build Coastguard Worker int generate_symbols;	/* enable symbols & fixup support */
21*cd60bc56SAndroid Build Coastguard Worker int generate_fixups;		/* suppress generation of fixups on symbol support */
22*cd60bc56SAndroid Build Coastguard Worker int auto_label_aliases;		/* auto generate labels -> aliases */
23*cd60bc56SAndroid Build Coastguard Worker int annotate;		/* Level of annotation: 1 for input source location
24*cd60bc56SAndroid Build Coastguard Worker 			   >1 for full input source location. */
25*cd60bc56SAndroid Build Coastguard Worker 
is_power_of_2(int x)26*cd60bc56SAndroid Build Coastguard Worker static int is_power_of_2(int x)
27*cd60bc56SAndroid Build Coastguard Worker {
28*cd60bc56SAndroid Build Coastguard Worker 	return (x > 0) && ((x & (x - 1)) == 0);
29*cd60bc56SAndroid Build Coastguard Worker }
30*cd60bc56SAndroid Build Coastguard Worker 
fill_fullpaths(struct node * tree,const char * prefix)31*cd60bc56SAndroid Build Coastguard Worker static void fill_fullpaths(struct node *tree, const char *prefix)
32*cd60bc56SAndroid Build Coastguard Worker {
33*cd60bc56SAndroid Build Coastguard Worker 	struct node *child;
34*cd60bc56SAndroid Build Coastguard Worker 	const char *unit;
35*cd60bc56SAndroid Build Coastguard Worker 
36*cd60bc56SAndroid Build Coastguard Worker 	tree->fullpath = join_path(prefix, tree->name);
37*cd60bc56SAndroid Build Coastguard Worker 
38*cd60bc56SAndroid Build Coastguard Worker 	unit = strchr(tree->name, '@');
39*cd60bc56SAndroid Build Coastguard Worker 	if (unit)
40*cd60bc56SAndroid Build Coastguard Worker 		tree->basenamelen = unit - tree->name;
41*cd60bc56SAndroid Build Coastguard Worker 	else
42*cd60bc56SAndroid Build Coastguard Worker 		tree->basenamelen = strlen(tree->name);
43*cd60bc56SAndroid Build Coastguard Worker 
44*cd60bc56SAndroid Build Coastguard Worker 	for_each_child(tree, child)
45*cd60bc56SAndroid Build Coastguard Worker 		fill_fullpaths(child, tree->fullpath);
46*cd60bc56SAndroid Build Coastguard Worker }
47*cd60bc56SAndroid Build Coastguard Worker 
48*cd60bc56SAndroid Build Coastguard Worker /* Usage related data. */
49*cd60bc56SAndroid Build Coastguard Worker static const char usage_synopsis[] = "dtc [options] <input file>";
50*cd60bc56SAndroid Build Coastguard Worker static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:@AThv";
51*cd60bc56SAndroid Build Coastguard Worker static struct option const usage_long_opts[] = {
52*cd60bc56SAndroid Build Coastguard Worker 	{"quiet",            no_argument, NULL, 'q'},
53*cd60bc56SAndroid Build Coastguard Worker 	{"in-format",         a_argument, NULL, 'I'},
54*cd60bc56SAndroid Build Coastguard Worker 	{"out",               a_argument, NULL, 'o'},
55*cd60bc56SAndroid Build Coastguard Worker 	{"out-format",        a_argument, NULL, 'O'},
56*cd60bc56SAndroid Build Coastguard Worker 	{"out-version",       a_argument, NULL, 'V'},
57*cd60bc56SAndroid Build Coastguard Worker 	{"out-dependency",    a_argument, NULL, 'd'},
58*cd60bc56SAndroid Build Coastguard Worker 	{"reserve",           a_argument, NULL, 'R'},
59*cd60bc56SAndroid Build Coastguard Worker 	{"space",             a_argument, NULL, 'S'},
60*cd60bc56SAndroid Build Coastguard Worker 	{"pad",               a_argument, NULL, 'p'},
61*cd60bc56SAndroid Build Coastguard Worker 	{"align",             a_argument, NULL, 'a'},
62*cd60bc56SAndroid Build Coastguard Worker 	{"boot-cpu",          a_argument, NULL, 'b'},
63*cd60bc56SAndroid Build Coastguard Worker 	{"force",            no_argument, NULL, 'f'},
64*cd60bc56SAndroid Build Coastguard Worker 	{"include",           a_argument, NULL, 'i'},
65*cd60bc56SAndroid Build Coastguard Worker 	{"sort",             no_argument, NULL, 's'},
66*cd60bc56SAndroid Build Coastguard Worker 	{"phandle",           a_argument, NULL, 'H'},
67*cd60bc56SAndroid Build Coastguard Worker 	{"warning",           a_argument, NULL, 'W'},
68*cd60bc56SAndroid Build Coastguard Worker 	{"error",             a_argument, NULL, 'E'},
69*cd60bc56SAndroid Build Coastguard Worker 	{"symbols",	     no_argument, NULL, '@'},
70*cd60bc56SAndroid Build Coastguard Worker 	{"auto-alias",       no_argument, NULL, 'A'},
71*cd60bc56SAndroid Build Coastguard Worker 	{"annotate",         no_argument, NULL, 'T'},
72*cd60bc56SAndroid Build Coastguard Worker 	{"help",             no_argument, NULL, 'h'},
73*cd60bc56SAndroid Build Coastguard Worker 	{"version",          no_argument, NULL, 'v'},
74*cd60bc56SAndroid Build Coastguard Worker 	{NULL,               no_argument, NULL, 0x0},
75*cd60bc56SAndroid Build Coastguard Worker };
76*cd60bc56SAndroid Build Coastguard Worker static const char * const usage_opts_help[] = {
77*cd60bc56SAndroid Build Coastguard Worker 	"\n\tQuiet: -q suppress warnings, -qq errors, -qqq all",
78*cd60bc56SAndroid Build Coastguard Worker 	"\n\tInput formats are:\n"
79*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tdts - device tree source text\n"
80*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tdtb - device tree blob\n"
81*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tfs  - /proc/device-tree style directory",
82*cd60bc56SAndroid Build Coastguard Worker 	"\n\tOutput file",
83*cd60bc56SAndroid Build Coastguard Worker 	"\n\tOutput formats are:\n"
84*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tdts - device tree source text\n"
85*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tdtb - device tree blob\n"
86*cd60bc56SAndroid Build Coastguard Worker #ifndef NO_YAML
87*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tyaml - device tree encoded as YAML\n"
88*cd60bc56SAndroid Build Coastguard Worker #endif
89*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tasm - assembler source",
90*cd60bc56SAndroid Build Coastguard Worker 	"\n\tBlob version to produce, defaults to "stringify(DEFAULT_FDT_VERSION)" (for dtb and asm output)",
91*cd60bc56SAndroid Build Coastguard Worker 	"\n\tOutput dependency file",
92*cd60bc56SAndroid Build Coastguard Worker 	"\n\tMake space for <number> reserve map entries (for dtb and asm output)",
93*cd60bc56SAndroid Build Coastguard Worker 	"\n\tMake the blob at least <bytes> long (extra space)",
94*cd60bc56SAndroid Build Coastguard Worker 	"\n\tAdd padding to the blob of <bytes> long (extra space)",
95*cd60bc56SAndroid Build Coastguard Worker 	"\n\tMake the blob align to the <bytes> (extra space)",
96*cd60bc56SAndroid Build Coastguard Worker 	"\n\tSet the physical boot cpu",
97*cd60bc56SAndroid Build Coastguard Worker 	"\n\tTry to produce output even if the input tree has errors",
98*cd60bc56SAndroid Build Coastguard Worker 	"\n\tAdd a path to search for include files",
99*cd60bc56SAndroid Build Coastguard Worker 	"\n\tSort nodes and properties before outputting (useful for comparing trees)",
100*cd60bc56SAndroid Build Coastguard Worker 	"\n\tValid phandle formats are:\n"
101*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tlegacy - \"linux,phandle\" properties only\n"
102*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tepapr  - \"phandle\" properties only\n"
103*cd60bc56SAndroid Build Coastguard Worker 	 "\t\tboth   - Both \"linux,phandle\" and \"phandle\" properties",
104*cd60bc56SAndroid Build Coastguard Worker 	"\n\tEnable/disable warnings (prefix with \"no-\")",
105*cd60bc56SAndroid Build Coastguard Worker 	"\n\tEnable/disable errors (prefix with \"no-\")",
106*cd60bc56SAndroid Build Coastguard Worker 	"\n\tEnable generation of symbols",
107*cd60bc56SAndroid Build Coastguard Worker 	"\n\tEnable auto-alias of labels",
108*cd60bc56SAndroid Build Coastguard Worker 	"\n\tAnnotate output .dts with input source file and line (-T -T for more details)",
109*cd60bc56SAndroid Build Coastguard Worker 	"\n\tPrint this help and exit",
110*cd60bc56SAndroid Build Coastguard Worker 	"\n\tPrint version and exit",
111*cd60bc56SAndroid Build Coastguard Worker 	NULL,
112*cd60bc56SAndroid Build Coastguard Worker };
113*cd60bc56SAndroid Build Coastguard Worker 
guess_type_by_name(const char * fname,const char * fallback)114*cd60bc56SAndroid Build Coastguard Worker static const char *guess_type_by_name(const char *fname, const char *fallback)
115*cd60bc56SAndroid Build Coastguard Worker {
116*cd60bc56SAndroid Build Coastguard Worker 	const char *s;
117*cd60bc56SAndroid Build Coastguard Worker 
118*cd60bc56SAndroid Build Coastguard Worker 	s = strrchr(fname, '.');
119*cd60bc56SAndroid Build Coastguard Worker 	if (s == NULL)
120*cd60bc56SAndroid Build Coastguard Worker 		return fallback;
121*cd60bc56SAndroid Build Coastguard Worker 	if (!strcasecmp(s, ".dts"))
122*cd60bc56SAndroid Build Coastguard Worker 		return "dts";
123*cd60bc56SAndroid Build Coastguard Worker 	if (!strcasecmp(s, ".yaml"))
124*cd60bc56SAndroid Build Coastguard Worker 		return "yaml";
125*cd60bc56SAndroid Build Coastguard Worker 	if (!strcasecmp(s, ".dtbo"))
126*cd60bc56SAndroid Build Coastguard Worker 		return "dtb";
127*cd60bc56SAndroid Build Coastguard Worker 	if (!strcasecmp(s, ".dtb"))
128*cd60bc56SAndroid Build Coastguard Worker 		return "dtb";
129*cd60bc56SAndroid Build Coastguard Worker 	return fallback;
130*cd60bc56SAndroid Build Coastguard Worker }
131*cd60bc56SAndroid Build Coastguard Worker 
guess_input_format(const char * fname,const char * fallback)132*cd60bc56SAndroid Build Coastguard Worker static const char *guess_input_format(const char *fname, const char *fallback)
133*cd60bc56SAndroid Build Coastguard Worker {
134*cd60bc56SAndroid Build Coastguard Worker 	struct stat statbuf;
135*cd60bc56SAndroid Build Coastguard Worker 	fdt32_t magic;
136*cd60bc56SAndroid Build Coastguard Worker 	FILE *f;
137*cd60bc56SAndroid Build Coastguard Worker 
138*cd60bc56SAndroid Build Coastguard Worker 	if (stat(fname, &statbuf) != 0)
139*cd60bc56SAndroid Build Coastguard Worker 		return fallback;
140*cd60bc56SAndroid Build Coastguard Worker 
141*cd60bc56SAndroid Build Coastguard Worker 	if (S_ISDIR(statbuf.st_mode))
142*cd60bc56SAndroid Build Coastguard Worker 		return "fs";
143*cd60bc56SAndroid Build Coastguard Worker 
144*cd60bc56SAndroid Build Coastguard Worker 	if (!S_ISREG(statbuf.st_mode))
145*cd60bc56SAndroid Build Coastguard Worker 		return fallback;
146*cd60bc56SAndroid Build Coastguard Worker 
147*cd60bc56SAndroid Build Coastguard Worker 	f = fopen(fname, "r");
148*cd60bc56SAndroid Build Coastguard Worker 	if (f == NULL)
149*cd60bc56SAndroid Build Coastguard Worker 		return fallback;
150*cd60bc56SAndroid Build Coastguard Worker 	if (fread(&magic, 4, 1, f) != 1) {
151*cd60bc56SAndroid Build Coastguard Worker 		fclose(f);
152*cd60bc56SAndroid Build Coastguard Worker 		return fallback;
153*cd60bc56SAndroid Build Coastguard Worker 	}
154*cd60bc56SAndroid Build Coastguard Worker 	fclose(f);
155*cd60bc56SAndroid Build Coastguard Worker 
156*cd60bc56SAndroid Build Coastguard Worker 	if (fdt32_to_cpu(magic) == FDT_MAGIC)
157*cd60bc56SAndroid Build Coastguard Worker 		return "dtb";
158*cd60bc56SAndroid Build Coastguard Worker 
159*cd60bc56SAndroid Build Coastguard Worker 	return guess_type_by_name(fname, fallback);
160*cd60bc56SAndroid Build Coastguard Worker }
161*cd60bc56SAndroid Build Coastguard Worker 
main(int argc,char * argv[])162*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
163*cd60bc56SAndroid Build Coastguard Worker {
164*cd60bc56SAndroid Build Coastguard Worker 	struct dt_info *dti;
165*cd60bc56SAndroid Build Coastguard Worker 	const char *inform = NULL;
166*cd60bc56SAndroid Build Coastguard Worker 	const char *outform = NULL;
167*cd60bc56SAndroid Build Coastguard Worker 	const char *outname = "-";
168*cd60bc56SAndroid Build Coastguard Worker 	const char *depname = NULL;
169*cd60bc56SAndroid Build Coastguard Worker 	bool force = false, sort = false;
170*cd60bc56SAndroid Build Coastguard Worker 	const char *arg;
171*cd60bc56SAndroid Build Coastguard Worker 	int opt;
172*cd60bc56SAndroid Build Coastguard Worker 	FILE *outf = NULL;
173*cd60bc56SAndroid Build Coastguard Worker 	int outversion = DEFAULT_FDT_VERSION;
174*cd60bc56SAndroid Build Coastguard Worker 	long long cmdline_boot_cpuid = -1;
175*cd60bc56SAndroid Build Coastguard Worker 
176*cd60bc56SAndroid Build Coastguard Worker 	quiet      = 0;
177*cd60bc56SAndroid Build Coastguard Worker 	reservenum = 0;
178*cd60bc56SAndroid Build Coastguard Worker 	minsize    = 0;
179*cd60bc56SAndroid Build Coastguard Worker 	padsize    = 0;
180*cd60bc56SAndroid Build Coastguard Worker 	alignsize  = 0;
181*cd60bc56SAndroid Build Coastguard Worker 
182*cd60bc56SAndroid Build Coastguard Worker 	while ((opt = util_getopt_long()) != EOF) {
183*cd60bc56SAndroid Build Coastguard Worker 		switch (opt) {
184*cd60bc56SAndroid Build Coastguard Worker 		case 'I':
185*cd60bc56SAndroid Build Coastguard Worker 			inform = optarg;
186*cd60bc56SAndroid Build Coastguard Worker 			break;
187*cd60bc56SAndroid Build Coastguard Worker 		case 'O':
188*cd60bc56SAndroid Build Coastguard Worker 			outform = optarg;
189*cd60bc56SAndroid Build Coastguard Worker 			break;
190*cd60bc56SAndroid Build Coastguard Worker 		case 'o':
191*cd60bc56SAndroid Build Coastguard Worker 			outname = optarg;
192*cd60bc56SAndroid Build Coastguard Worker 			break;
193*cd60bc56SAndroid Build Coastguard Worker 		case 'V':
194*cd60bc56SAndroid Build Coastguard Worker 			outversion = strtol(optarg, NULL, 0);
195*cd60bc56SAndroid Build Coastguard Worker 			break;
196*cd60bc56SAndroid Build Coastguard Worker 		case 'd':
197*cd60bc56SAndroid Build Coastguard Worker 			depname = optarg;
198*cd60bc56SAndroid Build Coastguard Worker 			break;
199*cd60bc56SAndroid Build Coastguard Worker 		case 'R':
200*cd60bc56SAndroid Build Coastguard Worker 			reservenum = strtoul(optarg, NULL, 0);
201*cd60bc56SAndroid Build Coastguard Worker 			break;
202*cd60bc56SAndroid Build Coastguard Worker 		case 'S':
203*cd60bc56SAndroid Build Coastguard Worker 			minsize = strtol(optarg, NULL, 0);
204*cd60bc56SAndroid Build Coastguard Worker 			break;
205*cd60bc56SAndroid Build Coastguard Worker 		case 'p':
206*cd60bc56SAndroid Build Coastguard Worker 			padsize = strtol(optarg, NULL, 0);
207*cd60bc56SAndroid Build Coastguard Worker 			break;
208*cd60bc56SAndroid Build Coastguard Worker 		case 'a':
209*cd60bc56SAndroid Build Coastguard Worker 			alignsize = strtol(optarg, NULL, 0);
210*cd60bc56SAndroid Build Coastguard Worker 			if (!is_power_of_2(alignsize))
211*cd60bc56SAndroid Build Coastguard Worker 				die("Invalid argument \"%d\" to -a option\n",
212*cd60bc56SAndroid Build Coastguard Worker 				    alignsize);
213*cd60bc56SAndroid Build Coastguard Worker 			break;
214*cd60bc56SAndroid Build Coastguard Worker 		case 'f':
215*cd60bc56SAndroid Build Coastguard Worker 			force = true;
216*cd60bc56SAndroid Build Coastguard Worker 			break;
217*cd60bc56SAndroid Build Coastguard Worker 		case 'q':
218*cd60bc56SAndroid Build Coastguard Worker 			quiet++;
219*cd60bc56SAndroid Build Coastguard Worker 			break;
220*cd60bc56SAndroid Build Coastguard Worker 		case 'b':
221*cd60bc56SAndroid Build Coastguard Worker 			cmdline_boot_cpuid = strtoll(optarg, NULL, 0);
222*cd60bc56SAndroid Build Coastguard Worker 			break;
223*cd60bc56SAndroid Build Coastguard Worker 		case 'i':
224*cd60bc56SAndroid Build Coastguard Worker 			srcfile_add_search_path(optarg);
225*cd60bc56SAndroid Build Coastguard Worker 			break;
226*cd60bc56SAndroid Build Coastguard Worker 		case 'v':
227*cd60bc56SAndroid Build Coastguard Worker 			util_version();
228*cd60bc56SAndroid Build Coastguard Worker 		case 'H':
229*cd60bc56SAndroid Build Coastguard Worker 			if (streq(optarg, "legacy"))
230*cd60bc56SAndroid Build Coastguard Worker 				phandle_format = PHANDLE_LEGACY;
231*cd60bc56SAndroid Build Coastguard Worker 			else if (streq(optarg, "epapr"))
232*cd60bc56SAndroid Build Coastguard Worker 				phandle_format = PHANDLE_EPAPR;
233*cd60bc56SAndroid Build Coastguard Worker 			else if (streq(optarg, "both"))
234*cd60bc56SAndroid Build Coastguard Worker 				phandle_format = PHANDLE_BOTH;
235*cd60bc56SAndroid Build Coastguard Worker 			else
236*cd60bc56SAndroid Build Coastguard Worker 				die("Invalid argument \"%s\" to -H option\n",
237*cd60bc56SAndroid Build Coastguard Worker 				    optarg);
238*cd60bc56SAndroid Build Coastguard Worker 			break;
239*cd60bc56SAndroid Build Coastguard Worker 
240*cd60bc56SAndroid Build Coastguard Worker 		case 's':
241*cd60bc56SAndroid Build Coastguard Worker 			sort = true;
242*cd60bc56SAndroid Build Coastguard Worker 			break;
243*cd60bc56SAndroid Build Coastguard Worker 
244*cd60bc56SAndroid Build Coastguard Worker 		case 'W':
245*cd60bc56SAndroid Build Coastguard Worker 			parse_checks_option(true, false, optarg);
246*cd60bc56SAndroid Build Coastguard Worker 			break;
247*cd60bc56SAndroid Build Coastguard Worker 
248*cd60bc56SAndroid Build Coastguard Worker 		case 'E':
249*cd60bc56SAndroid Build Coastguard Worker 			parse_checks_option(false, true, optarg);
250*cd60bc56SAndroid Build Coastguard Worker 			break;
251*cd60bc56SAndroid Build Coastguard Worker 
252*cd60bc56SAndroid Build Coastguard Worker 		case '@':
253*cd60bc56SAndroid Build Coastguard Worker 			generate_symbols = 1;
254*cd60bc56SAndroid Build Coastguard Worker 			break;
255*cd60bc56SAndroid Build Coastguard Worker 		case 'A':
256*cd60bc56SAndroid Build Coastguard Worker 			auto_label_aliases = 1;
257*cd60bc56SAndroid Build Coastguard Worker 			break;
258*cd60bc56SAndroid Build Coastguard Worker 		case 'T':
259*cd60bc56SAndroid Build Coastguard Worker 			annotate++;
260*cd60bc56SAndroid Build Coastguard Worker 			break;
261*cd60bc56SAndroid Build Coastguard Worker 
262*cd60bc56SAndroid Build Coastguard Worker 		case 'h':
263*cd60bc56SAndroid Build Coastguard Worker 			usage(NULL);
264*cd60bc56SAndroid Build Coastguard Worker 		default:
265*cd60bc56SAndroid Build Coastguard Worker 			usage("unknown option");
266*cd60bc56SAndroid Build Coastguard Worker 		}
267*cd60bc56SAndroid Build Coastguard Worker 	}
268*cd60bc56SAndroid Build Coastguard Worker 
269*cd60bc56SAndroid Build Coastguard Worker 	if (argc > (optind+1))
270*cd60bc56SAndroid Build Coastguard Worker 		usage("missing files");
271*cd60bc56SAndroid Build Coastguard Worker 	else if (argc < (optind+1))
272*cd60bc56SAndroid Build Coastguard Worker 		arg = "-";
273*cd60bc56SAndroid Build Coastguard Worker 	else
274*cd60bc56SAndroid Build Coastguard Worker 		arg = argv[optind];
275*cd60bc56SAndroid Build Coastguard Worker 
276*cd60bc56SAndroid Build Coastguard Worker 	/* minsize and padsize are mutually exclusive */
277*cd60bc56SAndroid Build Coastguard Worker 	if (minsize && padsize)
278*cd60bc56SAndroid Build Coastguard Worker 		die("Can't set both -p and -S\n");
279*cd60bc56SAndroid Build Coastguard Worker 
280*cd60bc56SAndroid Build Coastguard Worker 	if (depname) {
281*cd60bc56SAndroid Build Coastguard Worker 		depfile = fopen(depname, "w");
282*cd60bc56SAndroid Build Coastguard Worker 		if (!depfile)
283*cd60bc56SAndroid Build Coastguard Worker 			die("Couldn't open dependency file %s: %s\n", depname,
284*cd60bc56SAndroid Build Coastguard Worker 			    strerror(errno));
285*cd60bc56SAndroid Build Coastguard Worker 		fprintf(depfile, "%s:", outname);
286*cd60bc56SAndroid Build Coastguard Worker 	}
287*cd60bc56SAndroid Build Coastguard Worker 
288*cd60bc56SAndroid Build Coastguard Worker 	if (inform == NULL)
289*cd60bc56SAndroid Build Coastguard Worker 		inform = guess_input_format(arg, "dts");
290*cd60bc56SAndroid Build Coastguard Worker 	if (outform == NULL) {
291*cd60bc56SAndroid Build Coastguard Worker 		outform = guess_type_by_name(outname, NULL);
292*cd60bc56SAndroid Build Coastguard Worker 		if (outform == NULL) {
293*cd60bc56SAndroid Build Coastguard Worker 			if (streq(inform, "dts"))
294*cd60bc56SAndroid Build Coastguard Worker 				outform = "dtb";
295*cd60bc56SAndroid Build Coastguard Worker 			else
296*cd60bc56SAndroid Build Coastguard Worker 				outform = "dts";
297*cd60bc56SAndroid Build Coastguard Worker 		}
298*cd60bc56SAndroid Build Coastguard Worker 	}
299*cd60bc56SAndroid Build Coastguard Worker 	if (annotate && (!streq(inform, "dts") || !streq(outform, "dts")))
300*cd60bc56SAndroid Build Coastguard Worker 		die("--annotate requires -I dts -O dts\n");
301*cd60bc56SAndroid Build Coastguard Worker 	if (streq(inform, "dts"))
302*cd60bc56SAndroid Build Coastguard Worker 		dti = dt_from_source(arg);
303*cd60bc56SAndroid Build Coastguard Worker 	else if (streq(inform, "fs"))
304*cd60bc56SAndroid Build Coastguard Worker 		dti = dt_from_fs(arg);
305*cd60bc56SAndroid Build Coastguard Worker 	else if(streq(inform, "dtb"))
306*cd60bc56SAndroid Build Coastguard Worker 		dti = dt_from_blob(arg);
307*cd60bc56SAndroid Build Coastguard Worker 	else
308*cd60bc56SAndroid Build Coastguard Worker 		die("Unknown input format \"%s\"\n", inform);
309*cd60bc56SAndroid Build Coastguard Worker 
310*cd60bc56SAndroid Build Coastguard Worker 	dti->outname = outname;
311*cd60bc56SAndroid Build Coastguard Worker 
312*cd60bc56SAndroid Build Coastguard Worker 	if (depfile) {
313*cd60bc56SAndroid Build Coastguard Worker 		fputc('\n', depfile);
314*cd60bc56SAndroid Build Coastguard Worker 		fclose(depfile);
315*cd60bc56SAndroid Build Coastguard Worker 	}
316*cd60bc56SAndroid Build Coastguard Worker 
317*cd60bc56SAndroid Build Coastguard Worker 	if (cmdline_boot_cpuid != -1)
318*cd60bc56SAndroid Build Coastguard Worker 		dti->boot_cpuid_phys = cmdline_boot_cpuid;
319*cd60bc56SAndroid Build Coastguard Worker 
320*cd60bc56SAndroid Build Coastguard Worker 	fill_fullpaths(dti->dt, "");
321*cd60bc56SAndroid Build Coastguard Worker 
322*cd60bc56SAndroid Build Coastguard Worker 	/* on a plugin, generate by default */
323*cd60bc56SAndroid Build Coastguard Worker 	if (dti->dtsflags & DTSF_PLUGIN) {
324*cd60bc56SAndroid Build Coastguard Worker 		generate_fixups = 1;
325*cd60bc56SAndroid Build Coastguard Worker 	}
326*cd60bc56SAndroid Build Coastguard Worker 
327*cd60bc56SAndroid Build Coastguard Worker 	process_checks(force, dti);
328*cd60bc56SAndroid Build Coastguard Worker 
329*cd60bc56SAndroid Build Coastguard Worker 	if (auto_label_aliases)
330*cd60bc56SAndroid Build Coastguard Worker 		generate_label_tree(dti, "aliases", false);
331*cd60bc56SAndroid Build Coastguard Worker 
332*cd60bc56SAndroid Build Coastguard Worker 	if (generate_symbols)
333*cd60bc56SAndroid Build Coastguard Worker 		generate_label_tree(dti, "__symbols__", true);
334*cd60bc56SAndroid Build Coastguard Worker 
335*cd60bc56SAndroid Build Coastguard Worker 	if (generate_fixups) {
336*cd60bc56SAndroid Build Coastguard Worker 		generate_fixups_tree(dti, "__fixups__");
337*cd60bc56SAndroid Build Coastguard Worker 		generate_local_fixups_tree(dti, "__local_fixups__");
338*cd60bc56SAndroid Build Coastguard Worker 	}
339*cd60bc56SAndroid Build Coastguard Worker 
340*cd60bc56SAndroid Build Coastguard Worker 	if (sort)
341*cd60bc56SAndroid Build Coastguard Worker 		sort_tree(dti);
342*cd60bc56SAndroid Build Coastguard Worker 
343*cd60bc56SAndroid Build Coastguard Worker 	if (streq(outname, "-")) {
344*cd60bc56SAndroid Build Coastguard Worker 		outf = stdout;
345*cd60bc56SAndroid Build Coastguard Worker 	} else {
346*cd60bc56SAndroid Build Coastguard Worker 		outf = fopen(outname, "wb");
347*cd60bc56SAndroid Build Coastguard Worker 		if (! outf)
348*cd60bc56SAndroid Build Coastguard Worker 			die("Couldn't open output file %s: %s\n",
349*cd60bc56SAndroid Build Coastguard Worker 			    outname, strerror(errno));
350*cd60bc56SAndroid Build Coastguard Worker 	}
351*cd60bc56SAndroid Build Coastguard Worker 
352*cd60bc56SAndroid Build Coastguard Worker 	if (streq(outform, "dts")) {
353*cd60bc56SAndroid Build Coastguard Worker 		dt_to_source(outf, dti);
354*cd60bc56SAndroid Build Coastguard Worker #ifndef NO_YAML
355*cd60bc56SAndroid Build Coastguard Worker 	} else if (streq(outform, "yaml")) {
356*cd60bc56SAndroid Build Coastguard Worker 		if (!streq(inform, "dts"))
357*cd60bc56SAndroid Build Coastguard Worker 			die("YAML output format requires dts input format\n");
358*cd60bc56SAndroid Build Coastguard Worker 		dt_to_yaml(outf, dti);
359*cd60bc56SAndroid Build Coastguard Worker #endif
360*cd60bc56SAndroid Build Coastguard Worker 	} else if (streq(outform, "dtb")) {
361*cd60bc56SAndroid Build Coastguard Worker 		dt_to_blob(outf, dti, outversion);
362*cd60bc56SAndroid Build Coastguard Worker 	} else if (streq(outform, "asm")) {
363*cd60bc56SAndroid Build Coastguard Worker 		dt_to_asm(outf, dti, outversion);
364*cd60bc56SAndroid Build Coastguard Worker 	} else if (streq(outform, "null")) {
365*cd60bc56SAndroid Build Coastguard Worker 		/* do nothing */
366*cd60bc56SAndroid Build Coastguard Worker 	} else {
367*cd60bc56SAndroid Build Coastguard Worker 		die("Unknown output format \"%s\"\n", outform);
368*cd60bc56SAndroid Build Coastguard Worker 	}
369*cd60bc56SAndroid Build Coastguard Worker 
370*cd60bc56SAndroid Build Coastguard Worker 	exit(0);
371*cd60bc56SAndroid Build Coastguard Worker }
372