#!/bin/bash


# these soc use old bl31 code, others use new one
declare -a BL31_OLD_VER_SOC_LIST=("gxb" "gxtvbb" "gxl" "txl")
declare BL31_V1_3_SRC_FOLDER="bl31_1.3/src"
declare BL31_V1_0_SRC_FOLDER="bl31/src"
declare BL31_V1_3_BIN_FOLDER="bl31_1.3/bin"
declare BL31_V1_0_BIN_FOLDER="bl31/bin"


function build_bl31() {
	echo -n "Build bl31...Please wait... "
	# $1: src_folder, $2: bin_folder, $3: soc
	local target="$1/bl31.bin"
	local target2="$1/bl31.img"
	cd $1
	export CROSS_COMPILE=${AARCH64_TOOL_CHAIN}
	CONFIG_SPD="opteed"
	#CONFIG_SPD="none"
	local soc=$3
	if [ "$soc" == "gxtvbb" ] || [ "$soc" == "gxb" ]; then
		soc="gxbb"
	elif [ "$soc" == "txl" ]; then
		soc="gxl"
	fi
	#make PLAT=${soc} SPD=${CONFIG_SPD} realclean &> /dev/null
	#make PLAT=${soc} SPD=${CONFIG_SPD} V=1 all &> /dev/null
	/bin/bash mk $soc
	if [ $? != 0 ]; then
		cd ${MAIN_FOLDER}
		echo "Error: Build bl31 failed... abort"
		exit -1
	fi
	cd ${MAIN_FOLDER}
	cp ${target} $2 -f
	cp ${target2} $2 -f
	echo "done"
	return
}

function build_bl31_v1_3() {
	echo -n "Build bl31 v1.3...Please wait... "
	# $1: src_folder, $2: bin_folder, $3: soc
	local target="$1/bl31.bin"
	local target2="$1/bl31.img"
	cd $1
	export CROSS_COMPILE=${AARCH64_TOOL_CHAIN}
	#sh mk $3 &> /dev/null
	local soc=$3
	if [ "$soc" == "txhd" ]; then
		soc="axg"
	fi
	/bin/bash mk $soc
	if [ $? != 0 ]; then
		cd ${MAIN_FOLDER}
		echo "Error: Build bl31 failed... abort"
		exit -1
	fi
	cd ${MAIN_FOLDER}
	cp ${target} $2 -f
	cp ${target2} $2 -f
	echo "done"
	return
}

# check use which bl31 build script
function check_bl31_ver() {
	# $1: soc
	# return 1: use bl31 v1.3
	# return 0: use bl31 v1.0
	local -i ver=1
	for soc_list in ${!BL31_OLD_VER_SOC_LIST[@]}; do
	if [ "$1" == "${BL31_OLD_VER_SOC_LIST[${soc_list}]}" ]; then
		ver=0
	fi
	done
	return ${ver}
}

# some soc need use bl31_v1.3
function switch_bl31() {
	# $1: soc
	check_bl31_ver $1
	if [ $? != 0 ]; then
		echo "check bl31 ver: use v1.3"
		BLX_SRC_FOLDER[2]=${BL31_V1_3_SRC_FOLDER}
		BLX_BIN_FOLDER[2]=${BL31_V1_3_BIN_FOLDER}
	else
		echo "check bl31 ver: use v1.0"
		BLX_SRC_FOLDER[2]=${BL31_V1_0_SRC_FOLDER}
		BLX_BIN_FOLDER[2]=${BL31_V1_0_BIN_FOLDER}
	fi
}