blob: 9b6db798d0f48e939f11dfa01163b6719068db59 [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 Leed52b0f62023-05-29 10:12:08 +080010
11BB_BL31_BINARY = "BootBlock_BL31_no_tip.bin"
12BB_BL31_TEE_BINARY = "BootBlock_BL31_Tee_no_tip.bin"
13BB_BL31_TEE_UBOOT_BINARY = "u-boot.bin.merged"
14
Tim Leedd14a912022-07-29 16:42:15 +080015FULL_SUFFIX = "full"
16MERGED_SUFFIX = "merged"
Tim Lee3af4d262022-09-27 15:01:43 +080017UBOOT_SUFFIX:append = ".${MERGED_SUFFIX}"
Tim Leed52b0f62023-05-29 10:12:08 +080018UBOOT_HEADER_BINARY := "${UBOOT_BINARY}.${FULL_SUFFIX}"
Tim Leedd14a912022-07-29 16:42:15 +080019
20IGPS_DIR = "${STAGING_DIR_NATIVE}/${datadir}/npcm8xx-igps"
Tim Leedd14a912022-07-29 16:42:15 +080021
Tim Lee7f23e3a2022-11-30 13:53:50 +080022BB_BIN = "arbel_a35_bootblock.bin"
23BL31_BIN = "bl31.bin"
24OPTEE_BIN = "tee.bin"
25UBOOT_BIN = "u-boot.bin"
Tim Leed52b0f62023-05-29 10:12:08 +080026BB_NO_TIP_BIN = "arbel_a35_bootblock_no_tip.bin"
Tim Lee7f23e3a2022-11-30 13:53:50 +080027
28# Align images if needed
29python do_pad_binary() {
Tim Leed52b0f62023-05-29 10:12:08 +080030 TIP_IMAGE = d.getVar('TIP_IMAGE', True)
Tim Lee7f23e3a2022-11-30 13:53:50 +080031 def Pad_bin_file_inplace(inF, align):
32 padding_size = 0
Tim Lee7f23e3a2022-11-30 13:53:50 +080033
34 F_size = os.path.getsize(inF)
35
Brian Ma317ff982023-08-01 16:09:54 +080036 if ((F_size % align) == 0):
37 return
38
Tim Lee7f23e3a2022-11-30 13:53:50 +080039 padding_size = align - (F_size % align)
40
41 infile = open(inF, "ab")
42 infile.seek(0, 2)
43 infile.write(b'\x00' * padding_size)
44 infile.close()
45
Tim Leed52b0f62023-05-29 10:12:08 +080046 if TIP_IMAGE == "True":
47 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Lee7f23e3a2022-11-30 13:53:50 +080048 '%s' % d.getVar('BB_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Leed52b0f62023-05-29 10:12:08 +080049 else:
50 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
51 '%s' % d.getVar('BB_NO_TIP_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080052
53 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Leed52b0f62023-05-29 10:12:08 +080054 '%s' % d.getVar('BL31_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080055
56 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
Tim Leed52b0f62023-05-29 10:12:08 +080057 '%s' % d.getVar('OPTEE_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
Tim Lee7f23e3a2022-11-30 13:53:50 +080058
59 Pad_bin_file_inplace(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
60 '%s' % d.getVar('UBOOT_BIN',True)), int(d.getVar('PAD_ALIGN', True)))
61}
62
Tim Leedd14a912022-07-29 16:42:15 +080063# Prepare the Bootblock and U-Boot images using npcm8xx-bingo
64do_prepare_bootloaders() {
65 local olddir="$(pwd)"
66 cd ${DEPLOY_DIR_IMAGE}
67
68 bingo ${IGPS_DIR}/BL31_AndHeader.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080069 -o ${BL31_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080070
71 bingo ${IGPS_DIR}/OpTeeAndHeader.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080072 -o ${OPTEE_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080073
Tim Leed52b0f62023-05-29 10:12:08 +080074 if [ "${TIP_IMAGE}" = "True" ]; then
Tim Leedd14a912022-07-29 16:42:15 +080075 bingo ${IGPS_DIR}/BootBlockAndHeader_${DEVICE_GEN}_${IGPS_MACHINE}.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080076 -o ${BB_HEADER_BINARY}
77 else
78 bingo ${IGPS_DIR}/BootBlockAndHeader_${DEVICE_GEN}_${IGPS_MACHINE}_NoTip.xml \
79 -o ${BB_HEADER_BINARY}
80 fi
Tim Leedd14a912022-07-29 16:42:15 +080081
82 bingo ${IGPS_DIR}/UbootHeader_${DEVICE_GEN}.xml \
Tim Leed52b0f62023-05-29 10:12:08 +080083 -o ${UBOOT_HEADER_BINARY}
Tim Leedd14a912022-07-29 16:42:15 +080084
85 cd "$olddir"
86}
87
Tim Leed52b0f62023-05-29 10:12:08 +080088check_keys() {
89 if [ -n "${KEY_FOLDER}" ]; then
90 echo "local"
91 else
92 echo "default"
93 fi
94}
Tim Leedd14a912022-07-29 16:42:15 +080095
Tim Leed4452592023-06-15 15:24:13 +080096# Sign images for secure os be enabled and TIP mode only
Tim Leed52b0f62023-05-29 10:12:08 +080097do_sign_binary() {
Tim Leed4452592023-06-15 15:24:13 +080098 if [ "${SECURED_IMAGE}" != "True" -o "${TIP_IMAGE}" != "True" ]; then
Tim Leed52b0f62023-05-29 10:12:08 +080099 return
100 fi
101 checked=`check_keys`
102 if [ "${checked}" = "local" ]; then
103 bbnote "Sign image with local keys"
104 key_bb=${KEY_FOLDER}/${KEY_BB}
105 key_bl31=${KEY_FOLDER}/${KEY_BL31}
106 key_optee=${KEY_FOLDER}/${KEY_OPTEE}
107 key_uboot=${KEY_FOLDER}/${KEY_UBOOT}
108 else
109 bbnote "Sign image with default keys"
110 key_bb=${KEY_FOLDER_DEFAULT}/${KEY_BB}
111 key_bl31=${KEY_FOLDER_DEFAULT}/${KEY_BL31}
112 key_optee=${KEY_FOLDER_DEFAULT}/${KEY_OPTEE}
113 key_uboot=${KEY_FOLDER_DEFAULT}/${KEY_UBOOT}
114 fi
115 bbnote "BB sign key from ${checked}: ${key_bb}"
116 bbnote "BL31 sign key from ${checked}: ${key_bl31}"
117 bbnote "OPTEE sign key from ${checked}: ${key_optee}"
118 bbnote "UBOOT sign key from ${checked}: ${key_uboot}"
119 # Used to embed the key index inside the image, usually at offset 0x140
120 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
121 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} 140 ${KEY_BB_INDEX}
122
123 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
124 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} 140 ${SKMT_BL31_KEY_INDEX}
125
126 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
127 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} 140 ${SKMT_BL32_KEY_INDEX}
128
129 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Replace_binary_single_byte \
130 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} 140 ${SKMT_BL33_KEY_INDEX}
131
132 # Sign specific image with specific key
133 res=`python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
134 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} 112 ${key_bb} 16 \
135 ${DEPLOY_DIR_IMAGE}/${BB_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_BB_ID}
136
137 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
138 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} 112 ${key_bl31} 16 \
139 ${DEPLOY_DIR_IMAGE}/${BL31_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_BL31_ID}
140
141 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
142 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} 112 ${key_optee} 16 \
143 ${DEPLOY_DIR_IMAGE}/${OPTEE_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_OPTEE_ID}
144
145 python3 ${IGPS_DIR}/BinarySignatureGenerator.py Sign_binary \
146 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} 112 ${key_uboot} 16 \
147 ${DEPLOY_DIR_IMAGE}/${UBOOT_HEADER_BINARY} ${SIGN_TYPE} 0 ${KEY_UBOOT_ID}`
148
149 # Stop full image build process when sign binary got failed
150 set +e
151 err=`echo $res | grep -E "missing|Invalid|failed"`
152 if [ -n "${err}" ]; then
153 bbfatal "Sign binary failed: keys are not found or invalid. Please check your KEY_FOLDER and KEY definition."
154 fi
155 set -e
156}
157
158python do_merge_bootloaders() {
159 TIP_IMAGE = d.getVar('TIP_IMAGE', True)
Tim Lee9d9d9e32022-10-28 16:57:26 +0800160 def Merge_bin_files_and_pad(inF1, inF2, outF, align, align_end):
Tim Leedd14a912022-07-29 16:42:15 +0800161 padding_size = 0
162 padding_size_end = 0
163 F1_size = os.path.getsize(inF1)
164 F2_size = os.path.getsize(inF2)
165
166 if ((F1_size % align) != 0):
167 padding_size = align - (F1_size % align)
168
Tim Lee9d9d9e32022-10-28 16:57:26 +0800169 if ((F2_size % align_end) != 0):
170 padding_size_end = align_end - (F2_size % align_end)
Tim Leedd14a912022-07-29 16:42:15 +0800171
172 with open(outF, "wb") as file3:
173 with open(inF1, "rb") as file1:
174 data = file1.read()
175 file3.write(data)
176
177 file3.write(b'\xFF' * padding_size)
178
179 with open(inF2, "rb") as file2:
180 data = file2.read()
181 file3.write(data)
182
183 file3.write(b'\xFF' * padding_size_end)
184
Tim Leed52b0f62023-05-29 10:12:08 +0800185 if TIP_IMAGE == "True":
186 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BINARY',True)),
187 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800188 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BINARY',True)),
Tim Lee9d9d9e32022-10-28 16:57:26 +0800189 int(d.getVar('BB_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800190
Tim Leed52b0f62023-05-29 10:12:08 +0800191 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BINARY',True)),
192 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BL31_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800193 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 +0800194 int(d.getVar('ATF_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800195
Tim Leed52b0f62023-05-29 10:12:08 +0800196 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_BINARY',True)),
197 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('OPTEE_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800198 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 +0800199 int(d.getVar('OPTEE_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800200
Tim Leed52b0f62023-05-29 10:12:08 +0800201 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('KMT_TIPFW_BB_BL31_TEE_BINARY',True)),
202 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('UBOOT_HEADER_BINARY',True)),
Tim Leedd14a912022-07-29 16:42:15 +0800203 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 +0800204 int(d.getVar('UBOOT_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leed52b0f62023-05-29 10:12:08 +0800205 else:
206 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_HEADER_BINARY',True)),
207 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BL31_HEADER_BINARY',True)),
208 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_BINARY',True)),
209 int(d.getVar('ATF_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
210
211 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_BINARY',True)),
212 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('OPTEE_HEADER_BINARY',True)),
213 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_BINARY',True)),
214 int(d.getVar('OPTEE_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
215
216 Merge_bin_files_and_pad(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_BINARY',True)),
217 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('UBOOT_HEADER_BINARY',True)),
218 os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True), '%s' % d.getVar('BB_BL31_TEE_UBOOT_BINARY',True)),
219 int(d.getVar('UBOOT_ALIGN', True)), int(d.getVar('ALIGN_END', True)))
Tim Leedd14a912022-07-29 16:42:15 +0800220}
221
Tim Lee30d2a112022-12-01 14:19:46 +0800222do_pad_binary[depends] += " \
Tim Lee0277e832023-08-03 13:28:38 +0800223 ${@'npcm8xx-tip-fw:do_deploy' if d.getVar('TIP_IMAGE', True) == 'True' else ''} \
Tim Leedd14a912022-07-29 16:42:15 +0800224 npcm8xx-bootblock:do_deploy \
Tim Lee3af4d262022-09-27 15:01:43 +0800225 u-boot-nuvoton:do_deploy \
Tim Leedd14a912022-07-29 16:42:15 +0800226 trusted-firmware-a:do_deploy \
227 optee-os:do_deploy \
228 npcm7xx-bingo-native:do_populate_sysroot \
229 npcm8xx-igps-native:do_populate_sysroot \
230 "
231
232# link images for we only need to flash partial image with idea name
233do_generate_ext4_tar:append() {
234 cd ${DEPLOY_DIR_IMAGE}
235 ln -sf ${UBOOT_BINARY}.${MERGED_SUFFIX} image-u-boot
236 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
237 ln -sf ${S}/ext4/${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst image-rofs
238 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} image-rwfs
239 ln -sf ${IMAGE_NAME}.rootfs.wic.gz image-emmc.gz
240}
241
Tim Lee7f23e3a2022-11-30 13:53:50 +0800242addtask do_pad_binary before do_prepare_bootloaders
Tim Leed52b0f62023-05-29 10:12:08 +0800243addtask do_sign_binary before do_merge_bootloaders after do_prepare_bootloaders
Tim Leedd14a912022-07-29 16:42:15 +0800244addtask do_prepare_bootloaders before do_generate_static after do_generate_rwfs_static
Tim Leed52b0f62023-05-29 10:12:08 +0800245addtask do_merge_bootloaders before do_generate_static after do_sign_binary
Tim Leedd14a912022-07-29 16:42:15 +0800246addtask do_merge_bootloaders before do_generate_ext4_tar after do_prepare_bootloaders
247
248# Include the full bootblock and u-boot in the final static image
249python do_generate_static:append() {
250 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
251 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
252 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
253 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
254}
255
256do_make_ubi:append() {
257 # Concatenate the uboot and ubi partitions
258 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
259 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
260 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
261}
262
263do_make_ubi[depends] += "${PN}:do_prepare_bootloaders"
264do_generate_ubi_tar[depends] += "${PN}:do_prepare_bootloaders"
265do_generate_ubi_tar[depends] += "${PN}:do_merge_bootloaders"
266do_generate_static_tar[depends] += "${PN}:do_prepare_bootloaders"
267do_generate_static_tar[depends] += "${PN}:do_merge_bootloaders"
268do_generate_ext4_tar[depends] += "${PN}:do_prepare_bootloaders"
269do_generate_ext4_tar[depends] += "${PN}:do_merge_bootloaders"