blob: cdecb1c1d351663f16b919b777a47355412d8857 [file] [log] [blame]
Michal Simeka7178b72019-10-02 15:55:57 +02001#!/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"
Michal Simekf0887502021-05-31 11:13:45 +020011BL31_ELF="${BL31%.*}.elf"
12[ -f ${BL31_ELF} ] && ATF_LOAD_ADDR=`${CROSS_COMPILE}readelf -l "${BL31_ELF}" | \
13awk '/Entry point/ { print $3 }'`
14
Michal Simeka7178b72019-10-02 15:55:57 +020015[ -z "$ATF_LOAD_ADDR" ] && ATF_LOAD_ADDR="0xfffea000"
Michal Simek48bd9ba2021-06-07 12:37:32 +020016ATF_LOAD_ADDR_LOW=`printf 0x%x $((ATF_LOAD_ADDR & 0xffffffff))`
17ATF_LOAD_ADDR_HIGH=`printf 0x%x $((ATF_LOAD_ADDR >> 32))`
Michal Simeka7178b72019-10-02 15:55:57 +020018
Michal Simekf0887502021-05-31 11:13:45 +020019[ -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"
Michal Simek48bd9ba2021-06-07 12:37:32 +020025TEE_LOAD_ADDR_LOW=`printf 0x%x $((TEE_LOAD_ADDR & 0xffffffff))`
26TEE_LOAD_ADDR_HIGH=`printf 0x%x $((TEE_LOAD_ADDR >> 32))`
Michal Simekf0887502021-05-31 11:13:45 +020027
Michal Simeka7178b72019-10-02 15:55:57 +020028if [ -z "$BL33_LOAD_ADDR" ];then
Simon Glass72cc5382022-10-20 18:22:39 -060029 BL33_LOAD_ADDR=`awk '/CONFIG_TEXT_BASE/ { print $3 }' include/generated/autoconf.h`
Michal Simeka7178b72019-10-02 15:55:57 +020030fi
Michal Simek48bd9ba2021-06-07 12:37:32 +020031BL33_LOAD_ADDR_LOW=`printf 0x%x $((BL33_LOAD_ADDR & 0xffffffff))`
32BL33_LOAD_ADDR_HIGH=`printf 0x%x $((BL33_LOAD_ADDR >> 32))`
Michal Simeka7178b72019-10-02 15:55:57 +020033
34DTB_LOAD_ADDR=`awk '/CONFIG_XILINX_OF_BOARD_DTB_ADDR/ { print $3 }' include/generated/autoconf.h`
35if [ ! -z "$DTB_LOAD_ADDR" ]; then
Michal Simek48bd9ba2021-06-07 12:37:32 +020036 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>;"
Michal Simeka7178b72019-10-02 15:55:57 +020039else
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
Michal Simekcf73de12020-03-23 14:40:52 +010050 echo "WARNING: BL31 file $BL31 NOT found, U-Boot will run in EL3" >&2
Michal Simeka7178b72019-10-02 15:55:57 +020051 BL31=/dev/null
Michal Simeka7178b72019-10-02 15:55:57 +020052fi
53
54cat << __HEADER_EOF
55// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
56
57/dts-v1/;
58
59/ {
Michal Simek367eb802021-08-19 14:17:37 +020060 description = "Configuration for Xilinx ZynqMP SoC";
Michal Simeka7178b72019-10-02 15:55:57 +020061
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";
Michal Simek48bd9ba2021-06-07 12:37:32 +020070 load = <$BL33_LOAD_ADDR_HIGH $BL33_LOAD_ADDR_LOW>;
71 entry = <$BL33_LOAD_ADDR_HIGH $BL33_LOAD_ADDR_LOW>;
Michal Simeka7178b72019-10-02 15:55:57 +020072 hash {
73 algo = "md5";
74 };
75 };
Michal Simekcf73de12020-03-23 14:40:52 +010076__HEADER_EOF
77
78if [ -f $BL31 ]; then
79cat << __ATF
Michal Simeka7178b72019-10-02 15:55:57 +020080 atf {
Michal Simek367eb802021-08-19 14:17:37 +020081 description = "Trusted Firmware-A";
Michal Simeka7178b72019-10-02 15:55:57 +020082 data = /incbin/("$BL31");
83 type = "firmware";
84 os = "arm-trusted-firmware";
85 arch = "arm64";
86 compression = "none";
Michal Simek48bd9ba2021-06-07 12:37:32 +020087 load = <$ATF_LOAD_ADDR_HIGH $ATF_LOAD_ADDR_LOW>;
88 entry = <$ATF_LOAD_ADDR_HIGH $ATF_LOAD_ADDR_LOW>;
Michal Simeka7178b72019-10-02 15:55:57 +020089 hash {
90 algo = "md5";
91 };
92 };
Michal Simekcf73de12020-03-23 14:40:52 +010093__ATF
94fi
Michal Simeka7178b72019-10-02 15:55:57 +020095
Michal Simekf0887502021-05-31 11:13:45 +020096if [ -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";
Michal Simek48bd9ba2021-06-07 12:37:32 +0200105 load = <$TEE_LOAD_ADDR_HIGH $TEE_LOAD_ADDR_LOW>;
106 entry = <$TEE_LOAD_ADDR_HIGH $TEE_LOAD_ADDR_LOW>;
Michal Simekf0887502021-05-31 11:13:45 +0200107 hash {
108 algo = "md5";
109 };
110 };
111__TEE
112fi
113
Michal Simek3c99ab52021-08-19 12:02:57 +0200114MULTI_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
Michal Simek7029ea82022-05-18 13:41:31 +0200143if [ -f $BL32 ]; then
Michal Simek3c99ab52021-08-19 12:02:57 +0200144cat << __CONF_SECTION1_EOF
145 config_1 {
Michal Simek7029ea82022-05-18 13:41:31 +0200146 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 {
Michal Simek3c99ab52021-08-19 12:02:57 +0200154 description = "Multi DTB with TF-A";
155 firmware = "atf";
156 loadables = "uboot", "fdt_1";
157 };
158__CONF_SECTION1_EOF
159fi
Michal Simek7029ea82022-05-18 13:41:31 +0200160fi
Michal Simek3c99ab52021-08-19 12:02:57 +0200161
162cat << __ITS_EOF
163 };
164};
165__ITS_EOF
166
167else
168
Michal Simeka7178b72019-10-02 15:55:57 +0200169DEFAULT=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
Michal Simekcf73de12020-03-23 14:40:52 +0100202if [ ! -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
Michal Simekf0887502021-05-31 11:13:45 +0200211if [ -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
Michal Simeka7178b72019-10-02 15:55:57 +0200221cat << __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
Michal Simekcf73de12020-03-23 14:40:52 +0100229fi
Michal Simekf0887502021-05-31 11:13:45 +0200230fi
Michal Simekcf73de12020-03-23 14:40:52 +0100231
Michal Simeka7178b72019-10-02 15:55:57 +0200232cnt=$((cnt+1))
233done
234
235cat << __ITS_EOF
236 };
237};
238__ITS_EOF
Michal Simek3c99ab52021-08-19 12:02:57 +0200239
240fi