#!/bin/bash

function select_uboot() {
	local cfg_name=$1

	cd ${MAIN_FOLDER}

	for file in `ls -d ${BL33_DEFCFG1}/* ${BL33_DEFCFG2}/* ${BL33_DEFCFG3}/* ${BL33_DEFCFG4}/*`; do
		temp_file=`basename $file`
		#echo $temp_file
		temp_file=${temp_file%_*}
		if [ "$cfg_name" == "$temp_file" ]; then
			if [ "1" == "${CONFIG_CHOICE_BUILD}" ]; then
				if [ "2015" == "${CONFIG_BUILD_VERSION}" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION1}
				elif [ "2019" == "${CONFIG_BUILD_VERSION}" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION2}
				elif [ "2023" == "${CONFIG_BUILD_VERSION}" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION3}
				elif [ "2025" == "${CONFIG_BUILD_VERSION}" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION4}
				else
					echo "input parameter error"
					exit 1
				fi
			else
				if [ "${BL33_DEFCFG1}" == "$(dirname $file)" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION1}
				elif [ "${BL33_DEFCFG2}" == "$(dirname $file)" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION2}
				elif [ "${BL33_DEFCFG3}" == "$(dirname $file)" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION3}
				elif [ "${BL33_DEFCFG4}" == "$(dirname $file)" ]; then
					bl33_path=${UBOOT_FOLDER}/${UBOOT_VERSION4}
				else
					echo "not found defconfig"
					exit 1
				fi
			fi
			echo "select bl33: ${bl33_path}"
			BL33_BUILD_FOLDER=${bl33_path}/build/
			SOURCE_FILE=("${BL33_BUILD_FOLDER}.config")
			CONFIG_FILE=("${BL33_BUILD_FOLDER}include/autoconf.mk")
			UBOOT_SRC_FOLDER=${bl33_path}
			break
		fi
	done
	export BL33_BUILD_FOLDER SOURCE_FILE CONFIG_FILE UBOOT_SRC_FOLDER
}

function pre_build_uboot() {
	select_uboot $1
	cd ${UBOOT_SRC_FOLDER}
	echo -n "Compile config: "
	echo "$1"
	SOCNAME=$1
	echo "SOCNAME:${SOCNAME}"
	export ${SOCNAME}
	make distclean # &> /dev/null
	make $1'_config' # &> /dev/null
	if [ $? != 0 ]
	then
		echo "Pre-build failed! exit!"
		cd ${MAIN_FOLDER}
		exit -1
	fi
	cd ${MAIN_FOLDER}
}

function build_uboot() {
	echo "Build uboot...Please Wait...$1...$2...$3...$4...$5...$6...$7"
	mkdir -p ${FIP_BUILD_FOLDER}
	cd ${UBOOT_SRC_FOLDER}
	if [[ "${SCRIPT_ARG_CHIPSET_VARIANT}" =~ "nocs" ]] || [[ "${CONFIG_CHIPSET_VARIANT}" =~ "nocs" ]]; then
		CONFIG_CHIP_NOCS=1
		echo "### ${CONFIG_CHIP_NOCS} ###"
	fi
	set -e
	if [ "${CONFIG_MDUMP_COMPRESS}" = "1" ]; then
		CONFIG_MDUMP_COMPRESS=1
		echo "### BL33 CONFIG_MDUMP_COMPRESS = 1 ###"
		make -j SYSTEMMODE=$1 AVBMODE=$2 BOOTCTRLMODE=$3 FASTBOOTMODE=$4 AVB2RECOVERY=$5 TESTKEY=$6 GPTMODE=$7 CHIPMODE=${CONFIG_CHIP_NOCS} \
			CONFIG_MDUMP_COMPRESS=${CONFIG_MDUMP_COMPRESS} \
			CONFIG_TEE_TYPE=${CONFIG_TEE_TYPE} # &> /dev/null
	else
		echo "### BL33 CONFIG_MDUMP_COMPRESS = 0 ### CONFIG_TEE_TYPE ${CONFIG_TEE_TYPE}"
		make -j SYSTEMMODE=$1 AVBMODE=$2 BOOTCTRLMODE=$3 FASTBOOTMODE=$4 AVB2RECOVERY=$5 TESTKEY=$6 GPTMODE=$7 CHIPMODE=${CONFIG_CHIP_NOCS} \
			CONFIG_TEE_TYPE=${CONFIG_TEE_TYPE} # &> /dev/null
	fi
	set +e

	if [ "y" == "${CONFIG_AB_UPDATE}" ]; then
		cp ./build/board/amlogic/${SOCNAME}/firmware/acs.bin ../../${BUILD_PATH}/acs.bin -f
		fip_bl33_size=`stat -c %s ./build/u-boot.bin`
		dd if=/dev/zero of=./build/fip.tmp bs=2097120 count=1
		dd if=./build/u-boot.bin of=./build/fip.tmp bs=${fip_bl33_size} count=1 conv=notrunc

		# sha fip ab
		openssl dgst -sha256 -binary ./build/fip.tmp > ./build/u-boot.bin.sha256
		dd if=./build/u-boot.bin.sha256 of=./build/fip.tmp bs=1 count=32 oflag=append conv=notrunc
		cp ./build/fip.tmp ../../build/fip-bl33.bin -f

		# sign fip ab
		../../fip/stool/signing-tool-c1/sign-boot-c1.sh --sign-kernel -i ./build/fip.tmp \
		-k ./board/amlogic/common/ab_mode/aml-key/kernelkey.pem -a ./board/amlogic/common/ab_mode/aml-key/kernelaeskey \
		--iv ./board/amlogic/common/ab_mode/aml-key/kernelaesiv -o ./build/fip-bl33.bin.encrypt
		cp ./build/fip-bl33.bin.encrypt ../../build/ -f
		#cp ./build/fip-bl33.bin.encrypt ../../${BUILD_PATH}/fip-bl33.bin -f

		# build pre bl33
		set -e
		make distclean
		make ${SOCNAME}_defconfig
		make -j SYSTEMMODE=$1 AVBMODE=$2 BOOTCTRLMODE=$3 FASTBOOTMODE=$4 AVB2RECOVERY=$5 TESTKEY=$6 CHIPMODE=${CONFIG_CHIP_NOCS} \
			ABUPDATE=${CONFIG_AB_UPDATE} \
			CONFIG_TEE_TYPE=${CONFIG_TEE_TYPE} # &> /dev/null
		set +e
		if [ $? != 0 ]; then
			echo "Pre bl33 failed! exit!"
			cd ${MAIN_FOLDER}
			exit 1
		fi
		cp ./build/u-boot.bin ../../${FIP_BUILD_FOLDER}bl33.bin
	fi

	SOC_GROUP=`echo ${SOCNAME} | cut -d '_' -f 1`
	skiped=("c1" "c2" "c3" "g12a" "g12b" "sm1" "t5w")
	if [[ "${skiped[@]}"  =~ "${SOC_GROUP}" ]]; then
		echo ""
		echo "The soc(${SOC_GROUP}) does not support bl33z, skip."
		echo ""
	elif [ "${CONFIG_SUPPORT_BL33Z}" = "1" ]; then
		echo ""
		set -e
		echo "ramdump enable, build bl33z.bin for soc [${SOCNAME}] ..."
		if [ -f "./bl33z/Makefile" ]; then
			set -e
			make -C bl33z/ PLAT=${SOCNAME} AARCH=aarch64 distclean
			make -C bl33z/ PLAT=${SOCNAME} AARCH=aarch64
			set +e
			if [ -f "./bl33z/build/bl33z.bin" -a -f "./build/u-boot.bin" ]; then
				# place bl33z at end of u-boot.bin, _end align(4096)
				END_LENS=$(stat -c%s "./build/u-boot.bin")
				END_ALIGN=4096
				BL33Z_LOAD=`echo "((($END_LENS-1) / $END_ALIGN * $END_ALIGN) + $END_ALIGN)" | bc`
				echo "uboot.bin size:$END_LENS, align:$END_ALIGN, new uboot size:$BL33Z_LOAD"

				dd if=/dev/zero of=u-boot.tmp bs=$BL33Z_LOAD count=1
				dd if=./build/u-boot.bin of=u-boot.tmp  conv=notrunc  &> /dev/null
				cat ./bl33z/build/bl33z.bin >> u-boot.tmp
				cp -rf u-boot.tmp build/u-boot.bin
				rm -rf u-boot.tmp
				echo "Append bl33z.bin to the end of uboot.bin OK."
			else
				echo "Error: build bl33z.bin failed... abort"
			fi
		else
			echo "Error: bl33z proj is not exist... abort"
		fi
		set +e
		echo ""
	fi
	ret=$?
	cd ${MAIN_FOLDER}
	if [ 0 -ne $ret ]; then
		echo "Error: U-boot build failed... abort"
		exit -1
	fi
}

function uboot_config_list() {
	echo "      ******Amlogic Configs******"
	for file in `ls -d ${BL33_DEFCFG1}/* ${BL33_DEFCFG2}/* ${BL33_DEFCFG3}/* ${BL33_DEFCFG4}/*`; do
		temp_file=`basename $file`
		#echo "$temp_file"
		temp_file=${temp_file%_*}
		echo "          ${temp_file}"
	done

	customer_folder1="${BL33_PATH1}/customer/board/defconfigs"
	customer_folder2="${BL33_PATH2}/customer/board/defconfigs"
	if [ -e ${customer_folder1} ]; then
		echo "      ******Customer Configs******"
		for file in ${customer_folder1}/*; do
			temp_file=`basename $file`
			temp_file=${temp_file%_*}
			echo "          ${temp_file}"
		done
	fi
	if [ -e ${customer_folder2} ]; then
		for file in ${customer_folder2}/*; do
			temp_file=`basename $file`
			temp_file=${temp_file%_*}
			echo "          ${temp_file}"
		done
	fi

	echo "      ***************************"
}

function copy_bl33() {
	if [ "y" != "${CONFIG_AB_UPDATE}" ]; then
		cp ${BL33_BUILD_FOLDER}/u-boot.bin ${FIP_BUILD_FOLDER}bl33.bin -f
	fi

	# remove src link to prevent android "File system loop detected" issue
	#cd ${UBOOT_SRC_FOLDER}/build/
	#rm source
	cd ${MAIN_FOLDER}
}
