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 175 # if disable packing tee.bin 176 if ! grep -q '^CONFIG_SPL_OPTEE=y' .config ; then 177 return 178 fi 179 180 fi 181 fi 182 183 TEE="tee.bin" 184 echo " optee { 185 description = \"OP-TEE\"; 186 data = /incbin/(\"${TEE}${SUFFIX}\"); 187 type = \"firmware\"; 188 arch = \"${ARCH}\"; 189 os = \"op-tee\"; 190 compression = \"${COMPRESSION}\"; 191 ${ENTRY} 192 load = <"${TEE_LOAD_ADDR}">;" 193 if [ "${COMPRESSION}" != "none" ]; then 194 openssl dgst -sha256 -binary -out ${TEE}.digest ${TEE} 195 ${COMPRESS_CMD} ${TEE} 196 echo " digest { 197 value = /incbin/(\"./${TEE}.digest\"); 198 algo = \"sha256\"; 199 };" 200 fi 201 echo " hash { 202 algo = \"sha256\"; 203 }; 204 };" 205 LOADABLE_OPTEE=", \"optee\"" 206 FIRMWARE_OPTEE="firmware = \"optee\";" 207 FIRMWARE_SIGN="\"firmware\"" 208} 209 210function gen_mcu_node() 211{ 212 for ((i=0, n=0; i<5; i++)) 213 do 214 if [ ${i} -eq 0 ]; then 215 MCU_ADDR=${MCU0_LOAD_ADDR} 216 elif [ ${i} -eq 1 ]; then 217 MCU_ADDR=${MCU1_LOAD_ADDR} 218 elif [ ${i} -eq 2 ]; then 219 MCU_ADDR=${MCU2_LOAD_ADDR} 220 elif [ ${i} -eq 3 ]; then 221 MCU_ADDR=${MCU3_LOAD_ADDR} 222 elif [ ${i} -eq 4 ]; then 223 MCU_ADDR=${MCU4_LOAD_ADDR} 224 fi 225 226 if [ -z ${MCU_ADDR} ]; then 227 continue 228 fi 229 230 MCU_ADDR_VAL=$((MCU_ADDR)) 231 MCU="mcu${i}" 232 echo " ${MCU} { 233 description = \"${MCU}\"; 234 type = \"standalone\"; 235 arch = \"riscv\"; 236 load = <"${MCU_ADDR}">;" 237 238 if [ "${COMPRESSION}" != "none" -a ${MCU_ADDR_VAL} -lt ${MAX_ADDR_VAL} ]; then 239 openssl dgst -sha256 -binary -out ${MCU}.bin.digest ${MCU}.bin 240 ${COMPRESS_CMD} ${MCU}.bin 241 echo " data = /incbin/(\"./${MCU}.bin${SUFFIX}\"); 242 compression = \"${COMPRESSION}\"; 243 digest { 244 value = /incbin/(\"./${MCU}.bin.digest\"); 245 algo = \"sha256\"; 246 };" 247 else 248 echo " data = /incbin/(\"./${MCU}.bin\"); 249 compression = \"none\";" 250 fi 251 252 echo " hash { 253 algo = \"sha256\"; 254 }; 255 };" 256 257 if [ ${n} -eq 0 ]; then 258 STANDALONE_LIST=${STANDALONE_LIST}"\"${MCU}\"" 259 else 260 STANDALONE_LIST=${STANDALONE_LIST}", \"${MCU}\"" 261 fi 262 n=`expr ${n} + 1` 263 264 STANDALONE_SIGN=", \"standalone\"" 265 STANDALONE_MCU="standalone = ${STANDALONE_LIST};" 266 done 267} 268 269function gen_loadable_node() 270{ 271 for ((i=0; i<5; i++)) 272 do 273 if [ ${i} -eq 0 ]; then 274 LOAD_ADDR=${LOAD0_LOAD_ADDR} 275 elif [ ${i} -eq 1 ]; then 276 LOAD_ADDR=${LOAD1_LOAD_ADDR} 277 elif [ ${i} -eq 2 ]; then 278 LOAD_ADDR=${LOAD2_LOAD_ADDR} 279 elif [ ${i} -eq 3 ]; then 280 LOAD_ADDR=${LOAD3_LOAD_ADDR} 281 elif [ ${i} -eq 4 ]; then 282 LOAD_ADDR=${LOAD4_LOAD_ADDR} 283 fi 284 285 if [ -z ${LOAD_ADDR} ]; then 286 continue 287 fi 288 289 LOAD_ADDR_VAL=$((LOAD_ADDR)) 290 LOAD="load${i}" 291 echo " ${LOAD} { 292 description = \"${LOAD}\"; 293 type = \"standalone\"; 294 arch = \"${ARCH}\"; 295 load = <"${LOAD_ADDR}">;" 296 297 if [ "${COMPRESSION}" != "none" -a ${LOAD_ADDR_VAL} -lt ${MAX_ADDR_VAL} ]; then 298 openssl dgst -sha256 -binary -out ${LOAD}.bin.digest ${LOAD}.bin 299 ${COMPRESS_CMD} ${LOAD}.bin 300 echo " data = /incbin/(\"./${LOAD}.bin${SUFFIX}\"); 301 compression = \"${COMPRESSION}\"; 302 digest { 303 value = /incbin/(\"./${LOAD}.bin.digest\"); 304 algo = \"sha256\"; 305 };" 306 else 307 echo " data = /incbin/(\"./${LOAD}.bin\"); 308 compression = \"none\";" 309 fi 310 311 echo " hash { 312 algo = \"sha256\"; 313 }; 314 };" 315 316 LOADABLE_OTHER=${LOADABLE_OTHER}", \"${LOAD}\"" 317 done 318} 319 320function gen_header() 321{ 322echo " 323/* 324 * Copyright (C) 2020 Rockchip Electronic Co.,Ltd 325 * 326 * Simple U-boot fit source file containing ATF/OP-TEE/U-Boot/dtb/MCU 327 */ 328 329/dts-v1/; 330 331/ { 332 description = \"FIT Image with ATF/OP-TEE/U-Boot/MCU\"; 333 #address-cells = <1>; 334 335 images { 336" 337} 338 339function gen_arm64_configurations() 340{ 341PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'` 342if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then 343 ALGO_PADDING=" padding = \"pss\";" 344fi 345if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then 346 ALGO_NAME=" algo = \"sha256,rsa4096\";" 347else 348 ALGO_NAME=" algo = \"sha256,rsa2048\";" 349fi 350echo " }; 351 352 configurations { 353 default = \"conf\"; 354 conf { 355 description = \"${PLATFORM}\"; 356 rollback-index = <0x0>; 357 firmware = \"atf-1\"; 358 loadables = ${LOADABLE_UBOOT}${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER}; 359 ${STANDALONE_MCU} 360 ${FDT} 361 signature { 362 ${ALGO_NAME} 363 ${ALGO_PADDING} 364 key-name-hint = \"dev\"; 365 sign-images = \"firmware\", \"loadables\"${FDT_SIGN}${STANDALONE_SIGN}; 366 }; 367 }; 368 }; 369}; 370" 371} 372 373function gen_arm_configurations() 374{ 375PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'` 376if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then 377 ALGO_PADDING=" padding = \"pss\";" 378fi 379if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then 380 ALGO_NAME=" algo = \"sha256,rsa4096\";" 381else 382 ALGO_NAME=" algo = \"sha256,rsa2048\";" 383fi 384if [ ! -z "${LOADABLE_UBOOT}" ] || [ ! -z "${LOADABLE_OTHER}" ]; then 385 LOADABLE_UBOOT="\"uboot\"" 386 LOADABLES="loadables = ${LOADABLE_UBOOT}${LOADABLE_OTHER};" 387 if [ -z ${FIRMWARE_SIGN} ]; then 388 LOADABLES_SIGN="\"loadables\"" 389 else 390 LOADABLES_SIGN=", \"loadables\"" 391 fi 392fi 393 394echo " }; 395 396 configurations { 397 default = \"conf\"; 398 conf { 399 description = \"${PLATFORM}\"; 400 rollback-index = <0x0>; 401 ${FIRMWARE_OPTEE} 402 ${LOADABLES} 403 ${STANDALONE_MCU} 404 ${FDT} 405 signature { 406 ${ALGO_NAME} 407 ${ALGO_PADDING} 408 key-name-hint = \"dev\"; 409 sign-images = ${FIRMWARE_SIGN}${LOADABLES_SIGN}${FDT_SIGN}${STANDALONE_SIGN}; 410 }; 411 }; 412 }; 413}; 414" 415} 416 417