xref: /rk3399_rockchip-uboot/arch/arm/mach-rockchip/fit_nodes.sh (revision 514e00a960f8a815e0c86931b498063c6fc4ef76)
1#!/bin/bash
2#
3# Copyright (C) 2021 Rockchip Electronics Co., Ltd
4#
5# SPDX-License-Identifier:     GPL-2.0+
6#
7
8# Process args and auto set variables
9source ./${srctree}/arch/arm/mach-rockchip/fit_args.sh
10rm -f ${srctree}/*.digest ${srctree}/*.bin.gz ${srctree}/bl31_0x*.bin
11
12# compression
13if [ "${COMPRESSION}" == "gzip" ]; then
14	SUFFIX=".gz"
15	COMPRESS_CMD="gzip -kf9"
16elif [ "${COMPRESSION}" == "lzma" ]; then
17	SUFFIX=".lzma"
18	COMPRESS_CMD="${srctree}/scripts/compress.sh lzma"
19else
20	COMPRESSION="none"
21	SUFFIX=
22fi
23
24# nodes
25function gen_uboot_node()
26{
27	UBOOT="u-boot-nodtb.bin"
28	echo "		uboot {
29			description = \"U-Boot\";
30			data = /incbin/(\"${UBOOT}${SUFFIX}\");
31			type = \"standalone\";
32			arch = \"${U_ARCH}\";
33			os = \"U-Boot\";
34			compression = \"${COMPRESSION}\";
35			load = <"${UBOOT_LOAD_ADDR}">;"
36	if [ "${COMPRESSION}" != "none" ]; then
37		openssl dgst -sha256 -binary -out ${UBOOT}.digest ${UBOOT}
38		UBOOT_SZ=`ls -l ${UBOOT} | awk '{ print $5 }'`
39		if [ ${UBOOT_SZ} -gt 0 ]; then
40			${COMPRESS_CMD} ${srctree}/${UBOOT}
41		else
42			touch ${srctree}/${UBOOT}${SUFFIX}
43		fi
44		echo "		digest {
45				value = /incbin/(\"./${UBOOT}.digest\");
46				algo = \"sha256\";
47			};"
48	fi
49	echo "			hash {
50				algo = \"sha256\";
51			};
52		};"
53}
54
55function gen_fdt_node()
56{
57	echo "		fdt {
58			description = \"U-Boot dtb\";
59			data = /incbin/(\"./u-boot.dtb\");
60			type = \"flat_dt\";
61			arch = \"${U_ARCH}\";
62			compression = \"none\";
63			hash {
64				algo = \"sha256\";
65			};
66		};"
67};
68
69function gen_kfdt_node()
70{
71	KERN_DTB=`sed -n "/CONFIG_EMBED_KERNEL_DTB_PATH=/s/CONFIG_EMBED_KERNEL_DTB_PATH=//p" .config | tr -d '"'`
72	if [ -z "${KERN_DTB}" ]; then
73		return;
74	fi
75
76	if [ -f ${srctree}/${KERN_DTB} ]; then
77	PROP_KERN_DTB=', "kern-fdt"';
78	echo "		kern-fdt {
79			description = \"${KERN_DTB}\";
80			data = /incbin/(\"${KERN_DTB}\");
81			type = \"flat_dt\";
82			arch = \"${U_ARCH}\";
83			compression = \"none\";
84			hash {
85				algo = \"sha256\";
86			};
87		};"
88	fi
89}
90
91function gen_bl31_node()
92{
93	${srctree}/arch/arm/mach-rockchip/decode_bl31.py
94
95	NUM=1
96	for ATF in `ls -l bl31_0x*.bin | sort --key=5 -nr | awk '{ print $9 }'`
97	do
98		ATF_LOAD_ADDR=`echo ${ATF} | awk -F "_" '{ printf $2 }' | awk -F "." '{ printf $1 }'`
99		# only atf-1 support compress
100		if [ "${COMPRESSION}" != "none" -a ${NUM} -eq 1  ]; then
101			openssl dgst -sha256 -binary -out ${ATF}.digest ${ATF}
102			${COMPRESS_CMD} ${ATF}
103
104			echo "		atf-${NUM} {
105			description = \"ARM Trusted Firmware\";
106			data = /incbin/(\"./${ATF}${SUFFIX}\");
107			type = \"firmware\";
108			arch = \"${ARCH}\";
109			os = \"arm-trusted-firmware\";
110			compression = \"${COMPRESSION}\";
111			load = <"${ATF_LOAD_ADDR}">;
112			hash {
113				algo = \"sha256\";
114			};
115			digest {
116				value = /incbin/(\"./${ATF}.digest\");
117				algo = \"sha256\";
118			};
119		};"
120		else
121			echo "		atf-${NUM} {
122			description = \"ARM Trusted Firmware\";
123			data = /incbin/(\"./${ATF}\");
124			type = \"firmware\";
125			arch = \"${ARCH}\";
126			os = \"arm-trusted-firmware\";
127			compression = \"none\";
128			load = <"${ATF_LOAD_ADDR}">;
129			hash {
130				algo = \"sha256\";
131			};
132		};"
133		fi
134
135		if [ ${NUM} -gt 1 ]; then
136			LOADABLE_ATF=${LOADABLE_ATF}", \"atf-${NUM}\""
137		fi
138		NUM=`expr ${NUM} + 1`
139	done
140}
141
142function gen_bl32_node()
143{
144	if [ -z ${TEE_LOAD_ADDR} ]; then
145		return
146	fi
147
148	if [ "${ARCH}" == "arm" ]; then
149		# If not AArch32 mode
150		if ! grep  -q '^CONFIG_ARM64_BOOT_AARCH32=y' .config ; then
151			ENTRY="entry = <0x${TEE_LOAD_ADDR}>;"
152		fi
153	fi
154
155	TEE="tee.bin"
156	echo "		optee {
157			description = \"OP-TEE\";
158			data = /incbin/(\"${TEE}${SUFFIX}\");
159			type = \"firmware\";
160			arch = \"${ARCH}\";
161			os = \"op-tee\";
162			compression = \"${COMPRESSION}\";
163			${ENTRY}
164			load = <"0x${TEE_LOAD_ADDR}">;"
165	if [ "${COMPRESSION}" != "none" ]; then
166		openssl dgst -sha256 -binary -out ${TEE}.digest ${TEE}
167		${COMPRESS_CMD} ${TEE}
168		echo "			digest {
169				value = /incbin/(\"./${TEE}.digest\");
170				algo = \"sha256\";
171			};"
172	fi
173	echo "			hash {
174				algo = \"sha256\";
175			};
176		};"
177	LOADABLE_OPTEE=", \"optee\""
178	FIRMWARE_OPTEE="firmware = \"optee\";"
179	FIRMWARE_SIGN=", \"firmware\""
180}
181
182function gen_mcu_node()
183{
184	for ((i=0, n=0; i<5; i++))
185	do
186		if [ ${i} -eq 0 ]; then
187			MCU_ADDR=${MCU0_LOAD_ADDR}
188		elif [ ${i} -eq 1 ]; then
189			MCU_ADDR=${MCU1_LOAD_ADDR}
190		elif [ ${i} -eq 2 ]; then
191			MCU_ADDR=${MCU2_LOAD_ADDR}
192		elif [ ${i} -eq 3 ]; then
193			MCU_ADDR=${MCU3_LOAD_ADDR}
194		elif [ ${i} -eq 4 ]; then
195			MCU_ADDR=${MCU4_LOAD_ADDR}
196		fi
197
198		if [ -z ${MCU_ADDR} ]; then
199			continue
200		fi
201		MCU="mcu${i}"
202		echo "		${MCU} {
203			description = \"${MCU}\";
204			type = \"standalone\";
205			arch = \"riscv\";
206			data = /incbin/(\"./${MCU}.bin${SUFFIX}\");
207			compression = \"${COMPRESSION}\";
208			load = <0x"${MCU_ADDR}">;"
209		if [ "${COMPRESSION}" != "none" ]; then
210			openssl dgst -sha256 -binary -out ${MCU}.bin.digest ${MCU}.bin
211			${COMPRESS_CMD} ${MCU}.bin
212		echo "			digest {
213				value = /incbin/(\"./${MCU}.bin.digest\");
214				algo = \"sha256\";
215			};"
216		fi
217		echo "			hash {
218				algo = \"sha256\";
219			};
220		};"
221
222		if [ ${n} -eq 0 ]; then
223			STANDALONE_LIST=${STANDALONE_LIST}"\"${MCU}\""
224		else
225			STANDALONE_LIST=${STANDALONE_LIST}", \"${MCU}\""
226		fi
227		n=`expr ${n} + 1`
228
229		STANDALONE_SIGN=", \"standalone\""
230		STANDALONE_MCU="standalone = ${STANDALONE_LIST};"
231	done
232}
233
234function gen_loadable_node()
235{
236	for ((i=0; i<5; i++))
237	do
238		if [ ${i} -eq 0 ]; then
239			LOAD_ADDR=${LOAD0_LOAD_ADDR}
240		elif [ ${i} -eq 1 ]; then
241			LOAD_ADDR=${LOAD1_LOAD_ADDR}
242		elif [ ${i} -eq 2 ]; then
243			LOAD_ADDR=${LOAD2_LOAD_ADDR}
244		elif [ ${i} -eq 3 ]; then
245			LOAD_ADDR=${LOAD3_LOAD_ADDR}
246		elif [ ${i} -eq 4 ]; then
247			LOAD_ADDR=${LOAD4_LOAD_ADDR}
248		fi
249
250		if [ -z ${LOAD_ADDR} ]; then
251			continue
252		fi
253		LOAD="load${i}"
254		echo "		${LOAD} {
255			description = \"${LOAD}\";
256			type = \"standalone\";
257			arch = \"${ARCH}\";
258			data = /incbin/(\"./${LOAD}.bin${SUFFIX}\");
259			compression = \"${COMPRESSION}\";
260			load = <0x"${LOAD_ADDR}">;"
261		if [ "${COMPRESSION}" != "none" ]; then
262			openssl dgst -sha256 -binary -out ${LOAD}.bin.digest ${LOAD}.bin
263			${COMPRESS_CMD} ${LOAD}.bin
264	echo "			digest {
265				value = /incbin/(\"./${LOAD}.bin.digest\");
266				algo = \"sha256\";
267			};"
268		fi
269		echo "			hash {
270				algo = \"sha256\";
271			};
272		};"
273
274		LOADABLE_OTHER=${LOADABLE_OTHER}", \"${LOAD}\""
275	done
276}
277
278function gen_header()
279{
280echo "
281/*
282 * Copyright (C) 2020 Rockchip Electronic Co.,Ltd
283 *
284 * Simple U-boot fit source file containing ATF/OP-TEE/U-Boot/dtb/MCU
285 */
286
287/dts-v1/;
288
289/ {
290	description = \"FIT Image with ATF/OP-TEE/U-Boot/MCU\";
291	#address-cells = <1>;
292
293	images {
294"
295}
296
297function gen_arm64_configurations()
298{
299PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'`
300if grep  -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
301	ALGO_PADDING="				padding = \"pss\";"
302fi
303echo "	};
304
305	configurations {
306		default = \"conf\";
307		conf {
308			description = \"${PLATFORM}\";
309			rollback-index = <0x0>;
310			firmware = \"atf-1\";
311			loadables = \"uboot\"${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER};
312			${STANDALONE_MCU}
313			fdt = \"fdt\"${PROP_KERN_DTB};
314			signature {
315				algo = \"sha256,rsa2048\";
316				${ALGO_PADDING}
317				key-name-hint = \"dev\";
318				sign-images = \"fdt\", \"firmware\", \"loadables\"${STANDALONE_SIGN};
319			};
320		};
321	};
322};
323"
324}
325
326function gen_arm_configurations()
327{
328PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'`
329if grep  -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
330        ALGO_PADDING="                          padding = \"pss\";"
331fi
332echo "	};
333
334	configurations {
335		default = \"conf\";
336		conf {
337			description = \"${PLATFORM}\";
338			rollback-index = <0x0>;
339			${FIRMWARE_OPTEE}
340			loadables = \"uboot\"${LOADABLE_OTHER};
341			${STANDALONE_MCU}
342			fdt = \"fdt\"${PROP_KERN_DTB};
343			signature {
344				algo = \"sha256,rsa2048\";
345				${ALGO_PADDING}
346				key-name-hint = \"dev\";
347				sign-images = \"fdt\", \"loadables\"${FIRMWARE_SIGN}${STANDALONE_SIGN};
348			};
349		};
350	};
351};
352"
353}
354
355