1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0+ 3# 4# script to generate FIT image source for Xilinx ZynqMP boards with 5# ARM Trusted Firmware and multiple device trees (given on the command line) 6# 7# usage: $0 <dt_name> [<dt_name> [<dt_name] ...] 8 9BL33="u-boot-nodtb.bin" 10[ -z "$BL31" ] && BL31="bl31.bin" 11BL31_ELF="${BL31%.*}.elf" 12[ -f ${BL31_ELF} ] && ATF_LOAD_ADDR=`${CROSS_COMPILE}readelf -l "${BL31_ELF}" | \ 13awk '/Entry point/ { print $3 }'` 14 15[ -z "$ATF_LOAD_ADDR" ] && ATF_LOAD_ADDR="0xfffea000" 16ATF_LOAD_ADDR_LOW=`printf 0x%x $((ATF_LOAD_ADDR & 0xffffffff))` 17ATF_LOAD_ADDR_HIGH=`printf 0x%x $((ATF_LOAD_ADDR >> 32))` 18 19[ -z "$BL32" ] && BL32="tee.bin" 20BL32_ELF="${BL32%.*}.elf" 21[ -f ${BL32_ELF} ] && TEE_LOAD_ADDR=`${CROSS_COMPILE}readelf -l "${BL32_ELF}" | \ 22awk '/Entry point/ { print $3 }'` 23 24[ -z "$TEE_LOAD_ADDR" ] && TEE_LOAD_ADDR="0x60000000" 25TEE_LOAD_ADDR_LOW=`printf 0x%x $((TEE_LOAD_ADDR & 0xffffffff))` 26TEE_LOAD_ADDR_HIGH=`printf 0x%x $((TEE_LOAD_ADDR >> 32))` 27 28if [ -z "$BL33_LOAD_ADDR" ];then 29 BL33_LOAD_ADDR=`awk '/CONFIG_TEXT_BASE/ { print $3 }' include/generated/autoconf.h` 30fi 31BL33_LOAD_ADDR_LOW=`printf 0x%x $((BL33_LOAD_ADDR & 0xffffffff))` 32BL33_LOAD_ADDR_HIGH=`printf 0x%x $((BL33_LOAD_ADDR >> 32))` 33 34DTB_LOAD_ADDR=`awk '/CONFIG_XILINX_OF_BOARD_DTB_ADDR/ { print $3 }' include/generated/autoconf.h` 35if [ ! -z "$DTB_LOAD_ADDR" ]; then 36 DTB_LOAD_ADDR_LOW=`printf 0x%x $((DTB_LOAD_ADDR & 0xffffffff))` 37 DTB_LOAD_ADDR_HIGH=`printf 0x%x $((DTB_LOAD_ADDR >> 32))` 38 DTB_LOAD="load = <$DTB_LOAD_ADDR_HIGH $DTB_LOAD_ADDR_LOW>;" 39else 40 DTB_LOAD="" 41fi 42 43if [ -z "$*" ]; then 44 DT=arch/arm/dts/${DEVICE_TREE}.dtb 45else 46 DT=$* 47fi 48 49if [ ! -f $BL31 ]; then 50 echo "WARNING: BL31 file $BL31 NOT found, U-Boot will run in EL3" >&2 51 BL31=/dev/null 52fi 53 54cat << __HEADER_EOF 55// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 56 57/dts-v1/; 58 59/ { 60 description = "Configuration for Xilinx ZynqMP SoC"; 61 62 images { 63 uboot { 64 description = "U-Boot (64-bit)"; 65 data = /incbin/("$BL33"); 66 type = "firmware"; 67 os = "u-boot"; 68 arch = "arm64"; 69 compression = "none"; 70 load = <$BL33_LOAD_ADDR_HIGH $BL33_LOAD_ADDR_LOW>; 71 entry = <$BL33_LOAD_ADDR_HIGH $BL33_LOAD_ADDR_LOW>; 72 hash { 73 algo = "md5"; 74 }; 75 }; 76__HEADER_EOF 77 78if [ -f $BL31 ]; then 79cat << __ATF 80 atf { 81 description = "Trusted Firmware-A"; 82 data = /incbin/("$BL31"); 83 type = "firmware"; 84 os = "arm-trusted-firmware"; 85 arch = "arm64"; 86 compression = "none"; 87 load = <$ATF_LOAD_ADDR_HIGH $ATF_LOAD_ADDR_LOW>; 88 entry = <$ATF_LOAD_ADDR_HIGH $ATF_LOAD_ADDR_LOW>; 89 hash { 90 algo = "md5"; 91 }; 92 }; 93__ATF 94fi 95 96if [ -f $BL32 ]; then 97cat << __TEE 98 tee { 99 description = "TEE firmware"; 100 data = /incbin/("$BL32"); 101 type = "firmware"; 102 os = "tee"; 103 arch = "arm64"; 104 compression = "none"; 105 load = <$TEE_LOAD_ADDR_HIGH $TEE_LOAD_ADDR_LOW>; 106 entry = <$TEE_LOAD_ADDR_HIGH $TEE_LOAD_ADDR_LOW>; 107 hash { 108 algo = "md5"; 109 }; 110 }; 111__TEE 112fi 113 114MULTI_DTB=`awk '/CONFIG_MULTI_DTB_FIT / { print $3 }' include/generated/autoconf.h` 115 116if [ 1"$MULTI_DTB" -eq 11 ]; then 117 cat << __FDT_IMAGE_EOF 118 fdt_1 { 119 description = "Multi DTB fit image"; 120 data = /incbin/("fit-dtb.blob"); 121 type = "flat_dt"; 122 arch = "arm64"; 123 compression = "none"; 124 $DTB_LOAD 125 hash { 126 algo = "md5"; 127 }; 128 }; 129 }; 130 configurations { 131 default = "config_1"; 132__FDT_IMAGE_EOF 133 134if [ ! -f $BL31 ]; then 135cat << __CONF_SECTION1_EOF 136 config_1 { 137 description = "Multi DTB without TF-A"; 138 firmware = "uboot"; 139 loadables = "fdt_1"; 140 }; 141__CONF_SECTION1_EOF 142else 143if [ -f $BL32 ]; then 144cat << __CONF_SECTION1_EOF 145 config_1 { 146 description = "Multi DTB with TF-A and TEE"; 147 firmware = "atf"; 148 loadables = "uboot", "tee", "fdt_1"; 149 }; 150__CONF_SECTION1_EOF 151else 152cat << __CONF_SECTION1_EOF 153 config_1 { 154 description = "Multi DTB with TF-A"; 155 firmware = "atf"; 156 loadables = "uboot", "fdt_1"; 157 }; 158__CONF_SECTION1_EOF 159fi 160fi 161 162cat << __ITS_EOF 163 }; 164}; 165__ITS_EOF 166 167else 168 169DEFAULT=1 170cnt=1 171for dtname in $DT 172do 173 cat << __FDT_IMAGE_EOF 174 fdt_$cnt { 175 description = "$(basename $dtname .dtb)"; 176 data = /incbin/("$dtname"); 177 type = "flat_dt"; 178 arch = "arm64"; 179 compression = "none"; 180 $DTB_LOAD 181 hash { 182 algo = "md5"; 183 }; 184 }; 185__FDT_IMAGE_EOF 186 187[ "x$(basename $dtname .dtb)" = "x${DEVICE_TREE}" ] && DEFAULT=$cnt 188 189cnt=$((cnt+1)) 190done 191 192cat << __CONF_HEADER_EOF 193 }; 194 configurations { 195 default = "config_$DEFAULT"; 196 197__CONF_HEADER_EOF 198 199cnt=1 200for dtname in $DT 201do 202if [ ! -f $BL31 ]; then 203cat << __CONF_SECTION1_EOF 204 config_$cnt { 205 description = "$(basename $dtname .dtb)"; 206 firmware = "uboot"; 207 fdt = "fdt_$cnt"; 208 }; 209__CONF_SECTION1_EOF 210else 211if [ -f $BL32 ]; then 212cat << __CONF_SECTION1_EOF 213 config_$cnt { 214 description = "$(basename $dtname .dtb)"; 215 firmware = "atf"; 216 loadables = "uboot", "tee"; 217 fdt = "fdt_$cnt"; 218 }; 219__CONF_SECTION1_EOF 220else 221cat << __CONF_SECTION1_EOF 222 config_$cnt { 223 description = "$(basename $dtname .dtb)"; 224 firmware = "atf"; 225 loadables = "uboot"; 226 fdt = "fdt_$cnt"; 227 }; 228__CONF_SECTION1_EOF 229fi 230fi 231 232cnt=$((cnt+1)) 233done 234 235cat << __ITS_EOF 236 }; 237}; 238__ITS_EOF 239 240fi 241