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