]> code.ossystems Code Review - meta-freescale.git/commitdiff
classes: imx-boot-container: add class to provide boot container
authorAndrey Zhizhikin <andrey.z@gmail.com>
Wed, 3 Mar 2021 16:33:33 +0000 (16:33 +0000)
committerOtavio Salvador <otavio@ossystems.com.br>
Wed, 17 Mar 2021 13:53:42 +0000 (10:53 -0300)
Add a class which extends the u-boot build mechanism with providing a
separate "flash.bin" binary that replaces the imx-boot in the WIC file.

This class is inherited in u-boot-fslc recipe and extends it only to
those machines that have a corresponding "imx-boot-container" machine
override set.

Signed-off-by: Andrey Zhizhikin <andrey.z@gmail.com>
classes/imx-boot-container.bbclass [new file with mode: 0644]

diff --git a/classes/imx-boot-container.bbclass b/classes/imx-boot-container.bbclass
new file mode 100644 (file)
index 0000000..003f997
--- /dev/null
@@ -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
+}