2007-12-18 07:06:42 +03:00
/*
* ( 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 */
2010-11-18 02:28:20 +03:00
int phandle_format = PHANDLE_BOTH ; /* Use linux,phandle or phandle properties */
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
static void fill_fullpaths ( struct node * tree , const char * prefix )
2007-12-18 07:06:42 +03:00
{
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: \n " ) ;
fprintf ( stderr , " \t dtc [options] <input file> \n " ) ;
fprintf ( stderr , " \n Options: \n " ) ;
fprintf ( stderr , " \t -h \n " ) ;
fprintf ( stderr , " \t \t This help text \n " ) ;
fprintf ( stderr , " \t -q \n " ) ;
fprintf ( stderr , " \t \t Quiet: -q suppress warnings, -qq errors, -qqq all \n " ) ;
fprintf ( stderr , " \t -I <input format> \n " ) ;
fprintf ( stderr , " \t \t Input formats are: \n " ) ;
fprintf ( stderr , " \t \t \t dts - device tree source text \n " ) ;
fprintf ( stderr , " \t \t \t dtb - device tree blob \n " ) ;
fprintf ( stderr , " \t \t \t fs - /proc/device-tree style directory \n " ) ;
fprintf ( stderr , " \t -o <output file> \n " ) ;
fprintf ( stderr , " \t -O <output format> \n " ) ;
fprintf ( stderr , " \t \t Output formats are: \n " ) ;
fprintf ( stderr , " \t \t \t dts - device tree source text \n " ) ;
fprintf ( stderr , " \t \t \t dtb - device tree blob \n " ) ;
fprintf ( stderr , " \t \t \t asm - assembler source \n " ) ;
fprintf ( stderr , " \t -V <output version> \n " ) ;
fprintf ( stderr , " \t \t Blob version to produce, defaults to %d (relevant for dtb \n \t \t and asm output only) \n " , DEFAULT_FDT_VERSION ) ;
2012-01-11 04:27:52 +04:00
fprintf ( stderr , " \t -d <output dependency file> \n " ) ;
2007-12-18 07:06:42 +03:00
fprintf ( stderr , " \t -R <number> \n " ) ;
fprintf ( stderr , " \t \t Make space for <number> reserve map entries (relevant for \n \t \t dtb and asm output only) \n " ) ;
fprintf ( stderr , " \t -S <bytes> \n " ) ;
fprintf ( stderr , " \t \t Make the blob at least <bytes> long (extra space) \n " ) ;
fprintf ( stderr , " \t -p <bytes> \n " ) ;
fprintf ( stderr , " \t \t Add padding to the blob of <bytes> long (extra space) \n " ) ;
fprintf ( stderr , " \t -b <number> \n " ) ;
fprintf ( stderr , " \t \t Set the physical boot cpu \n " ) ;
fprintf ( stderr , " \t -f \n " ) ;
fprintf ( stderr , " \t \t Force - try to produce output even if the input tree has errors \n " ) ;
2012-09-29 01:25:59 +04:00
fprintf ( stderr , " \t -i \n " ) ;
fprintf ( stderr , " \t \t Add a path to search for include files \n " ) ;
2010-11-18 02:28:20 +03:00
fprintf ( stderr , " \t -s \n " ) ;
fprintf ( stderr , " \t \t Sort nodes and properties before outputting (only useful for \n \t \t comparing trees) \n " ) ;
2007-12-18 07:06:42 +03:00
fprintf ( stderr , " \t -v \n " ) ;
fprintf ( stderr , " \t \t Print DTC version and exit \n " ) ;
2010-11-18 02:28:20 +03:00
fprintf ( stderr , " \t -H <phandle format> \n " ) ;
fprintf ( stderr , " \t \t phandle formats are: \n " ) ;
fprintf ( stderr , " \t \t \t legacy - \" linux,phandle \" properties only \n " ) ;
fprintf ( stderr , " \t \t \t epapr - \" phandle \" properties only \n " ) ;
fprintf ( stderr , " \t \t \t both - Both \" linux,phandle \" and \" phandle \" properties \n " ) ;
2012-09-29 01:25:59 +04:00
fprintf ( stderr , " \t -W [no-]<checkname> \n " ) ;
fprintf ( stderr , " \t -E [no-]<checkname> \n " ) ;
fprintf ( stderr , " \t \t \t enable or disable warnings and errors \n " ) ;
2008-08-07 06:24:17 +04:00
exit ( 3 ) ;
2007-12-18 07:06:42 +03:00
}
int main ( int argc , char * argv [ ] )
{
struct boot_info * bi ;
const char * inform = " dts " ;
const char * outform = " dts " ;
const char * outname = " - " ;
2012-01-11 04:27:52 +04:00
const char * depname = NULL ;
2012-01-26 15:20:07 +04:00
int force = 0 , sort = 0 ;
2007-12-18 07:06:42 +03:00
const char * arg ;
int opt ;
FILE * outf = NULL ;
int outversion = DEFAULT_FDT_VERSION ;
2008-08-07 06:24:17 +04:00
long long cmdline_boot_cpuid = - 1 ;
2007-12-18 07:06:42 +03:00
quiet = 0 ;
reservenum = 0 ;
minsize = 0 ;
padsize = 0 ;
2012-09-29 01:25:59 +04:00
while ( ( opt = getopt ( argc , argv , " hI:O:o:V:d:R:S:p:fqb:i:vH:sW:E: " ) )
2012-01-11 04:27:52 +04:00
! = EOF ) {
2007-12-18 07:06:42 +03:00
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 ;
2012-01-11 04:27:52 +04:00
case ' d ' :
depname = optarg ;
break ;
2007-12-18 07:06:42 +03:00
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 ' q ' :
quiet + + ;
break ;
case ' b ' :
2008-08-07 06:24:17 +04:00
cmdline_boot_cpuid = strtoll ( optarg , NULL , 0 ) ;
2007-12-18 07:06:42 +03:00
break ;
2012-09-29 01:25:59 +04:00
case ' i ' :
srcfile_add_search_path ( optarg ) ;
break ;
2007-12-18 07:06:42 +03:00
case ' v ' :
2008-08-07 06:24:17 +04:00
printf ( " Version: %s \n " , DTC_VERSION ) ;
exit ( 0 ) ;
2010-11-18 02:28:20 +03:00
case ' H ' :
if ( streq ( optarg , " legacy " ) )
phandle_format = PHANDLE_LEGACY ;
else if ( streq ( optarg , " epapr " ) )
phandle_format = PHANDLE_EPAPR ;
else if ( streq ( optarg , " both " ) )
phandle_format = PHANDLE_BOTH ;
else
die ( " Invalid argument \" %s \" to -H option \n " ,
optarg ) ;
break ;
case ' s ' :
sort = 1 ;
break ;
2012-09-29 01:25:59 +04:00
case ' W ' :
parse_checks_option ( true , false , optarg ) ;
break ;
case ' E ' :
parse_checks_option ( false , true , optarg ) ;
break ;
2007-12-18 07:06:42 +03:00
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 */
2008-08-07 06:24:17 +04:00
if ( minsize & & padsize )
2007-12-18 07:06:42 +03:00
die ( " Can't set both -p and -S \n " ) ;
2010-11-18 02:28:20 +03:00
if ( minsize )
fprintf ( stderr , " DTC: Use of \" -S \" is deprecated; it will be removed soon, use \" -p \" instead \n " ) ;
2012-01-11 04:27:52 +04:00
if ( depname ) {
depfile = fopen ( depname , " w " ) ;
if ( ! depfile )
die ( " Couldn't open dependency file %s: %s \n " , depname ,
strerror ( errno ) ) ;
fprintf ( depfile , " %s: " , outname ) ;
}
2008-08-07 06:24:17 +04:00
if ( streq ( inform , " dts " ) )
2007-12-18 07:06:42 +03:00
bi = dt_from_source ( arg ) ;
2008-08-07 06:24:17 +04:00
else if ( streq ( inform , " fs " ) )
2007-12-18 07:06:42 +03:00
bi = dt_from_fs ( arg ) ;
2008-08-07 06:24:17 +04:00
else if ( streq ( inform , " dtb " ) )
bi = dt_from_blob ( arg ) ;
else
2007-12-18 07:06:42 +03:00
die ( " Unknown input format \" %s \" \n " , inform ) ;
2012-01-11 04:27:52 +04:00
if ( depfile ) {
fputc ( ' \n ' , depfile ) ;
fclose ( depfile ) ;
}
2008-08-07 06:24:17 +04:00
if ( cmdline_boot_cpuid ! = - 1 )
bi - > boot_cpuid_phys = cmdline_boot_cpuid ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
fill_fullpaths ( bi - > dt , " " ) ;
process_checks ( force , bi ) ;
2007-12-18 07:06:42 +03:00
2010-11-18 02:28:20 +03:00
if ( sort )
sort_tree ( bi ) ;
2007-12-18 07:06:42 +03:00
if ( streq ( outname , " - " ) ) {
outf = stdout ;
} else {
outf = fopen ( outname , " w " ) ;
if ( ! outf )
die ( " Couldn't open output file %s: %s \n " ,
outname , strerror ( errno ) ) ;
}
if ( streq ( outform , " dts " ) ) {
dt_to_source ( outf , bi ) ;
} else if ( streq ( outform , " dtb " ) ) {
2008-08-07 06:24:17 +04:00
dt_to_blob ( outf , bi , outversion ) ;
2007-12-18 07:06:42 +03:00
} else if ( streq ( outform , " asm " ) ) {
2008-08-07 06:24:17 +04:00
dt_to_asm ( outf , bi , outversion ) ;
2007-12-18 07:06:42 +03:00
} else if ( streq ( outform , " null " ) ) {
/* do nothing */
} else {
die ( " Unknown output format \" %s \" \n " , outform ) ;
}
exit ( 0 ) ;
}