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" 11# Can be also done as ${CROSS_COMPILE}readelf -l bl31.elf | awk '/Entry point/ { print $3 }' 12[ -z "$ATF_LOAD_ADDR" ] && ATF_LOAD_ADDR="0xfffea000" 13 14if [ -z "$BL33_LOAD_ADDR" ];then 15 BL33_LOAD_ADDR=`awk '/CONFIG_SYS_TEXT_BASE/ { print $3 }' include/generated/autoconf.h` 16fi 17 18DTB_LOAD_ADDR=`awk '/CONFIG_XILINX_OF_BOARD_DTB_ADDR/ { print $3 }' include/generated/autoconf.h` 19if [ ! -z "$DTB_LOAD_ADDR" ]; then 20 DTB_LOAD="load = <$DTB_LOAD_ADDR>;" 21else 22 DTB_LOAD="" 23fi 24 25if [ -z "$*" ]; then 26 DT=arch/arm/dts/${DEVICE_TREE}.dtb 27else 28 DT=$* 29fi 30 31if [ ! -f $BL31 ]; then 32 echo "WARNING: BL31 file $BL31 NOT found, U-Boot will run in EL3" >&2 33 BL31=/dev/null 34fi 35 36cat << __HEADER_EOF 37// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 38 39/dts-v1/; 40 41/ { 42 description = "Configuration to load ATF before U-Boot"; 43 44 images { 45 uboot { 46 description = "U-Boot (64-bit)"; 47 data = /incbin/("$BL33"); 48 type = "firmware"; 49 os = "u-boot"; 50 arch = "arm64"; 51 compression = "none"; 52 load = <$BL33_LOAD_ADDR>; 53 entry = <$BL33_LOAD_ADDR>; 54 hash { 55 algo = "md5"; 56 }; 57 }; 58__HEADER_EOF 59 60if [ -f $BL31 ]; then 61cat << __ATF 62 atf { 63 description = "ARM Trusted Firmware"; 64 data = /incbin/("$BL31"); 65 type = "firmware"; 66 os = "arm-trusted-firmware"; 67 arch = "arm64"; 68 compression = "none"; 69 load = <$ATF_LOAD_ADDR>; 70 entry = <$ATF_LOAD_ADDR>; 71 hash { 72 algo = "md5"; 73 }; 74 }; 75__ATF 76fi 77 78DEFAULT=1 79cnt=1 80for dtname in $DT 81do 82 cat << __FDT_IMAGE_EOF 83 fdt_$cnt { 84 description = "$(basename $dtname .dtb)"; 85 data = /incbin/("$dtname"); 86 type = "flat_dt"; 87 arch = "arm64"; 88 compression = "none"; 89 $DTB_LOAD 90 hash { 91 algo = "md5"; 92 }; 93 }; 94__FDT_IMAGE_EOF 95 96[ "x$(basename $dtname .dtb)" = "x${DEVICE_TREE}" ] && DEFAULT=$cnt 97 98cnt=$((cnt+1)) 99done 100 101cat << __CONF_HEADER_EOF 102 }; 103 configurations { 104 default = "config_$DEFAULT"; 105 106__CONF_HEADER_EOF 107 108cnt=1 109for dtname in $DT 110do 111if [ ! -f $BL31 ]; then 112cat << __CONF_SECTION1_EOF 113 config_$cnt { 114 description = "$(basename $dtname .dtb)"; 115 firmware = "uboot"; 116 fdt = "fdt_$cnt"; 117 }; 118__CONF_SECTION1_EOF 119else 120cat << __CONF_SECTION1_EOF 121 config_$cnt { 122 description = "$(basename $dtname .dtb)"; 123 firmware = "atf"; 124 loadables = "uboot"; 125 fdt = "fdt_$cnt"; 126 }; 127__CONF_SECTION1_EOF 128fi 129 130cnt=$((cnt+1)) 131done 132 133cat << __ITS_EOF 134 }; 135}; 136__ITS_EOF 137