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