1#!/bin/bash 2# 3# Copyright (C) 2021 Rockchip Electronics Co., Ltd 4# 5# SPDX-License-Identifier: GPL-2.0+ 6# 7 8# Process args and auto set variables 9source ./${srctree}/arch/arm/mach-rockchip/fit_args.sh 10rm -f ${srctree}/*.digest ${srctree}/*.bin.gz ${srctree}/bl31_0x*.bin 11 12# Periph register 13MAX_ADDR_VAL=$((0xf0000000)) 14 15# compression 16if [ "${COMPRESSION}" == "gzip" ]; then 17 SUFFIX=".gz" 18 COMPRESS_CMD="gzip -kf9" 19elif [ "${COMPRESSION}" == "lzma" ]; then 20 SUFFIX=".lzma" 21 COMPRESS_CMD="${srctree}/scripts/compress.sh lzma" 22else 23 COMPRESSION="none" 24 SUFFIX= 25fi 26 27# nodes 28function gen_uboot_node() 29{ 30 UBOOT="u-boot-nodtb.bin" 31 echo " uboot { 32 description = \"U-Boot\"; 33 data = /incbin/(\"${UBOOT}${SUFFIX}\"); 34 type = \"standalone\"; 35 arch = \"${U_ARCH}\"; 36 os = \"U-Boot\"; 37 compression = \"${COMPRESSION}\"; 38 load = <"${UBOOT_LOAD_ADDR}">;" 39 if [ "${COMPRESSION}" != "none" ]; then 40 openssl dgst -sha256 -binary -out ${UBOOT}.digest ${UBOOT} 41 UBOOT_SZ=`ls -l ${UBOOT} | awk '{ print $5 }'` 42 if [ ${UBOOT_SZ} -gt 0 ]; then 43 ${COMPRESS_CMD} ${srctree}/${UBOOT} 44 else 45 touch ${srctree}/${UBOOT}${SUFFIX} 46 fi 47 echo " digest { 48 value = /incbin/(\"./${UBOOT}.digest\"); 49 algo = \"sha256\"; 50 };" 51 fi 52 echo " hash { 53 algo = \"sha256\"; 54 }; 55 };" 56} 57 58function gen_fdt_node() 59{ 60 echo " fdt { 61 description = \"U-Boot dtb\"; 62 data = /incbin/(\"./u-boot.dtb\"); 63 type = \"flat_dt\"; 64 arch = \"${U_ARCH}\"; 65 compression = \"none\"; 66 hash { 67 algo = \"sha256\"; 68 }; 69 };" 70}; 71 72function gen_kfdt_node() 73{ 74 KERN_DTB=`sed -n "/CONFIG_EMBED_KERNEL_DTB_PATH=/s/CONFIG_EMBED_KERNEL_DTB_PATH=//p" .config | tr -d '"'` 75 if [ -z "${KERN_DTB}" ]; then 76 return; 77 fi 78 79 if [ -f ${srctree}/${KERN_DTB} ]; then 80 PROP_KERN_DTB=', "kern-fdt"'; 81 echo " kern-fdt { 82 description = \"${KERN_DTB}\"; 83 data = /incbin/(\"${KERN_DTB}\"); 84 type = \"flat_dt\"; 85 arch = \"${U_ARCH}\"; 86 compression = \"none\"; 87 hash { 88 algo = \"sha256\"; 89 }; 90 };" 91 fi 92} 93 94function gen_bl31_node() 95{ 96 ${srctree}/arch/arm/mach-rockchip/decode_bl31.py 97 98 NUM=1 99 for ATF in `ls -l bl31_0x*.bin | sort --key=5 -nr | awk '{ print $9 }'` 100 do 101 ATF_LOAD_ADDR=`echo ${ATF} | awk -F "_" '{ printf $2 }' | awk -F "." '{ printf $1 }'` 102 # only atf-1 support compress 103 if [ "${COMPRESSION}" != "none" -a ${NUM} -eq 1 ]; then 104 openssl dgst -sha256 -binary -out ${ATF}.digest ${ATF} 105 ${COMPRESS_CMD} ${ATF} 106 107 echo " atf-${NUM} { 108 description = \"ARM Trusted Firmware\"; 109 data = /incbin/(\"./${ATF}${SUFFIX}\"); 110 type = \"firmware\"; 111 arch = \"${ARCH}\"; 112 os = \"arm-trusted-firmware\"; 113 compression = \"${COMPRESSION}\"; 114 load = <"${ATF_LOAD_ADDR}">; 115 hash { 116 algo = \"sha256\"; 117 }; 118 digest { 119 value = /incbin/(\"./${ATF}.digest\"); 120 algo = \"sha256\"; 121 }; 122 };" 123 else 124 echo " atf-${NUM} { 125 description = \"ARM Trusted Firmware\"; 126 data = /incbin/(\"./${ATF}\"); 127 type = \"firmware\"; 128 arch = \"${ARCH}\"; 129 os = \"arm-trusted-firmware\"; 130 compression = \"none\"; 131 load = <"${ATF_LOAD_ADDR}">; 132 hash { 133 algo = \"sha256\"; 134 }; 135 };" 136 fi 137 138 if [ ${NUM} -gt 1 ]; then 139 LOADABLE_ATF=${LOADABLE_ATF}", \"atf-${NUM}\"" 140 fi 141 NUM=`expr ${NUM} + 1` 142 done 143} 144 145function gen_bl32_node() 146{ 147 if [ -z ${TEE_LOAD_ADDR} ]; then 148 return 149 fi 150 151 if [ "${ARCH}" == "arm" ]; then 152 # If not AArch32 mode 153 if ! grep -q '^CONFIG_ARM64_BOOT_AARCH32=y' .config ; then 154 ENTRY="entry = <"${TEE_LOAD_ADDR}">;" 155 fi 156 fi 157 158 TEE="tee.bin" 159 echo " optee { 160 description = \"OP-TEE\"; 161 data = /incbin/(\"${TEE}${SUFFIX}\"); 162 type = \"firmware\"; 163 arch = \"${ARCH}\"; 164 os = \"op-tee\"; 165 compression = \"${COMPRESSION}\"; 166 ${ENTRY} 167 load = <"${TEE_LOAD_ADDR}">;" 168 if [ "${COMPRESSION}" != "none" ]; then 169 openssl dgst -sha256 -binary -out ${TEE}.digest ${TEE} 170 ${COMPRESS_CMD} ${TEE} 171 echo " digest { 172 value = /incbin/(\"./${TEE}.digest\"); 173 algo = \"sha256\"; 174 };" 175 fi 176 echo " hash { 177 algo = \"sha256\"; 178 }; 179 };" 180 LOADABLE_OPTEE=", \"optee\"" 181 FIRMWARE_OPTEE="firmware = \"optee\";" 182 FIRMWARE_SIGN=", \"firmware\"" 183} 184 185function gen_mcu_node() 186{ 187 for ((i=0, n=0; i<5; i++)) 188 do 189 if [ ${i} -eq 0 ]; then 190 MCU_ADDR=${MCU0_LOAD_ADDR} 191 elif [ ${i} -eq 1 ]; then 192 MCU_ADDR=${MCU1_LOAD_ADDR} 193 elif [ ${i} -eq 2 ]; then 194 MCU_ADDR=${MCU2_LOAD_ADDR} 195 elif [ ${i} -eq 3 ]; then 196 MCU_ADDR=${MCU3_LOAD_ADDR} 197 elif [ ${i} -eq 4 ]; then 198 MCU_ADDR=${MCU4_LOAD_ADDR} 199 fi 200 201 if [ -z ${MCU_ADDR} ]; then 202 continue 203 fi 204 205 MCU_ADDR_VAL=$((MCU_ADDR)) 206 MCU="mcu${i}" 207 echo " ${MCU} { 208 description = \"${MCU}\"; 209 type = \"standalone\"; 210 arch = \"riscv\"; 211 load = <"${MCU_ADDR}">;" 212 213 if [ "${COMPRESSION}" != "none" -a ${MCU_ADDR_VAL} -lt ${MAX_ADDR_VAL} ]; then 214 openssl dgst -sha256 -binary -out ${MCU}.bin.digest ${MCU}.bin 215 ${COMPRESS_CMD} ${MCU}.bin 216 echo " data = /incbin/(\"./${MCU}.bin${SUFFIX}\"); 217 compression = \"${COMPRESSION}\"; 218 digest { 219 value = /incbin/(\"./${MCU}.bin.digest\"); 220 algo = \"sha256\"; 221 };" 222 else 223 echo " data = /incbin/(\"./${MCU}.bin\"); 224 compression = \"none\";" 225 fi 226 227 echo " hash { 228 algo = \"sha256\"; 229 }; 230 };" 231 232 if [ ${n} -eq 0 ]; then 233 STANDALONE_LIST=${STANDALONE_LIST}"\"${MCU}\"" 234 else 235 STANDALONE_LIST=${STANDALONE_LIST}", \"${MCU}\"" 236 fi 237 n=`expr ${n} + 1` 238 239 STANDALONE_SIGN=", \"standalone\"" 240 STANDALONE_MCU="standalone = ${STANDALONE_LIST};" 241 done 242} 243 244function gen_loadable_node() 245{ 246 for ((i=0; i<5; i++)) 247 do 248 if [ ${i} -eq 0 ]; then 249 LOAD_ADDR=${LOAD0_LOAD_ADDR} 250 elif [ ${i} -eq 1 ]; then 251 LOAD_ADDR=${LOAD1_LOAD_ADDR} 252 elif [ ${i} -eq 2 ]; then 253 LOAD_ADDR=${LOAD2_LOAD_ADDR} 254 elif [ ${i} -eq 3 ]; then 255 LOAD_ADDR=${LOAD3_LOAD_ADDR} 256 elif [ ${i} -eq 4 ]; then 257 LOAD_ADDR=${LOAD4_LOAD_ADDR} 258 fi 259 260 if [ -z ${LOAD_ADDR} ]; then 261 continue 262 fi 263 264 LOAD_ADDR_VAL=$((LOAD_ADDR)) 265 LOAD="load${i}" 266 echo " ${LOAD} { 267 description = \"${LOAD}\"; 268 type = \"standalone\"; 269 arch = \"${ARCH}\"; 270 load = <"${LOAD_ADDR}">;" 271 272 if [ "${COMPRESSION}" != "none" -a ${LOAD_ADDR_VAL} -lt ${MAX_ADDR_VAL} ]; then 273 openssl dgst -sha256 -binary -out ${LOAD}.bin.digest ${LOAD}.bin 274 ${COMPRESS_CMD} ${LOAD}.bin 275 echo " data = /incbin/(\"./${LOAD}.bin${SUFFIX}\"); 276 compression = \"${COMPRESSION}\"; 277 digest { 278 value = /incbin/(\"./${LOAD}.bin.digest\"); 279 algo = \"sha256\"; 280 };" 281 else 282 echo " data = /incbin/(\"./${LOAD}.bin\"); 283 compression = \"none\";" 284 fi 285 286 echo " hash { 287 algo = \"sha256\"; 288 }; 289 };" 290 291 LOADABLE_OTHER=${LOADABLE_OTHER}", \"${LOAD}\"" 292 done 293} 294 295function gen_header() 296{ 297echo " 298/* 299 * Copyright (C) 2020 Rockchip Electronic Co.,Ltd 300 * 301 * Simple U-boot fit source file containing ATF/OP-TEE/U-Boot/dtb/MCU 302 */ 303 304/dts-v1/; 305 306/ { 307 description = \"FIT Image with ATF/OP-TEE/U-Boot/MCU\"; 308 #address-cells = <1>; 309 310 images { 311" 312} 313 314function gen_arm64_configurations() 315{ 316PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'` 317if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then 318 ALGO_PADDING=" padding = \"pss\";" 319fi 320echo " }; 321 322 configurations { 323 default = \"conf\"; 324 conf { 325 description = \"${PLATFORM}\"; 326 rollback-index = <0x0>; 327 firmware = \"atf-1\"; 328 loadables = \"uboot\"${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER}; 329 ${STANDALONE_MCU} 330 fdt = \"fdt\"${PROP_KERN_DTB}; 331 signature { 332 algo = \"sha256,rsa2048\"; 333 ${ALGO_PADDING} 334 key-name-hint = \"dev\"; 335 sign-images = \"fdt\", \"firmware\", \"loadables\"${STANDALONE_SIGN}; 336 }; 337 }; 338 }; 339}; 340" 341} 342 343function gen_arm_configurations() 344{ 345PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'` 346if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then 347 ALGO_PADDING=" padding = \"pss\";" 348fi 349echo " }; 350 351 configurations { 352 default = \"conf\"; 353 conf { 354 description = \"${PLATFORM}\"; 355 rollback-index = <0x0>; 356 ${FIRMWARE_OPTEE} 357 loadables = \"uboot\"${LOADABLE_OTHER}; 358 ${STANDALONE_MCU} 359 fdt = \"fdt\"${PROP_KERN_DTB}; 360 signature { 361 algo = \"sha256,rsa2048\"; 362 ${ALGO_PADDING} 363 key-name-hint = \"dev\"; 364 sign-images = \"fdt\", \"loadables\"${FIRMWARE_SIGN}${STANDALONE_SIGN}; 365 }; 366 }; 367 }; 368}; 369" 370} 371 372