diff options
-rw-r--r-- | classes/imx-boot-container.bbclass | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/classes/imx-boot-container.bbclass b/classes/imx-boot-container.bbclass new file mode 100644 index 00000000..003f997a --- /dev/null +++ b/classes/imx-boot-container.bbclass @@ -0,0 +1,107 @@ +# +# This class provides a support to build the boot container for +# i.MX8M derivatives +# +# imx8m machines require a separate build target to be executed +# due to the fact that final boot image is constructed using flash.bin +# taget. It produces a boot binary image, which is constructed from +# various binary components (u-boot with separate dtb, atf, DDR +# firmware and optional op-tee) into a single image using FIT format. +# This flash.bin file is then parsed and loaded either via +# SPL directly (imx8mm), or using bootrom code (imx8mn and imx8mp). +# +# In order to use flash.bin binary boot image, it is required that +# the U-Boot build is to be invoked for an additional build target. +# This class extendes the U-Boot build targets with the "flash.bin", +# which effectively serves as a boot container. It replaces the boot +# container `imx-boot` provided by NXP. +# +# Class inheritance is performed in u-boot-fslc recipe, and is controlled +# by variable UBOOT_PROVIDES_BOOT_CONTAINER, which is defined in the +# base machine include file (imx-base.inc), and is set to "1" when the +# 'imx-boot-container' is present in MACHINEOVERRIDES. + +# Extend the UBOOT_MAKE_TARGET with additional target for U-Boot build +# system to produce the boot container +UBOOT_MAKE_TARGET += "flash.bin" + +# Define ATF binary file to be deployed to the U-Boot build folder +ATF_MACHINE_NAME = "bl31-${ATF_PLATFORM}.bin" +ATF_MACHINE_NAME_append = "${@bb.utils.contains('MACHINE_FEATURES', 'optee', '-optee', '', d)}" + +# This package aggregates output deployed by other packages, so set the +# appropriate dependencies for populate binaries task +do_resolve_and_populate_binaries[depends] += " \ + ${@' '.join('%s:do_deploy' % r for r in '${IMX_EXTRA_FIRMWARE}'.split() )} \ + imx-atf:do_deploy \ + ${@bb.utils.contains('MACHINE_FEATURES', 'optee', 'optee-os:do_deploy', '', d)} \ +" + +# Append make flags to include ATF load address +EXTRA_OEMAKE += "ATF_LOAD_ADDR=${ATF_LOAD_ADDR}" + +# Define an additional task that collects binary output from dependent packages +# and deploys them into the U-Boot build folder +do_resolve_and_populate_binaries() { + if [ ! -n "${ATF_LOAD_ADDR}" ]; then + bberror "ATF_LOAD_ADDR is undefined, result binary would be unusable!" + fi + + if [ -n "${UBOOT_CONFIG}" ]; then + for config in ${UBOOT_MACHINE}; do + i=$(expr $i + 1); + for type in ${UBOOT_CONFIG}; do + j=$(expr $j + 1); + if [ $j -eq $i ]; then + for ddr_firmware in ${DDR_FIRMWARE_NAME}; do + # Sanitize the FW name as U-Boot expects it to be without version + if [ -n "${DDR_FIRMWARE_VERSION}" ]; then + ddr_firmware_name=$(echo $ddr_firmware | sed s/_${DDR_FIRMWARE_VERSION}//) + else + ddr_firmware_name="$ddr_firmware" + fi + bbnote "Copy ddr_firmware: ${ddr_firmware} from ${DEPLOY_DIR_IMAGE} -> ${B}/${config}/${ddr_firmware_name}" + cp ${DEPLOY_DIR_IMAGE}/${ddr_firmware} ${B}/${config}/${ddr_firmware_name} + done + if [ -n "${ATF_MACHINE_NAME}" ]; then + cp ${DEPLOY_DIR_IMAGE}/${BOOT_TOOLS}/${ATF_MACHINE_NAME} ${B}/${config}/bl31.bin + else + bberror "ATF binary is undefined, result binary would be unusable!" + fi + fi + done + unset j + done + unset i + fi +} +addtask do_resolve_and_populate_binaries before do_compile after do_configure + +# Append the u-boot do_deploy task to deploy also the result flash.bin +# boot container as a replacement for the one provided by NXP BSP. +# +# Deploy task renames the target file from flash.bin to imx-boot to match +# the name WKS file requires. +# +# This effectively would allow the usage of the same WKS file for those +# derivatives that are using the boot container from U-Boot and those +# that are not yet have support for it enabled. +do_deploy_append() { + # Deploy the resulted flash.bin for WIC to pick it up + if [ -n "${UBOOT_CONFIG}" ]; then + for config in ${UBOOT_MACHINE}; do + i=$(expr $i + 1); + for type in ${UBOOT_CONFIG}; do + j=$(expr $j + 1); + if [ $j -eq $i ] + then + install -m 0644 ${B}/${config}/flash.bin ${DEPLOYDIR}/flash.bin-${MACHINE}-${UBOOT_CONFIG} + ln -sf flash.bin-${MACHINE}-${UBOOT_CONFIG} imx-boot + ln -sf flash.bin-${MACHINE}-${UBOOT_CONFIG} flash.bin + fi + done + unset j + done + unset i + fi +} |