xref: /aosp_15_r20/system/libufdt/utils/src/mkdtimg_dump.c (revision 13e8728f0cffde9369df671f7b293a048a99c7ed)
1*13e8728fSAndroid Build Coastguard Worker /*
2*13e8728fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*13e8728fSAndroid Build Coastguard Worker  *
4*13e8728fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*13e8728fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*13e8728fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*13e8728fSAndroid Build Coastguard Worker  *
8*13e8728fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*13e8728fSAndroid Build Coastguard Worker  *
10*13e8728fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*13e8728fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*13e8728fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*13e8728fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*13e8728fSAndroid Build Coastguard Worker  * limitations under the License.
15*13e8728fSAndroid Build Coastguard Worker  */
16*13e8728fSAndroid Build Coastguard Worker 
17*13e8728fSAndroid Build Coastguard Worker #include <getopt.h>
18*13e8728fSAndroid Build Coastguard Worker #include <inttypes.h>
19*13e8728fSAndroid Build Coastguard Worker #include <stdint.h>
20*13e8728fSAndroid Build Coastguard Worker #include <stdio.h>
21*13e8728fSAndroid Build Coastguard Worker #include <stdlib.h>
22*13e8728fSAndroid Build Coastguard Worker 
23*13e8728fSAndroid Build Coastguard Worker #include "dt_table.h"
24*13e8728fSAndroid Build Coastguard Worker #include "libacpi.h"
25*13e8728fSAndroid Build Coastguard Worker #include "libfdt.h"
26*13e8728fSAndroid Build Coastguard Worker 
27*13e8728fSAndroid Build Coastguard Worker struct dump_params {
28*13e8728fSAndroid Build Coastguard Worker   const char *img_filename;
29*13e8728fSAndroid Build Coastguard Worker   const char *out_filename;
30*13e8728fSAndroid Build Coastguard Worker   const char *out_dtb_filename;
31*13e8728fSAndroid Build Coastguard Worker };
32*13e8728fSAndroid Build Coastguard Worker 
33*13e8728fSAndroid Build Coastguard Worker static const char short_options[] = "o:b:";
34*13e8728fSAndroid Build Coastguard Worker static struct option options[] = {{"output", required_argument, NULL, 'o'},
35*13e8728fSAndroid Build Coastguard Worker                                   {"dtb", required_argument, NULL, 'b'},
36*13e8728fSAndroid Build Coastguard Worker                                   {0, 0, NULL, 0}};
37*13e8728fSAndroid Build Coastguard Worker 
read_fdt_from_image(FILE * img_fp,uint32_t dt_offset,uint32_t dt_size)38*13e8728fSAndroid Build Coastguard Worker static void *read_fdt_from_image(FILE *img_fp,
39*13e8728fSAndroid Build Coastguard Worker                                  uint32_t dt_offset, uint32_t dt_size) {
40*13e8728fSAndroid Build Coastguard Worker   void *fdt = NULL;
41*13e8728fSAndroid Build Coastguard Worker 
42*13e8728fSAndroid Build Coastguard Worker   fdt = malloc(dt_size);
43*13e8728fSAndroid Build Coastguard Worker   if (fdt == NULL) {
44*13e8728fSAndroid Build Coastguard Worker     fprintf(stderr, "malloc(%" PRIu32 ") failed.\n", dt_size);
45*13e8728fSAndroid Build Coastguard Worker     return NULL;
46*13e8728fSAndroid Build Coastguard Worker   }
47*13e8728fSAndroid Build Coastguard Worker 
48*13e8728fSAndroid Build Coastguard Worker   fseek(img_fp, dt_offset, SEEK_SET);
49*13e8728fSAndroid Build Coastguard Worker   if (fread(fdt, dt_size, 1, img_fp) == 0) {
50*13e8728fSAndroid Build Coastguard Worker     fprintf(stderr, "Read FDT data error.\n");
51*13e8728fSAndroid Build Coastguard Worker 
52*13e8728fSAndroid Build Coastguard Worker     free(fdt);
53*13e8728fSAndroid Build Coastguard Worker     return NULL;
54*13e8728fSAndroid Build Coastguard Worker   }
55*13e8728fSAndroid Build Coastguard Worker 
56*13e8728fSAndroid Build Coastguard Worker   return fdt;
57*13e8728fSAndroid Build Coastguard Worker }
58*13e8728fSAndroid Build Coastguard Worker 
write_fdt_to_file(const char * filename,const void * fdt,uint32_t (* get_fdt_size)(const void *))59*13e8728fSAndroid Build Coastguard Worker static int write_fdt_to_file(const char *filename, const void *fdt,
60*13e8728fSAndroid Build Coastguard Worker                              uint32_t (*get_fdt_size)(const void *)) {
61*13e8728fSAndroid Build Coastguard Worker   int ret = -1;
62*13e8728fSAndroid Build Coastguard Worker   FILE *out_fp = NULL;
63*13e8728fSAndroid Build Coastguard Worker 
64*13e8728fSAndroid Build Coastguard Worker   out_fp = fopen(filename, "wb");
65*13e8728fSAndroid Build Coastguard Worker   if (!out_fp) {
66*13e8728fSAndroid Build Coastguard Worker     fprintf(stderr, "Can not create file: %s\n", filename);
67*13e8728fSAndroid Build Coastguard Worker     goto end;
68*13e8728fSAndroid Build Coastguard Worker   }
69*13e8728fSAndroid Build Coastguard Worker 
70*13e8728fSAndroid Build Coastguard Worker   uint32_t fdt_size = get_fdt_size(fdt);
71*13e8728fSAndroid Build Coastguard Worker   if (fwrite(fdt, fdt_size, 1, out_fp) < 1) {
72*13e8728fSAndroid Build Coastguard Worker     fprintf(stderr, "Write FDT data error.\n");
73*13e8728fSAndroid Build Coastguard Worker     goto end;
74*13e8728fSAndroid Build Coastguard Worker   }
75*13e8728fSAndroid Build Coastguard Worker 
76*13e8728fSAndroid Build Coastguard Worker   ret = 0;
77*13e8728fSAndroid Build Coastguard Worker 
78*13e8728fSAndroid Build Coastguard Worker end:
79*13e8728fSAndroid Build Coastguard Worker   if (out_fp) fclose(out_fp);
80*13e8728fSAndroid Build Coastguard Worker 
81*13e8728fSAndroid Build Coastguard Worker   return ret;
82*13e8728fSAndroid Build Coastguard Worker }
83*13e8728fSAndroid Build Coastguard Worker 
free_fdt(void * fdt)84*13e8728fSAndroid Build Coastguard Worker static void free_fdt(void *fdt) {
85*13e8728fSAndroid Build Coastguard Worker   if (fdt == NULL) {
86*13e8728fSAndroid Build Coastguard Worker     /* do nothing */
87*13e8728fSAndroid Build Coastguard Worker     return;
88*13e8728fSAndroid Build Coastguard Worker   }
89*13e8728fSAndroid Build Coastguard Worker 
90*13e8728fSAndroid Build Coastguard Worker   free(fdt);
91*13e8728fSAndroid Build Coastguard Worker }
92*13e8728fSAndroid Build Coastguard Worker 
93*13e8728fSAndroid Build Coastguard Worker 
output_prop_int(FILE * out_fp,const char * name,uint32_t value)94*13e8728fSAndroid Build Coastguard Worker static void output_prop_int(FILE *out_fp, const char *name, uint32_t value) {
95*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp, "%20s = %d\n", name, fdt32_to_cpu(value));
96*13e8728fSAndroid Build Coastguard Worker }
97*13e8728fSAndroid Build Coastguard Worker 
output_prop_int_cpu(FILE * out_fp,const char * name,uint32_t value)98*13e8728fSAndroid Build Coastguard Worker static void output_prop_int_cpu(FILE *out_fp, const char *name, uint32_t value) {
99*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp, "%20s = %d\n", name, value);
100*13e8728fSAndroid Build Coastguard Worker }
101*13e8728fSAndroid Build Coastguard Worker 
output_prop_hex(FILE * out_fp,const char * name,uint32_t value)102*13e8728fSAndroid Build Coastguard Worker static void output_prop_hex(FILE *out_fp, const char *name, uint32_t value) {
103*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp, "%20s = %08x\n", name, fdt32_to_cpu(value));
104*13e8728fSAndroid Build Coastguard Worker }
105*13e8728fSAndroid Build Coastguard Worker 
output_prop_str(FILE * out_fp,const char * name,const char * value)106*13e8728fSAndroid Build Coastguard Worker static void output_prop_str(FILE *out_fp, const char *name, const char *value) {
107*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp, "%20s = %s\n", name, value);
108*13e8728fSAndroid Build Coastguard Worker }
109*13e8728fSAndroid Build Coastguard Worker 
output_table_header(FILE * out_fp,const struct dt_table_header * header)110*13e8728fSAndroid Build Coastguard Worker static void output_table_header(FILE *out_fp, const struct dt_table_header *header) {
111*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp, "dt_table_header:\n");
112*13e8728fSAndroid Build Coastguard Worker   output_prop_hex(out_fp, "magic", header->magic);
113*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "total_size", header->total_size);
114*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "header_size", header->header_size);
115*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "dt_entry_size", header->dt_entry_size);
116*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "dt_entry_count", header->dt_entry_count);
117*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "dt_entries_offset", header->dt_entries_offset);
118*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "page_size", header->page_size);
119*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "version", header->version);
120*13e8728fSAndroid Build Coastguard Worker }
121*13e8728fSAndroid Build Coastguard Worker 
output_table_entry(FILE * out_fp,int index,const struct dt_table_entry * entry)122*13e8728fSAndroid Build Coastguard Worker static void output_table_entry(FILE *out_fp, int index, const struct dt_table_entry *entry) {
123*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp, "dt_table_entry[%d]:\n", index);
124*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "dt_size", entry->dt_size);
125*13e8728fSAndroid Build Coastguard Worker   output_prop_int(out_fp, "dt_offset", entry->dt_offset);
126*13e8728fSAndroid Build Coastguard Worker   output_prop_hex(out_fp, "id", entry->id);
127*13e8728fSAndroid Build Coastguard Worker   output_prop_hex(out_fp, "rev", entry->rev);
128*13e8728fSAndroid Build Coastguard Worker   output_prop_hex(out_fp, "custom[0]", entry->custom[0]);
129*13e8728fSAndroid Build Coastguard Worker   output_prop_hex(out_fp, "custom[1]", entry->custom[1]);
130*13e8728fSAndroid Build Coastguard Worker   output_prop_hex(out_fp, "custom[2]", entry->custom[2]);
131*13e8728fSAndroid Build Coastguard Worker   output_prop_hex(out_fp, "custom[3]", entry->custom[3]);
132*13e8728fSAndroid Build Coastguard Worker }
133*13e8728fSAndroid Build Coastguard Worker 
output_fdt_info(FILE * out_fp,void * fdt,uint32_t (* get_fdt_size)(const void *))134*13e8728fSAndroid Build Coastguard Worker static int output_fdt_info(FILE *out_fp, void *fdt,
135*13e8728fSAndroid Build Coastguard Worker                            uint32_t (*get_fdt_size)(const void *)) {
136*13e8728fSAndroid Build Coastguard Worker   uint32_t fdt_size = get_fdt_size(fdt);
137*13e8728fSAndroid Build Coastguard Worker 
138*13e8728fSAndroid Build Coastguard Worker   output_prop_int_cpu(out_fp, "(FDT)size", fdt_size);
139*13e8728fSAndroid Build Coastguard Worker 
140*13e8728fSAndroid Build Coastguard Worker   int root_node_off = fdt_path_offset(fdt, "/");
141*13e8728fSAndroid Build Coastguard Worker   if (root_node_off < 0) {
142*13e8728fSAndroid Build Coastguard Worker     fprintf(stderr, "Can not get the root node.\n");
143*13e8728fSAndroid Build Coastguard Worker     return -1;
144*13e8728fSAndroid Build Coastguard Worker   }
145*13e8728fSAndroid Build Coastguard Worker 
146*13e8728fSAndroid Build Coastguard Worker   const char *compatible =
147*13e8728fSAndroid Build Coastguard Worker     (const char *)fdt_getprop(fdt, root_node_off, "compatible", NULL);
148*13e8728fSAndroid Build Coastguard Worker   output_prop_str(out_fp, "(FDT)compatible", compatible ? compatible : "(unknown)");
149*13e8728fSAndroid Build Coastguard Worker 
150*13e8728fSAndroid Build Coastguard Worker   return 0;
151*13e8728fSAndroid Build Coastguard Worker }
152*13e8728fSAndroid Build Coastguard Worker 
get_acpi_file_size(const void * acpi)153*13e8728fSAndroid Build Coastguard Worker static inline uint32_t get_acpi_file_size(const void *acpi) {
154*13e8728fSAndroid Build Coastguard Worker   return acpi_length(acpi);
155*13e8728fSAndroid Build Coastguard Worker }
156*13e8728fSAndroid Build Coastguard Worker 
get_fdt_file_size(const void * fdt)157*13e8728fSAndroid Build Coastguard Worker static inline uint32_t get_fdt_file_size(const void *fdt) {
158*13e8728fSAndroid Build Coastguard Worker   return fdt_totalsize(fdt);
159*13e8728fSAndroid Build Coastguard Worker }
160*13e8728fSAndroid Build Coastguard Worker 
dump_image_from_fp(FILE * out_fp,FILE * img_fp,const struct dump_params * params)161*13e8728fSAndroid Build Coastguard Worker static int dump_image_from_fp(FILE *out_fp, FILE *img_fp,
162*13e8728fSAndroid Build Coastguard Worker                               const struct dump_params *params) {
163*13e8728fSAndroid Build Coastguard Worker   struct dt_table_header header;
164*13e8728fSAndroid Build Coastguard Worker   if (fread(&header, sizeof(header), 1, img_fp) != 1) {
165*13e8728fSAndroid Build Coastguard Worker     fprintf(stderr, "Read error.\n");
166*13e8728fSAndroid Build Coastguard Worker     return -1;
167*13e8728fSAndroid Build Coastguard Worker   }
168*13e8728fSAndroid Build Coastguard Worker   /* TODO: check header */
169*13e8728fSAndroid Build Coastguard Worker   output_table_header(out_fp, &header);
170*13e8728fSAndroid Build Coastguard Worker 
171*13e8728fSAndroid Build Coastguard Worker   uint32_t (*get_fdt_size)(const void *);
172*13e8728fSAndroid Build Coastguard Worker   uint32_t entry_magic = fdt32_to_cpu(header.magic);
173*13e8728fSAndroid Build Coastguard Worker   if (entry_magic == ACPI_TABLE_MAGIC)
174*13e8728fSAndroid Build Coastguard Worker     get_fdt_size = get_acpi_file_size;
175*13e8728fSAndroid Build Coastguard Worker   else
176*13e8728fSAndroid Build Coastguard Worker     get_fdt_size = get_fdt_file_size;
177*13e8728fSAndroid Build Coastguard Worker 
178*13e8728fSAndroid Build Coastguard Worker   uint32_t entry_size = fdt32_to_cpu(header.dt_entry_size);
179*13e8728fSAndroid Build Coastguard Worker   uint32_t entry_offset = fdt32_to_cpu(header.dt_entries_offset);
180*13e8728fSAndroid Build Coastguard Worker   uint32_t entry_count = fdt32_to_cpu(header.dt_entry_count);
181*13e8728fSAndroid Build Coastguard Worker   uint32_t i;
182*13e8728fSAndroid Build Coastguard Worker   for (i = 0; i < entry_count; i++) {
183*13e8728fSAndroid Build Coastguard Worker     struct dt_table_entry entry;
184*13e8728fSAndroid Build Coastguard Worker     fseek(img_fp, entry_offset, SEEK_SET);
185*13e8728fSAndroid Build Coastguard Worker     if (fread(&entry, sizeof(entry), 1, img_fp) != 1) {
186*13e8728fSAndroid Build Coastguard Worker       fprintf(stderr, "Read dt_table_entry error.\n");
187*13e8728fSAndroid Build Coastguard Worker       return -1;
188*13e8728fSAndroid Build Coastguard Worker     }
189*13e8728fSAndroid Build Coastguard Worker     output_table_entry(out_fp, i, &entry);
190*13e8728fSAndroid Build Coastguard Worker 
191*13e8728fSAndroid Build Coastguard Worker     uint32_t dt_size = fdt32_to_cpu(entry.dt_size);
192*13e8728fSAndroid Build Coastguard Worker     uint32_t dt_offset = fdt32_to_cpu(entry.dt_offset);
193*13e8728fSAndroid Build Coastguard Worker     if (dt_size > 0 && dt_offset > 0) {
194*13e8728fSAndroid Build Coastguard Worker       void *fdt = read_fdt_from_image(img_fp, dt_offset, dt_size);
195*13e8728fSAndroid Build Coastguard Worker       if (fdt) {
196*13e8728fSAndroid Build Coastguard Worker         output_fdt_info(out_fp, fdt, get_fdt_size);
197*13e8728fSAndroid Build Coastguard Worker 
198*13e8728fSAndroid Build Coastguard Worker         if (params->out_dtb_filename != NULL) {
199*13e8728fSAndroid Build Coastguard Worker           char filename[256];
200*13e8728fSAndroid Build Coastguard Worker           snprintf(filename, sizeof(filename), "%s.%d",
201*13e8728fSAndroid Build Coastguard Worker                    params->out_dtb_filename, i);
202*13e8728fSAndroid Build Coastguard Worker           write_fdt_to_file(filename, fdt, get_fdt_size);
203*13e8728fSAndroid Build Coastguard Worker         }
204*13e8728fSAndroid Build Coastguard Worker 
205*13e8728fSAndroid Build Coastguard Worker         free_fdt(fdt);
206*13e8728fSAndroid Build Coastguard Worker       }
207*13e8728fSAndroid Build Coastguard Worker     }
208*13e8728fSAndroid Build Coastguard Worker 
209*13e8728fSAndroid Build Coastguard Worker     entry_offset += entry_size;
210*13e8728fSAndroid Build Coastguard Worker   }
211*13e8728fSAndroid Build Coastguard Worker 
212*13e8728fSAndroid Build Coastguard Worker   return 0;
213*13e8728fSAndroid Build Coastguard Worker }
214*13e8728fSAndroid Build Coastguard Worker 
process_command_dump(const struct dump_params * params)215*13e8728fSAndroid Build Coastguard Worker static int process_command_dump(const struct dump_params *params) {
216*13e8728fSAndroid Build Coastguard Worker   int ret = -1;
217*13e8728fSAndroid Build Coastguard Worker   FILE *out_fp = NULL;
218*13e8728fSAndroid Build Coastguard Worker   FILE *img_fp = NULL;
219*13e8728fSAndroid Build Coastguard Worker 
220*13e8728fSAndroid Build Coastguard Worker   img_fp = fopen(params->img_filename, "rb");
221*13e8728fSAndroid Build Coastguard Worker   if (img_fp == NULL) {
222*13e8728fSAndroid Build Coastguard Worker     fprintf(stderr, "Can not open image file: %s\n", params->img_filename);
223*13e8728fSAndroid Build Coastguard Worker     goto end;
224*13e8728fSAndroid Build Coastguard Worker   }
225*13e8728fSAndroid Build Coastguard Worker 
226*13e8728fSAndroid Build Coastguard Worker   if (params->out_filename != NULL) {
227*13e8728fSAndroid Build Coastguard Worker     out_fp = fopen(params->out_filename, "w");
228*13e8728fSAndroid Build Coastguard Worker     if (out_fp == NULL) {
229*13e8728fSAndroid Build Coastguard Worker       fprintf(stderr, "Can not create file: %s\n", params->out_filename);
230*13e8728fSAndroid Build Coastguard Worker       goto end;
231*13e8728fSAndroid Build Coastguard Worker     }
232*13e8728fSAndroid Build Coastguard Worker   }
233*13e8728fSAndroid Build Coastguard Worker 
234*13e8728fSAndroid Build Coastguard Worker   ret = dump_image_from_fp(out_fp ? out_fp : stdout, img_fp, params);
235*13e8728fSAndroid Build Coastguard Worker 
236*13e8728fSAndroid Build Coastguard Worker end:
237*13e8728fSAndroid Build Coastguard Worker   if (img_fp) fclose(img_fp);
238*13e8728fSAndroid Build Coastguard Worker   if (out_fp) fclose(out_fp);
239*13e8728fSAndroid Build Coastguard Worker 
240*13e8728fSAndroid Build Coastguard Worker   return ret;
241*13e8728fSAndroid Build Coastguard Worker }
242*13e8728fSAndroid Build Coastguard Worker 
handle_usage_dump(FILE * out_fp,const char * prog_name)243*13e8728fSAndroid Build Coastguard Worker void handle_usage_dump(FILE *out_fp, const char *prog_name) {
244*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp, "  %s dump <image_file> (<option>...)\n\n", prog_name);
245*13e8728fSAndroid Build Coastguard Worker   fprintf(out_fp,
246*13e8728fSAndroid Build Coastguard Worker     "    options:\n"
247*13e8728fSAndroid Build Coastguard Worker     "      -o, --output <filename>  Output file name.\n"
248*13e8728fSAndroid Build Coastguard Worker     "                               Default is output to stdout.\n"
249*13e8728fSAndroid Build Coastguard Worker     "      -b, --dtb <filename>     Dump dtb/dtbo files from image.\n"
250*13e8728fSAndroid Build Coastguard Worker     "                               Will output to <filename>.0, <filename>.1, etc.\n");
251*13e8728fSAndroid Build Coastguard Worker }
252*13e8728fSAndroid Build Coastguard Worker 
handle_command_dump(int argc,char * argv[],int arg_start)253*13e8728fSAndroid Build Coastguard Worker int handle_command_dump(int argc, char *argv[], int arg_start) {
254*13e8728fSAndroid Build Coastguard Worker   if (argc - arg_start < 1) {
255*13e8728fSAndroid Build Coastguard Worker     handle_usage_dump(stderr, argv[0]);
256*13e8728fSAndroid Build Coastguard Worker     return 1;
257*13e8728fSAndroid Build Coastguard Worker   }
258*13e8728fSAndroid Build Coastguard Worker 
259*13e8728fSAndroid Build Coastguard Worker   struct dump_params params;
260*13e8728fSAndroid Build Coastguard Worker   memset(&params, 0, sizeof(params));
261*13e8728fSAndroid Build Coastguard Worker   params.img_filename = argv[arg_start];
262*13e8728fSAndroid Build Coastguard Worker 
263*13e8728fSAndroid Build Coastguard Worker   optind = arg_start + 1;
264*13e8728fSAndroid Build Coastguard Worker   while (1) {
265*13e8728fSAndroid Build Coastguard Worker     int c = getopt_long(argc, argv, short_options, options, NULL);
266*13e8728fSAndroid Build Coastguard Worker     if (c == -1) {
267*13e8728fSAndroid Build Coastguard Worker       break;
268*13e8728fSAndroid Build Coastguard Worker     }
269*13e8728fSAndroid Build Coastguard Worker     switch (c) {
270*13e8728fSAndroid Build Coastguard Worker       case 'o':
271*13e8728fSAndroid Build Coastguard Worker         params.out_filename = optarg;
272*13e8728fSAndroid Build Coastguard Worker         break;
273*13e8728fSAndroid Build Coastguard Worker       case 'b':
274*13e8728fSAndroid Build Coastguard Worker         params.out_dtb_filename = optarg;
275*13e8728fSAndroid Build Coastguard Worker         break;
276*13e8728fSAndroid Build Coastguard Worker       default:
277*13e8728fSAndroid Build Coastguard Worker         /* Unknown option, return error */
278*13e8728fSAndroid Build Coastguard Worker         return 1;
279*13e8728fSAndroid Build Coastguard Worker     }
280*13e8728fSAndroid Build Coastguard Worker   }
281*13e8728fSAndroid Build Coastguard Worker 
282*13e8728fSAndroid Build Coastguard Worker   return process_command_dump(&params);
283*13e8728fSAndroid Build Coastguard Worker }
284