• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2#
3# Builds ARM Trusted Firmware, and generates FIPs with UEFI and optionally
4# Trusted OS for the supported platforms.
5# Not intended to be called directly, invoked from uefi-build.sh.
6#
7# Board configuration is extracted from
8# parse-platforms.py and platforms.config.
9#
10
11. "$TOOLS_DIR"/common-functions
12OUTPUT_DIR="$PWD"/uefi-build
13
14ATF_BUILDVER=1
15
16function usage
17{
18	echo "usage:"
19	echo "atf-build.sh -e <EDK2 source directory> -t <UEFI build profile/toolchain> <platform>"
20	echo
21}
22
23function check_atf_buildver
24{
25	MAJOR=`grep "^VERSION_MAJOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'`
26	[ $? -ne 0 ] && return 1
27	MINOR=`grep "^VERSION_MINOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'`
28	[ $? -ne 0 ] && return 1
29
30	if [ "$MAJOR" -eq 1 -a "$MINOR" -ge 2 ]; then
31		ATF_BUILDVER=2
32	fi
33}
34
35function build_platform
36{
37	if [ X"$EDK2_DIR" = X"" ];then
38		echo "EDK2_DIR not set!" >&2
39		return 1
40	fi
41
42	check_atf_buildver || return 1
43
44	BUILD_ATF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o build_atf`"
45	if [ X"$BUILD_ATF" = X"" ]; then
46		echo "Platform '$1' is not configured to build ARM Trusted Firmware."
47		return 0
48	fi
49
50	ATF_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_platform`"
51	if [ X"$ATF_PLATFORM" = X"" ]; then
52		ATF_PLATFORM=$1
53	fi
54
55	#
56	# Read platform configuration
57	#
58	PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o longname`"
59	PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o arch`"
60	PLATFORM_IMAGE_DIR="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_image_dir`"
61	PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_buildflags`"
62
63	if [ $VERBOSE -eq 1 ]; then
64		echo "PLATFORM_NAME=$PLATFORM_NAME"
65		echo "PLATFORM_ARCH=$PLATFORM_ARCH"
66		echo "PLATFORM_IMAGE_DIR=$PLATFORM_IMAGE_DIR"
67		echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
68	fi
69
70	unset BL30 BL31 BL32 BL33
71	BL30="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o scp_bin`"
72	if [ $ATF_BUILDVER -gt 1 ]; then
73		unset SCP_BL2
74		SCP_BL2=`search_packages_path "$BL30"`
75	fi
76	BL31="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o el3_bin`"
77	BL33="$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_bin`"
78
79	#
80	# Set up cross compilation variables (if applicable)
81	#
82	set_cross_compile
83	CROSS_COMPILE="$TEMP_CROSS_COMPILE"
84	echo "Building ARM Trusted Firmware for $PLATFORM_NAME - $BUILD_PROFILE"
85	echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\""
86
87	if [ X"$BL30" != X"" ]; then
88		BL30=`search_packages_path "$BL30"`
89	fi
90	if [ X"$BL31" != X"" ]; then
91		BL31=`search_packages_path "$BL31"`
92	fi
93
94	#
95	# BL32 requires more attention
96	# If TOS_DIR is not set, we assume user does not want a Trusted OS,
97	# even if the source directory and/or binary for it exists
98	#
99	if [ X"$TOS_DIR" != X"" ]; then
100		SPD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_spd`"
101
102		TOS_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_bin`"
103		if [ X"$TOS_BIN" != X"" ]; then
104			BL32=$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/$TOS_BIN
105		fi
106
107		if [ X"$SPD" != X"" ] && [ X"$BL32" != X"" ]; then
108			#
109			# Since SPD cannot be exported or undefined,
110			# we parametrise it here
111			#
112			SPD_OPTION="SPD=$SPD"
113		else
114			echo "WARNING:	Proceeding without Trusted OS!"
115			echo "		Please specify both ATF_SPD and TOS_BIN"
116			echo "		if you wish to use a Trusted OS!"
117		fi
118	else
119	#
120	# Since TOS_DIR is not set, user does not want a Trusted OS
121	# even if the source directory and/or binary for it exists.
122	# Next, Check whether user wants secure partition image.
123	# If SPM_BIN is set then include pre-built secure partition image as a
124	# BL32 Image and implicitly set SPM=1.
125	#
126		SPM_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o spm_bin`"
127
128		if [ X"$SPM_BIN" != X"" ]; then
129			BL32=$WORKSPACE/Build/StandaloneSmmPkg/$BUILD_PROFILE/FV/$SPM_BIN
130			PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS SPM=1"
131		fi
132	# We assume that user does not want secure partition either.
133	# Todo: Revisit if either one of Trusted OS or Secure Partition Image is Mandatory.
134	fi
135
136
137
138	#
139	# Debug extraction handling
140	#
141	case "$BUILD_ATF" in
142	debug*)
143		DEBUG=1
144		BUILD_TYPE="debug"
145		;;
146	*)
147		DEBUG=0
148		BUILD_TYPE="release"
149		;;
150	esac
151
152	export BL30 BL31 BL32 BL33
153
154	echo "BL30=$BL30"
155	if [ $ATF_BUILDVER -gt 1 ] && [ X"$BL30" != X"" ]; then
156		export SCP_BL2
157		echo "SCP_BL2=$BL30"
158	fi
159	echo "BL31=$BL31"
160	echo "BL32=$BL32"
161	echo "BL33=$BL33"
162	echo "$SPD_OPTION"
163	echo "BUILD_TYPE=$BUILD_TYPE"
164
165	#
166	# If a build was done with BL32, and followed by another without,
167	# the BL32 component remains in fip.bin, so we delete the build dir
168	# contents before calling make
169	#
170	rm -rf build/"$ATF_PLATFORM/$BUILD_TYPE"/*
171
172	#
173	# Build ARM Trusted Firmware and create FIP
174	#
175	if [ $VERBOSE -eq 1 ]; then
176		echo "Calling ARM Trusted Firmware build:"
177		echo "CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip"
178	fi
179	CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip
180	if [ $? -eq 0 ]; then
181		#
182		# Copy resulting images to UEFI image dir
183		#
184		if [ $VERBOSE -eq 1 ]; then
185			echo "Copying bl1.bin and fip.bin to "$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/""
186		fi
187		cp -a build/"$ATF_PLATFORM/$BUILD_TYPE"/{bl1,fip}.bin "$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/"
188	else
189		return 1
190	fi
191}
192
193# Check to see if we are in a trusted firmware directory
194# refuse to continue if we aren't
195if [ ! -d bl32 ]
196then
197	echo "ERROR: we aren't in the arm-trusted-firmware directory."
198	usage
199	exit 1
200fi
201
202build=
203
204if [ $# = 0 ]
205then
206	usage
207	exit 1
208else
209	while [ "$1" != "" ]; do
210		case $1 in
211			"-e" )
212				shift
213				EDK2_DIR="$1"
214				;;
215			"/h" | "/?" | "-?" | "-h" | "--help" )
216				usage
217				exit
218				;;
219			"-t" )
220				shift
221				BUILD_PROFILE="$1"
222				;;
223			* )
224				build="$1"
225				;;
226		esac
227		shift
228	done
229fi
230
231if [ X"$build" = X"" ]; then
232	echo "No platform specified!" >&2
233	echo
234	usage
235	exit 1
236fi
237
238build_platform $build
239exit $?
240