#!/usr/bin/perl

use Cwd qw();

sub HELP_MESSAGE
{
	print "\nUsage  : build -f \"Flash type\" -b \"board name\" [-v X.X.X] [-m \"DDR type\"] [-o \"Output file\"] \\\n";
	print "              [-p] [-r \"UART baudrate\"] [-u \"UART port\"] [-g \"MPP configuration\"] \\\n";
	print "              [-z \"Private RSA KAK key file\" -a \"Private RSA CSK key file\" -k \"CSK array index\" \\\n";
	print "              -x \"BOX ID\" -l \"Flash ID\"] [-j \"JTAG delay\"]\n";
	print "Example: ./build.pl -f spi -v 14T2 -b avanta_lp -i spi:nand -c\n";
	print "\n";
	print "Options:\n";
	print "\t-f\tBoot device. Accepts spi, nor, nand, mmc\n";
	print "\t-b\tBoard type. Accepts:\tavanta_lp , avanta_lp_customer0 , avanta_lp_customer1\n";
	print "\t\t\t\t\tarmada_38x, armada_38x_clearfog, armada_38x_customer0, armada_38x_customer1\n";
	print "\t\t\t\t\tarmada_39x, armada_39x_customer0, armada_39x_customer1\n";
	print "\t\t\t\t\tarmada_375, armada_375_customer0, armada_375_customer1\n";
	print "\t\t\t\t\tbobcat2_db, bobcat2_rd, bobcat2_customer0, bobcat2_customer1\n";
	print "\t\t\t\t\tac3_db, ac3_rd, ac3_customer0, ac3_customer1\n";
	print "\t-o\tOutput dir/file. The image will be copied into this dir/file\n";
	print "\t-e\tBig Endian. If not specified Little endian is used\n";
 	print "\t-m\tDDR type(default: DDR4 for A39x, DDR3 for the rest). Accepts: 3 for DDR3, 4 for DDR4\n";
	print "\t-i\tSupported interfaces, seperated by \":\" -  Accepts [spi:nor:nand]\n";
	print "\t-v\tSW version (in file name: u-boot-alp-X.X.X-spi.bin, else using date by default)\n";
	print "\t\tinterfaces. Supports spi, nor, nand. the boot \n";
	print "\t\tinterface will always be suppored\n";
	print "\t-p\tDisable BootROM debug print output during boot (enabled by dafault)\n";
	print "\t-r\tChange the default BootROM UART debug port baudrate. Supported baudrates:\n";
	print "\t\t\t\t\t2400, 4800, 9600, 19200, 38400, 57600, 115200\n";
	print "\t-u\tChange the default BootROM UART debug port number. Suported ports 0 - 3\n";
	print "\t-g\tSelect BootROM debug port MPPs configuration value = 0-7 (BootROM-specific)\n";
	print "\t-s\tStyle of build, accepts: dev, prod, openbox\n";
	print "\n";
	print "Secure boot options:\n";
	print "\tNOTE: \tAll secure options except \"j\" are mandatory once one of them is selected\n";
	print "\t\tSecure boot mode is availbale for Armada-3xx and Avanta-LP SoC families only!\n\n";
	print "\t-z\tCreate image with RSA KAK block signature for secure boot mode\n";
	print "\t\tIf the private key file name is \"@@\", the new RSA key pair will be generated and used\n";
	print "\t-a\tCreate image with RSA CSK signature for secure boot mode\n";
	print "\t\tIf the private key file name is \"@@\", the new RSA key pair will be generated and used\n";
	print "\t-k\tCSK Array Index in range of 0 to 15\n";
	print "\t-j\tEnable JTAG interface and delay boot execution by \" delay\" ms. Disabled if omitted\n";
	print "\t-x\tBox ID (hex) - in range of 0 to 0xffffffff\n";
	print "\t-l\tFlash ID (hex) - in range of to 0xffffffff\n";
	print "\n";
	print "Environment Variables:\n";
	print "\tCROSS_COMPILE     Cross compiler to build U-BOOT\n";
	print "\tCROSS_COMPILE_BH  Cross compiler to build bin hdr\n";
	print "\n";
}

# Main
use Getopt::Std;

getopt('f:b:o:i:v:d:m:r:u:g:z:a:k:j:x:l:s:');

if((!defined $opt_b) or
	(!defined $opt_f)) {
	if(!defined $opt_b){
		printf "\n *** Error: Please set board type\n";
	}
	if(!defined $opt_f){
		printf "\n *** Error: Please set boot device\n";
	}
	HELP_MESSAGE();
	exit 1;
}

$cross    = $ENV{'CROSS_COMPILE'};
$cross_bh = $ENV{'CROSS_COMPILE_BH'};
if(!defined $opt_v){
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
	$month = $mon + 1;
	$opt_v = "$month-$mday";
}
if(!defined $cross){
	printf " *** Error: Please set environment variables CROSS_COMPILE\n";
	HELP_MESSAGE();
	exit 1;
}
if(!defined $cross_bh){
	printf " *** Error: Please set environment variables CROSS_COMPILE_BH\n";
	HELP_MESSAGE();
	exit 1;
}

if(($opt_b eq "armada_xp_dbgp") or
	($opt_b eq "avanta_lp_fpga") or
	($opt_b eq "avanta_lp") or
	($opt_b eq "avanta_lp_customer0") or
	($opt_b eq "avanta_lp_customer1") or
	($opt_b eq "armada_375") or
	($opt_b eq "armada_375_customer0") or
	($opt_b eq "armada_375_customer1") or
	($opt_b eq "armada_38x") or
	($opt_b eq "armada_38x_clearfog") or
	($opt_b eq "armada_38x_customer0") or
	($opt_b eq "armada_38x_customer1") or
	($opt_b eq "armada_38x_gfch100") or
	($opt_b eq "armada_39x") or
	($opt_b eq "armada_39x_customer0") or
	($opt_b eq "armada_39x_customer1") or
	($opt_b eq "bobcat2_db") or
	($opt_b eq "bobcat2_rd_mtl") or
	($opt_b eq "bobcat2_rd") or
	($opt_b eq "bobcat2_customer0") or
	($opt_b eq "bobcat2_customer1") or
	($opt_b eq "ac3_db") or
	($opt_b eq "ac3_rd") or
	($opt_b eq "ac3_customer0") or
	($opt_b eq "ac3_customer1") )
{
	$board = $opt_b;
	$ddr3LibBuild="yes";
	if( (substr $board,7 , 3) eq "370" ) {
		$boardID="a370";
		$targetBoard = substr $board, 11;
		$ddr3LibBuild="no";
	}
	elsif ( (substr $board,7 , 2) eq "xp" ) {
		$boardID="axp";
		$targetBoard = substr $board, 10;
		$ddr3LibBuild="no";
	}
	elsif ( (substr $board,7 , 2) eq "lp" ) {
		$boardID="alp";
		$ddr3LibBuild="no";
	}
	elsif ( (substr $board,7 , 3) eq "375" ) {
		$boardID="a375";
		$ddr3LibBuild="no";
	}
	elsif ( (substr $board,7 , 3) eq "38x" ) {
		$boardID="a38x";
	}
	elsif ( (substr $board,7 , 3) eq "39x" ) {
		$boardID="a39x";
	}
	elsif ( (substr $board,0 , 7) eq "bobcat2" ) {
		$boardID="msys-bc2";
		$targetBoard = substr $board, 8;
	}
	elsif ( (substr $board,0 , 3) eq "ac3" ) {
		$boardID="msys-ac3";
		$targetBoard = substr $board, 8;
	}
	# if board string contains "customer" (Or A38x-SolidRun Clear fog board), use customer define for binary_header
	if ((index($board, "customer") != -1) or (index($board, "clearfog") != -1)
		or (index($board, "gfch100") != -1)) {
			system("echo \"#define CONFIG_CUSTOMER_BOARD_SUPPORT 1\" >> include/config.h");
	}

}
else
{
	if (defined) {
			print "\n *** Error: Bad board type $opt_b specified\n\n";
		}
		else {
			print "\n *** Error: Board type unspecified\n\n";
		}
		HELP_MESSAGE();
		exit 1;
	}

# Configure Make
system("make mrproper");
print "\n**** [Cleaning Make]\t*****\n\n";

my $path = Cwd::cwd();
chdir  ("./tools/marvell");
if( ($boardID eq "msys-ac3") or ($boardID eq "msys-bc2")) {
	system("make clean BOARD=msys -s");
} else {
	system("make clean BOARD=$boardID -s");
}
chdir  ("$path");
system("make ${board}_config");

# Set pre processors
print "\n**** [Setting Macros]\t*****\n\n";
if($opt_f eq "spi")      {
	system("echo \"#define MV_SPI_BOOT\" >> include/config.h");
	system("echo \"#define MV_INCLUDE_SPI\" >> include/config.h");
	print "Boot from SPI\n";
	$img_opts   = "";
	$flash_name = "spi";
	$img_type   = "flash";
}
elsif ($opt_f eq "nor")  {
	system("echo \"#define MV_NOR_BOOT\" >> include/config.h");
	system("echo \"#define MV_INCLUDE_NOR\" >> include/config.h");
	print "Boot from NOR\n";
	$img_opts   = "";
	$flash_name = "nor";
	$img_type   = "flash";
}
elsif  ($opt_f eq "nand"){
	system("echo \"#define MV_NAND_BOOT\" >> include/config.h");
	system("echo \"#define MV_NAND\" >> include/config.h");
	print "Boot from NAND\n";
	$flash_name = "nand";
	$img_type   = "nand";
	if($boardID eq "alp") {
		$img_opts   = "-P 2048 -L 128 -N SLC";
	}
	else {
		$img_opts   = "-P 4096 -L 256 -N SLC";
	}
	print "Image options =  $img_opts\n\n";
}
elsif  ($opt_f eq "mmc"){
	system("echo \"#define MV_MMC_BOOT\" >> include/config.h");
	print "Boot from MMC/eMMC/SD\n";
	$flash_name = "mmc";
	$img_type   = "mmc";
}
else
{
	if (defined $opt_f) {
		print "\n *** Error: Bad flash type $opt_f specified\n\n";
	}
	else {
		print "\n *** Error: Flash type unspecified\n\n";
	}
	HELP_MESSAGE();
	exit 1;
}

$bin_hdr_n = "bin_hdr.bin";

if (($boardID eq "a38x") or
	($boardID eq "a39x") or
	($boardID eq "a375") or
	($boardID eq "alp")) {

	# Secure boot options
	if ((defined $opt_z) or
		(defined $opt_a) or
		(defined $opt_k) or
		(defined $opt_j) or
		(defined $opt_x) or
		(defined $opt_l)) {

		# If defined one of secure options, all the rest except "j" become mandatory
		if ((!defined $opt_z) or
			(!defined $opt_a) or
			(!defined $opt_k) or
			(!defined $opt_x) or
			(!defined $opt_l)) {
			print "\n *** Error: In secure boot mode all options (except \"j\") are mandatory!\n\n";
			exit 1;
		}

		# KAK RSA key
		if ($opt_z eq "@@") {
			print("Secure boot, generate new KAK RSA key\n");
		} else {
			printf("Secure boot, Use KAK RSA key from file \"$opt_z\"\n", );
		}

		# CSK RSA key
		if ($opt_a eq "@@") {
			print("Secure boot, generate new CSK RSA key ");
		} else {
			print("Secure boot, Use CSK RSA key from file \"$opt_z\" ");
		}

		# CSK array index
		print("@ CSK array index $opt_k\n");
		$rsa_opts = "-Z $opt_z -A $opt_a -K $opt_k ";

		# JTAG enable/disable and delay
		if(!defined $opt_j){
			$id_opts = "-B $opt_x -F $opt_l ";
		} else {
			$id_opts = "-B $opt_x -F $opt_l -J $opt_j ";
		}
		printf("Secure boot, Additional options : %s\n", $id_opts);

		$bin_hdr_n = "bin_hdr_sec.bin";

	} else {

		print("No secure boot option selected\n");
		$rsa_opts = "";
		$id_opts = "";
	}

}



# Big endian place holder
if(defined $opt_e) {
	$endian = "be";
	system("echo \"#define __BE\" >> include/config.h");
	system("echo \"BIG_ENDIAN = y\" >> include/config.mk");
	system("echo \"LDFLAGS += -EB  \" >> include/config.mk");
	system("echo \"LDFLAGS_FINAL += -be8  \" >> include/config.mk");
	system("echo \"  * Big Endian byte ordering \"");
	system("echo \"PLATFORM_CPPFLAGS += -march=armv7-a \" >>  arch/arm/cpu/armv7/config.mk");
	system("echo \"#define CPU_ARMARCH7 \" >> include/config.h");
	system("echo \"  * ARM Architecture 7 - Using be8 compile flag\"");
	system("echo \"CPPFLAGS += -falign-labels=4\" >> include/config.mk");
	system("echo \"CFLAGS += -mno-tune-ldrd\" >> include/config.mk");
	print "** BIG ENDIAN ** \n";
}
else {
	$endian = "le";
	print "** Little ENDIAN ** \n";
}

#Interface support
if(defined $opt_i)
{
	@interfaces = split(':', $opt_i);
	if ((grep{$_ eq 'nor'} @interfaces)  and (grep{$_ eq 'nand'} @interfaces))
	{
		print"\n *** Error: The device does not support simultaneous access to nand and nor interfaces\n";
		exit 1;
	}

	if ($boardID eq "msys") {
		if ((grep{$_ eq 'nor'} @interfaces)  and (grep{$_ eq 'spi'} @interfaces))
		{
			print"\n *** Error: MSYS does not support simultaneous access to spi and nor interfaces\n";
			exit 1;
		}
	}

	print "Support flash: ";
	foreach $if (@interfaces)
	{
		if($if eq "spi"){
			system("echo \"#define MV_INCLUDE_SPI\" >> include/config.h");
			print "SPI ";
		}
		elsif($if eq "nor"){
			system("echo \"#define MV_INCLUDE_NOR\" >> include/config.h");
			print "NOR ";
		}
		elsif($if eq "nand"){
			system("echo \"#define MV_NAND\" >> include/config.h");
			print "NAND ";
		}
		else {
			print " *** Warning: Ignoring unrecognized interface - $if";
		}
	}
	print "\n";
}

if($opt_d eq 4)
{
	system("echo \"DDR4SUBLIB = yes\" >> include/config.mk");
	print "** Rebuild DDR4 sublib **\n";
	$opt_d = 2;
}

#by default -d 2 will be enabled for new TIP SoCs
if(($ddr3LibBuild eq "yes") && !((substr $board,7 , 3) eq "39x"))
{
	$opt_d = 2;
}

if(defined $opt_d)
{
	system("echo \"DDR3LIB = $opt_d\" >> include/config.mk");
	print "\n *** DDR3LIB = v$opt_d *********************************\n\n";
}

if( (defined $opt_m) && ($opt_m eq 4) )
{
	system("echo \"DDRTYPE = ddr$opt_m\" >> include/config.mk");
	system("echo \"#define CONFIG_DDR4\" >> include/config.h");
	print "** DDRTYPE = DDR$opt_m **\n";
}
else {
	system("echo \"DDRTYPE = ddr3\" >> include/config.mk");
	system("echo \"#define CONFIG_DDR3\" >> include/config.h");
	print "** DDRTYPE = DDR$opt_m **\n";
}

if($opt_z eq 1)
{
	if ($boardID eq "alp" or $boardID eq "a375"){
		print "\n\nBuild U-Boot $boardID for Zx revision\n\n";
		system("echo \"#define CONFIG_ALP_A375_ZX_REV 1\" >> include/config.h");
	}
}

if(!defined $opt_s){
	printf " *** Error: Unspecified build style!\n";
	HELP_MESSAGE();
	exit 1;
} elsif ($opt_s eq "prod") {
	printf("style=prod, console will be disabled.\n");
	system("echo \"#define CONFIG_DISABLE_INPUT\" >> include/config.h");
	system("echo \"#define CONFIG_BOOT_DELAY 0\" >> include/config.h");
} elsif ($opt_s eq "dev") {
	printf("style=dev, console will be enabled.\n");
	system("echo \"#undef CONFIG_DISABLE_INPUT\" >> include/config.h");
} elsif ($opt_s eq "openbox") {
	printf("style=openbox, console will be enabled.\n");
	system("echo \"#undef CONFIG_DISABLE_INPUT\" >> include/config.h");
} else {
	printf(" *** Error: Unknown build style was set: $opt_s\n");
	HELP_MESSAGE();
	exit 1;
}

if(defined $opt_p)
{
	$extra_opt = " -p";
}

if(defined $opt_r)
{
	$extra_opt = "$extra_opt" . " -b $opt_r";
}

if(defined $opt_u)
{
	$extra_opt = "$extra_opt" . " -u $opt_u";
}

if(defined $opt_g)
{
	$extra_opt = "$extra_opt" . " -m $opt_g";
}

# Build !
print "\n**** [Building U-BOOT]\t*****\n\n";
$fail = system("make -j6 -s");

if($fail){
	print "\n *** Error: Build failed\n\n";
	exit 1;
}

# ALP/A38x/A375 use a single image for all boards (no specific compilation for each board)
if( ($boardID eq "alp") or
    ($boardID eq "msys-ac3") or
    ($boardID eq "a375") or
    ($boardID eq "a39x") or
    ($boardID eq "a38x") ) {
	$targetBoard = "";
	if (($boardID eq "alp" or $boardID eq "a375") and $opt_z eq 1){
		$targetBoard = "-Z";
	}
}
else {
	$targetBoard = "-$targetBoard";
}


#Create Image and Uart Image
print "\n**** [Creating Image]\t*****\n\n";

$failUart = system("./tools/marvell/doimage -T uart -D 0 -E 0 -G ./tools/marvell/bin_hdr/bin_hdr.uart.bin u-boot.bin u-boot-$boardID-$opt_v-$flash_name$targetBoard-uart.bin");
$failDebug = system("./tools/marvell/doimage -T uart -D 0 -E 0 -H 3 -G ./tools/marvell/bin_hdr/bin_hdr.debug.bin u-boot.bin u-boot-$boardID-$opt_v-$flash_name$targetBoard-debug.bin");
$fail = system("./tools/marvell/doimage -T $img_type -D 0x0 -E 0x0 $img_opts $rsa_opts $id_opts $extra_opt -G ./tools/marvell/bin_hdr/$bin_hdr_n u-boot.bin u-boot-$boardID-$opt_v-$flash_name$targetBoard.bin");

if($fail){
	print "\n *** Error: Doimage failed\n\n";
	exit 1;
}
if($failUart){
	print "\n *** Error: Doimage for uart image failed\n\n";
	exit 1;
}
if($failDebug){
	print "\n *** Error: Doimage for debug image failed\n\n";
	exit 1;
}

if(defined $opt_o)
{
	print "\n**** [Copying Image]\tto ",$opt_o,"  *****\n\n";

	system("mkdir -p $opt_o/$endian/$opt_f");
	system("mkdir -p $opt_o/bin_hdr");
	system("cp u-boot-$boardID-$opt_v-$flash_name$targetBoard.bin $opt_o/u-boot.bin");
	system("cp u-boot-$boardID-$opt_v-$flash_name$targetBoard.bin $opt_o/$endian/$opt_f/ ");
	system("cp u-boot $opt_o/$endian/$opt_f/u-boot-$boardID-$opt_v-$flash_name$targetBoard");
	system("cp u-boot.srec $opt_o/$endian/$opt_f/u-boot-$boardID-$opt_v-$flash_name$targetBoard.srec");
	system("cp u-boot-$boardID-$opt_v-$flash_name$targetBoard-uart.bin $opt_o/$endian/$opt_f/");

	system("cp tools/marvell/bin_hdr/bin_hdr.bin $opt_o/bin_hdr/");
	system("cp tools/marvell/bin_hdr/bin_hdr.elf $opt_o/bin_hdr/");
	system("cp tools/marvell/bin_hdr/bin_hdr.dis $opt_o/bin_hdr/");
	system("cp tools/marvell/bin_hdr/bin_hdr.srec $opt_o/bin_hdr/");
}

exit 0;
