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 1833e46123SJoseph ChenOFFS_NS_UBOOT="0xc00" 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{ 192*374d2596SJoseph Chen # generate u-boot.its file 193173a9307SJoseph Chen ./make.sh itb ${ARG_INI_TRUST} 194*374d2596SJoseph Chen 195*374d2596SJoseph Chen # check existance of file in its 196ae33e311SJoseph Chen check_its ${ITS_UBOOT} 197ae33e311SJoseph Chen 1982d11b868SJoseph Chen if [ "${ARG_SIGN}" != "y" ]; then 199ae33e311SJoseph Chen ${MKIMAGE} -f ${ITS_UBOOT} -E -p ${OFFS_NS_UBOOT} ${ITB_UBOOT} -v ${ARG_VER_UBOOT} 200ae33e311SJoseph Chen if [ "${ARG_SPL_NEW}" == "y" ]; then 201ae33e311SJoseph Chen ./make.sh --spl ${ARG_INI_LOADER} 202ae33e311SJoseph Chen echo "pack loader with new: spl/u-boot-spl.bin" 203ae33e311SJoseph Chen else 204ae33e311SJoseph Chen ./make.sh loader ${ARG_INI_LOADER} 205ae33e311SJoseph Chen fi 206ae33e311SJoseph Chen else 207ae33e311SJoseph Chen if [ ! -f ${RSA_PRI_KEY} ]; then 208ae33e311SJoseph Chen echo "ERROR: No ${RSA_PRI_KEY} " 209ae33e311SJoseph Chen exit 1 210ae33e311SJoseph Chen elif [ ! -f ${RSA_PUB_KEY} ]; then 211ae33e311SJoseph Chen echo "ERROR: No ${RSA_PUB_KEY} " 212ae33e311SJoseph Chen exit 1 213ae33e311SJoseph Chen fi 214ae33e311SJoseph Chen 215ae33e311SJoseph Chen if ! grep -q '^CONFIG_SPL_FIT_SIGNATURE=y' .config ; then 216ae33e311SJoseph Chen echo "ERROR: CONFIG_SPL_FIT_SIGNATURE is disabled" 217ae33e311SJoseph Chen exit 1 218ae33e311SJoseph Chen fi 219ae33e311SJoseph Chen 22041290645SJoseph Chen # rollback-index 221ae33e311SJoseph Chen if grep -q '^CONFIG_SPL_FIT_ROLLBACK_PROTECT=y' .config ; then 222ae33e311SJoseph Chen ARG_SPL_ROLLBACK_PROTECT="y" 223ae33e311SJoseph Chen if [ -z ${ARG_ROLLBACK_IDX_UBOOT} ]; then 224ae33e311SJoseph Chen echo "ERROR: No arg \"--rollback-index-uboot <n>\"" 225ae33e311SJoseph Chen exit 1 226ae33e311SJoseph Chen fi 227ae33e311SJoseph Chen fi 228ae33e311SJoseph Chen 229ae33e311SJoseph Chen if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then 23041290645SJoseph Chen VERSION=`grep 'rollback-index' ${ITS_UBOOT} | awk -F '=' '{ printf $2 }' | tr -d ' '` 23141290645SJoseph Chen sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX_UBOOT}>;/g" ${ITS_UBOOT} 232ae33e311SJoseph Chen fi 233ae33e311SJoseph Chen 234*374d2596SJoseph Chen # Generally, boot.img is signed before uboot.img, so the ras key can be found 235*374d2596SJoseph Chen # in u-boot.dtb. If not found, let's insert rsa key anyway. 236ae33e311SJoseph Chen if ! fdtget -l ${UBOOT_DTB} /signature >/dev/null 2>&1 ; then 237ae33e311SJoseph Chen ${MKIMAGE} -f ${ITS_UBOOT} -k ${KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_S_UBOOT} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT} 2382d11b868SJoseph Chen echo "## Adding RSA public key into ${UBOOT_DTB}" 239ae33e311SJoseph Chen fi 240ae33e311SJoseph Chen 241ae33e311SJoseph Chen # Pack 242ae33e311SJoseph Chen ${MKIMAGE} -f ${ITS_UBOOT} -k ${KEY_DIR} -K ${SPL_DTB} -E -p ${OFFS_S_UBOOT} -r ${ITB_UBOOT} -v ${ARG_VER_UBOOT} 243ae33e311SJoseph Chen mv ${SIG_BIN} ${SIG_UBOOT} 244ae33e311SJoseph Chen 2458d853b06SJoseph Chen # burn-key-hash 2468d853b06SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 2478d853b06SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} burn-key-hash 0x1 2488d853b06SJoseph Chen fi 249*374d2596SJoseph Chen 250ae33e311SJoseph Chen # rollback-index read back check 251ae33e311SJoseph Chen if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then 252ae33e311SJoseph Chen VERSION=`fdtget -ti ${ITB_UBOOT} /configurations/conf rollback-index` 253ae33e311SJoseph Chen if [ "${VERSION}" != "${ARG_ROLLBACK_IDX_UBOOT}" ]; then 254ae33e311SJoseph Chen echo "ERROR: Failed to set rollback-index for ${ITB_UBOOT}"; 255ae33e311SJoseph Chen exit 1 256ae33e311SJoseph Chen fi 257ae33e311SJoseph Chen fi 258ae33e311SJoseph Chen 25914aa40ffSJoseph Chen # burn-key-hash read back check 26014aa40ffSJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 2618d853b06SJoseph Chen if [ "`fdtget -ti ${SPL_DTB} ${SIGNATURE_KEY_NODE} burn-key-hash`" != "1" ]; then 2628d853b06SJoseph Chen echo "ERROR: Failed to set burn-key-hash for ${SPL_DTB}"; 26314aa40ffSJoseph Chen exit 1 26414aa40ffSJoseph Chen fi 26514aa40ffSJoseph Chen fi 26614aa40ffSJoseph Chen 267ae33e311SJoseph Chen # host check signature 268ae33e311SJoseph Chen if [ "${ARG_NO_CHECK}" != "y" ]; then 269ae33e311SJoseph Chen if [ "${ARG_SPL_NEW}" == "y" ]; then 270ae33e311SJoseph Chen ${CHECK_SIGN} -f ${ITB_UBOOT} -k ${SPL_DTB} -s 271ae33e311SJoseph Chen else 272ae33e311SJoseph Chen spl_file="../rkbin/"`sed -n "/FlashBoot=/s/FlashBoot=//p" ${ARG_INI_LOADER} |tr -d '\r'` 273ae33e311SJoseph Chen offs=`fdtdump -s ${spl_file} | head -1 | awk -F ":" '{ print $2 }' | sed "s/ found fdt at offset //g" | tr -d " "` 274ae33e311SJoseph Chen if [ -z ${offs} ]; then 275ae33e311SJoseph Chen echo "ERROR: invalid ${spl_file} , unable to find fdt blob" 276ae33e311SJoseph Chen fi 277ae33e311SJoseph Chen offs=`printf %d ${offs} ` # hex -> dec 278ae33e311SJoseph Chen dd if=${spl_file} of=spl/u-boot-spl-old.dtb bs=${offs} skip=1 >/dev/null 2>&1 279ae33e311SJoseph Chen ${CHECK_SIGN} -f ${ITB_UBOOT} -k spl/u-boot-spl-old.dtb -s 280ae33e311SJoseph Chen fi 281ae33e311SJoseph Chen fi 282ae33e311SJoseph Chen 283*374d2596SJoseph Chen # minimize u-boot-spl.dtb: clear as 0 but not remove property. 284ae33e311SJoseph Chen if grep -q '^CONFIG_SPL_FIT_HW_CRYPTO=y' .config ; then 285ae33e311SJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0 286ae33e311SJoseph Chen if grep -q '^CONFIG_SPL_ROCKCHIP_CRYPTO_V1=y' .config ; then 287b800cd5aSJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 288134814e5SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@np 289ae33e311SJoseph Chen else 290b800cd5aSJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 291134814e5SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@c 292ae33e311SJoseph Chen fi 293ae33e311SJoseph Chen else 294b800cd5aSJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 295b800cd5aSJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 296b800cd5aSJoseph Chen fdtput -tx ${SPL_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN 0x0 297134814e5SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@c 298134814e5SJoseph Chen fdtput -r ${SPL_DTB} ${SIGNATURE_KEY_NODE}/hash@np 299ae33e311SJoseph Chen fi 300ae33e311SJoseph Chen 301ae33e311SJoseph Chen # repack spl 302ae33e311SJoseph Chen rm -f *_loader_*.bin 303ae33e311SJoseph Chen if [ "${ARG_SPL_NEW}" == "y" ]; then 304ae33e311SJoseph Chen cat spl/u-boot-spl-nodtb.bin > spl/u-boot-spl.bin 305ae33e311SJoseph Chen if ! grep -q '^CONFIG_SPL_SEPARATE_BSS=y' .config ; then 306ae33e311SJoseph Chen cat spl/u-boot-spl-pad.bin >> spl/u-boot-spl.bin 307ae33e311SJoseph Chen fi 308ae33e311SJoseph Chen cat ${SPL_DTB} >> spl/u-boot-spl.bin 309ae33e311SJoseph Chen 310ae33e311SJoseph Chen ./make.sh --spl ${ARG_INI_LOADER} 3118d853b06SJoseph Chen echo "## pack loader with new: spl/u-boot-spl.bin" 312ae33e311SJoseph Chen else 313ae33e311SJoseph Chen ./make.sh loader ${ARG_INI_LOADER} 314ae33e311SJoseph Chen fi 3158d853b06SJoseph Chen 3168d853b06SJoseph Chen if [ "${ARG_BURN_KEY_HASH}" == "y" ]; then 3178d853b06SJoseph Chen echo "## ${SPL_DTB}: burn-key-hash=1" 3188d853b06SJoseph Chen fi 319ae33e311SJoseph Chen fi 320ae33e311SJoseph Chen 321ae33e311SJoseph Chen rm -f u-boot.itb u-boot.img u-boot-dtb.img 322ae33e311SJoseph Chen mv ${ITS_UBOOT} ${FIT_DIR} 323ae33e311SJoseph Chen} 324ae33e311SJoseph Chen 325ae33e311SJoseph Chenfunction fit_gen_boot_itb() 326ae33e311SJoseph Chen{ 3272d11b868SJoseph Chen if [ ! -z ${ARG_BOOT_IMG} ]; then 3282d11b868SJoseph Chen ${FIT_UNPACK} -f ${ARG_BOOT_IMG} -o ${FIT_DIR}/unpack 329ae33e311SJoseph Chen ITS_BOOT="${FIT_DIR}/unpack/image.its" 330ae33e311SJoseph Chen else 331ae33e311SJoseph Chen compression=`awk -F"," '/COMPRESSION=/ { printf $1 }' ${ARG_INI_TRUST} | tr -d ' ' | cut -c 13-` 332ae33e311SJoseph Chen if [ -z "${compression}" ]; then 333ae33e311SJoseph Chen compression="none" 334ae33e311SJoseph Chen fi 335ae33e311SJoseph Chen ./arch/arm/mach-rockchip/make_fit_boot.sh -c ${compression} > ${ITS_BOOT} 336ae33e311SJoseph Chen check_its ${ITS_BOOT} 337ae33e311SJoseph Chen fi 338ae33e311SJoseph Chen 3392d11b868SJoseph Chen if [ "${ARG_SIGN}" != "y" ]; then 340ae33e311SJoseph Chen ${MKIMAGE} -f ${ITS_BOOT} -E -p ${OFFS_NS_BOOT} ${ITB_BOOT} -v ${ARG_VER_BOOT} 341ae33e311SJoseph Chen else 342ae33e311SJoseph Chen if [ ! -f ${RSA_PRI_KEY} ]; then 343ae33e311SJoseph Chen echo "ERROR: No ${RSA_PRI_KEY}" 344ae33e311SJoseph Chen exit 1 345ae33e311SJoseph Chen elif [ ! -f ${RSA_PUB_KEY} ]; then 346ae33e311SJoseph Chen echo "ERROR: No ${RSA_PUB_KEY}" 347ae33e311SJoseph Chen exit 1 348ae33e311SJoseph Chen fi 349ae33e311SJoseph Chen 350ae33e311SJoseph Chen if ! grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then 351ae33e311SJoseph Chen echo "ERROR: CONFIG_FIT_SIGNATURE is disabled" 352ae33e311SJoseph Chen exit 1 353ae33e311SJoseph Chen fi 354ae33e311SJoseph Chen 355ae33e311SJoseph Chen if grep -q '^CONFIG_FIT_ROLLBACK_PROTECT=y' .config ; then 356ae33e311SJoseph Chen ARG_ROLLBACK_PROTECT="y" 357ae33e311SJoseph Chen if [ -z ${ARG_ROLLBACK_IDX_BOOT} ]; then 358ae33e311SJoseph Chen echo "ERROR: No arg \"--rollback-index-boot <n>\"" 359ae33e311SJoseph Chen exit 1 360ae33e311SJoseph Chen fi 361ae33e311SJoseph Chen fi 362ae33e311SJoseph Chen 363ae33e311SJoseph Chen # fixup 364ae33e311SJoseph Chen COMMON_FILE=`sed -n "/_common.h/p" ${CHIP_FILE} | awk '{ print $1 }'` 365ae33e311SJoseph Chen FDT_ADDR_R=`awk /fdt_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` 366ae33e311SJoseph Chen KERNEL_ADDR_R=`awk /kernel_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` 367ae33e311SJoseph Chen RMADISK_ADDR_R=`awk /ramdisk_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` 368ae33e311SJoseph Chen sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g" ${ITS_BOOT} 369ae33e311SJoseph Chen sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g" ${ITS_BOOT} 370ae33e311SJoseph Chen sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RMADISK_ADDR_R}/g" ${ITS_BOOT} 371ae33e311SJoseph Chen if grep -q '^CONFIG_ARM64=y' .config ; then 372ae33e311SJoseph Chen sed -i 's/arch = "arm";/arch = "arm64";/g' ${ITS_BOOT} 373ae33e311SJoseph Chen fi 374ae33e311SJoseph Chen 375ae33e311SJoseph Chen if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then 37641290645SJoseph Chen VERSION=`grep 'rollback-index' ${ITS_BOOT} | awk -F '=' '{ printf $2 }' | tr -d ' '` 37741290645SJoseph Chen sed -i "s/rollback-index = ${VERSION}/rollback-index = <${ARG_ROLLBACK_IDX_BOOT}>;/g" ${ITS_BOOT} 378ae33e311SJoseph Chen fi 379ae33e311SJoseph Chen 380ae33e311SJoseph Chen ${MKIMAGE} -f ${ITS_BOOT} -k ${KEY_DIR} -K ${UBOOT_DTB} -E -p ${OFFS_S_BOOT} -r ${ITB_BOOT} -v ${ARG_VER_BOOT} 381ae33e311SJoseph Chen mv ${SIG_BIN} ${SIG_BOOT} 382ae33e311SJoseph Chen 383ae33e311SJoseph Chen # rollback-index read back check 384ae33e311SJoseph Chen if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then 385ae33e311SJoseph Chen VERSION=`fdtget -ti ${ITB_BOOT} /configurations/conf rollback-index` 386ae33e311SJoseph Chen if [ "${VERSION}" != "${ARG_ROLLBACK_IDX_BOOT}" ]; then 387ae33e311SJoseph Chen echo "ERROR: Failed to set rollback-index for ${ITB_BOOT}"; 388ae33e311SJoseph Chen exit 1 389ae33e311SJoseph Chen fi 390ae33e311SJoseph Chen fi 391ae33e311SJoseph Chen 392*374d2596SJoseph Chen # host check signature 393ae33e311SJoseph Chen if [ "${ARG_NO_CHECK}" != "y" ]; then 394ae33e311SJoseph Chen ${CHECK_SIGN} -f ${ITB_BOOT} -k ${UBOOT_DTB} 395ae33e311SJoseph Chen fi 396ae33e311SJoseph Chen 397*374d2596SJoseph Chen # minimize u-boot.dtb: clearn as 0 but not remove property. 398ae33e311SJoseph Chen if grep -q '^CONFIG_FIT_HW_CRYPTO=y' .config ; then 399ae33e311SJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,r-squared 0x0 400ae33e311SJoseph Chen if grep -q '^CONFIG_ROCKCHIP_CRYPTO_V1=y' .config ; then 401b800cd5aSJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 402ae33e311SJoseph Chen else 403b800cd5aSJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 404ae33e311SJoseph Chen fi 405ae33e311SJoseph Chen else 406b800cd5aSJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,c 0x0 407b800cd5aSJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,np 0x0 408b800cd5aSJoseph Chen fdtput -tx ${UBOOT_DTB} ${SIGNATURE_KEY_NODE} rsa,exponent-BN 0x0 409ae33e311SJoseph Chen fi 410134814e5SJoseph Chen fdtput -r ${UBOOT_DTB} ${SIGNATURE_KEY_NODE}/hash@c 411134814e5SJoseph Chen fdtput -r ${UBOOT_DTB} ${SIGNATURE_KEY_NODE}/hash@np 412ae33e311SJoseph Chen fi 413ae33e311SJoseph Chen 414ae33e311SJoseph Chen mv ${ITS_BOOT} ${FIT_DIR} 415ae33e311SJoseph Chen} 416ae33e311SJoseph Chen 417ae33e311SJoseph Chenfunction fit_gen_uboot_img() 418ae33e311SJoseph Chen{ 419ae33e311SJoseph Chen ITB=$1 420ae33e311SJoseph Chen 421ae33e311SJoseph Chen if [ -z ${ITB} ]; then 422ae33e311SJoseph Chen ITB=${ITB_UBOOT} 423ae33e311SJoseph Chen fi 424ae33e311SJoseph Chen 425ae33e311SJoseph Chen ITB_MAX_NUM=`sed -n "/SPL_FIT_IMAGE_MULTIPLE/p" .config | awk -F "=" '{ print $2 }'` 426ae33e311SJoseph Chen ITB_MAX_KB=`sed -n "/SPL_FIT_IMAGE_KB/p" .config | awk -F "=" '{ print $2 }'` 427ae33e311SJoseph Chen ITB_MAX_BS=$((ITB_MAX_KB*1024)) 428ae33e311SJoseph Chen ITB_BS=`ls -l ${ITB} | awk '{ print $5 }'` 429ae33e311SJoseph Chen 430ae33e311SJoseph Chen if [ ${ITB_BS} -gt ${ITB_MAX_BS} ]; then 431ae33e311SJoseph Chen echo "ERROR: pack ${IMG_UBOOT} failed! ${ITB} actual: ${ITB_BS} bytes, max limit: ${ITB_MAX_BS} bytes" 432ae33e311SJoseph Chen exit 1 433ae33e311SJoseph Chen fi 434ae33e311SJoseph Chen 435ae33e311SJoseph Chen rm -f ${IMG_UBOOT} 436ae33e311SJoseph Chen for ((i = 0; i < ${ITB_MAX_NUM}; i++)); 437ae33e311SJoseph Chen do 438ae33e311SJoseph Chen cat ${ITB} >> ${IMG_UBOOT} 439ae33e311SJoseph Chen truncate -s %${ITB_MAX_KB}K ${IMG_UBOOT} 440ae33e311SJoseph Chen done 441ae33e311SJoseph Chen} 442ae33e311SJoseph Chen 443ae33e311SJoseph Chenfunction fit_gen_boot_img() 444ae33e311SJoseph Chen{ 445ae33e311SJoseph Chen ITB=$1 446ae33e311SJoseph Chen 447ae33e311SJoseph Chen if [ -z ${ITB} ]; then 448ae33e311SJoseph Chen ITB=${ITB_BOOT} 449ae33e311SJoseph Chen fi 450ae33e311SJoseph Chen 451ae33e311SJoseph Chen if [ "${ITB}" != "${IMG_BOOT}" ]; then 452ae33e311SJoseph Chen cp ${ITB} ${IMG_BOOT} -f 453ae33e311SJoseph Chen fi 454ae33e311SJoseph Chen} 455ae33e311SJoseph Chen 456ae33e311SJoseph Chenfunction fit_msg_uboot() 457ae33e311SJoseph Chen{ 4582d11b868SJoseph Chen if [ "${ARG_SIGN}" != "y" ]; then 459ae33e311SJoseph Chen MSG_SIGN="no-signed" 460ae33e311SJoseph Chen else 461ae33e311SJoseph Chen MSG_SIGN="signed" 462ae33e311SJoseph Chen fi 463ae33e311SJoseph Chen 464ae33e311SJoseph Chen VERSION=`fdtget -ti ${ITB_UBOOT} / version` 465ae33e311SJoseph Chen if [ "${VERSION}" != "" ]; then 466ae33e311SJoseph Chen MSG_VER=", version=${VERSION}" 467ae33e311SJoseph Chen fi 468ae33e311SJoseph Chen 469ae33e311SJoseph Chen if [ "${ARG_SPL_ROLLBACK_PROTECT}" == "y" ]; then 470ae33e311SJoseph Chen echo "Image(${MSG_SIGN}${MSG_VER}, rollback-index=${ARG_ROLLBACK_IDX_UBOOT}): ${IMG_UBOOT} (with uboot, trust...) is ready" 471ae33e311SJoseph Chen else 472ae33e311SJoseph Chen echo "Image(${MSG_SIGN}${MSG_VER}): ${IMG_UBOOT} (FIT with uboot, trust...) is ready" 473ae33e311SJoseph Chen fi 474ae33e311SJoseph Chen} 475ae33e311SJoseph Chen 476ae33e311SJoseph Chenfunction fit_msg_boot() 477ae33e311SJoseph Chen{ 4782d11b868SJoseph Chen if [ "${ARG_SIGN}" != "y" ]; then 479ae33e311SJoseph Chen MSG_SIGN="no-signed" 480ae33e311SJoseph Chen else 481ae33e311SJoseph Chen MSG_SIGN="signed" 482ae33e311SJoseph Chen fi 483ae33e311SJoseph Chen 484ae33e311SJoseph Chen VERSION=`fdtget -ti ${ITB_BOOT} / version` 485ae33e311SJoseph Chen if [ "${VERSION}" != "" ]; then 486ae33e311SJoseph Chen MSG_VER=", version=${VERSION}" 487ae33e311SJoseph Chen fi 488ae33e311SJoseph Chen 489ae33e311SJoseph Chen if [ "${ARG_ROLLBACK_PROTECT}" == "y" ]; then 490ae33e311SJoseph Chen echo "Image(${MSG_SIGN}${MSG_VER}, rollback-index=${ARG_ROLLBACK_IDX_BOOT}): ${IMG_BOOT} is ready" 491ae33e311SJoseph Chen else 492ae33e311SJoseph Chen echo "Image(${MSG_SIGN}${MSG_VER}): ${IMG_BOOT} (FIT with kernel, fdt, resource...) is ready" 493ae33e311SJoseph Chen fi 494ae33e311SJoseph Chen} 495ae33e311SJoseph Chen 496ae33e311SJoseph Chenfunction fit_msg_loader() 497ae33e311SJoseph Chen{ 498ae33e311SJoseph Chen LOADER=`ls *loader*.bin` 499ae33e311SJoseph Chen echo "Image(no-signed): ${LOADER} (with spl, ddr, usbplug) is ready" 500ae33e311SJoseph Chen} 501ae33e311SJoseph Chen 5022d11b868SJoseph Chenfunction fit_generate_uboot() 503ae33e311SJoseph Chen{ 5042d11b868SJoseph Chen fit_raw_compile 505ae33e311SJoseph Chen fit_gen_uboot_itb 506ae33e311SJoseph Chen fit_gen_uboot_img 507ae33e311SJoseph Chen echo 508ae33e311SJoseph Chen fit_msg_uboot 509ae33e311SJoseph Chen} 510ae33e311SJoseph Chen 5112d11b868SJoseph Chenfunction fit_generate_uboot_boot() 512ae33e311SJoseph Chen{ 5132d11b868SJoseph Chen fit_raw_compile 514ae33e311SJoseph Chen fit_gen_boot_itb 515ae33e311SJoseph Chen fit_gen_boot_img 516ae33e311SJoseph Chen fit_gen_uboot_itb 517ae33e311SJoseph Chen fit_gen_uboot_img 518ae33e311SJoseph Chen echo 519ae33e311SJoseph Chen 520ae33e311SJoseph Chen fit_msg_uboot 521ae33e311SJoseph Chen fit_msg_boot 522ae33e311SJoseph Chen fit_msg_loader 523ae33e311SJoseph Chen echo 524ae33e311SJoseph Chen} 525ae33e311SJoseph Chen 526ae33e311SJoseph Chenfit_process_args $* 527ae33e311SJoseph Chenif [ ! -z "${ARG_VALIDATE}" ]; then 528ae33e311SJoseph Chen validate_arg ${ARG_VALIDATE} 529d6babb00SJoseph Chenelif [ ! -z "${ARG_BOOT_IMG}" -o ! -z "${ARG_BOOT_IMG_DIR}" ]; then 5302d11b868SJoseph Chen fit_generate_uboot_boot 5312d11b868SJoseph Chenelse 5322d11b868SJoseph Chen fit_generate_uboot 533ae33e311SJoseph Chenfi 534ae33e311SJoseph Chen 535