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