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