xref: /rk3399_rockchip-uboot/scripts/fit.sh (revision f269c7e952a4c0e2ab4c185d34d2479944c4e33b)
1ae33e311SJoseph Chen#!/bin/bash
2ae33e311SJoseph Chen#
3ae33e311SJoseph Chen# Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd
4ae33e311SJoseph Chen#
5ae33e311SJoseph Chen# SPDX-License-Identifier: GPL-2.0
6ae33e311SJoseph Chen#
7ae33e311SJoseph Chenset -e
8ae33e311SJoseph Chen
9ae33e311SJoseph ChenFIT_DIR="fit"
10ae33e311SJoseph ChenIMG_UBOOT="uboot.img"
11ae33e311SJoseph ChenIMG_BOOT="boot.img"
12ae33e311SJoseph ChenITB_UBOOT="${FIT_DIR}/uboot.itb"
13ae33e311SJoseph ChenITB_BOOT="${FIT_DIR}/boot.itb"
14ae33e311SJoseph ChenSIG_BIN="data2sign.bin"
15ae33e311SJoseph ChenSIG_UBOOT="${FIT_DIR}/uboot.data2sign"
16ae33e311SJoseph ChenSIG_BOOT="${FIT_DIR}/boot.data2sign"
17ae33e311SJoseph Chen# offs
18ae33e311SJoseph ChenOFFS_NS_UBOOT="0xa00"
19ae33e311SJoseph ChenOFFS_S_UBOOT="0xc00"
20ae33e311SJoseph ChenOFFS_NS_BOOT="0x800"
21ae33e311SJoseph ChenOFFS_S_BOOT="0xc00"
22ae33e311SJoseph Chen# file
23ae33e311SJoseph ChenCHIP_FILE="arch/arm/lib/.asm-offsets.s.cmd"
24ae33e311SJoseph Chen# placeholder address
25ae33e311SJoseph ChenFDT_ADDR_PLACEHOLDER="0xffffff00"
26ae33e311SJoseph ChenKERNEL_ADDR_PLACEHOLDER="0xffffff01"
27ae33e311SJoseph ChenRAMDISK_ADDR_PLACEHOLDER="0xffffff02"
28ae33e311SJoseph Chen# tools
29ae33e311SJoseph ChenMKIMAGE="./tools/mkimage"
30ae33e311SJoseph ChenFIT_UNPACK="./scripts/fit-unpack.sh"
31ae33e311SJoseph ChenCHECK_SIGN="./tools/fit_check_sign"
32ae33e311SJoseph Chen# key
33ae33e311SJoseph ChenKEY_DIR="keys/"
34ae33e311SJoseph ChenRSA_PRI_KEY="keys/dev.key"
35ae33e311SJoseph ChenRSA_PUB_KEY="keys/dev.crt"
36ae33e311SJoseph ChenSIGNATURE_KEY_NODE="/signature/key-dev"
37ae33e311SJoseph ChenSPL_DTB="spl/u-boot-spl.dtb"
38ae33e311SJoseph ChenUBOOT_DTB="u-boot.dtb"
39ae33e311SJoseph Chen# its
40ae33e311SJoseph ChenITS_UBOOT="u-boot.its"
41ae33e311SJoseph ChenITS_BOOT="boot.its"
42ae33e311SJoseph ChenARG_VER_UBOOT="0"
43ae33e311SJoseph ChenARG_VER_BOOT="0"
44ae33e311SJoseph Chen
45ae33e311SJoseph Chenfunction help()
46ae33e311SJoseph Chen{
47ae33e311SJoseph Chen	echo
48ae33e311SJoseph Chen	echo "usage:"
49ae33e311SJoseph Chen	echo "    $0 [args]"
50ae33e311SJoseph Chen	echo
51ae33e311SJoseph Chen	echo "args:"
52ae33e311SJoseph Chen	echo "    --rollback-index-boot   <decimal integer>"
53ae33e311SJoseph Chen	echo "    --rollback-index-uboot  <decimal integer>"
54ae33e311SJoseph Chen	echo "    --version-uboot         <decimal integer>"
55ae33e311SJoseph Chen	echo "    --version-boot          <decimal integer>"
56ae33e311SJoseph Chen	echo "    --ini-trust"
57ae33e311SJoseph Chen	echo "    --ini-loader"
58ae33e311SJoseph Chen	echo "    --no-check"
59ae33e311SJoseph Chen	echo "    --spl-new"
60ae33e311SJoseph Chen	echo "    --boot_img"
612d11b868SJoseph Chen	echo "    --args"
62ae33e311SJoseph Chen	echo
63ae33e311SJoseph Chen}
64ae33e311SJoseph Chen
65ae33e311SJoseph Chenfunction arg_check_decimal()
66ae33e311SJoseph Chen{
67ae33e311SJoseph Chen	if [ -z $1 ]; then
68ae33e311SJoseph Chen		help
69ae33e311SJoseph Chen		exit 1
70ae33e311SJoseph Chen	fi
71ae33e311SJoseph Chen
72ae33e311SJoseph Chen	decimal=`echo $1 |sed 's/[0-9]//g'`
73ae33e311SJoseph Chen	if [ ! -z ${decimal} ]; then
74ae33e311SJoseph Chen		echo "ERROR: $1 is not decimal integer"
75ae33e311SJoseph Chen		help
76ae33e311SJoseph Chen		exit 1
77ae33e311SJoseph Chen	fi
78ae33e311SJoseph Chen}
79ae33e311SJoseph Chen
80ae33e311SJoseph Chenfunction check_its()
81ae33e311SJoseph Chen{
82ae33e311SJoseph Chen	cat $1 | while read line
83ae33e311SJoseph Chen	do
84ae33e311SJoseph Chen		file=`echo ${line} | sed -n "/incbin/p" | awk -F '"' '{ printf $2 }' | tr -d ' '`
85ae33e311SJoseph Chen		if [ ! -f ${file} ]; then
86ae33e311SJoseph Chen			echo "ERROR: No ${file}"
87ae33e311SJoseph Chen			exit 1
88ae33e311SJoseph Chen		fi
89ae33e311SJoseph Chen	done
90ae33e311SJoseph Chen}
91ae33e311SJoseph Chen
92ae33e311SJoseph Chenfunction validate_arg()
93ae33e311SJoseph Chen{
94ae33e311SJoseph Chen	case $1 in
9514aa40ffSJoseph Chen		--no-check|--spl-new|--burn-key-hash)
96ae33e311SJoseph Chen			shift=1
97ae33e311SJoseph Chen			;;
98ae33e311SJoseph Chen		--ini-trust|--ini-loader|--rollback-index-boot|--rollback-index-uboot|--boot_img|--version-uboot|--version-boot)
99ae33e311SJoseph Chen			shift=2
100ae33e311SJoseph Chen			;;
101ae33e311SJoseph Chen		*)
102ae33e311SJoseph Chen			shift=0
103ae33e311SJoseph Chen			;;
104ae33e311SJoseph Chen	esac
105ae33e311SJoseph Chen	echo ${shift}
106ae33e311SJoseph Chen}
107ae33e311SJoseph Chen
108ae33e311SJoseph Chenfunction fit_process_args()
109ae33e311SJoseph Chen{
110ae33e311SJoseph Chen	if [ $# -eq 0 ]; then
111ae33e311SJoseph Chen		help
112ae33e311SJoseph Chen		exit 0
113ae33e311SJoseph Chen	fi
114ae33e311SJoseph Chen
115ae33e311SJoseph Chen	while [ $# -gt 0 ]; do
116ae33e311SJoseph Chen		case $1 in
1172d11b868SJoseph Chen			--args)
118ae33e311SJoseph Chen				ARG_VALIDATE=$2
119ae33e311SJoseph Chen				shift 2
120ae33e311SJoseph Chen				;;
1212d11b868SJoseph Chen			--boot_img)     # boot.img
1222d11b868SJoseph Chen				ARG_BOOT_IMG=$2
1232d11b868SJoseph Chen				shift 2
124ae33e311SJoseph Chen				;;
1252d11b868SJoseph Chen			--boot_img_dir) # boot.img components directory
1262d11b868SJoseph Chen				ARG_BOOT_IMG_DIR=$2
1272d11b868SJoseph Chen				shift 2
128ae33e311SJoseph Chen				;;
129ae33e311SJoseph Chen			--no-check)     # No hostcc fit signature check
130ae33e311SJoseph Chen				ARG_NO_CHECK="y"
131ae33e311SJoseph Chen				shift 1
132ae33e311SJoseph Chen				;;
133ae33e311SJoseph Chen			--ini-trust)    # Assign trust ini file
134ae33e311SJoseph Chen				ARG_INI_TRUST=$2
135ae33e311SJoseph Chen				shift 2
136ae33e311SJoseph Chen				;;
137ae33e311SJoseph Chen			--ini-loader)   # Assign loader ini file
138ae33e311SJoseph Chen				ARG_INI_LOADER=$2
139ae33e311SJoseph Chen				shift 2
140ae33e311SJoseph Chen				;;
141ae33e311SJoseph Chen			--spl-new)      # Use current build u-boot-spl.bin to pack loader
142ae33e311SJoseph Chen				ARG_SPL_NEW="y"
143ae33e311SJoseph Chen				shift 1
144ae33e311SJoseph Chen				;;
145ae33e311SJoseph Chen			--rollback-index-boot)
146ae33e311SJoseph Chen				ARG_ROLLBACK_IDX_BOOT=$2
147ae33e311SJoseph Chen				arg_check_decimal $2
148ae33e311SJoseph Chen				shift 2
149ae33e311SJoseph Chen				;;
150ae33e311SJoseph Chen			--rollback-index-uboot)
151ae33e311SJoseph Chen				ARG_ROLLBACK_IDX_UBOOT=$2
152ae33e311SJoseph Chen				arg_check_decimal $2
153ae33e311SJoseph Chen				shift 2
154ae33e311SJoseph Chen				;;
155ae33e311SJoseph Chen			--version-uboot)
156ae33e311SJoseph Chen				ARG_VER_UBOOT=$2
157ae33e311SJoseph Chen				arg_check_decimal $2
158ae33e311SJoseph Chen				shift 2
159ae33e311SJoseph Chen				;;
160ae33e311SJoseph Chen			--version-boot)
161ae33e311SJoseph Chen				ARG_VER_BOOT=$2
162ae33e311SJoseph Chen				arg_check_decimal $2
163ae33e311SJoseph Chen				shift 2
164ae33e311SJoseph Chen				;;
16514aa40ffSJoseph Chen			--burn-key-hash)
16614aa40ffSJoseph Chen				ARG_BURN_KEY_HASH="y"
16714aa40ffSJoseph Chen				shift 1
16814aa40ffSJoseph Chen				;;
169ae33e311SJoseph Chen			*)
170ae33e311SJoseph Chen				help
171ae33e311SJoseph Chen				exit 1
172ae33e311SJoseph Chen				;;
173ae33e311SJoseph Chen		esac
174ae33e311SJoseph Chen	done
1752d11b868SJoseph Chen
1762d11b868SJoseph Chen	if grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then
1772d11b868SJoseph Chen		ARG_SIGN="y"
1782d11b868SJoseph Chen	fi
179ae33e311SJoseph Chen}
180ae33e311SJoseph Chen
1812d11b868SJoseph Chenfunction fit_raw_compile()
182ae33e311SJoseph Chen{
183ae33e311SJoseph Chen	# Verified-boot: should rebuild code but don't need to repack images.
1842d11b868SJoseph Chen	if [ "${ARG_SIGN}" == "y" ]; then
1852d11b868SJoseph Chen		./make.sh --raw-compile
186ae33e311SJoseph Chen	fi
1872d11b868SJoseph Chen	rm ${FIT_DIR} -rf && mkdir -p ${FIT_DIR}
188ae33e311SJoseph Chen}
189ae33e311SJoseph Chen
190ae33e311SJoseph Chenfunction fit_gen_uboot_itb()
191ae33e311SJoseph Chen{
192ae33e311SJoseph Chen	./make.sh itb ${ARG_INI_TRUST} >/dev/null 2>&1
193ae33e311SJoseph Chen	check_its ${ITS_UBOOT}
194ae33e311SJoseph Chen
1952d11b868SJoseph Chen	if [ "${ARG_SIGN}" != "y" ]; then
196ae33e311SJoseph Chen		${MKIMAGE} -f ${ITS_UBOOT} -E -p ${OFFS_NS_UBOOT} ${ITB_UBOOT} -v ${ARG_VER_UBOOT}
197ae33e311SJoseph Chen		if [ "${ARG_SPL_NEW}" == "y" ]; then
198ae33e311SJoseph Chen			./make.sh --spl ${ARG_INI_LOADER}
199ae33e311SJoseph Chen			echo "pack loader with new: spl/u-boot-spl.bin"
200ae33e311SJoseph Chen		else
201ae33e311SJoseph Chen			./make.sh loader ${ARG_INI_LOADER}
202ae33e311SJoseph Chen		fi
203ae33e311SJoseph Chen	else
204ae33e311SJoseph Chen		if [ ! -f ${RSA_PRI_KEY} ]; then
205ae33e311SJoseph Chen			echo "ERROR: No ${RSA_PRI_KEY} "
206ae33e311SJoseph Chen			exit 1
207ae33e311SJoseph Chen		elif [ ! -f ${RSA_PUB_KEY} ]; then
208ae33e311SJoseph Chen			echo "ERROR: No ${RSA_PUB_KEY} "
209ae33e311SJoseph Chen			exit 1
210ae33e311SJoseph Chen		fi
211ae33e311SJoseph Chen
212ae33e311SJoseph Chen		if ! grep -q '^CONFIG_SPL_FIT_SIGNATURE=y' .config ; then
213ae33e311SJoseph Chen			echo "ERROR: CONFIG_SPL_FIT_SIGNATURE is disabled"
214ae33e311SJoseph Chen			exit 1
215ae33e311SJoseph Chen		fi
216ae33e311SJoseph Chen
21741290645SJoseph Chen		# rollback-index
218ae33e311SJoseph Chen		if grep -q '^CONFIG_SPL_FIT_ROLLBACK_PROTECT=y' .config ; then
219ae33e311SJoseph Chen			ARG_SPL_ROLLBACK_PROTECT="y"
220ae33e311SJoseph Chen			if [ -z ${ARG_ROLLBACK_IDX_UBOOT} ]; then
221ae33e311SJoseph Chen				echo "ERROR: No arg \"--rollback-index-uboot <n>\""
222ae33e311SJoseph Chen				exit 1
223ae33e311SJoseph Chen			fi
224ae33e311SJoseph Chen		fi
225ae33e311SJoseph Chen
226ae33e311SJoseph Chen		if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then
22741290645SJoseph Chen			VERSION=`grep 'rollback-index' ${ITS_UBOOT} | awk -F '=' '{ printf $2 }' | tr -d ' '`
22841290645SJoseph Chen			sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX_UBOOT}>;/g" ${ITS_UBOOT}
229ae33e311SJoseph Chen		fi
230ae33e311SJoseph Chen
23114aa40ffSJoseph Chen		# burn-key-hash
23214aa40ffSJoseph Chen		if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then
23314aa40ffSJoseph Chen			sed -i "s/burn-key-hash = <0>;/burn-key-hash = <1>;/g" ${ITS_UBOOT}
23414aa40ffSJoseph Chen		fi
23514aa40ffSJoseph Chen
236ae33e311SJoseph Chen		# u-boot.dtb must contains rsa key
237ae33e311SJoseph Chen		if ! fdtget -l ${UBOOT_DTB} /signature >/dev/null 2>&1 ; then
238ae33e311SJoseph Chen			${MKIMAGE} -f ${ITS_UBOOT} -k ${KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_S_UBOOT} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT}
2392d11b868SJoseph Chen			echo "## Adding RSA public key into ${UBOOT_DTB}"
240ae33e311SJoseph Chen		fi
241ae33e311SJoseph Chen
242ae33e311SJoseph Chen		# Pack
243ae33e311SJoseph Chen		${MKIMAGE} -f ${ITS_UBOOT} -k ${KEY_DIR} -K ${SPL_DTB} -E -p ${OFFS_S_UBOOT} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT}
244ae33e311SJoseph Chen		mv ${SIG_BIN} ${SIG_UBOOT}
245ae33e311SJoseph Chen
246ae33e311SJoseph Chen		# rollback-index read back check
247ae33e311SJoseph Chen		if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then
248ae33e311SJoseph Chen			VERSION=`fdtget -ti ${ITB_UBOOT} /configurations/conf rollback-index`
249ae33e311SJoseph Chen			if [ "${VERSION}" != "${ARG_ROLLBACK_IDX_UBOOT}" ]; then
250ae33e311SJoseph Chen				echo "ERROR: Failed to set rollback-index for ${ITB_UBOOT}";
251ae33e311SJoseph Chen				exit 1
252ae33e311SJoseph Chen			fi
253ae33e311SJoseph Chen		fi
254ae33e311SJoseph Chen
25514aa40ffSJoseph Chen		# burn-key-hash read back check
25614aa40ffSJoseph Chen		if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then
25714aa40ffSJoseph Chen			if [ "`fdtget -ti ${ITB_UBOOT} /configurations/conf burn-key-hash`" != "1" ]; then
25814aa40ffSJoseph Chen				echo "ERROR: Failed to set burn-key-hash for ${ITB_UBOOT}";
25914aa40ffSJoseph Chen				exit 1
26014aa40ffSJoseph Chen			fi
26114aa40ffSJoseph Chen		fi
26214aa40ffSJoseph Chen
263ae33e311SJoseph Chen		# host check signature
264ae33e311SJoseph Chen		if [ "${ARG_NO_CHECK}" != "y" ]; then
265ae33e311SJoseph Chen			if [ "${ARG_SPL_NEW}" == "y" ]; then
266ae33e311SJoseph Chen				 ${CHECK_SIGN} -f ${ITB_UBOOT} -k ${SPL_DTB} -s
267ae33e311SJoseph Chen			else
268ae33e311SJoseph Chen				spl_file="../rkbin/"`sed -n "/FlashBoot=/s/FlashBoot=//p" ${ARG_INI_LOADER}  |tr -d '\r'`
269ae33e311SJoseph Chen				offs=`fdtdump -s ${spl_file} | head -1 | awk -F ":" '{ print $2 }' | sed "s/ found fdt at offset //g" | tr -d " "`
270ae33e311SJoseph Chen				if [ -z ${offs}  ]; then
271ae33e311SJoseph Chen					echo "ERROR: invalid ${spl_file} , unable to find fdt blob"
272ae33e311SJoseph Chen				fi
273ae33e311SJoseph Chen				offs=`printf %d ${offs} ` # hex -> dec
274ae33e311SJoseph Chen				dd if=${spl_file} of=spl/u-boot-spl-old.dtb bs=${offs} skip=1 >/dev/null 2>&1
275ae33e311SJoseph Chen				${CHECK_SIGN} -f ${ITB_UBOOT} -k spl/u-boot-spl-old.dtb -s
276ae33e311SJoseph Chen			fi
277ae33e311SJoseph Chen		fi
278ae33e311SJoseph Chen
279ae33e311SJoseph Chen		# minimize u-boot-spl.dtb
280ae33e311SJoseph Chen		if grep -q '^CONFIG_SPL_FIT_HW_CRYPTO=y' .config ; then
281ae33e311SJoseph Chen			fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0
282ae33e311SJoseph Chen			if grep -q '^CONFIG_SPL_ROCKCHIP_CRYPTO_V1=y' .config ; then
283*f269c7e9SJoseph Chen				fdtput -d ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np
284ae33e311SJoseph Chen			else
285*f269c7e9SJoseph Chen				fdtput -d ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c
286ae33e311SJoseph Chen			fi
287ae33e311SJoseph Chen		else
288*f269c7e9SJoseph Chen			fdtput -d ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c
289*f269c7e9SJoseph Chen			fdtput -d ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np
290*f269c7e9SJoseph Chen			fdtput -d ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN
291ae33e311SJoseph Chen		fi
292ae33e311SJoseph Chen
293ae33e311SJoseph Chen		# repack spl
294ae33e311SJoseph Chen		rm -f *_loader_*.bin
295ae33e311SJoseph Chen		if [ "${ARG_SPL_NEW}" == "y" ]; then
296ae33e311SJoseph Chen			cat spl/u-boot-spl-nodtb.bin > spl/u-boot-spl.bin
297ae33e311SJoseph Chen			if ! grep -q '^CONFIG_SPL_SEPARATE_BSS=y' .config ; then
298ae33e311SJoseph Chen				cat spl/u-boot-spl-pad.bin >> spl/u-boot-spl.bin
299ae33e311SJoseph Chen			fi
300ae33e311SJoseph Chen			cat ${SPL_DTB} >> spl/u-boot-spl.bin
301ae33e311SJoseph Chen
302ae33e311SJoseph Chen			./make.sh --spl ${ARG_INI_LOADER}
303ae33e311SJoseph Chen			echo "pack loader with new: spl/u-boot-spl.bin"
304ae33e311SJoseph Chen		else
305ae33e311SJoseph Chen			./make.sh loader ${ARG_INI_LOADER}
306ae33e311SJoseph Chen		fi
307ae33e311SJoseph Chen	fi
308ae33e311SJoseph Chen
309ae33e311SJoseph Chen	rm -f u-boot.itb u-boot.img u-boot-dtb.img
310ae33e311SJoseph Chen	mv ${ITS_UBOOT} ${FIT_DIR}
311ae33e311SJoseph Chen}
312ae33e311SJoseph Chen
313ae33e311SJoseph Chenfunction fit_gen_boot_itb()
314ae33e311SJoseph Chen{
3152d11b868SJoseph Chen	if [ ! -z ${ARG_BOOT_IMG} ]; then
3162d11b868SJoseph Chen		${FIT_UNPACK} -f ${ARG_BOOT_IMG} -o ${FIT_DIR}/unpack
317ae33e311SJoseph Chen		ITS_BOOT="${FIT_DIR}/unpack/image.its"
318ae33e311SJoseph Chen	else
319ae33e311SJoseph Chen		compression=`awk -F"," '/COMPRESSION=/  { printf $1 }' ${ARG_INI_TRUST} | tr -d ' ' | cut -c 13-`
320ae33e311SJoseph Chen		if [ -z "${compression}" ]; then
321ae33e311SJoseph Chen			compression="none"
322ae33e311SJoseph Chen		fi
323ae33e311SJoseph Chen		./arch/arm/mach-rockchip/make_fit_boot.sh -c ${compression} > ${ITS_BOOT}
324ae33e311SJoseph Chen		check_its ${ITS_BOOT}
325ae33e311SJoseph Chen	fi
326ae33e311SJoseph Chen
3272d11b868SJoseph Chen	if [ "${ARG_SIGN}" != "y" ]; then
328ae33e311SJoseph Chen		${MKIMAGE} -f ${ITS_BOOT} -E -p ${OFFS_NS_BOOT} ${ITB_BOOT} -v ${ARG_VER_BOOT}
329ae33e311SJoseph Chen	else
330ae33e311SJoseph Chen		if [ ! -f ${RSA_PRI_KEY}  ]; then
331ae33e311SJoseph Chen			echo "ERROR: No ${RSA_PRI_KEY}"
332ae33e311SJoseph Chen			exit 1
333ae33e311SJoseph Chen		elif [ ! -f ${RSA_PUB_KEY}  ]; then
334ae33e311SJoseph Chen			echo "ERROR: No ${RSA_PUB_KEY}"
335ae33e311SJoseph Chen			exit 1
336ae33e311SJoseph Chen		fi
337ae33e311SJoseph Chen
338ae33e311SJoseph Chen		if ! grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then
339ae33e311SJoseph Chen			echo "ERROR: CONFIG_FIT_SIGNATURE is disabled"
340ae33e311SJoseph Chen			exit 1
341ae33e311SJoseph Chen		fi
342ae33e311SJoseph Chen
343ae33e311SJoseph Chen		if grep -q '^CONFIG_FIT_ROLLBACK_PROTECT=y' .config ; then
344ae33e311SJoseph Chen			ARG_ROLLBACK_PROTECT="y"
345ae33e311SJoseph Chen			if [ -z ${ARG_ROLLBACK_IDX_BOOT} ]; then
346ae33e311SJoseph Chen				echo "ERROR: No arg \"--rollback-index-boot <n>\""
347ae33e311SJoseph Chen				exit 1
348ae33e311SJoseph Chen			fi
349ae33e311SJoseph Chen		fi
350ae33e311SJoseph Chen
351ae33e311SJoseph Chen		# fixup
352ae33e311SJoseph Chen		COMMON_FILE=`sed -n "/_common.h/p" ${CHIP_FILE} | awk '{ print $1 }'`
353ae33e311SJoseph Chen		FDT_ADDR_R=`awk /fdt_addr_r/         ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
354ae33e311SJoseph Chen		KERNEL_ADDR_R=`awk /kernel_addr_r/   ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
355ae33e311SJoseph Chen		RMADISK_ADDR_R=`awk /ramdisk_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'`
356ae33e311SJoseph Chen		sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g"         ${ITS_BOOT}
357ae33e311SJoseph Chen		sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g"   ${ITS_BOOT}
358ae33e311SJoseph Chen		sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RMADISK_ADDR_R}/g" ${ITS_BOOT}
359ae33e311SJoseph Chen		if grep -q '^CONFIG_ARM64=y' .config ; then
360ae33e311SJoseph Chen			sed -i 's/arch = "arm";/arch = "arm64";/g' ${ITS_BOOT}
361ae33e311SJoseph Chen		fi
362ae33e311SJoseph Chen
363ae33e311SJoseph Chen		if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then
36441290645SJoseph Chen			VERSION=`grep 'rollback-index' ${ITS_BOOT} | awk -F '=' '{ printf $2 }' | tr -d ' '`
36541290645SJoseph Chen			sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX_BOOT}>;/g" ${ITS_BOOT}
366ae33e311SJoseph Chen		fi
367ae33e311SJoseph Chen
368ae33e311SJoseph Chen		${MKIMAGE} -f ${ITS_BOOT} -k ${KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_S_BOOT} -r ${ITB_BOOT} -v ${ARG_VER_BOOT}
369ae33e311SJoseph Chen		mv ${SIG_BIN} ${SIG_BOOT}
370ae33e311SJoseph Chen
371ae33e311SJoseph Chen		# rollback-index read back check
372ae33e311SJoseph Chen		if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then
373ae33e311SJoseph Chen			VERSION=`fdtget -ti ${ITB_BOOT} /configurations/conf rollback-index`
374ae33e311SJoseph Chen			if [ "${VERSION}" != "${ARG_ROLLBACK_IDX_BOOT}" ]; then
375ae33e311SJoseph Chen				echo "ERROR: Failed to set rollback-index for ${ITB_BOOT}";
376ae33e311SJoseph Chen				exit 1
377ae33e311SJoseph Chen			fi
378ae33e311SJoseph Chen		fi
379ae33e311SJoseph Chen
380ae33e311SJoseph Chen		if [ "${ARG_NO_CHECK}" != "y" ]; then
381ae33e311SJoseph Chen			 ${CHECK_SIGN} -f ${ITB_BOOT} -k ${UBOOT_DTB}
382ae33e311SJoseph Chen		fi
383ae33e311SJoseph Chen
384ae33e311SJoseph Chen		# minimize u-boot.dtb
385ae33e311SJoseph Chen		if grep -q '^CONFIG_FIT_HW_CRYPTO=y' .config ; then
386ae33e311SJoseph Chen			fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0
387ae33e311SJoseph Chen			if grep -q '^CONFIG_ROCKCHIP_CRYPTO_V1=y' .config ; then
388*f269c7e9SJoseph Chen				fdtput -d ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np
389ae33e311SJoseph Chen			else
390*f269c7e9SJoseph Chen				fdtput -d ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c
391ae33e311SJoseph Chen			fi
392ae33e311SJoseph Chen		else
393*f269c7e9SJoseph Chen			fdtput -d ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c
394*f269c7e9SJoseph Chen			fdtput -d ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np
395*f269c7e9SJoseph Chen			fdtput -d ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN
396ae33e311SJoseph Chen		fi
397ae33e311SJoseph Chen	fi
398ae33e311SJoseph Chen
399ae33e311SJoseph Chen	mv ${ITS_BOOT} ${FIT_DIR}
400ae33e311SJoseph Chen}
401ae33e311SJoseph Chen
402ae33e311SJoseph Chenfunction fit_gen_uboot_img()
403ae33e311SJoseph Chen{
404ae33e311SJoseph Chen	ITB=$1
405ae33e311SJoseph Chen
406ae33e311SJoseph Chen	if [ -z ${ITB} ]; then
407ae33e311SJoseph Chen		ITB=${ITB_UBOOT}
408ae33e311SJoseph Chen	fi
409ae33e311SJoseph Chen
410ae33e311SJoseph Chen	ITB_MAX_NUM=`sed -n "/SPL_FIT_IMAGE_MULTIPLE/p" .config | awk -F "=" '{ print $2 }'`
411ae33e311SJoseph Chen	ITB_MAX_KB=`sed  -n "/SPL_FIT_IMAGE_KB/p" .config | awk -F "=" '{ print $2 }'`
412ae33e311SJoseph Chen	ITB_MAX_BS=$((ITB_MAX_KB*1024))
413ae33e311SJoseph Chen	ITB_BS=`ls -l ${ITB} | awk '{ print $5 }'`
414ae33e311SJoseph Chen
415ae33e311SJoseph Chen	if [ ${ITB_BS} -gt ${ITB_MAX_BS} ]; then
416ae33e311SJoseph Chen		echo "ERROR: pack ${IMG_UBOOT} failed! ${ITB} actual: ${ITB_BS} bytes, max limit: ${ITB_MAX_BS} bytes"
417ae33e311SJoseph Chen		exit 1
418ae33e311SJoseph Chen	fi
419ae33e311SJoseph Chen
420ae33e311SJoseph Chen	rm -f ${IMG_UBOOT}
421ae33e311SJoseph Chen	for ((i = 0; i < ${ITB_MAX_NUM}; i++));
422ae33e311SJoseph Chen	do
423ae33e311SJoseph Chen		cat ${ITB} >> ${IMG_UBOOT}
424ae33e311SJoseph Chen		truncate -s %${ITB_MAX_KB}K ${IMG_UBOOT}
425ae33e311SJoseph Chen	done
426ae33e311SJoseph Chen}
427ae33e311SJoseph Chen
428ae33e311SJoseph Chenfunction fit_gen_boot_img()
429ae33e311SJoseph Chen{
430ae33e311SJoseph Chen	ITB=$1
431ae33e311SJoseph Chen
432ae33e311SJoseph Chen	if [ -z ${ITB} ]; then
433ae33e311SJoseph Chen		ITB=${ITB_BOOT}
434ae33e311SJoseph Chen	fi
435ae33e311SJoseph Chen
436ae33e311SJoseph Chen	if [ "${ITB}" != "${IMG_BOOT}" ]; then
437ae33e311SJoseph Chen		cp ${ITB} ${IMG_BOOT} -f
438ae33e311SJoseph Chen	fi
439ae33e311SJoseph Chen}
440ae33e311SJoseph Chen
441ae33e311SJoseph Chenfunction fit_msg_uboot()
442ae33e311SJoseph Chen{
4432d11b868SJoseph Chen	if [ "${ARG_SIGN}" != "y" ]; then
444ae33e311SJoseph Chen		MSG_SIGN="no-signed"
445ae33e311SJoseph Chen	else
446ae33e311SJoseph Chen		MSG_SIGN="signed"
447ae33e311SJoseph Chen	fi
448ae33e311SJoseph Chen
449ae33e311SJoseph Chen	VERSION=`fdtget -ti ${ITB_UBOOT} / version`
450ae33e311SJoseph Chen	if [ "${VERSION}" != "" ]; then
451ae33e311SJoseph Chen		MSG_VER=", version=${VERSION}"
452ae33e311SJoseph Chen	fi
453ae33e311SJoseph Chen
45414aa40ffSJoseph Chen	if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then
45514aa40ffSJoseph Chen		echo "uboot.img: burn-key-hash=1"
45614aa40ffSJoseph Chen		echo
45714aa40ffSJoseph Chen	fi
45814aa40ffSJoseph Chen
459ae33e311SJoseph Chen	if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then
460ae33e311SJoseph Chen		echo "Image(${MSG_SIGN}${MSG_VER}, rollback-index=${ARG_ROLLBACK_IDX_UBOOT}):  ${IMG_UBOOT} (with uboot, trust...) is ready"
461ae33e311SJoseph Chen	else
462ae33e311SJoseph Chen		echo "Image(${MSG_SIGN}${MSG_VER}):  ${IMG_UBOOT} (FIT with uboot, trust...) is ready"
463ae33e311SJoseph Chen	fi
464ae33e311SJoseph Chen}
465ae33e311SJoseph Chen
466ae33e311SJoseph Chenfunction fit_msg_boot()
467ae33e311SJoseph Chen{
4682d11b868SJoseph Chen	if [ "${ARG_SIGN}" != "y" ]; then
469ae33e311SJoseph Chen		MSG_SIGN="no-signed"
470ae33e311SJoseph Chen	else
471ae33e311SJoseph Chen		MSG_SIGN="signed"
472ae33e311SJoseph Chen	fi
473ae33e311SJoseph Chen
474ae33e311SJoseph Chen	VERSION=`fdtget -ti ${ITB_BOOT} / version`
475ae33e311SJoseph Chen	if [ "${VERSION}" != "" ]; then
476ae33e311SJoseph Chen		MSG_VER=", version=${VERSION}"
477ae33e311SJoseph Chen	fi
478ae33e311SJoseph Chen
479ae33e311SJoseph Chen	if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then
480ae33e311SJoseph Chen		echo "Image(${MSG_SIGN}${MSG_VER}, rollback-index=${ARG_ROLLBACK_IDX_BOOT}):  ${IMG_BOOT} is ready"
481ae33e311SJoseph Chen	else
482ae33e311SJoseph Chen		echo "Image(${MSG_SIGN}${MSG_VER}):  ${IMG_BOOT} (FIT with kernel, fdt, resource...) is ready"
483ae33e311SJoseph Chen	fi
484ae33e311SJoseph Chen}
485ae33e311SJoseph Chen
486ae33e311SJoseph Chenfunction fit_msg_loader()
487ae33e311SJoseph Chen{
488ae33e311SJoseph Chen	LOADER=`ls *loader*.bin`
489ae33e311SJoseph Chen	echo "Image(no-signed):  ${LOADER} (with spl, ddr, usbplug) is ready"
490ae33e311SJoseph Chen}
491ae33e311SJoseph Chen
4922d11b868SJoseph Chenfunction fit_generate_uboot()
493ae33e311SJoseph Chen{
4942d11b868SJoseph Chen	fit_raw_compile
495ae33e311SJoseph Chen	fit_gen_uboot_itb
496ae33e311SJoseph Chen	fit_gen_uboot_img
497ae33e311SJoseph Chen	echo
498ae33e311SJoseph Chen	fit_msg_uboot
499ae33e311SJoseph Chen}
500ae33e311SJoseph Chen
5012d11b868SJoseph Chenfunction fit_generate_uboot_boot()
502ae33e311SJoseph Chen{
5032d11b868SJoseph Chen	fit_raw_compile
504ae33e311SJoseph Chen	fit_gen_boot_itb
505ae33e311SJoseph Chen	fit_gen_boot_img
506ae33e311SJoseph Chen	fit_gen_uboot_itb
507ae33e311SJoseph Chen	fit_gen_uboot_img
508ae33e311SJoseph Chen	echo
509ae33e311SJoseph Chen
510ae33e311SJoseph Chen	fit_msg_uboot
511ae33e311SJoseph Chen	fit_msg_boot
512ae33e311SJoseph Chen	fit_msg_loader
513ae33e311SJoseph Chen	echo
514ae33e311SJoseph Chen}
515ae33e311SJoseph Chen
516ae33e311SJoseph Chenfit_process_args $*
517ae33e311SJoseph Chenif [ ! -z "${ARG_VALIDATE}" ]; then
518ae33e311SJoseph Chen	validate_arg ${ARG_VALIDATE}
519d6babb00SJoseph Chenelif [ ! -z "${ARG_BOOT_IMG}" -o ! -z "${ARG_BOOT_IMG_DIR}" ]; then
5202d11b868SJoseph Chen	fit_generate_uboot_boot
5212d11b868SJoseph Chenelse
5222d11b868SJoseph Chen	fit_generate_uboot
523ae33e311SJoseph Chenfi
524ae33e311SJoseph Chen
525