1a9eed6e1SPeng Fan#!/bin/sh 2a9eed6e1SPeng Fan# SPDX-License-Identifier: GPL-2.0+ 3a9eed6e1SPeng Fan# 4a9eed6e1SPeng Fan# script to generate FIT image source for i.MX8MQ boards with 5a9eed6e1SPeng Fan# ARM Trusted Firmware and multiple device trees (given on the command line) 6a9eed6e1SPeng Fan# 7a9eed6e1SPeng Fan# usage: $0 <dt_name> [<dt_name> [<dt_name] ...] 8a9eed6e1SPeng Fan 9a9eed6e1SPeng Fan[ -z "$BL31" ] && BL31="bl31.bin" 10a9eed6e1SPeng Fan[ -z "$TEE_LOAD_ADDR" ] && TEE_LOAD_ADDR="0xfe000000" 11a9eed6e1SPeng Fan[ -z "$ATF_LOAD_ADDR" ] && ATF_LOAD_ADDR="0x00910000" 12*b184a796SPeng Fan[ -z "$BL33_LOAD_ADDR" ] && BL33_LOAD_ADDR="0x40200000" 13a9eed6e1SPeng Fan 14a9eed6e1SPeng Fanif [ ! -f $BL31 ]; then 15a9eed6e1SPeng Fan echo "ERROR: BL31 file $BL31 NOT found" >&2 16a9eed6e1SPeng Fan exit 0 17a9eed6e1SPeng Fanelse 18a9eed6e1SPeng Fan echo "$BL31 size: " >&2 19a9eed6e1SPeng Fan ls -lct $BL31 | awk '{print $5}' >&2 20a9eed6e1SPeng Fanfi 21a9eed6e1SPeng Fan 22a9eed6e1SPeng FanBL32="tee.bin" 23a9eed6e1SPeng Fan 24a9eed6e1SPeng Fanif [ ! -f $BL32 ]; then 25a9eed6e1SPeng Fan BL32=/dev/null 26a9eed6e1SPeng Fanelse 27a9eed6e1SPeng Fan echo "Building with TEE support, make sure your $BL31 is compiled with spd. If you do not want tee, please delete $BL31" >&2 28a9eed6e1SPeng Fan echo "$BL32 size: " >&2 29a9eed6e1SPeng Fan ls -lct $BL32 | awk '{print $5}' >&2 30a9eed6e1SPeng Fanfi 31a9eed6e1SPeng Fan 32a9eed6e1SPeng FanBL33="u-boot-nodtb.bin" 33a9eed6e1SPeng Fan 34a9eed6e1SPeng Fanif [ ! -f $BL33 ]; then 35a9eed6e1SPeng Fan echo "ERROR: $BL33 file NOT found" >&2 36a9eed6e1SPeng Fan exit 0 37a9eed6e1SPeng Fanelse 38a9eed6e1SPeng Fan echo "u-boot-nodtb.bin size: " >&2 39a9eed6e1SPeng Fan ls -lct u-boot-nodtb.bin | awk '{print $5}' >&2 40a9eed6e1SPeng Fanfi 41a9eed6e1SPeng Fan 42a9eed6e1SPeng Fanfor dtname in $* 43a9eed6e1SPeng Fando 44a9eed6e1SPeng Fan echo "$dtname size: " >&2 45a9eed6e1SPeng Fan ls -lct $dtname | awk '{print $5}' >&2 46a9eed6e1SPeng Fandone 47a9eed6e1SPeng Fan 48a9eed6e1SPeng Fan 49a9eed6e1SPeng Fancat << __HEADER_EOF 50a9eed6e1SPeng Fan/dts-v1/; 51a9eed6e1SPeng Fan 52a9eed6e1SPeng Fan/ { 53a9eed6e1SPeng Fan description = "Configuration to load ATF before U-Boot"; 54a9eed6e1SPeng Fan 55a9eed6e1SPeng Fan images { 56a9eed6e1SPeng Fan uboot@1 { 57a9eed6e1SPeng Fan description = "U-Boot (64-bit)"; 58a9eed6e1SPeng Fan data = /incbin/("$BL33"); 59a9eed6e1SPeng Fan type = "standalone"; 60a9eed6e1SPeng Fan arch = "arm64"; 61a9eed6e1SPeng Fan compression = "none"; 62*b184a796SPeng Fan load = <$BL33_LOAD_ADDR>; 63a9eed6e1SPeng Fan }; 64a9eed6e1SPeng Fan atf@1 { 65a9eed6e1SPeng Fan description = "ARM Trusted Firmware"; 66a9eed6e1SPeng Fan data = /incbin/("$BL31"); 67a9eed6e1SPeng Fan type = "firmware"; 68a9eed6e1SPeng Fan arch = "arm64"; 69a9eed6e1SPeng Fan compression = "none"; 70a9eed6e1SPeng Fan load = <$ATF_LOAD_ADDR>; 71a9eed6e1SPeng Fan entry = <$ATF_LOAD_ADDR>; 72a9eed6e1SPeng Fan }; 73a9eed6e1SPeng Fan__HEADER_EOF 74a9eed6e1SPeng Fan 75a9eed6e1SPeng Fanif [ -f $BL32 ]; then 76a9eed6e1SPeng Fancat << __HEADER_EOF 77a9eed6e1SPeng Fan tee@1 { 78a9eed6e1SPeng Fan description = "TEE firmware"; 79a9eed6e1SPeng Fan data = /incbin/("$BL32"); 80a9eed6e1SPeng Fan type = "firmware"; 81a9eed6e1SPeng Fan arch = "arm64"; 82a9eed6e1SPeng Fan compression = "none"; 83a9eed6e1SPeng Fan load = <$TEE_LOAD_ADDR>; 84a9eed6e1SPeng Fan entry = <$TEE_LOAD_ADDR>; 85a9eed6e1SPeng Fan }; 86a9eed6e1SPeng Fan__HEADER_EOF 87a9eed6e1SPeng Fanfi 88a9eed6e1SPeng Fan 89a9eed6e1SPeng Fancnt=1 90a9eed6e1SPeng Fanfor dtname in $* 91a9eed6e1SPeng Fando 92a9eed6e1SPeng Fan cat << __FDT_IMAGE_EOF 93a9eed6e1SPeng Fan fdt@$cnt { 94a9eed6e1SPeng Fan description = "$(basename $dtname .dtb)"; 95a9eed6e1SPeng Fan data = /incbin/("$dtname"); 96a9eed6e1SPeng Fan type = "flat_dt"; 97a9eed6e1SPeng Fan compression = "none"; 98a9eed6e1SPeng Fan }; 99a9eed6e1SPeng Fan__FDT_IMAGE_EOF 100a9eed6e1SPeng Fancnt=$((cnt+1)) 101a9eed6e1SPeng Fandone 102a9eed6e1SPeng Fan 103a9eed6e1SPeng Fancat << __CONF_HEADER_EOF 104a9eed6e1SPeng Fan }; 105a9eed6e1SPeng Fan configurations { 106a9eed6e1SPeng Fan default = "config@1"; 107a9eed6e1SPeng Fan 108a9eed6e1SPeng Fan__CONF_HEADER_EOF 109a9eed6e1SPeng Fan 110a9eed6e1SPeng Fancnt=1 111a9eed6e1SPeng Fanfor dtname in $* 112a9eed6e1SPeng Fando 113a9eed6e1SPeng Fanif [ -f $BL32 ]; then 114a9eed6e1SPeng Fancat << __CONF_SECTION_EOF 115a9eed6e1SPeng Fan config@$cnt { 116a9eed6e1SPeng Fan description = "$(basename $dtname .dtb)"; 117a9eed6e1SPeng Fan firmware = "uboot@1"; 118a9eed6e1SPeng Fan loadables = "atf@1", "tee@1"; 119a9eed6e1SPeng Fan fdt = "fdt@$cnt"; 120a9eed6e1SPeng Fan }; 121a9eed6e1SPeng Fan__CONF_SECTION_EOF 122a9eed6e1SPeng Fanelse 123a9eed6e1SPeng Fancat << __CONF_SECTION1_EOF 124a9eed6e1SPeng Fan config@$cnt { 125a9eed6e1SPeng Fan description = "$(basename $dtname .dtb)"; 126a9eed6e1SPeng Fan firmware = "uboot@1"; 127a9eed6e1SPeng Fan loadables = "atf@1"; 128a9eed6e1SPeng Fan fdt = "fdt@$cnt"; 129a9eed6e1SPeng Fan }; 130a9eed6e1SPeng Fan__CONF_SECTION1_EOF 131a9eed6e1SPeng Fanfi 132a9eed6e1SPeng Fancnt=$((cnt+1)) 133a9eed6e1SPeng Fandone 134a9eed6e1SPeng Fan 135a9eed6e1SPeng Fancat << __ITS_EOF 136a9eed6e1SPeng Fan }; 137a9eed6e1SPeng Fan}; 138a9eed6e1SPeng Fan__ITS_EOF 139