| # TC0 specific TFA configuration |
| |
| DEPENDS += "scp-firmware util-linux-native gptfdisk-native" |
| |
| FILESEXTRAPATHS:prepend := "${THISDIR}/files/tc:" |
| SRC_URI:append = " \ |
| file://generate_metadata.py \ |
| " |
| |
| COMPATIBLE_MACHINE = "(tc?)" |
| |
| TFA_PLATFORM = "tc" |
| TFA_BUILD_TARGET = "all fip" |
| TFA_UBOOT = "1" |
| TFA_INSTALL_TARGET = "bl1 fip" |
| TFA_MBEDTLS = "1" |
| TFA_DEBUG = "1" |
| |
| TFA_SPD = "spmd" |
| TFA_SPMD_SPM_AT_SEL2 = "1" |
| |
| TFA_TARGET_PLATFORM:tc0 = "0" |
| TFA_TARGET_PLATFORM:tc1 = "1" |
| |
| EXTRA_OEMAKE += "TARGET_PLATFORM=${TFA_TARGET_PLATFORM}" |
| |
| # Set optee as SP. Set spmc manifest and sp layout file to optee |
| DEPENDS += "optee-os" |
| |
| TFA_SP_LAYOUT_FILE = "${RECIPE_SYSROOT}/lib/firmware/sp_layout.json" |
| TFA_ARM_SPMC_MANIFEST_DTS = "plat/arm/board/tc/fdts/tc_spmc_optee_sp_manifest.dts" |
| |
| EXTRA_OEMAKE += "SCP_BL2=${RECIPE_SYSROOT}/firmware/scp_ramfw.bin" |
| EXTRA_OEMAKE += "TRUSTED_BOARD_BOOT=1 GENERATE_COT=1 ARM_ROTPK_LOCATION=devel_rsa \ |
| ROT_KEY=plat/arm/board/common/rotpk/arm_rotprivk_rsa.pem" |
| EXTRA_OEMAKE += "PSA_FWU_SUPPORT=1 ARM_GPT_SUPPORT=1" |
| EXTRA_OEMAKE += "CTX_INCLUDE_MTE_REGS=1" |
| |
| do_generate_gpt() { |
| gpt_image="${BUILD_DIR}/fip_gpt.bin" |
| fip_bin="${BUILD_DIR}/fip.bin" |
| # the FIP partition type is not standardized, so generate one |
| fip_type_uuid=`uuidgen --sha1 --namespace @dns --name "fip_type_uuid"` |
| # metadata partition type UUID, specified by the document: |
| # Platform Security Firmware Update for the A-profile Arm Architecture |
| # version: 1.0BET0 |
| metadata_type_uuid="8a7a84a0-8387-40f6-ab41-a8b9a5a60d23" |
| location_uuid=`uuidgen` |
| FIP_A_uuid=`uuidgen` |
| FIP_B_uuid=`uuidgen` |
| |
| # maximum FIP size 4MB. This is the current size of the FIP rounded up to an integer number of MB. |
| fip_max_size=4194304 |
| fip_bin_size=$(stat -c %s $fip_bin) |
| if [ $fip_max_size -lt $fip_bin_size ]; then |
| bberror "FIP binary ($fip_bin_size bytes) is larger than the GPT partition ($fip_max_size bytes)" |
| fi |
| |
| # maximum metadata size 512B. This is the current size of the metadata rounded up to an integer number of sectors. |
| metadata_max_size=512 |
| metadata_file="${BUILD_DIR}/metadata.bin" |
| python3 ${WORKDIR}/generate_metadata.py --metadata_file $metadata_file \ |
| --img_type_uuids $fip_type_uuid \ |
| --location_uuids $location_uuid \ |
| --img_uuids $FIP_A_uuid $FIP_B_uuid |
| |
| # create GPT image. The GPT contains 2 FIP partitions: FIP_A and FIP_B, and 2 metadata partitions: FWU-Metadata and Bkup-FWU-Metadata. |
| # the GPT layout is the following: |
| # ----------------------- |
| # Protective MBR |
| # ----------------------- |
| # Primary GPT Header |
| # ----------------------- |
| # FIP_A |
| # ----------------------- |
| # FIP_B |
| # ----------------------- |
| # FWU-Metadata |
| # ----------------------- |
| # Bkup-FWU-Metadata |
| # ----------------------- |
| # Secondary GPT Header |
| # ----------------------- |
| |
| sector_size=512 |
| gpt_header_size=33 # valid only for 512-byte sectors |
| num_sectors_fip=`expr $fip_max_size / $sector_size` |
| num_sectors_metadata=`expr $metadata_max_size / $sector_size` |
| start_sector_1=`expr 1 + $gpt_header_size` # size of MBR is 1 sector |
| start_sector_2=`expr $start_sector_1 + $num_sectors_fip` |
| start_sector_3=`expr $start_sector_2 + $num_sectors_fip` |
| start_sector_4=`expr $start_sector_3 + $num_sectors_metadata` |
| num_sectors_gpt=`expr $start_sector_4 + $num_sectors_metadata + $gpt_header_size` |
| gpt_size=`expr $num_sectors_gpt \* $sector_size` |
| |
| # create raw image |
| dd if=/dev/zero of=$gpt_image bs=$gpt_size count=1 |
| |
| # create the GPT layout |
| sgdisk $gpt_image \ |
| --set-alignment 1 \ |
| --disk-guid $location_uuid \ |
| \ |
| --new 1:$start_sector_1:+$num_sectors_fip \ |
| --change-name 1:FIP_A \ |
| --typecode 1:$fip_type_uuid \ |
| --partition-guid 1:$FIP_A_uuid \ |
| \ |
| --new 2:$start_sector_2:+$num_sectors_fip \ |
| --change-name 2:FIP_B \ |
| --typecode 2:$fip_type_uuid \ |
| --partition-guid 2:$FIP_B_uuid \ |
| \ |
| --new 3:$start_sector_3:+$num_sectors_metadata \ |
| --change-name 3:FWU-Metadata \ |
| --typecode 3:$metadata_type_uuid \ |
| \ |
| --new 4:$start_sector_4:+$num_sectors_metadata \ |
| --change-name 4:Bkup-FWU-Metadata \ |
| --typecode 4:$metadata_type_uuid |
| |
| # populate the GPT partitions |
| dd if=$fip_bin of=$gpt_image bs=$sector_size seek=$start_sector_1 count=$num_sectors_fip conv=notrunc |
| dd if=$fip_bin of=$gpt_image bs=$sector_size seek=$start_sector_2 count=$num_sectors_fip conv=notrunc |
| dd if=$metadata_file of=$gpt_image bs=$sector_size seek=$start_sector_3 count=$num_sectors_metadata conv=notrunc |
| dd if=$metadata_file of=$gpt_image bs=$sector_size seek=$start_sector_4 count=$num_sectors_metadata conv=notrunc |
| } |
| |
| addtask do_generate_gpt after do_compile before do_install |
| |
| do_install:append() { |
| install -m 0644 ${BUILD_DIR}/fip_gpt.bin ${D}/firmware/fip_gpt-tc.bin |
| ln -sf fip_gpt-tc.bin ${D}/firmware/fip_gpt.bin |
| } |