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