blob: d87015f6c4e28237f9a473d5775db13e5be28c74 [file] [log] [blame]
Marek Vasut78ad5b42022-07-12 17:04:52 +02001#!/bin/sh
2
3# 0) Generate keys
4#
5# WARNING: ECDSA keys are only supported by HAB 4.5 and newer (i.e. i.MX8M Plus)
6#
7# cd /path/to/cst-3.3.1/keys/
8# ./hab4_pki_tree.sh -existing-ca n -use-ecc n -kl 4096 -duration 10 -num-srk 4 -srk-ca y
9# cd /path/to/cst-3.3.1/crts/
10# ../linux64/bin/srktool -h 4 -t SRK_1_2_3_4_table.bin -e SRK_1_2_3_4_fuse.bin -d sha256 -c ./SRK1_sha256_4096_65537_v3_ca_crt.pem,./SRK2_sha256_4096_65537_v3_ca_crt.pem,./SRK3_sha256_4096_65537_v3_ca_crt.pem,./SRK4_sha256_4096_65537_v3_ca_crt.pem -f 1
11
12# 1) Build U-Boot (e.g. for i.MX8MM)
13#
14# export ATF_LOAD_ADDR=0x920000
15# cp -Lv /path/to/arm-trusted-firmware/build/imx8mm/release/bl31.bin .
16# cp -Lv /path/to/firmware-imx-8.14/firmware/ddr/synopsys/ddr3* .
17# make -j imx8mm_board_defconfig
18# make -j`nproc` flash.bin
19
20# 2) Sign SPL and DRAM blobs
21
22cp doc/imx/habv4/csf_examples/mx8m/csf_spl.txt csf_spl.tmp
23cp doc/imx/habv4/csf_examples/mx8m/csf_fit.txt csf_fit.tmp
24
Tim Harvey0c6f3ce2023-06-15 08:21:08 -070025# update File Paths from env vars
26if ! [ -r $CSF_KEY ]; then
27 echo "Error: \$CSF_KEY not found"
28 exit 1
29fi
30if ! [ -r $IMG_KEY ]; then
31 echo "Error: \$IMG_KEY not found"
32 exit 1
33fi
34if ! [ -r $SRK_TABLE ]; then
35 echo "Error: \$SRK_TABLE not found"
36 exit 1
37fi
38sed -i "s:\$CSF_KEY:$CSF_KEY:" csf_spl.tmp
39sed -i "s:\$IMG_KEY:$IMG_KEY:" csf_spl.tmp
40sed -i "s:\$SRK_TABLE:$SRK_TABLE:" csf_spl.tmp
41sed -i "s:\$CSF_KEY:$CSF_KEY:" csf_fit.tmp
42sed -i "s:\$IMG_KEY:$IMG_KEY:" csf_fit.tmp
43sed -i "s:\$SRK_TABLE:$SRK_TABLE:" csf_fit.tmp
44
45# update SPL Blocks
Marek Vasut78ad5b42022-07-12 17:04:52 +020046spl_block_base=$(printf "0x%x" $(( $(sed -n "/CONFIG_SPL_TEXT_BASE=/ s@.*=@@p" .config) - 0x40)) )
47spl_block_size=$(printf "0x%x" $(stat -tc %s u-boot-spl-ddr.bin))
48sed -i "/Blocks = / s@.*@ Blocks = $spl_block_base 0x0 $spl_block_size \"flash.bin\"@" csf_spl.tmp
49
50# Generate CSF blob
51cst -i csf_spl.tmp -o csf_spl.bin
52
53# Patch CSF blob into flash.bin
54spl_csf_offset=$(xxd -s 24 -l 4 -e flash.bin | cut -d " " -f 2 | sed "s@^@0x@")
55spl_bin_offset=$(xxd -s 4 -l 4 -e flash.bin | cut -d " " -f 2 | sed "s@^@0x@")
56spl_dd_offset=$((${spl_csf_offset} - ${spl_bin_offset} + 0x40))
57dd if=csf_spl.bin of=flash.bin bs=1 seek=${spl_dd_offset} conv=notrunc
58
59# 3) Sign u-boot.itb
60
Marek Vasuta7416eb2023-05-28 23:00:30 +020061# fitImage
62fit_block_base=$(printf "0x%x" $(sed -n "/CONFIG_SPL_LOAD_FIT_ADDRESS=/ s@.*=@@p" .config) )
Marek Vasut78ad5b42022-07-12 17:04:52 +020063fit_block_offset=$(printf "0x%s" $(fdtget -t x u-boot.dtb /binman/imx-boot/uboot offset))
Marek Vasuta7416eb2023-05-28 23:00:30 +020064fit_block_size=$(printf "0x%x" $(( ( ( $(stat -tc %s u-boot.itb) + 0x1000 - 0x1 ) & ~(0x1000 - 0x1)) + 0x20 )) )
65sed -i "/Blocks = / s@.*@ Blocks = $fit_block_base $fit_block_offset $fit_block_size \"flash.bin\"@" csf_fit.tmp
Marek Vasut78ad5b42022-07-12 17:04:52 +020066
67# IVT
68ivt_ptr_base=$(printf "%08x" ${fit_block_base} | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
69ivt_block_base=$(printf "%08x" $(( ${fit_block_base} + ${fit_block_size} - 0x20 )) | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
70csf_block_base=$(printf "%08x" $(( ${fit_block_base} + ${fit_block_size} )) | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
71ivt_block_offset=$((${fit_block_offset} + ${fit_block_size} - 0x20))
72csf_block_offset=$((${ivt_block_offset} + 0x20))
73
Marek Vasuta7416eb2023-05-28 23:00:30 +020074echo "0xd1002041 ${ivt_block_base} 0x00000000 0x00000000 0x00000000 ${ivt_block_base} ${csf_block_base} 0x00000000" | xxd -r -p > ivt.bin
Marek Vasut78ad5b42022-07-12 17:04:52 +020075dd if=ivt.bin of=flash.bin bs=1 seek=${ivt_block_offset} conv=notrunc
76
77# Generate CSF blob
78cst -i csf_fit.tmp -o csf_fit.bin
79# Patch CSF blob into flash.bin
80dd if=csf_fit.bin of=flash.bin bs=1 seek=${csf_block_offset} conv=notrunc