xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-rockchip/fit_nodes.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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
175			# if disable packing tee.bin
176			if ! grep -q '^CONFIG_SPL_OPTEE=y' .config ; then
177				return
178			fi
179
180		fi
181	fi
182
183	TEE="tee.bin"
184	echo "		optee {
185			description = \"OP-TEE\";
186			data = /incbin/(\"${TEE}${SUFFIX}\");
187			type = \"firmware\";
188			arch = \"${ARCH}\";
189			os = \"op-tee\";
190			compression = \"${COMPRESSION}\";
191			${ENTRY}
192			load = <"${TEE_LOAD_ADDR}">;"
193	if [ "${COMPRESSION}" != "none" ]; then
194		openssl dgst -sha256 -binary -out ${TEE}.digest ${TEE}
195		${COMPRESS_CMD} ${TEE}
196		echo "			digest {
197				value = /incbin/(\"./${TEE}.digest\");
198				algo = \"sha256\";
199			};"
200	fi
201	echo "			hash {
202				algo = \"sha256\";
203			};
204		};"
205	LOADABLE_OPTEE=", \"optee\""
206	FIRMWARE_OPTEE="firmware = \"optee\";"
207	FIRMWARE_SIGN="\"firmware\""
208}
209
210function gen_mcu_node()
211{
212	for ((i=0, n=0; i<5; i++))
213	do
214		if [ ${i} -eq 0 ]; then
215			MCU_ADDR=${MCU0_LOAD_ADDR}
216		elif [ ${i} -eq 1 ]; then
217			MCU_ADDR=${MCU1_LOAD_ADDR}
218		elif [ ${i} -eq 2 ]; then
219			MCU_ADDR=${MCU2_LOAD_ADDR}
220		elif [ ${i} -eq 3 ]; then
221			MCU_ADDR=${MCU3_LOAD_ADDR}
222		elif [ ${i} -eq 4 ]; then
223			MCU_ADDR=${MCU4_LOAD_ADDR}
224		fi
225
226		if [ -z ${MCU_ADDR} ]; then
227			continue
228		fi
229
230		MCU_ADDR_VAL=$((MCU_ADDR))
231		MCU="mcu${i}"
232		echo "		${MCU} {
233			description = \"${MCU}\";
234			type = \"standalone\";
235			arch = \"riscv\";
236			load = <"${MCU_ADDR}">;"
237
238		if [ "${COMPRESSION}" != "none" -a ${MCU_ADDR_VAL} -lt ${MAX_ADDR_VAL} ]; then
239			openssl dgst -sha256 -binary -out ${MCU}.bin.digest ${MCU}.bin
240			${COMPRESS_CMD} ${MCU}.bin
241			echo "			data = /incbin/(\"./${MCU}.bin${SUFFIX}\");
242			compression = \"${COMPRESSION}\";
243			digest {
244				value = /incbin/(\"./${MCU}.bin.digest\");
245				algo = \"sha256\";
246			};"
247		else
248			echo "			data = /incbin/(\"./${MCU}.bin\");
249			compression = \"none\";"
250		fi
251
252		echo "			hash {
253				algo = \"sha256\";
254			};
255		};"
256
257		if [ ${n} -eq 0 ]; then
258			STANDALONE_LIST=${STANDALONE_LIST}"\"${MCU}\""
259		else
260			STANDALONE_LIST=${STANDALONE_LIST}", \"${MCU}\""
261		fi
262		n=`expr ${n} + 1`
263
264		STANDALONE_SIGN=", \"standalone\""
265		STANDALONE_MCU="standalone = ${STANDALONE_LIST};"
266	done
267}
268
269function gen_loadable_node()
270{
271	for ((i=0; i<5; i++))
272	do
273		if [ ${i} -eq 0 ]; then
274			LOAD_ADDR=${LOAD0_LOAD_ADDR}
275		elif [ ${i} -eq 1 ]; then
276			LOAD_ADDR=${LOAD1_LOAD_ADDR}
277		elif [ ${i} -eq 2 ]; then
278			LOAD_ADDR=${LOAD2_LOAD_ADDR}
279		elif [ ${i} -eq 3 ]; then
280			LOAD_ADDR=${LOAD3_LOAD_ADDR}
281		elif [ ${i} -eq 4 ]; then
282			LOAD_ADDR=${LOAD4_LOAD_ADDR}
283		fi
284
285		if [ -z ${LOAD_ADDR} ]; then
286			continue
287		fi
288
289		LOAD_ADDR_VAL=$((LOAD_ADDR))
290		LOAD="load${i}"
291		echo "		${LOAD} {
292			description = \"${LOAD}\";
293			type = \"standalone\";
294			arch = \"${ARCH}\";
295			load = <"${LOAD_ADDR}">;"
296
297		if [ "${COMPRESSION}" != "none" -a ${LOAD_ADDR_VAL} -lt ${MAX_ADDR_VAL} ]; then
298			openssl dgst -sha256 -binary -out ${LOAD}.bin.digest ${LOAD}.bin
299			${COMPRESS_CMD} ${LOAD}.bin
300			echo "			data = /incbin/(\"./${LOAD}.bin${SUFFIX}\");
301			compression = \"${COMPRESSION}\";
302			digest {
303				value = /incbin/(\"./${LOAD}.bin.digest\");
304				algo = \"sha256\";
305			};"
306		else
307			echo "			data = /incbin/(\"./${LOAD}.bin\");
308			compression = \"none\";"
309		fi
310
311		echo "			hash {
312				algo = \"sha256\";
313			};
314		};"
315
316		LOADABLE_OTHER=${LOADABLE_OTHER}", \"${LOAD}\""
317	done
318}
319
320function gen_header()
321{
322echo "
323/*
324 * Copyright (C) 2020 Rockchip Electronic Co.,Ltd
325 *
326 * Simple U-boot fit source file containing ATF/OP-TEE/U-Boot/dtb/MCU
327 */
328
329/dts-v1/;
330
331/ {
332	description = \"FIT Image with ATF/OP-TEE/U-Boot/MCU\";
333	#address-cells = <1>;
334
335	images {
336"
337}
338
339function gen_arm64_configurations()
340{
341PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'`
342if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
343	ALGO_PADDING="				padding = \"pss\";"
344fi
345if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then
346	ALGO_NAME="				algo = \"sha256,rsa4096\";"
347else
348	ALGO_NAME="				algo = \"sha256,rsa2048\";"
349fi
350echo "	};
351
352	configurations {
353		default = \"conf\";
354		conf {
355			description = \"${PLATFORM}\";
356			rollback-index = <0x0>;
357			firmware = \"atf-1\";
358			loadables = ${LOADABLE_UBOOT}${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER};
359			${STANDALONE_MCU}
360			${FDT}
361			signature {
362				${ALGO_NAME}
363				${ALGO_PADDING}
364				key-name-hint = \"dev\";
365				sign-images = \"firmware\", \"loadables\"${FDT_SIGN}${STANDALONE_SIGN};
366			};
367		};
368	};
369};
370"
371}
372
373function gen_arm_configurations()
374{
375PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'`
376if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then
377        ALGO_PADDING="                          padding = \"pss\";"
378fi
379if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then
380	ALGO_NAME="				algo = \"sha256,rsa4096\";"
381else
382	ALGO_NAME="				algo = \"sha256,rsa2048\";"
383fi
384if [ ! -z "${LOADABLE_UBOOT}" ] || [ ! -z "${LOADABLE_OTHER}" ]; then
385	LOADABLE_UBOOT="\"uboot\""
386	LOADABLES="loadables = ${LOADABLE_UBOOT}${LOADABLE_OTHER};"
387	if [ -z ${FIRMWARE_SIGN} ]; then
388		LOADABLES_SIGN="\"loadables\""
389	else
390		LOADABLES_SIGN=", \"loadables\""
391	fi
392fi
393
394echo "	};
395
396	configurations {
397		default = \"conf\";
398		conf {
399			description = \"${PLATFORM}\";
400			rollback-index = <0x0>;
401			${FIRMWARE_OPTEE}
402			${LOADABLES}
403			${STANDALONE_MCU}
404			${FDT}
405			signature {
406				${ALGO_NAME}
407				${ALGO_PADDING}
408				key-name-hint = \"dev\";
409				sign-images = ${FIRMWARE_SIGN}${LOADABLES_SIGN}${FDT_SIGN}${STANDALONE_SIGN};
410			};
411		};
412	};
413};
414"
415}
416
417