blob: 03500faa140b30fdf1c74af98fd55775789c60a6 [file] [log] [blame]
Tim Leedd14a912022-07-29 16:42:15 +08001UBOOT_BINARY := "u-boot.${UBOOT_SUFFIX}"
Tim Leed52b0f62023-05-29 10:12:08 +08002BB_HEADER_BINARY := "BootBlockAndHeader.bin"
3BL31_HEADER_BINARY := "bl31AndHeader.bin"
4OPTEE_HEADER_BINARY := "teeAndHeader.bin"
Tim Leedd14a912022-07-29 16:42:15 +08005KMT_TIPFW_BINARY := "Kmt_TipFwL0_Skmt_TipFwL1.bin"
6KMT_TIPFW_BB_BINARY = "Kmt_TipFw_BootBlock.bin"
7KMT_TIPFW_BB_BL31_BINARY = "Kmt_TipFw_BootBlock_BL31.bin"
8KMT_TIPFW_BB_BL31_TEE_BINARY = "Kmt_TipFw_BootBlock_BL31_Tee.bin"
9KMT_TIPFW_BB_UBOOT_BINARY = "u-boot.bin.merged"
Tim Lee0e2dc682023-11-08 17:29:00 +080010SA_KMT_TIPFW_BINARY := "SA_Kmt_TipFwL0.bin"
Tim Leed52b0f62023-05-29 10:12:08 +080011
12BB_BL31_BINARY = "BootBlock_BL31_no_tip.bin"
13BB_BL31_TEE_BINARY = "BootBlock_BL31_Tee_no_tip.bin"
Tim Lee0e2dc682023-11-08 17:29:00 +080014BB_BL31_TEE_UBOOT_BINARY = "BootBlock_BL31_Tee_Uboot_no_tip.bin"
15BB_BL31_TEE_UBOOT_SA_BINARY = "BootBlock_BL31_Tee_Uboot_no_tip_SA.bin"
Tim Leed52b0f62023-05-29 10:12:08 +080016
Tim Leedd14a912022-07-29 16:42:15 +080017FULL_SUFFIX = "full"
18MERGED_SUFFIX = "merged"
Tim Lee3af4d262022-09-27 15:01:43 +080019UBOOT_SUFFIX:append = ".${MERGED_SUFFIX}"
Tim Leed52b0f62023-05-29 10:12:08 +080020UBOOT_HEADER_BINARY := "${UBOOT_BINARY}.${FULL_SUFFIX}"
Tim Leedd14a912022-07-29 16:42:15 +080021
22IGPS_DIR = "${STAGING_DIR_NATIVE}/${datadir}/npcm8xx-igps"
Tim Leedd14a912022-07-29 16:42:15 +080023
Tim Lee7f23e3a2022-11-30 13:53:50 +080024BB_BIN = "arbel_a35_bootblock.bin"
25BL31_BIN = "bl31.bin"
26OPTEE_BIN = "tee.bin"
27UBOOT_BIN = "u-boot.bin"
Tim Leed52b0f62023-05-29 10:12:08 +080028BB_NO_TIP_BIN = "arbel_a35_bootblock_no_tip.bin"
Tim Lee7f23e3a2022-11-30 13:53:50 +080029
30# Align images if needed
31python do_pad_binary() {
Tim Leed52b0f62023-05-29 10:12:08 +080032 TIP_IMAGE = d.getVar('TIP_IMAGE', True)
Tim Lee7f23e3a2022-11-30 13:53:50 +080033 def Pad_bin_file_inplace(inF, align):
34 padding_size = 0
Tim Lee7f23e3a2022-11-30 13:53:50 +080035
36 F_size = os.path.getsize(inF)
37
Brian Ma317ff982023-08-01 16:09:54 +080038 if ((F_size % align) == 0):
39 return
40
Tim Lee7f23e3a2022-11-30 13:53:50 +080041 padding_size = align - (F_size % align)
42
43 infile = open(inF, "ab")
44 infile.seek(0, 2)
45 infile.write(b'\x00' * padding_size)
46 infile.close()
47
Tim Leed52b0f62023-05-29 10:12:08 +080048 if TIP_IMAGE == "True":
49 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Lee7f23e3a2022-11-30 13:53:50 +080050 '%s' % d.getVar('BB_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Leed52b0f62023-05-29 10:12:08 +080051 else:
52 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
53 '%s' % d.getVar('BB_NO_TIP_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080054
55 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Leed52b0f62023-05-29 10:12:08 +080056 '%s' % d.getVar('BL31_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080057
58 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Leed52b0f62023-05-29 10:12:08 +080059 '%s' % d.getVar('OPTEE_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080060
61 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
62 '%s' % d.getVar('UBOOT_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
63}
64
Tim Leedd14a912022-07-29 16:42:15 +080065# Prepare the Bootblock and U-Boot images using npcm8xx-bingo
66do_prepare_bootloaders() {
67 local olddir="$(pwd)"
68 cd ${DEPLOY_DIR_IMAGE}
69
70 bingo ${IGPS_DIR}/BL31_AndHeader.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080071 -o ${BL31_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080072
73 bingo ${IGPS_DIR}/OpTeeAndHeader.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080074 -o ${OPTEE_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080075
Tim Leed52b0f62023-05-29 10:12:08 +080076 if [ "${TIP_IMAGE}" = "True" ]; then
Tim Leedd14a912022-07-29 16:42:15 +080077 bingo ${IGPS_DIR}/BootBlockAndHeader_${DEVICE_GEN}_${IGPS_MACHINE}.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080078 -o ${BB_HEADER_BINARY}
79 else
80 bingo ${IGPS_DIR}/BootBlockAndHeader_${DEVICE_GEN}_${IGPS_MACHINE}_NoTip.xml \
81 -o ${BB_HEADER_BINARY}
82 fi
Tim Leedd14a912022-07-29 16:42:15 +080083
84 bingo ${IGPS_DIR}/UbootHeader_${DEVICE_GEN}.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080085 -o ${UBOOT_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080086
87 cd "$olddir"
88}
89
Tim Leed52b0f62023-05-29 10:12:08 +080090check_keys() {
91 if [ -n "${KEY_FOLDER}" ]; then
92 echo "local"
93 else
94 echo "default"
95 fi
96}
Tim Leedd14a912022-07-29 16:42:15 +080097
Tim Leed4452592023-06-15 15:24:13 +080098# Sign images for secure os be enabled and TIP mode only
Tim Leed52b0f62023-05-29 10:12:08 +080099do_sign_binary() {
Tim Leed4452592023-06-15 15:24:13 +0800100 if [ "${SECURED_IMAGE}" != "True" -o "${TIP_IMAGE}" != "True" ]; then
Tim Leed52b0f62023-05-29 10:12:08 +0800101 return
102 fi
103 checked=`check_keys`
104 if [ "${checked}" = "local" ]; then
105 bbnote "Sign image with local keys"
106 key_bb=${KEY_FOLDER}/${KEY_BB}
107 key_bl31=${KEY_FOLDER}/${KEY_BL31}
108 key_optee=${KEY_FOLDER}/${KEY_OPTEE}
109 key_uboot=${KEY_FOLDER}/${KEY_UBOOT}
110 else
111 bbnote "Sign image with default keys"
112 key_bb=${KEY_FOLDER_DEFAULT}/${KEY_BB}
113 key_bl31=${KEY_FOLDER_DEFAULT}/${KEY_BL31}
114 key_optee=${KEY_FOLDER_DEFAULT}/${KEY_OPTEE}
115 key_uboot=${KEY_FOLDER_DEFAULT}/${KEY_UBOOT}
116 fi
117 bbnote "BB sign key from ${checked}: ${key_bb}"
118 bbnote "BL31 sign key from ${checked}: ${key_bl31}"
119 bbnote "OPTEE sign key from ${checked}: ${key_optee}"
120 bbnote "UBOOT sign key from ${checked}: ${key_uboot}"
121 # Used to embed the key index inside the image, usually at offset 0x140
122 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
123 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} 140 ${KEY_BB_INDEX}
124
125 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
126 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} 140 ${SKMT_BL31_KEY_INDEX}
127
128 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
129 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} 140 ${SKMT_BL32_KEY_INDEX}
130
131 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
132 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} 140 ${SKMT_BL33_KEY_INDEX}
133
134 # Sign specific image with specific key
135 res=`python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
136 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} 112 ${key_bb} 16 \
137 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_BB_ID}
138
139 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
140 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} 112 ${key_bl31} 16 \
141 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_BL31_ID}
142
143 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
144 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} 112 ${key_optee} 16 \
145 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_OPTEE_ID}
146
147 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
148 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} 112 ${key_uboot} 16 \
149 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_UBOOT_ID}`
150
151 # Stop full image build process when sign binary got failed
152 set +e
153 err=`echo $res | grep -E "missing|Invalid|failed"`
154 if [ -n "${err}" ]; then
155 bbfatal "Sign binary failed: keys are not found or invalid. Please check your KEY_FOLDER and KEY definition."
156 fi
157 set -e
158}
159
160python do_merge_bootloaders() {
161 TIP_IMAGE = d.getVar('TIP_IMAGE', True)
Tim Lee0e2dc682023-11-08 17:29:00 +0800162 SA_TIP_IMAGE = d.getVar('SA_TIP_IMAGE', True)
Tim Lee9d9d9e32022-10-28 16:57:26 +0800163 def Merge_bin_files_and_pad(inF1, inF2, outF, align, align_end):
Tim Leedd14a912022-07-29 16:42:15 +0800164 padding_size = 0
165 padding_size_end = 0
166 F1_size = os.path.getsize(inF1)
167 F2_size = os.path.getsize(inF2)
168
169 if ((F1_size % align) != 0):
170 padding_size = align - (F1_size % align)
171
Tim Lee9d9d9e32022-10-28 16:57:26 +0800172 if ((F2_size % align_end) != 0):
173 padding_size_end = align_end - (F2_size % align_end)
Tim Leedd14a912022-07-29 16:42:15 +0800174
175 with open(outF, "wb") as file3:
176 with open(inF1, "rb") as file1:
177 data = file1.read()
178 file3.write(data)
179
180 file3.write(b'\xFF' * padding_size)
181
182 with open(inF2, "rb") as file2:
183 data = file2.read()
184 file3.write(data)
185
186 file3.write(b'\xFF' * padding_size_end)
187
Tim Leed52b0f62023-05-29 10:12:08 +0800188 if TIP_IMAGE == "True":
189 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BINARY',True)),
190 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800191 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800192 int(d.getVar('BB_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800193
Tim Leed52b0f62023-05-29 10:12:08 +0800194 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BINARY',True)),
195 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BL31_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800196 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800197 int(d.getVar('ATF_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800198
Tim Leed52b0f62023-05-29 10:12:08 +0800199 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_BINARY',True)),
200 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('OPTEE_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800201 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_TEE_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800202 int(d.getVar('OPTEE_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800203
Tim Leed52b0f62023-05-29 10:12:08 +0800204 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_TEE_BINARY',True)),
205 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('UBOOT_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800206 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_UBOOT_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800207 int(d.getVar('UBOOT_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leed52b0f62023-05-29 10:12:08 +0800208 else:
209 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_HEADER_BINARY',True)),
210 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BL31_HEADER_BINARY',True)),
211 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_BINARY',True)),
212 int(d.getVar('ATF_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
213
214 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_BINARY',True)),
215 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('OPTEE_HEADER_BINARY',True)),
216 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_BINARY',True)),
217 int(d.getVar('OPTEE_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
218
219 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_BINARY',True)),
220 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('UBOOT_HEADER_BINARY',True)),
221 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_UBOOT_BINARY',True)),
222 int(d.getVar('UBOOT_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Lee0e2dc682023-11-08 17:29:00 +0800223
224 if SA_TIP_IMAGE == "True":
225 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_UBOOT_BINARY',True)),
226 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('SA_KMT_TIPFW_BINARY',True)),
227 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_UBOOT_SA_BINARY',True)),
228 int(d.getVar('SA_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
229
230 os.rename(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_UBOOT_SA_BINARY',True)),
231 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_UBOOT_BINARY',True)))
232 else:
233 os.rename(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_UBOOT_BINARY',True)),
234 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_UBOOT_BINARY',True)))
Tim Leedd14a912022-07-29 16:42:15 +0800235}
236
Tim Lee30d2a112022-12-01 14:19:46 +0800237do_pad_binary[depends] += " \
Tim Lee0e2dc682023-11-08 17:29:00 +0800238 ${@'npcm8xx-tip-fw:do_deploy' if d.getVar('TIP_IMAGE', True) == 'True' or d.getVar('SA_TIP_IMAGE', True) == 'True' else ''} \
Tim Leedd14a912022-07-29 16:42:15 +0800239 npcm8xx-bootblock:do_deploy \
Tim Lee3af4d262022-09-27 15:01:43 +0800240 u-boot-nuvoton:do_deploy \
Tim Leedd14a912022-07-29 16:42:15 +0800241 trusted-firmware-a:do_deploy \
242 optee-os:do_deploy \
243 npcm7xx-bingo-native:do_populate_sysroot \
244 npcm8xx-igps-native:do_populate_sysroot \
245 "
246
247# link images for we only need to flash partial image with idea name
248do_generate_ext4_tar:append() {
249 cd ${DEPLOY_DIR_IMAGE}
250 ln -sf ${UBOOT_BINARY}.${MERGED_SUFFIX} image-u-boot
251 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
252 ln -sf ${S}/ext4/${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst image-rofs
253 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} image-rwfs
254 ln -sf ${IMAGE_NAME}.rootfs.wic.gz image-emmc.gz
255}
256
Tim Lee7f23e3a2022-11-30 13:53:50 +0800257addtask do_pad_binary before do_prepare_bootloaders
Tim Leed52b0f62023-05-29 10:12:08 +0800258addtask do_sign_binary before do_merge_bootloaders after do_prepare_bootloaders
Tim Leedd14a912022-07-29 16:42:15 +0800259addtask do_prepare_bootloaders before do_generate_static after do_generate_rwfs_static
Tim Leed52b0f62023-05-29 10:12:08 +0800260addtask do_merge_bootloaders before do_generate_static after do_sign_binary
Tim Leedd14a912022-07-29 16:42:15 +0800261addtask do_merge_bootloaders before do_generate_ext4_tar after do_prepare_bootloaders
262
263# Include the full bootblock and u-boot in the final static image
264python do_generate_static:append() {
265 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
266 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
267 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
268 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
269}
270
271do_make_ubi:append() {
272 # Concatenate the uboot and ubi partitions
273 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
274 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
275 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
276}
277
278do_make_ubi[depends] += "${PN}:do_prepare_bootloaders"
279do_generate_ubi_tar[depends] += "${PN}:do_prepare_bootloaders"
280do_generate_ubi_tar[depends] += "${PN}:do_merge_bootloaders"
281do_generate_static_tar[depends] += "${PN}:do_prepare_bootloaders"
282do_generate_static_tar[depends] += "${PN}:do_merge_bootloaders"
283do_generate_ext4_tar[depends] += "${PN}:do_prepare_bootloaders"
284do_generate_ext4_tar[depends] += "${PN}:do_merge_bootloaders"