1febc5adfSXianjun Jiao#!/bin/bash 2febc5adfSXianjun Jiaoset -ex 3febc5adfSXianjun Jiao 4febc5adfSXianjun JiaoHDF_FILE=$1 5febc5adfSXianjun JiaoUBOOT_FILE=$2 6febc5adfSXianjun JiaoATF_FILE=${3:-download} 7febc5adfSXianjun JiaoBUILD_DIR=build_boot_bin 8febc5adfSXianjun JiaoOUTPUT_DIR=output_boot_bin 9febc5adfSXianjun Jiao 10febc5adfSXianjun Jiaousage () { 11*6ffca2acSXianjun Jiao echo "usage: $0 system_top.<hdf/xsa> u-boot.elf (download | bl31.elf | <path-to-arm-trusted-firmware-source>) [output-archive]" 12febc5adfSXianjun Jiao exit 1 13febc5adfSXianjun Jiao} 14febc5adfSXianjun Jiao 15febc5adfSXianjun Jiaodepends () { 16febc5adfSXianjun Jiao echo "Xilinx $1 must be installed and in your PATH" 17febc5adfSXianjun Jiao echo "try: source /opt/Xilinx/Vivado/201x.x/settings64.sh" 18febc5adfSXianjun Jiao exit 1 19febc5adfSXianjun Jiao} 20febc5adfSXianjun Jiao 21febc5adfSXianjun Jiao### Check command line parameters 22*6ffca2acSXianjun Jiaoecho $HDF_FILE | grep -q ".hdf\|.xsa" || usage 23*6ffca2acSXianjun Jiaoecho $UBOOT_FILE | grep -q -e ".elf" -e "uboot" -e "u-boot" || usage 24febc5adfSXianjun Jiao 25febc5adfSXianjun Jiaoif [ ! -f $HDF_FILE ]; then 26febc5adfSXianjun Jiao echo $HDF_FILE: File not found! 27febc5adfSXianjun Jiao usage 28*6ffca2acSXianjun Jiaoelse 29*6ffca2acSXianjun Jiao if [[ "$HDF_FILE" =~ ".hdf" ]]; then TOOL="xsdk";else TOOL="vitis";fi 30febc5adfSXianjun Jiaofi 31febc5adfSXianjun Jiao 32febc5adfSXianjun Jiaoif [ ! -f $UBOOT_FILE ]; then 33febc5adfSXianjun Jiao echo $UBOOT_FILE: File not found! 34febc5adfSXianjun Jiao usage 35febc5adfSXianjun Jiaofi 36febc5adfSXianjun Jiao 37*6ffca2acSXianjun Jiao### Check for required Xilinx tools (starting with 2019.2 there is no hsi anymore) 38*6ffca2acSXianjun Jiaocommand -v xsct >/dev/null 2>&1 || depends xsct 39febc5adfSXianjun Jiaocommand -v bootgen >/dev/null 2>&1 || depends bootgen 40*6ffca2acSXianjun Jiaoif [[ "$HDF_FILE" =~ ".hdf" ]];then (command -v hsi >/dev/null 2>&1 || depends hsi);fi 41febc5adfSXianjun Jiao 42febc5adfSXianjun Jiaorm -Rf $BUILD_DIR $OUTPUT_DIR 43febc5adfSXianjun Jiaomkdir -p $OUTPUT_DIR 44febc5adfSXianjun Jiaomkdir -p $BUILD_DIR 45febc5adfSXianjun Jiao 46febc5adfSXianjun Jiao# 2017.4 use 47af34b94a52b8cdc8abbac44b6f3ffab33a2206 47febc5adfSXianjun Jiao# 2018.1 use df4a7e97d57494c7d79de51b1e0e450d982cea98 48febc5adfSXianjun Jiao# 2018.2 use 93a69a5a3bc318027da4af5911124537f4907642 49febc5adfSXianjun Jiao# 2018.3 use 08560c36ea5b6f48b962cb4bd9a79b35bb3d95ce 50*6ffca2acSXianjun Jiao# 2019.3 use 713dace94b259845fd8eede11061fbd8f039011e 51*6ffca2acSXianjun Jiao# 2020.1 use bf72e4d494f3be10665b94c0e88766eb2096ef71 52*6ffca2acSXianjun Jiao# 2021.2 use 799131a3b063f6f24f87baa74e46906c076aebcd 53febc5adfSXianjun Jiao 54*6ffca2acSXianjun Jiaotool_version=$($TOOL -version | sed -n '3p' | cut -d' ' -f 3) 55*6ffca2acSXianjun Jiaoif [ -z "$tool_version" ] ; then 56febc5adfSXianjun Jiao echo "Could not determine Vivado version" 57febc5adfSXianjun Jiao exit 1 58febc5adfSXianjun Jiaofi 59*6ffca2acSXianjun Jiaoatf_version=xilinx-$tool_version 60*6ffca2acSXianjun Jiao 61*6ffca2acSXianjun Jiaoif [[ "$atf_version" == "xilinx-v2021.1" ]];then atf_version="xlnx_rebase_v2.4_2021.1";fi 62*6ffca2acSXianjun Jiaoif [[ "$atf_version" == "xilinx-v2021.1.1" ]];then atf_version="xlnx_rebase_v2.4_2021.1_update1";fi 63*6ffca2acSXianjun Jiaoif [[ "$atf_version" == "xilinx-v2021.2" ]];then atf_version="xlnx-v2021.2";fi 64*6ffca2acSXianjun Jiao 65*6ffca2acSXianjun Jiaoif [[ "$4" == "uart1" ]];then console="cadence1";else console="cadence0";fi 66febc5adfSXianjun Jiao 67febc5adfSXianjun Jiao### Check if ATF_FILE is .elf or path to arm-trusted-firmware 68febc5adfSXianjun Jiaoif [ "$ATF_FILE" != "" ] && [ -d $ATF_FILE ]; then 69febc5adfSXianjun Jiao### Build arm-trusted-firmware bl31.elf 70febc5adfSXianjun Jiao( 71febc5adfSXianjun Jiao cd $ATF_FILE 72febc5adfSXianjun Jiao make distclean 73febc5adfSXianjun Jiao git checkout $atf_version 74*6ffca2acSXianjun Jiao make CROSS_COMPILE=aarch64-linux-gnu- PLAT=zynqmp RESET_TO_BL31=1 ZYNQMP_CONSOLE=$console 75febc5adfSXianjun Jiao) 76febc5adfSXianjun Jiao cp $ATF_FILE/build/zynqmp/release/bl31/bl31.elf $OUTPUT_DIR/bl31.elf 77febc5adfSXianjun Jiaoelif [ "$ATF_FILE" == "download" ]; then 78febc5adfSXianjun Jiao( 79febc5adfSXianjun Jiao command -v git >/dev/null 2>&1 || depends git 80febc5adfSXianjun Jiao cd $BUILD_DIR 81febc5adfSXianjun Jiao git clone https://github.com/Xilinx/arm-trusted-firmware.git 82febc5adfSXianjun Jiao cd arm-trusted-firmware 83febc5adfSXianjun Jiao git checkout $atf_version 84*6ffca2acSXianjun Jiao make CROSS_COMPILE=aarch64-linux-gnu- PLAT=zynqmp RESET_TO_BL31=1 ZYNQMP_CONSOLE=$console 85febc5adfSXianjun Jiao) 86febc5adfSXianjun Jiao cp $BUILD_DIR/arm-trusted-firmware/build/zynqmp/release/bl31/bl31.elf $OUTPUT_DIR/bl31.elf 87febc5adfSXianjun Jiaoelse 88febc5adfSXianjun Jiao echo $ATF_FILE | grep -q -e "bl31.elf" || usage 89febc5adfSXianjun Jiao if [ ! -f $ATF_FILE ]; then 90febc5adfSXianjun Jiao echo $ATF_FILE: File not found! 91febc5adfSXianjun Jiao usage 92febc5adfSXianjun Jiao fi 93febc5adfSXianjun Jiao cp $ATF_FILE $OUTPUT_DIR/bl31.elf 94febc5adfSXianjun Jiaofi 95febc5adfSXianjun Jiao 96*6ffca2acSXianjun Jiaocp "$HDF_FILE" "$BUILD_DIR/" 97*6ffca2acSXianjun Jiaocp "$UBOOT_FILE" "$OUTPUT_DIR/u-boot.elf" 98*6ffca2acSXianjun Jiaocp "$HDF_FILE" "$OUTPUT_DIR/" 99febc5adfSXianjun Jiao 100*6ffca2acSXianjun Jiao# Work-around for MPSoC ZCU102 and ZCU106 Evaluation Kits - DDR4 SODIMM change 101febc5adfSXianjun Jiao# (https://www.xilinx.com/support/answers/71961.html) 102febc5adfSXianjun Jiaoif [ $tool_version == "v2018.3" ];then 103febc5adfSXianjun Jiao( 104*6ffca2acSXianjun Jiao wget https://www.xilinx.com/Attachment/72113-files.zip -P $BUILD_DIR 105febc5adfSXianjun Jiao unzip $BUILD_DIR/72113-files.zip -d $BUILD_DIR 106febc5adfSXianjun Jiao) 107febc5adfSXianjun Jiaofi 108febc5adfSXianjun Jiao 109*6ffca2acSXianjun Jiao### Create create_fsbl_project.tcl file used by xsct to create the fsbl. 110febc5adfSXianjun Jiaoecho "hsi open_hw_design `basename $HDF_FILE`" > $BUILD_DIR/create_fsbl_project.tcl 111febc5adfSXianjun Jiaoecho 'set cpu_name [lindex [hsi get_cells -filter {IP_TYPE==PROCESSOR}] 0]' >> $BUILD_DIR/create_fsbl_project.tcl 112*6ffca2acSXianjun Jiao### The fsbl creating flow is different starting with 2019.2 Xilinx version 113*6ffca2acSXianjun Jiaoif [[ "$HDF_FILE" =~ ".hdf" ]];then 114febc5adfSXianjun Jiao echo 'sdk setws ./build/sdk' >> $BUILD_DIR/create_fsbl_project.tcl 115febc5adfSXianjun Jiao echo "sdk createhw -name hw_0 -hwspec `basename $HDF_FILE`" >> $BUILD_DIR/create_fsbl_project.tcl 116febc5adfSXianjun Jiao echo 'sdk createapp -name fsbl -hwproject hw_0 -proc $cpu_name -os standalone -lang C -app {Zynq MP FSBL}' >> $BUILD_DIR/create_fsbl_project.tcl 117febc5adfSXianjun Jiao echo 'configapp -app fsbl build-config release' >> $BUILD_DIR/create_fsbl_project.tcl 118febc5adfSXianjun Jiao if [ $tool_version == "v2018.3" ];then 119febc5adfSXianjun Jiao echo "file copy -force xfsbl_ddr_init.c ./build/sdk/fsbl/src" >> $BUILD_DIR/create_fsbl_project.tcl 120febc5adfSXianjun Jiao echo "file copy -force xfsbl_hooks.c ./build/sdk/fsbl/src" >> $BUILD_DIR/create_fsbl_project.tcl 121febc5adfSXianjun Jiao echo "file copy -force xfsbl_hooks.h ./build/sdk/fsbl/src" >> $BUILD_DIR/create_fsbl_project.tcl 122febc5adfSXianjun Jiao fi 123febc5adfSXianjun Jiao echo 'sdk projects -build -type all' >> $BUILD_DIR/create_fsbl_project.tcl 124febc5adfSXianjun Jiao 125febc5adfSXianjun Jiao ### Create create_pmufw_project.tcl 126febc5adfSXianjun Jiao echo "set hwdsgn [open_hw_design `basename $HDF_FILE`]" > $BUILD_DIR/create_pmufw_project.tcl 127*6ffca2acSXianjun Jiao echo 'generate_app -hw $hwdsgn -os standalone -proc psu_pmu_0 -app zynqmp_pmufw -compile -sw pmufw -dir pmufw' >> $BUILD_DIR/create_pmufw_project.tcl 128febc5adfSXianjun Jiao echo 'quit' >> $BUILD_DIR/create_pmufw_project.tcl 129febc5adfSXianjun Jiao 130*6ffca2acSXianjun Jiao FSBL_PATH="$BUILD_DIR/build/sdk/fsbl/Release/fsbl.elf" 131*6ffca2acSXianjun Jiao SYSTEM_TOP_BIT_PATH="$BUILD_DIR/build/sdk/hw_0/system_top.bit" 132*6ffca2acSXianjun Jiao PMUFW_PATH="$BUILD_DIR/pmufw/executable.elf" 133*6ffca2acSXianjun Jiaoelse 134*6ffca2acSXianjun Jiao # Flow got changed starting with 2019.2 version (when Vitis replaced SDK) and pmufw is generated automatically with fsbl 135*6ffca2acSXianjun Jiao echo 'platform create -name hw0 -hw system_top.xsa -os standalone -out ./build/sdk -proc $cpu_name' >> $BUILD_DIR/create_fsbl_project.tcl 136*6ffca2acSXianjun Jiao echo 'platform generate' >> $BUILD_DIR/create_fsbl_project.tcl 137*6ffca2acSXianjun Jiao 138*6ffca2acSXianjun Jiao FSBL_PATH="$BUILD_DIR/build/sdk/hw0/export/hw0/sw/hw0/boot/fsbl.elf" 139*6ffca2acSXianjun Jiao SYSTEM_TOP_BIT_PATH="$BUILD_DIR/build/sdk/hw0/hw/system_top.bit" 140*6ffca2acSXianjun Jiao PMUFW_PATH="$BUILD_DIR/build/sdk/hw0/export/hw0/sw/hw0/boot/pmufw.elf" 141*6ffca2acSXianjun Jiaofi 142*6ffca2acSXianjun Jiao 143febc5adfSXianjun Jiao### Create zynq.bif file used by bootgen 144febc5adfSXianjun Jiaoecho "the_ROM_image:" > $OUTPUT_DIR/zynq.bif 145febc5adfSXianjun Jiaoecho "{" >> $OUTPUT_DIR/zynq.bif 146febc5adfSXianjun Jiaoecho "[bootloader,destination_cpu=a53-0] fsbl.elf" >> $OUTPUT_DIR/zynq.bif 147febc5adfSXianjun Jiaoecho "[pmufw_image] pmufw.elf" >> $OUTPUT_DIR/zynq.bif 148febc5adfSXianjun Jiaoecho "[destination_device=pl] system_top.bit" >> $OUTPUT_DIR/zynq.bif 149febc5adfSXianjun Jiaoecho "[destination_cpu=a53-0,exception_level=el-3,trustzone] bl31.elf" >> $OUTPUT_DIR/zynq.bif 150febc5adfSXianjun Jiaoecho "[destination_cpu=a53-0, exception_level=el-2] u-boot.elf" >> $OUTPUT_DIR/zynq.bif 151febc5adfSXianjun Jiaoecho "}" >> $OUTPUT_DIR/zynq.bif 152febc5adfSXianjun Jiao 153febc5adfSXianjun Jiao### Build fsbl.elf & pmufw.elf 154febc5adfSXianjun Jiao( 155febc5adfSXianjun Jiao cd $BUILD_DIR 156*6ffca2acSXianjun Jiao xsct create_fsbl_project.tcl 157*6ffca2acSXianjun Jiao if [[ "$HDF_FILE" =~ ".hdf" ]];then 158febc5adfSXianjun Jiao hsi -source create_pmufw_project.tcl 159febc5adfSXianjun Jiao ### There was a bug in some vivado version where they build would fail -> check CC_FLAGS 160febc5adfSXianjun Jiao grep "CC_FLAGS :=" pmufw/Makefile | grep -e "-Os" || sed -i '/-mxl-soft-mul/ s/$/ -Os -flto -ffat-lto-objects/' pmufw/Makefile 161febc5adfSXianjun Jiao cd pmufw 162febc5adfSXianjun Jiao make 163*6ffca2acSXianjun Jiao fi 164febc5adfSXianjun Jiao) 165febc5adfSXianjun Jiao### Copy fsbl and system_top.bit into the output folder 166*6ffca2acSXianjun Jiaocp "$FSBL_PATH" "$OUTPUT_DIR/fsbl.elf" 167*6ffca2acSXianjun Jiaocp "$SYSTEM_TOP_BIT_PATH" "$OUTPUT_DIR/system_top.bit" 168*6ffca2acSXianjun Jiaocp "$PMUFW_PATH" "$OUTPUT_DIR/pmufw.elf" 169febc5adfSXianjun Jiao 170febc5adfSXianjun Jiao### Build BOOT.BIN 171febc5adfSXianjun Jiao( 172febc5adfSXianjun Jiao cd $OUTPUT_DIR 173febc5adfSXianjun Jiao bootgen -arch zynqmp -image zynq.bif -o BOOT.BIN -w 174febc5adfSXianjun Jiao) 175febc5adfSXianjun Jiao 176*6ffca2acSXianjun Jiao### Optionally tar.gz the entire output folder with the name given in argument 4/5 177*6ffca2acSXianjun Jiaoif [[ ( $4 == "uart"* && ${#5} -ne 0 ) ]]; then 178*6ffca2acSXianjun Jiao tar czvf $5.tar.gz $OUTPUT_DIR 179*6ffca2acSXianjun Jiaofi 180*6ffca2acSXianjun Jiao 181*6ffca2acSXianjun Jiaoif [[ ( ${#4} -ne 0 && $4 != "uart"* && ${#5} -eq 0 ) ]]; then 182febc5adfSXianjun Jiao tar czvf $4.tar.gz $OUTPUT_DIR 183febc5adfSXianjun Jiaofi 184