#!/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 "\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:');

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_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)) {
		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_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;
