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