diff --git a/.gitignore b/.gitignore index e69de29..06bfde4 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +key diff --git a/classes/fip-utils-stm32mp.bbclass b/classes/fip-utils-stm32mp.bbclass new file mode 100644 index 0000000..21028e7 --- /dev/null +++ b/classes/fip-utils-stm32mp.bbclass @@ -0,0 +1,345 @@ +DEPENDS += "tf-a-tools-native" + +# Configure new package to provide fiptool wrapper for SDK usage +PACKAGES =+ "${FIPTOOL_WRAPPER}" + +BBCLASSEXTEND_append = " nativesdk" + +RRECOMMENDS_${FIPTOOL_WRAPPER}_append_class-nativesdk = " nativesdk-tf-a-tools" + +# Define default TF-A FIP namings +FIP_BASENAME ?= "fip" +FIP_SUFFIX ?= "bin" + +# Set default TF-A FIP config +FIP_CONFIG ?= "" + +# Default FIP config: +# There are two options implemented to select two different firmware and each +# FIP_CONFIG should configure one: 'tfa' or 'optee' +FIP_CONFIG[tfa-fw] ?= "tfa" +FIP_CONFIG[tee-fw] ?= "optee" + +# Init BL31 config +FIP_BL31_ENABLE ?= "" + +# Set CERTTOOL binary name to use +CERTTOOL ?= "cert_create" +# Set FIPTOOL binary name to use +FIPTOOL ?= "fiptool" +# Set STM32MP fiptool wrapper +FIPTOOL_WRAPPER ?= "fiptool-stm32mp" + +# Default FIP file names and suffixes +FIP_BL31 ?= "tf-a-bl31" +FIP_BL31_SUFFIX ?= "bin" +FIP_TFA ?= "tf-a-bl32" +FIP_TFA_SUFFIX ?= "bin" +FIP_TFA_DTB ?= "bl32" +FIP_TFA_DTB_SUFFIX ?= "dtb" +FIP_FW_CONFIG ?= "fw-config" +FIP_FW_CONFIG_SUFFIX ?= "dtb" +FIP_OPTEE_HEADER ?= "tee-header_v2" +FIP_OPTEE_PAGER ?= "tee-pager_v2" +FIP_OPTEE_PAGEABLE ?= "tee-pageable_v2" +FIP_OPTEE_SUFFIX ?= "bin" +FIP_UBOOT ?= "u-boot-nodtb" +FIP_UBOOT_SUFFIX ?= "bin" +FIP_UBOOT_DTB ?= "u-boot" +FIP_UBOOT_DTB_SUFFIX ?= "dtb" +FIP_UBOOT_CONFIG ?= "trusted" + +# Configure default folder path for binaries to package +FIP_DEPLOYDIR_FIP ?= "${DEPLOYDIR}/fip" +FIP_DEPLOYDIR_BL31 ?= "${DEPLOYDIR}/arm-trusted-firmware/bl31" +FIP_DEPLOYDIR_TFA ?= "${DEPLOYDIR}/arm-trusted-firmware/bl32" +FIP_DEPLOYDIR_FWCONF ?= "${DEPLOYDIR}/arm-trusted-firmware/fwconfig" +FIP_DEPLOYDIR_OPTEE ?= "${DEPLOY_DIR}/images/${MACHINE}/optee" +FIP_DEPLOYDIR_UBOOT ?= "${DEPLOY_DIR}/images/${MACHINE}/u-boot" + +# Set default configuration to allow FIP signing +FIP_SIGN_ENABLE ??= '' +FIP_SIGN_KEY ??= '' +FIP_SIGN_KEY_EXTERNAL ??= '' +FIP_SIGN_KEY_PASS ??= '' +FIP_SIGN_SUFFIX ??= '' + +# Define FIP dependency build +FIP_DEPENDS += "virtual/bootloader" +FIP_DEPENDS += "${@bb.utils.contains('MACHINE_FEATURES', 'optee', 'virtual/optee-os', '', d)}" +FIP_DEPENDS_class-nativesdk = "" + +# ----------------------------------------------- +# Handle FIP config and set internal vars +# FIP_BL32_CONF +python () { + import re + + # Make sure that deploy class is configured + if not bb.data.inherits_class('deploy', d): + bb.fatal("The st-fip-utils class needs the deploy class to be configured on recipe side.") + + # Manage FIP binary dependencies + fip_depends = (d.getVar('FIP_DEPENDS') or "").split() + if len(fip_depends) > 0: + for depend in fip_depends: + d.appendVarFlag('do_deploy', 'depends', ' %s:do_deploy' % depend) + + # Manage FIP config settings + fipconfigflags = d.getVarFlags('FIP_CONFIG') + # The "doc" varflag is special, we don't want to see it here + fipconfigflags.pop('doc', None) + fipconfig = (d.getVar('FIP_CONFIG') or "").split() + if not fipconfig: + raise bb.parse.SkipRecipe("FIP_CONFIG must be set in the %s machine configuration." % d.getVar("MACHINE")) + if (d.getVar('FIP_BL32_CONF') or "").split(): + raise bb.parse.SkipRecipe("You cannot use FIP_BL32_CONF as it is internal to FIP_CONFIG var expansion.") + if len(fipconfig) > 0: + for config in fipconfig: + for f, v in fipconfigflags.items(): + if config == f: + # Make sure to get var flag properly expanded + v = d.getVarFlag('FIP_CONFIG', config) + if not v.strip(): + bb.fatal('[FIP_CONFIG] Missing configuration for %s config' % config) + items = v.split(',') + if items[0] and len(items) > 1: + raise bb.parse.SkipRecipe('Only can be specified!') + # Set internal vars + bb.debug(1, "Appending '%s' to FIP_BL32_CONF" % items[0]) + d.appendVar('FIP_BL32_CONF', items[0] + ',') + break + + # Manage signing settings + if d.getVar('FIP_SIGN_ENABLE') == '1': + fip_signingkey = d.getVar('FIP_SIGN_KEY') + if not fip_signingkey: + bb.fatal('Please make sure to configure "FIP_SIGN_KEY" var to signing key file.') + bb.debug(1, "Manage to find signing key file location from BBPATH...") + if d.getVar('FIP_SIGN_KEY_EXTERNAL') == '1': + found_signingkey = False + for p in d.getVar("BBPATH").split(":"): + file_path = os.path.join(p, fip_signingkey) + if os.path.isfile(file_path): + bb.debug(1, "Set FIP_SIGN_KEY to '%s' path." % file_path) + d.setVar('FIP_SIGN_KEY', file_path) + found_signingkey = True + if not found_signingkey: + bbpaths = d.getVar('BBPATH').replace(':','\n\t') + bb.fatal('\nNot able to find "%s" path from current BBPATH var:\n\t%s.' % (fip_signingkey, bbpaths)) +} + +# Deploy the fip binary for current target +do_deploy_append_class-target() { + install -d ${DEPLOYDIR} + install -d ${FIP_DEPLOYDIR_FIP} + + unset i + for config in ${FIP_CONFIG}; do + i=$(expr $i + 1) + bl32_conf=$(echo ${FIP_BL32_CONF} | cut -d',' -f${i}) + for dt in ${FIP_DEVICETREE}; do + # Init soc suffix + soc_suffix="" + if [ -n "${STM32MP_SOC_NAME}" ]; then + for soc in ${STM32MP_SOC_NAME}; do + [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] && soc_suffix="-${soc}" + done + fi + # Init FIP fw-config settings + [ -f "${FIP_DEPLOYDIR_FWCONF}/${dt}-${FIP_FW_CONFIG}-${config}.${FIP_FW_CONFIG_SUFFIX}" ] || bbfatal "Missing ${dt}-${FIP_FW_CONFIG}-${config}.${FIP_FW_CONFIG_SUFFIX} file in folder: ${FIP_DEPLOYDIR_FWCONF}" + FIP_FWCONFIG="--fw-config ${FIP_DEPLOYDIR_FWCONF}/${dt}-${FIP_FW_CONFIG}-${config}.${FIP_FW_CONFIG_SUFFIX}" + # Init FIP hw-config settings + [ -f "${FIP_DEPLOYDIR_UBOOT}/${FIP_UBOOT_DTB}-${dt}-${FIP_UBOOT_CONFIG}.${FIP_UBOOT_DTB_SUFFIX}" ] || bbfatal "Missing ${FIP_UBOOT_DTB}-${dt}-${FIP_UBOOT_CONFIG}.${FIP_UBOOT_DTB_SUFFIX} file in folder: ${FIP_DEPLOYDIR_UBOOT}" + FIP_HWCONFIG="--hw-config ${FIP_DEPLOYDIR_UBOOT}/${FIP_UBOOT_DTB}-${dt}-${FIP_UBOOT_CONFIG}.${FIP_UBOOT_DTB_SUFFIX}" + # Init FIP nt-fw config + [ -f "${FIP_DEPLOYDIR_UBOOT}/${FIP_UBOOT}${soc_suffix}.${FIP_UBOOT_SUFFIX}" ] || bbfatal "Missing ${FIP_UBOOT}${soc_suffix}.${FIP_UBOOT_SUFFIX} file in folder: ${FIP_DEPLOYDIR_UBOOT}" + FIP_NTFW="--nt-fw ${FIP_DEPLOYDIR_UBOOT}/${FIP_UBOOT}${soc_suffix}.${FIP_UBOOT_SUFFIX}" + # Init FIP bl31 settings + if [ "${FIP_BL31_ENABLE}" = "1" ]; then + # Check for files + [ -f "${FIP_DEPLOYDIR_BL31}/${FIP_BL31}${soc_suffix}.${FIP_BL31_SUFFIX}" ] || bbfatal "No ${FIP_BL31}${soc_suffix}.${FIP_BL31_SUFFIX} file in folder: ${FIP_DEPLOYDIR_BL31}" + # Set FIP_BL31CONF + FIP_BL31CONF="--soc-fw ${FIP_DEPLOYDIR_BL31}/${FIP_BL31}${soc_suffix}.${FIP_BL31_SUFFIX}" + else + FIP_BL31CONF="" + fi + # Init FIP extra conf settings + if [ "${bl32_conf}" = "tfa" ]; then + # Check for files + [ -f "${FIP_DEPLOYDIR_TFA}/${FIP_TFA}${soc_suffix}.${FIP_TFA_SUFFIX}" ] || bbfatal "No ${FIP_TFA}${soc_suffix}.${FIP_TFA_SUFFIX} file in folder: ${FIP_DEPLOYDIR_TFA}" + [ -f "${FIP_DEPLOYDIR_TFA}/${dt}-${FIP_TFA_DTB}.${FIP_TFA_DTB_SUFFIX}" ] || bbfatal "No ${dt}-${FIP_TFA_DTB}.${FIP_TFA_DTB_SUFFIX} file in folder: ${FIP_DEPLOYDIR_TFA}" + # Set FIP_EXTRACONF + FIP_EXTRACONF="\ + --tos-fw ${FIP_DEPLOYDIR_TFA}/${FIP_TFA}${soc_suffix}.${FIP_TFA_SUFFIX} \ + --tos-fw-config ${FIP_DEPLOYDIR_TFA}/${dt}-${FIP_TFA_DTB}.${FIP_TFA_DTB_SUFFIX} \ + " + elif [ "${bl32_conf}" = "optee" ]; then + # Check for files + [ -f "${FIP_DEPLOYDIR_OPTEE}/${FIP_OPTEE_HEADER}-${dt}.${FIP_OPTEE_SUFFIX}" ] || bbfatal "Missing ${FIP_OPTEE_HEADER}-${dt}.${FIP_OPTEE_SUFFIX} file in folder: ${FIP_DEPLOYDIR_OPTEE}" + [ -f "${FIP_DEPLOYDIR_OPTEE}/${FIP_OPTEE_PAGER}-${dt}.${FIP_OPTEE_SUFFIX}" ] || bbfatal "Missing ${FIP_OPTEE_PAGER}-${dt}.${FIP_OPTEE_SUFFIX} file in folder: ${FIP_DEPLOYDIR_OPTEE}" + [ -f "${FIP_DEPLOYDIR_OPTEE}/${FIP_OPTEE_PAGEABLE}-${dt}.${FIP_OPTEE_SUFFIX}" ] || bbfatal "Missing ${FIP_OPTEE_PAGEABLE}-${dt}.${FIP_OPTEE_SUFFIX} file in folder: ${FIP_DEPLOYDIR_OPTEE}" + # Set FIP_EXTRACONF + FIP_EXTRACONF="\ + --tos-fw ${FIP_DEPLOYDIR_OPTEE}/${FIP_OPTEE_HEADER}-${dt}.${FIP_OPTEE_SUFFIX} \ + --tos-fw-extra1 ${FIP_DEPLOYDIR_OPTEE}/${FIP_OPTEE_PAGER}-${dt}.${FIP_OPTEE_SUFFIX} \ + --tos-fw-extra2 ${FIP_DEPLOYDIR_OPTEE}/${FIP_OPTEE_PAGEABLE}-${dt}.${FIP_OPTEE_SUFFIX} \ + " + else + bbfatal "Wrong configuration '${bl32_conf}' found in FIP_CONFIG for ${config} config." + fi + # Init certificate settings + if [ "${FIP_SIGN_ENABLE}" = "1" ]; then + FIP_CERTCONF="\ + --tb-fw-cert ${WORKDIR}/tb_fw.crt \ + --trusted-key-cert ${WORKDIR}/trusted_key.crt \ + --nt-fw-cert ${WORKDIR}/nt_fw_content.crt \ + --nt-fw-key-cert ${WORKDIR}/nt_fw_key.crt \ + --tos-fw-cert ${WORKDIR}/tos_fw_content.crt \ + --tos-fw-key-cert ${WORKDIR}/tos_fw_key.crt \ + " + # Need fake bl2 binary to generate certificates + touch ${WORKDIR}/bl2-fake.bin + # Generate certificates + ${CERTTOOL} -n --tfw-nvctr 0 --ntfw-nvctr 0 --key-alg ecdsa --hash-alg sha256 \ + --rot-key ${FIP_SIGN_KEY} \ + --rot-key-pwd ${FIP_SIGN_KEY_PASS} \ + ${FIP_FWCONFIG} \ + ${FIP_HWCONFIG} \ + ${FIP_NTFW} \ + ${FIP_EXTRACONF} \ + ${FIP_CERTCONF} \ + --tb-fw ${WORKDIR}/bl2-fake.bin + # Remove fake bl2 binary + rm -f ${WORKDIR}/bl2-fake.bin + else + FIP_CERTCONF="" + fi + # Generate FIP binary + bbnote "${FIPTOOL} create \ + ${FIP_FWCONFIG} \ + ${FIP_HWCONFIG} \ + ${FIP_NTFW} \ + ${FIP_BL31CONF} \ + ${FIP_EXTRACONF} \ + ${FIP_CERTCONF} \ + ${FIP_DEPLOYDIR_FIP}/${FIP_BASENAME}-${dt}-${config}${FIP_SIGN_SUFFIX}.${FIP_SUFFIX}" + ${FIPTOOL} create \ + ${FIP_FWCONFIG} \ + ${FIP_HWCONFIG} \ + ${FIP_NTFW} \ + ${FIP_BL31CONF} \ + ${FIP_EXTRACONF} \ + ${FIP_CERTCONF} \ + ${FIP_DEPLOYDIR_FIP}/${FIP_BASENAME}-${dt}-${config}${FIP_SIGN_SUFFIX}.${FIP_SUFFIX} + done + done +} + +# Stub do_compile for nativesdk use case as we only expect to provide FIPTOOL_WRAPPER +do_compile_class-nativesdk() { + return +} + +do_install_class-nativesdk() { + # Create the FIPTOOL_WRAPPER script to use on sdk side + cat << EOF > ${WORKDIR}/${FIPTOOL_WRAPPER} +#!/bin/bash - +function bbfatal() { echo "\$*" ; exit 1 ; } + +# Set default TF-A FIP config +FIP_CONFIG="\${FIP_CONFIG:-${FIP_CONFIG}}" +FIP_BL32_CONF="\${FIP_BL32_CONF:-${FIP_BL32_CONF}}" +FIP_DEVICETREE="\${FIP_DEVICETREE:-${FIP_DEVICETREE}}" + +# Configure default folder path for binaries to package +FIP_DEPLOYDIR_ROOT="\${FIP_DEPLOYDIR_ROOT:-}" +FIP_DEPLOYDIR_FIP="\${FIP_DEPLOYDIR_FIP:-\$FIP_DEPLOYDIR_ROOT/fip}" +FIP_DEPLOYDIR_TFA="\${FIP_DEPLOYDIR_TFA:-\$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware/bl32}" +FIP_DEPLOYDIR_FWCONF="\${FIP_DEPLOYDIR_FWCONF:-\$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware/fwconfig}" +FIP_DEPLOYDIR_OPTEE="\${FIP_DEPLOYDIR_OPTEE:-\$FIP_DEPLOYDIR_ROOT/optee}" +FIP_DEPLOYDIR_UBOOT="\${FIP_DEPLOYDIR_UBOOT:-\$FIP_DEPLOYDIR_ROOT/u-boot}" + +echo "" +echo "${FIPTOOL_WRAPPER} config:" +for config in \$FIP_CONFIG; do + i=\$(expr \$i + 1) + bl32_conf=\$(echo \$FIP_BL32_CONF | cut -d',' -f\$i) + echo " \${config}:" ; \\ + echo " bl32 config value: \${bl32_conf}" +done +echo " FIP_DEVICETREE: \$FIP_DEVICETREE" +echo "" +echo " FIP_DEPLOYDIR_FIP : \$FIP_DEPLOYDIR_FIP" +echo " FIP_DEPLOYDIR_TFA : \$FIP_DEPLOYDIR_TFA" +echo " FIP_DEPLOYDIR_FWCONF: \$FIP_DEPLOYDIR_FWCONF" +echo " FIP_DEPLOYDIR_OPTEE : \$FIP_DEPLOYDIR_OPTEE" +echo " FIP_DEPLOYDIR_UBOOT : \$FIP_DEPLOYDIR_UBOOT" +echo "" + +unset i +for config in \$FIP_CONFIG; do + i=\$(expr \$i + 1) + bl32_conf=\$(echo \$FIP_BL32_CONF | cut -d',' -f\$i) + for dt in \$FIP_DEVICETREE; do + # Init soc suffix + soc_suffix="" + if [ -n "${STM32MP_SOC_NAME}" ]; then + for soc in ${STM32MP_SOC_NAME}; do + [ "\$(echo \${dt} | grep -c \${soc})" -eq 1 ] && soc_suffix="-\${soc}" + done + fi + # Init FIP fw-config settings + [ -f "\$FIP_DEPLOYDIR_FWCONF/\${dt}-${FIP_FW_CONFIG}-\${config}.${FIP_FW_CONFIG_SUFFIX}" ] || bbfatal "Missing \${dt}-${FIP_FW_CONFIG}-\${config}.${FIP_FW_CONFIG_SUFFIX} file in folder: \\\$FIP_DEPLOYDIR_FWCONF or '\\\$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware/fwconfig'" + FIP_FWCONFIG="--fw-config \$FIP_DEPLOYDIR_FWCONF/\${dt}-${FIP_FW_CONFIG}-\${config}.${FIP_FW_CONFIG_SUFFIX}" + # Init FIP hw-config settings + [ -f "\$FIP_DEPLOYDIR_UBOOT/${FIP_UBOOT_DTB}-\${dt}-${FIP_UBOOT_CONFIG}.${FIP_UBOOT_DTB_SUFFIX}" ] || bbfatal "Missing ${FIP_UBOOT_DTB}-\${dt}-${FIP_UBOOT_CONFIG}.${FIP_UBOOT_DTB_SUFFIX} file in folder: '\\\$FIP_DEPLOYDIR_UBOOT' or '\\\$FIP_DEPLOYDIR_ROOT/u-boot'" + FIP_HWCONFIG="--hw-config \$FIP_DEPLOYDIR_UBOOT/${FIP_UBOOT_DTB}-\${dt}-${FIP_UBOOT_CONFIG}.${FIP_UBOOT_DTB_SUFFIX}" + # Init FIP nt-fw config + [ -f "\$FIP_DEPLOYDIR_UBOOT/${FIP_UBOOT}\${soc_suffix}.${FIP_UBOOT_SUFFIX}" ] || bbfatal "Missing ${FIP_UBOOT}\${soc_suffix}.${FIP_UBOOT_SUFFIX} file in folder: '\\\$FIP_DEPLOYDIR_UBOOT' or '\\\$FIP_DEPLOYDIR_ROOT/u-boot'" + FIP_NTFW="--nt-fw \$FIP_DEPLOYDIR_UBOOT/${FIP_UBOOT}\${soc_suffix}.${FIP_UBOOT_SUFFIX}" + # Init FIP extra conf settings + if [ "\${bl32_conf}" = "tfa" ]; then + # Check for files + [ -f "\$FIP_DEPLOYDIR_TFA/${FIP_TFA}\${soc_suffix}.${FIP_TFA_SUFFIX}" ] || bbfatal "No ${FIP_TFA}\${soc_suffix}.${FIP_TFA_SUFFIX} file in folder: '\\\$FIP_DEPLOYDIR_TFA' or '\\\$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware/bl32'" + [ -f "\$FIP_DEPLOYDIR_TFA/\${dt}-${FIP_TFA_DTB}.${FIP_TFA_DTB_SUFFIX}" ] || bbfatal "No \${dt}-${FIP_TFA_DTB}.${FIP_TFA_DTB_SUFFIX} file in folder: '\\\$FIP_DEPLOYDIR_TFA' or '\\\$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware/bl32'" + # Set FIP_EXTRACONF + FIP_EXTRACONF="\\ + --tos-fw \$FIP_DEPLOYDIR_TFA/${FIP_TFA}\${soc_suffix}.${FIP_TFA_SUFFIX} \\ + --tos-fw-config \$FIP_DEPLOYDIR_TFA/\${dt}-${FIP_TFA_DTB}.${FIP_TFA_DTB_SUFFIX} \\ + " + elif [ "\${bl32_conf}" = "optee" ]; then + # Check for files + [ -f "\$FIP_DEPLOYDIR_OPTEE/${FIP_OPTEE_HEADER}-\${dt}.${FIP_OPTEE_SUFFIX}" ] || bbfatal "Missing ${FIP_OPTEE_HEADER}-\${dt}.${FIP_OPTEE_SUFFIX} file in folder: '\\\$FIP_DEPLOYDIR_OPTEE' or '\\\$FIP_DEPLOYDIR_ROOT/optee'" + [ -f "\$FIP_DEPLOYDIR_OPTEE/${FIP_OPTEE_PAGER}-\${dt}.${FIP_OPTEE_SUFFIX}" ] || bbfatal "Missing ${FIP_OPTEE_PAGER}-\${dt}.${FIP_OPTEE_SUFFIX} file in folder: '\\\$FIP_DEPLOYDIR_OPTEE' or '\\\$FIP_DEPLOYDIR_ROOT/optee'" + [ -f "\$FIP_DEPLOYDIR_OPTEE/${FIP_OPTEE_PAGEABLE}-\${dt}.${FIP_OPTEE_SUFFIX}" ] || bbfatal "Missing ${FIP_OPTEE_PAGEABLE}-\${dt}.${FIP_OPTEE_SUFFIX} file in folder: '\\\$FIP_DEPLOYDIR_OPTEE' or '\\\$FIP_DEPLOYDIR_ROOT/optee'" + # Set FIP_EXTRACONF + FIP_EXTRACONF="\\ + --tos-fw \$FIP_DEPLOYDIR_OPTEE/${FIP_OPTEE_HEADER}-\${dt}.${FIP_OPTEE_SUFFIX} \\ + --tos-fw-extra1 \$FIP_DEPLOYDIR_OPTEE/${FIP_OPTEE_PAGER}-\${dt}.${FIP_OPTEE_SUFFIX} \\ + --tos-fw-extra2 \$FIP_DEPLOYDIR_OPTEE/${FIP_OPTEE_PAGEABLE}-\${dt}.${FIP_OPTEE_SUFFIX} \\ + " + else + bbfatal "Wrong configuration '\${bl32_conf}' found in FIP_CONFIG for \${config} config." + fi + # Generate FIP binary + echo "[${FIPTOOL}] Create ${FIP_BASENAME}-\${dt}-\${config}.${FIP_SUFFIX} fip binary into 'FIP_DEPLOYDIR_FIP' folder..." + [ -d "\$FIP_DEPLOYDIR_FIP" ] || mkdir -p "\$FIP_DEPLOYDIR_FIP" + ${FIPTOOL} create \\ + \$FIP_FWCONFIG \\ + \$FIP_HWCONFIG \\ + \$FIP_NTFW \\ + \$FIP_EXTRACONF \\ + \$FIP_DEPLOYDIR_FIP/${FIP_BASENAME}-\${dt}-\${config}.${FIP_SUFFIX} + echo "[${FIPTOOL}] Done" + done +done +EOF + + # Install the FIPTOOL_WRAPPER + install -d ${D}${bindir} + install -m 0755 ${WORKDIR}/${FIPTOOL_WRAPPER} ${D}${bindir}/ +} + +# Feed package for sdk with our fiptool wrapper +FILES_${FIPTOOL_WRAPPER}_class-nativesdk = "${bindir}/${FIPTOOL_WRAPPER}" diff --git a/classes/flashlayout-stm32mp.bbclass b/classes/flashlayout-stm32mp.bbclass index dfef992..07af89f 100644 --- a/classes/flashlayout-stm32mp.bbclass +++ b/classes/flashlayout-stm32mp.bbclass @@ -131,6 +131,22 @@ FLASHLAYOUT_PARTITION_BIN2LOAD ??= "" FLASHLAYOUT_PARTITION_SIZE ??= "" FLASHLAYOUT_PARTITION_REPLACE_PATTERNS ??= "" +# The STM32CubeProgrammer supported ID range is: +# 0x00 to 0xFF +# Some IDs are reserved for internal usage on STM32CubeProgrammer and special +# management is implemented for binary with STM32 header. This means that for +# flashlayout files, available ID range is only: +# 0x01 to 0x0F for Boot partitions with STM32 header +# 0x10 to 0xF0 for User partitions programmed without header +# Note also that for FSBL and SSBL binaries loaded in RAM to program the devices +# there are two reserved IDs +# 0x01 for FSBL +# 0x03 for SSBL +FLASHLAYOUT_PARTITION_ID_START_BINARY ??= "0x04" +FLASHLAYOUT_PARTITION_ID_LIMIT_BINARY ??= "0x0F" +FLASHLAYOUT_PARTITION_ID_START_OTHERS ??= "0x10" +FLASHLAYOUT_PARTITION_ID_LIMIT_OTHERS ??= "0xF0" + python __anonymous () { # ----------------------------------------------------------------------------- # Make sure to add the flashlayout file creation after ROOTFS build @@ -178,6 +194,7 @@ python __anonymous () { # We add the flashlayout file creation task just after the do_image_complete for ROOTFS build bb.build.addtask('do_create_flashlayout_config', 'do_build', 'do_image_complete', d) # We add also the function that feeds the FLASHLAYOUT_PARTITION_* vars from PARTITIONS_CONFIG + d.appendVarFlag('do_create_flashlayout_config', 'prefuncs', ' flashlayout_partition_config') d.appendVarFlag('do_create_flashlayout_config', 'prefuncs', ' flashlayout_partition_image_config') } @@ -230,13 +247,13 @@ def get_device(bootscheme, config, partition, d): """ # Set device configuration device_configs = expand_var('FLASHLAYOUT_PARTITION_DEVICE', bootscheme, config, partition, d) - bb.note('>>> Selected FLASHLAYOUT_PARTITION_DEVICE: %s' % device_configs) + bb.debug(1, '>>> Selected FLASHLAYOUT_PARTITION_DEVICE: %s' % device_configs) if len(device_configs.split(',')) == 1: - bb.note('>>> Only one device configuration set for %s partition for %s label for %s bootscheme' % (partition, config, bootscheme)) + bb.debug(1, '>>> Only one device configuration set for %s partition for %s label for %s bootscheme' % (partition, config, bootscheme)) device = device_configs.split(':')[0] else: - bb.note('>>> Multiple device configurations set for %s partition for %s label for %s bootscheme' % (partition, config, bootscheme)) + bb.debug(1, '>>> Multiple device configurations set for %s partition for %s label for %s bootscheme' % (partition, config, bootscheme)) # Init default_device and device to empty string default_device = '' device = '' @@ -251,7 +268,7 @@ def get_device(bootscheme, config, partition, d): if default_device != '': bb.fatal('Found two "default" device configuration for %s partition for %s label for %s bootscheme in FLASHLAYOUT_PARTITION_DEVICE var' % (partition, config, bootscheme)) default_device = cfg_devc - bb.note('>>> Set default device configuration to %s' % default_device) + bb.debug(1, '>>> Set default device configuration to %s' % default_device) else: # Find out if any device is configured for current partition for p in cfg_part.split(): @@ -263,13 +280,44 @@ def get_device(bootscheme, config, partition, d): if default_device == '': bb.fatal('Not able to get device configuration for %s partition for %s label for %s bootscheme' % (partition, config, bootscheme)) else: - bb.note('>>> Configure device to default device setting') + bb.debug(1, '>>> Configure device to default device setting') device = default_device - bb.note('>>> New device configured: %s' % device) + bb.debug(1, '>>> New device configured: %s' % device) # Return the value computed return device -def get_offset(new_offset, current_device, bootscheme, config, partition, d): +def align_size(d, device, size, copy=1): + """ + This function returns the size in KiB for the selected device making sure to + align on erase block and taking into account the copy expected to fit for the + original size set + """ + # Make sure to use device name and not device type + device_types = (d.getVar('DEVICE_STORAGE_TYPES') or "").split() + if device in device_types: + device = d.getVar('DEVICE_%s' % device) or "" + # Get device alignment size + alignment_size = d.getVar('DEVICE_ALIGNMENT_SIZE_%s' % device) or "none" + if alignment_size == 'none': + bb.fatal('Missing DEVICE_ALIGNMENT_SIZE_%s value' % device) + # Check for default size alignment on erase block + if ( int(size) * 1024 ) % int(alignment_size, 16) == 0: + bb.debug(1, '>>> The partition size properly follows %s erase size' % alignment_size) + else: + bb.debug(1, '>>> The %s alignment size is: %s' % (device, alignment_size)) + floor_coef = ( int(size) * 1024 ) // int(alignment_size, 16) + compute_size = ( floor_coef + 1 ) * int(alignment_size, 16) * int(copy) + # Set size in KiB + size = compute_size // 1024 + # Compute size with requested copy + size = int(size) * int(copy) + # Convert to string + size = str(size) + bb.debug(1, '>>> New partition size configured to follow %s alignment size: %s' % (alignment_size, size)) + # Return the computed size + return size + +def get_offset(new_offset, copy, current_device, bootscheme, config, partition, d): """ This function returns a couple of strings: offset, next_offset The offset is the one to use in flashlayout file for the requested partition, @@ -284,106 +332,91 @@ def get_offset(new_offset, current_device, bootscheme, config, partition, d): The next_offset is computed by first getting the FLASHLAYOUT_PARTITION_SIZE for the current partition, and we make sure to align properly the next_offset according to the DEVICE_ALIGNMENT_SIZE_ where is feed from - 'current_device' input. + 'current_device' input and the number of copy expected to fit in partition. """ import re - # Get current_device alias device_alias = d.getVar('DEVICE_%s' % current_device) or "" - # Set offset offset = expand_var('FLASHLAYOUT_PARTITION_OFFSET', bootscheme, config, partition, d) - bb.note('>>> Selected FLASHLAYOUT_PARTITION_OFFSET: %s' % offset) + # Set max offset + max_offset = d.getVar('DEVICE_MAX_OFFSET_%s' % device_alias) or "none" + bb.debug(1, '>>> Selected FLASHLAYOUT_PARTITION_OFFSET: %s' % offset) if offset == 'none': if new_offset == 'none': - bb.note('>>> No %s partition offset configured (%s device) for %s label for %s bootscheme, so default to default origin device one.' % (partition, current_device, config, bootscheme)) + bb.debug(1, '>>> No %s partition offset configured (%s device) for %s label for %s bootscheme, so default to default origin device one.' % (partition, current_device, config, bootscheme)) start_offset = d.getVar('DEVICE_START_OFFSET_%s' % device_alias) or "none" if start_offset == 'none': bb.fatal('Missing DEVICE_START_OFFSET_%s value' % device_alias) offset = start_offset else: offset = new_offset - bb.note('>>> New offset configured: %s' % offset) - + bb.debug(1, '>>> New offset configured: %s' % offset) # Set next offset partition_size = expand_var('FLASHLAYOUT_PARTITION_SIZE', bootscheme, config, partition, d) - bb.note('>>> Selected FLASHLAYOUT_PARTITION_SIZE: %s' % partition_size) + bb.debug(1, '>>> Selected FLASHLAYOUT_PARTITION_SIZE: %s' % partition_size) if not partition_size.isdigit(): - bb.note('No partition size provided for %s partition, %s label and %s bootscheme!' % (partition, config, bootscheme)) + bb.debug(1, 'No partition size provided for %s partition, %s label and %s bootscheme!' % (partition, config, bootscheme)) next_offset = "none" + max_offset = "none" else: if re.match('^0x.*$', offset): - bb.note('>>> Current device is %s (%s alias)' % (current_device, device_alias)) - alignment_size = d.getVar('DEVICE_ALIGNMENT_SIZE_%s' % device_alias) or "none" - if alignment_size == 'none': - bb.fatal('Missing DEVICE_ALIGNMENT_SIZE_%s value' % device_alias) - if ( int(partition_size) * 1024 ) % int(alignment_size, 16) == 0: - bb.note('>>> The partition size properly follows %s erase size' % alignment_size) - else: - bb.note('>>> The %s alignment size is: %s' % (current_device, alignment_size)) - floor_coef = ( int(partition_size) * 1024 ) // int(alignment_size, 16) - compute_size = ( floor_coef + 1 ) * int(alignment_size, 16) - partition_size = str(compute_size // 1024) - bb.note('>>> New partition size configured to follow %s alignment size: %s' % (alignment_size, partition_size)) + bb.debug(1, '>>> Current device is %s (%s alias), and %s copy is set' % (current_device, device_alias, copy)) + partition_size = align_size(d, device_alias, partition_size, copy) # Compute new offset value overall_size = int(offset, 16) + int(partition_size) * 1024 next_offset = '0x{0:0{1}X}'.format(overall_size, 8) + + # Check if the next offset will exceed the size of the storage + if max_offset != "none": + if int(next_offset, 0) <= int(max_offset, 0): + # still some place, do not return max offset + max_offset = "none" else: next_offset = "none" - bb.note('>>> New next_offset configured: %s' % next_offset) + max_offset = "none" + bb.debug(1, '>>> New next_offset configured: %s' % next_offset) - # Return both offset and next offset - return str(offset), str(next_offset) + # Return offset, next offset and max offset + return str(offset), str(next_offset), str(max_offset) -def get_binaryname(labeltype, bootscheme, config, partition, d): +def get_binaryname(labeltype, device, bootscheme, config, partition, d): """ Return proper binary name to use in flashlayout file by applying any specific computation (replacement, etc) Make sure also that binary is available on deploy folder """ import re - # Init binary_name for current configuration binary_name = expand_var('FLASHLAYOUT_PARTITION_BIN2LOAD', bootscheme, config, partition, d) - bb.note('>>> Selected FLASHLAYOUT_PARTITION_BIN2LOAD: %s' % binary_name) + bb.debug(1, '>>> Selected FLASHLAYOUT_PARTITION_BIN2LOAD: %s' % binary_name) + # Set 'device' to alias name in lower case + if device != 'none': + device = d.getVar('DEVICE_%s' % device).lower() + # Init pattern to look for with current config value + update_patterns = ';' + bootscheme + update_patterns += ' ' + ';' + config.replace("-","_") + update_patterns += ' ' + ';' + device + update_patterns += ' ' + ';' + labeltype + bb.debug(1, '>>> Default substitution patterns: %s' % update_patterns) - # Get binary_name basename to then check for any rename case - binary_name_base = os.path.basename(binary_name) - bb.note('>>> Basename selected for %s: %s' % (binary_name, binary_name_base)) - - # Treat TF-A, TEE, U-BOOT and U-BOOT-SPL binary rename case - if re.match('^tf-a.*$', binary_name_base) or re.match('^u-boot.*$', binary_name_base) or re.match('^tee-.*$', binary_name_base) or re.match('^zImage-.*$', binary_name_base): - file_name, file_ext = os.path.splitext(binary_name) - # Init binary_type to use from labeltype - binary_type = labeltype + '-' + bootscheme - bb.note('>>> Binary type used: %s' % binary_type) - # Check for any replace pattern - replace_patterns = expand_var('FLASHLAYOUT_PARTITION_REPLACE_PATTERNS', bootscheme, config, partition, d) - bb.note('>>> Substitution patterns: %s' % replace_patterns) - # Apply replacement patterns on binary_type - if replace_patterns != 'none': - for replace_pattern in replace_patterns.split(): - pattern2replace = replace_pattern.split(';')[0] - pattern2use = replace_pattern.split(';')[1] - # Replace with pattern middle of string - binary_type = re.sub(r'-%s-' % pattern2replace, '-' + pattern2use + '-', binary_type) - # Replace with pattern end of string - binary_type = re.sub(r'-%s$' % pattern2replace, '-' + pattern2use, binary_type) - bb.note('>>> New "binary_type" to use for binary name": %s' % binary_type) - # Append binary_type to binary name - if re.match('^u-boot-spl.*$', binary_name_base): - binary_name = file_name + file_ext + '-' + binary_type - elif re.match('^zImage.*$', binary_name_base): - binary_name = file_name + '-' + labeltype + file_ext - else: - binary_name = file_name + '-' + binary_type + file_ext - - # Make sure binary is available in DEPLOY_DIR_IMAGE folder - if binary_name != 'none': - if not os.path.isfile(os.path.join(d.getVar('DEPLOY_DIR_IMAGE'), binary_name)): - # Specific exception for rootfs binary (not yet deployed) - if not os.path.isfile(os.path.join(d.getVar('IMGDEPLOYDIR'), binary_name)): - bb.fatal('Missing %s binary file in deploy folder' % binary_name) + replace_patterns = expand_var('FLASHLAYOUT_PARTITION_REPLACE_PATTERNS', bootscheme, config, partition, d) + if replace_patterns != 'none': + bb.debug(1, '>>> Substitution pattern addons: %s' % replace_patterns) + # Append substitution patterns to update pattern list + update_patterns += ' ' + replace_patterns + # Apply pattern substitution to binary name + for pattern in update_patterns.split(): + pattern2replace = pattern.split(';')[0] + pattern2use = pattern.split(';')[1] + if re.search(r'[-_]%s([-_.]|$)' % pattern2replace, binary_name): + if pattern2use == "": + # Remove pattern + binary_name = re.sub(r'[-_]%s([-_.]|$)' % pattern2replace, r'\1', binary_name) + else: + # Replace pattern + binary_name = re.sub(r'([-_])%s([-_.]|$)' % pattern2replace, r'\1%s\2' % pattern2use, binary_name) + bb.debug(1, '>>> New binary name: %s' % binary_name) # Return binary_name value return binary_name @@ -402,7 +435,7 @@ python do_create_flashlayout_config() { # We check first if it is requested to generate any flashlayout files if d.getVar("ENABLE_FLASHLAYOUT_CONFIG") != "1": - bb.note('ENABLE_FLASHLAYOUT_CONFIG not enabled') + bb.debug(1, 'ENABLE_FLASHLAYOUT_CONFIG not enabled') return # Create destination folder for flashlayout files @@ -411,7 +444,7 @@ python do_create_flashlayout_config() { # We check if user as define a static flashlayout file to use instead of dynamic generation if d.getVar("ENABLE_FLASHLAYOUT_DEFAULT") == "1": - bb.note('ENABLE_FLASHLAYOUT_DEFAULT enabled') + bb.debug(1, 'ENABLE_FLASHLAYOUT_DEFAULT enabled') flashlayout_src = d.getVar("FLASHLAYOUT_DEFAULT_SRC") if not flashlayout_src: bb.fatal("FLASHLAYOUT_DEFAULT_SRC not defined, please set a proper value") @@ -423,7 +456,7 @@ python do_create_flashlayout_config() { flashlayout_staticname=os.path.basename(f) flashlayout_file = os.path.join(d.getVar('FLASHLAYOUT_DESTDIR'), flashlayout_staticname) shutil.copy2(f, flashlayout_file) - bb.note('Copy %s to output file %s' % (f, flashlayout_file)) + bb.debug(1, 'Copy %s to output file %s' % (f, flashlayout_file)) else: bb.fatal("Configure static file: %s not found" % fl_src) return @@ -438,35 +471,35 @@ python do_create_flashlayout_config() { for bootscheme in bootschemes.split(): if re.match('.*_.*', bootscheme): bb.fatal("Please remove all '_' for bootschemes defined in FLASHLAYOUT_BOOTSCHEME_LABELS") - bb.note('FLASHLAYOUT_BOOTSCHEME_LABELS: %s' % bootschemes) + bb.debug(1, 'FLASHLAYOUT_BOOTSCHEME_LABELS: %s' % bootschemes) for bootscheme in bootschemes.split(): - bb.note('*** Loop for bootscheme label: %s' % bootscheme) + bb.debug(1, '*** Loop for bootscheme label: %s' % bootscheme) # Get the different flashlayout config label configs = expand_var('FLASHLAYOUT_CONFIG_LABELS', bootscheme, '', '', d) # Make sure there is no '_' in FLASHLAYOUT_CONFIG_LABELS for config in configs.split(): if re.match('.*_.*', config): bb.fatal("Please remove all '_' for configs defined in FLASHLAYOUT_CONFIG_LABELS") - bb.note('FLASHLAYOUT_CONFIG_LABELS: %s' % configs) + bb.debug(1, 'FLASHLAYOUT_CONFIG_LABELS: %s' % configs) if configs.strip() == 'none': - bb.note("FLASHLAYOUT_CONFIG_LABELS is none, so no flashlayout file to generate.") + bb.debug(1, "FLASHLAYOUT_CONFIG_LABELS is none, so no flashlayout file to generate.") continue # Create bootscheme subfolder for flashlayout files flashlayout_subfolder_path = os.path.join(d.getVar('FLASHLAYOUT_DESTDIR'), bootscheme) bb.utils.mkdirhier(flashlayout_subfolder_path) for config in configs.split(): - bb.note('*** Loop for config label: %s' % config) + bb.debug(1, '*** Loop for config label: %s' % config) # Set labeltypes list labeltypes = expand_var('FLASHLAYOUT_TYPE_LABELS', bootscheme, config, '', d) - bb.note('FLASHLAYOUT_TYPE_LABELS: %s' % labeltypes) + bb.debug(1, 'FLASHLAYOUT_TYPE_LABELS: %s' % labeltypes) if labeltypes.strip() == 'none': - bb.note("FLASHLAYOUT_TYPE_LABELS is none, so no flashlayout file to generate.") + bb.debug(1, "FLASHLAYOUT_TYPE_LABELS is none, so no flashlayout file to generate.") continue for labeltype in labeltypes.split(): - bb.note('*** Loop for label type: %s' % labeltype) + bb.debug(1, '*** Loop for label type: %s' % labeltype) # Init current label current_label = labeltype # Init flashlayout file name @@ -481,26 +514,51 @@ python do_create_flashlayout_config() { flashlayout_file = os.path.join(flashlayout_subfolder_path, d.expand("${FLASHLAYOUT_BASENAME}%s%s.${FLASHLAYOUT_SUFFIX}" % (config_append, labeltype_append))) # Get the partition list to write in flashlayout file partitions = expand_var('FLASHLAYOUT_PARTITION_LABELS', bootscheme, config, '', d) - bb.note('FLASHLAYOUT_PARTITION_LABELS: %s' % partitions) + bb.debug(1, 'FLASHLAYOUT_PARTITION_LABELS: %s' % partitions) if partitions == 'none': - bb.note("FLASHLAYOUT_PARTITION_LABELS is none, so no flashlayout file to generate.") + bb.debug(1, "FLASHLAYOUT_PARTITION_LABELS is none, so no flashlayout file to generate.") continue # Generate flashlayout file for labeltype try: with open(flashlayout_file, 'w') as fl_file: # Write to flashlayout file the first line header fl_file.write('#Opt\tId\tName\tType\tIP\tOffset\tBinary\n') + # Init partition id for binary and other + partition_id_bin = int(d.getVar("FLASHLAYOUT_PARTITION_ID_START_BINARY"), 16) + partition_id_binmax = int(d.getVar("FLASHLAYOUT_PARTITION_ID_LIMIT_BINARY"), 16) + partition_id_oth = int(d.getVar("FLASHLAYOUT_PARTITION_ID_START_OTHERS"), 16) + partition_id_othmax = int(d.getVar("FLASHLAYOUT_PARTITION_ID_LIMIT_OTHERS"), 16) # Init partition next offset to 'none' partition_nextoffset = "none" # Init partition previous device to 'none' partition_prevdevice = "none" for partition in partitions.split(): - bb.note('*** Loop for partition: %s' % partition) + bb.debug(1, '*** Loop for partition: %s' % partition) # Init partition settings partition_enable = expand_var('FLASHLAYOUT_PARTITION_ENABLE', bootscheme, config, partition, d) - partition_id = expand_var('FLASHLAYOUT_PARTITION_ID', bootscheme, config, partition, d) partition_name = partition partition_type = expand_var('FLASHLAYOUT_PARTITION_TYPE', bootscheme, config, partition, d) + partition_id = expand_var('FLASHLAYOUT_PARTITION_ID', bootscheme, config, partition, d) + if partition_id == "none": + # Compute partition_id + if partition_type == 'Binary': + # Make sure we're not getting wrong partition_id + if partition_id_bin > partition_id_binmax: + bb.fatal('Partition ID exceed %s limit for %s type: FLASHLAYOUT_PARTITION_ID = %s (bootscheme: %s, config: %s, partition: %s)' % (d.getVar("FLASHLAYOUT_PARTITION_ID_LIMIT_BINARY"), partition_type, partition_id, bootscheme, config, partition)) + partition_id = '0x{0:0{1}X}'.format(partition_id_bin, 2) + partition_id_bin = partition_id_bin + 1 + else: + # Make sure we're not getting wrong partition_id + if partition_id_oth > partition_id_othmax: + bb.fatal('Partition ID exceed %s limit for %s type: FLASHLAYOUT_PARTITION_ID = %s (bootscheme: %s, config: %s, partition: %s)' % (d.getVar("FLASHLAYOUT_PARTITION_ID_LIMIT_OTHERS"), partition_type, partition_id, bootscheme, config, partition)) + partition_id = '0x{0:0{1}X}'.format(partition_id_oth, 2) + partition_id_oth = partition_id_oth + 1 + partition_copy = expand_var('FLASHLAYOUT_PARTITION_COPY', bootscheme, config, partition, d) + if not partition_copy.isdigit(): + bb.fatal('Wrong configuration for FLASHLAYOUT_PARTITION_COPY: %s (bootscheme: %s, config: %s, partition: %s)' % (partition_copy, bootscheme, config, partition)) + # Update partition type if needed + if partition_copy != "1": + partition_type += '(' + partition_copy + ')' partition_device = get_device(bootscheme, config, partition, d) # Reset partition_nextoffset to 'none' in case partition device has changed if partition_device != partition_prevdevice: @@ -508,26 +566,43 @@ python do_create_flashlayout_config() { # Save partition current device to previous one for next loop partition_prevdevice = partition_device # Get partition offset - partition_offset, partition_nextoffset = get_offset(partition_nextoffset, partition_device, bootscheme, config, partition, d) + partition_offset, partition_nextoffset, partition_maxoffset = get_offset(partition_nextoffset, partition_copy, partition_device, bootscheme, config, partition, d) + + # Check if the size will exceed the mass storage + if partition_maxoffset != "none" : + bb.warn('>>> Cannot generate tsv for %s %s %s %s. The partition end offset %s is higher than max offset %s.' % (partition_device, bootscheme, config, partition, partition_nextoffset, partition_maxoffset)) + # No need to create/keep the tsv because flashlayout indicates the + # computed size exceeds the size of the device. So delete the tsv + fl_file.close() + if os.path.exists(flashlayout_file): + os.remove(flashlayout_file) + break + # Get binary name - partition_bin2load = get_binaryname(labeltype, bootscheme, config, partition, d) + partition_bin2load = get_binaryname(labeltype, partition_device, bootscheme, config, partition, d) # Be verbose in log file - bb.note('>>> Layout inputs: %s' % fl_file.name) - bb.note('>>> FLASHLAYOUT_PARTITION_ENABLE: %s' % partition_enable) - bb.note('>>> FLASHLAYOUT_PARTITION_ID: %s' % partition_id) - bb.note('>>> FLASHLAYOUT_PARTITION_LABEL: %s' % partition_name) - bb.note('>>> FLASHLAYOUT_PARTITION_TYPE: %s' % partition_type) - bb.note('>>> FLASHLAYOUT_PARTITION_DEVICE: %s' % partition_device) - bb.note('>>> FLASHLAYOUT_PARTITION_OFFSET: %s' % partition_offset) - bb.note('>>> FLASHLAYOUT_PARTITION_BIN2LOAD: %s' % partition_bin2load) - bb.note('>>> done') + bb.debug(1, '>>> Layout inputs: %s' % fl_file.name) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_ENABLE: %s' % partition_enable) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_ID: %s' % partition_id) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_LABEL: %s' % partition_name) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_TYPE: %s' % partition_type) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_DEVICE: %s' % partition_device) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_OFFSET: %s' % partition_offset) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_BIN2LOAD: %s' % partition_bin2load) + bb.debug(1, '>>> done') + # Make sure binary is available in DEPLOY_DIR_IMAGE folder + if partition_bin2load != 'none': + if not os.path.isfile(os.path.join(d.getVar('DEPLOY_DIR_IMAGE'), partition_bin2load)): + # Specific exception for rootfs binary (not yet deployed) + if not os.path.isfile(os.path.join(d.getVar('IMGDEPLOYDIR'), partition_bin2load)): + bb.fatal('Missing %s binary file in deploy folder' % partition_bin2load) # Get the supported labels for current storage device partition_device_alias = d.getVar('DEVICE_%s' % partition_device) or "" partition_type_supported_labels = d.getVar('DEVICE_BOARD_ENABLE_%s' % partition_device_alias) or "none" # Check if partition type is supported for the current label if partition_device != 'none' and current_label not in partition_type_supported_labels.split(): - bb.note('>>> FLASHLAYOUT_PARTITION_DEVICE (%s, alias %s) is not supported for current label (%s): partition %s not appended in flashlayout file' % (partition_device, partition_device_alias, current_label, partition_name)) - bb.note('>>> DEVICE_BOARD_ENABLE_%s: %s' % (partition_device_alias, partition_type_supported_labels)) + bb.debug(1, '>>> FLASHLAYOUT_PARTITION_DEVICE (%s, alias %s) is not supported for current label (%s): partition %s not appended in flashlayout file' % (partition_device, partition_device_alias, current_label, partition_name)) + bb.debug(1, '>>> DEVICE_BOARD_ENABLE_%s: %s' % (partition_device_alias, partition_type_supported_labels)) continue # Write to flashlayout file the partition configuration fl_file.write('%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % @@ -535,8 +610,12 @@ python do_create_flashlayout_config() { except OSError: bb.fatal('Unable to open %s' % (fl_file)) + if not os.path.exists(flashlayout_file): + # The tsv does not exist, so cannot generate the tsv for wrapper4dbg + break + if d.getVar("ENABLE_FLASHLAYOUT_CONFIG_WRAPPER4DBG") == "1": - bb.note('*** Loop for flashlayout for the wrapper for debug %s' % labeltype) + bb.debug(1, '*** Loop for flashlayout for the wrapper for debug %s' % labeltype) tmp_flashlayout_file = os.path.join(flashlayout_subfolder_path, "flashlayout.tmp") debug_flashlayout = False @@ -563,7 +642,7 @@ python do_create_flashlayout_config() { bb.utils.mkdirhier(flashlayout_wrapper4dbg_subfolder_path) # Wrapper4dbg output filename debug_flashlayout_file = os.path.join(flashlayout_wrapper4dbg_subfolder_path,d.expand("debug-${FLASHLAYOUT_BASENAME}%s%s.${FLASHLAYOUT_SUFFIX}" % (config_append, labeltype_append))) - bb.note(">>> Update tf-a in %s" % (debug_flashlayout_file)) + bb.debug(1, ">>> Update tf-a in %s" % (debug_flashlayout_file)) os.rename(tmp_flashlayout_file, debug_flashlayout_file) else: os.remove(tmp_flashlayout_file) @@ -583,16 +662,95 @@ python do_create_flashlayout_config_setscene () { } addtask do_create_flashlayout_config_setscene +python flashlayout_partition_config() { + """ + Set the different flashlayout partition vars for the configure partition + images. + Based on both PARTITIONS_BOOTLOADER_CONFIG and PARTITIONS_OPTEE_CONFIG feed: + FLASHLAYOUT_PARTITION_ENABLE__ + FLASHLAYOUT_PARTITION_SIZE__ + FLASHLAYOUT_PARTITION_COPY__ + FLASHLAYOUT_PARTITION_TYPE__ + """ + # Init partition and flashlayout configuration vars + partitionconfig_list = 'PARTITIONS_BOOTLOADER_CONFIG PARTITIONS_OPTEE_CONFIG' + + for partconfvar in partitionconfig_list.split(): + partitionsconfigflags = d.getVarFlags(partconfvar) + # The "doc" varflag is special, we don't want to see it here + partitionsconfigflags.pop('doc', None) + partitionsconfig = (d.getVar(partconfvar) or "").split() + + if len(partitionsconfig) > 0: + for config in partitionsconfig: + for f, v in partitionsconfigflags.items(): + if config == f: + # Make sure to get var flag properly expanded + v = d.getVarFlag(partconfvar, config) + if not v.strip(): + bb.fatal('[%s] Missing configuration for %s config' % (partconfvar, config)) + for subconfigs in v.split(): + bb.debug(1, '[%s] *** Loop for %s config with setting: %s' % (partconfvar, config, subconfigs)) + items = subconfigs.split(',') + # Check for proper content + if items[0] and len(items) > 5: + bb.fatal('[%s] Only partdata,partlabel,size,type,copy can be specified!' % partconfvar) + # Init flashlayout label + if items[1] and items[1] != '': + fl_label = d.expand(items[1]) + bb.debug(1, "Init for flashlayout label to: %s" % fl_label) + else: + bb.fatal('[%s] Missing partlabel setting' % partconfvar) + # Feed FLASHLAYOUT_PARTITION_* vars + if d.getVar('FLASHLAYOUT_PARTITION_ENABLE_%s_%s' % (config, fl_label)): + bb.debug(1, "FLASHLAYOUT_PARTITION_ENABLE_%s_%s is already set to: %s." % (config, fl_label, d.getVar('FLASHLAYOUT_PARTITION_ENABLE_%s_%s' % (config, fl_label)))) + else: + bb.debug(1, "Set FLASHLAYOUT_PARTITION_ENABLE_%s_%s to 'P'." % (config, fl_label)) + d.setVar('FLASHLAYOUT_PARTITION_ENABLE_%s_%s' % (config, fl_label), 'P') + if items[0] != '': + if d.getVar('FLASHLAYOUT_PARTITION_BIN2LOAD_%s_%s' % (config, fl_label)): + bb.debug(1, "FLASHLAYOUT_PARTITION_BIN2LOAD_%s_%s is already set to: %s." % (config, fl_label, d.getVar('FLASHLAYOUT_PARTITION_BIN2LOAD_%s_%s' % (config, fl_label)))) + else: + bb.debug(1, "Set FLASHLAYOUT_PARTITION_BIN2LOAD_%s_%s to %s." % (config, fl_label, items[0])) + d.setVar('FLASHLAYOUT_PARTITION_BIN2LOAD_%s_%s' % (config, fl_label), items[0]) + else: + bb.debug(1, "No partdata setting for %s label : default setting would applied..." % fl_label) + if items[2] and items[2] != '': + if d.getVar('FLASHLAYOUT_PARTITION_SIZE_%s_%s' % (config, fl_label)): + bb.debug(1, "FLASHLAYOUT_PARTITION_SIZE_%s_%s is already set to: %s." % (config, fl_label, d.getVar('FLASHLAYOUT_PARTITION_SIZE_%s_%s' % (config, fl_label)))) + else: + bb.debug(1, "Set FLASHLAYOUT_PARTITION_SIZE_%s_%s to %s." % (config, fl_label, items[2])) + d.setVar('FLASHLAYOUT_PARTITION_SIZE_%s_%s' % (config, fl_label), items[2]) + else: + bb.fatal('[%s] Missing size setting for % label' % (partconfvar, fl_label)) + if items[3] and items[3] != '': + if d.getVar('FLASHLAYOUT_PARTITION_TYPE_%s_%s' % (config, fl_label)): + bb.debug(1, "FLASHLAYOUT_PARTITION_TYPE_%s_%s is already set to: %s." % (config, fl_label, d.getVar('FLASHLAYOUT_PARTITION_TYPE_%s_%s' % (config, fl_label)))) + else: + bb.debug(1, "Set FLASHLAYOUT_PARTITION_TYPE_%s_%s to %s." % (config, fl_label, items[3])) + d.setVar('FLASHLAYOUT_PARTITION_TYPE_%s_%s' % (config, fl_label), items[3]) + else: + bb.debug(1, "No PARTITION_TYPE setting for %s label: default setting would applied..." % fl_label) + if items[4] and items[4] != '': + if d.getVar('FLASHLAYOUT_PARTITION_COPY_%s_%s' % (config, fl_label)): + bb.debug(1, "FLASHLAYOUT_PARTITION_COPY_%s_%s is already set to: %s." % (config, fl_label, d.getVar('FLASHLAYOUT_PARTITION_COPY_%s_%s' % (config, fl_label)))) + else: + bb.debug(1, "Set FLASHLAYOUT_PARTITION_COPY_%s_%s to %s." % (config, fl_label, items[4])) + d.setVar('FLASHLAYOUT_PARTITION_COPY_%s_%s' % (config, fl_label), items[4]) + else: + bb.debug(1, "No PARTITION_COPY setting for % label : default setting would applied..." % fl_label) + break +} python flashlayout_partition_image_config() { """ Set the different flashlayout partition vars for the configure partition images. Based on PARTITIONS_CONFIG, feed: FLASHLAYOUT_PARTITION_IMAGES - FLASHLAYOUT_PARTITION_ID_ - FLASHLAYOUT_PARTITION_TYPE_ + FLASHLAYOUT_PARTITION_ENABLE_ FLASHLAYOUT_PARTITION_SIZE_ FLASHLAYOUT_PARTITION_BIN2LOAD_ + FLASHLAYOUT_PARTITION_TYPE_ """ partitionsconfigflags = d.getVarFlags('PARTITIONS_CONFIG') @@ -601,9 +759,6 @@ python flashlayout_partition_image_config() { partitionsconfig = (d.getVar('PARTITIONS_CONFIG') or "").split() if len(partitionsconfig) > 0: - # Init default partition id for binary type and other - id_bin = 4 - id_oth = 33 for config in partitionsconfig: for f, v in partitionsconfigflags.items(): if config == f: @@ -611,6 +766,9 @@ python flashlayout_partition_image_config() { # Make sure about PARTITIONS_CONFIG contents if items[0] and len(items) > 5: bb.fatal('[PARTITIONS_CONFIG] Only image,label,mountpoint,size,type can be specified!') + # Check for proper configuration + if items[0] == '': + bb.fatal('[PARTITIONS_CONFIG] Missing image setting') if items[1]: bb.debug(1, "Appending %s to FLASHLAYOUT_PARTITION_IMAGES." % items[1]) d.appendVar('FLASHLAYOUT_PARTITION_IMAGES', ' ' + items[1]) @@ -618,6 +776,8 @@ python flashlayout_partition_image_config() { bb.fatal('[PARTITIONS_CONFIG] Missing image label setting') # Init flashlayout label fl_label = d.expand(items[1]) + bb.debug(1, "Set FLASHLAYOUT_PARTITION_ENABLE_%s to 'P'." % fl_label) + d.setVar('FLASHLAYOUT_PARTITION_ENABLE_%s' % fl_label, 'P') if items[2] == '': # There is no mountpoint specified, so we apply rootfs image format bb.debug(1, "Set FLASHLAYOUT_PARTITION_BIN2LOAD_%s to %s." % (fl_label, items[0] + "-${MACHINE}.ext4")) @@ -629,19 +789,10 @@ python flashlayout_partition_image_config() { bb.debug(1, "Set FLASHLAYOUT_PARTITION_SIZE_%s to %s." % (fl_label, items[3])) d.setVar('FLASHLAYOUT_PARTITION_SIZE_%s' % fl_label, items[3]) else: - bb.fatal('[PARTITIONS_CONFIG] Missing PARTITION_SIZE setting for % label' % fl_label) + bb.fatal('[PARTITIONS_CONFIG] Missing PARTITION_SIZE setting for %s label' % fl_label) if items[4]: bb.debug(1, "Set FLASHLAYOUT_PARTITION_TYPE_%s to %s." % (fl_label, items[4])) d.setVar('FLASHLAYOUT_PARTITION_TYPE_%s' % fl_label, items[4]) - # Compute partition id according to type set - if items[4] == 'Binary': - part_id = '0x{0:0{1}X}'.format(id_bin, 2) - id_bin = id_bin + 1 - else: - part_id = '0x{0:0{1}X}'.format(id_oth, 2) - id_oth = id_oth + 1 - bb.debug(1, "Set FLASHLAYOUT_PARTITION_ID_%s to %s." % (fl_label, part_id)) - d.setVar('FLASHLAYOUT_PARTITION_ID_%s' % fl_label, "%s" % part_id) else: bb.fatal('[PARTITIONS_CONFIG] Missing PARTITION_TYPE setting for % label' % fl_label) break @@ -653,14 +804,15 @@ python flashlayout_partition_image_config() { # need to make sure to add each variables to the vardeps list. FLASHLAYOUT_LABELS_VARS = "CONFIG_LABELS PARTITION_LABELS TYPE_LABELS" -FLASHLAYOUT_LABELS_OVERRIDES = "${@' '.join('%s %s %s_%s' % (b, c, b, c) for b in d.getVar('FLASHLAYOUT_BOOTSCHEME_LABELS').split() for c in d.getVar('FLASHLAYOUT_CONFIG_LABELS').split())}" +FLASHLAYOUT_LABELS_OVERRIDES = "${FLASHLAYOUT_BOOTSCHEME_LABELS} ${FLASHLAYOUT_CONFIG_LABELS}" +FLASHLAYOUT_LABELS_OVERRIDES += "${@' '.join('%s_%s' % (b, c) for b in d.getVar('FLASHLAYOUT_BOOTSCHEME_LABELS').split() for c in d.getVar('FLASHLAYOUT_CONFIG_LABELS').split())}" do_create_flashlayout_config[vardeps] += "${@' '.join(['FLASHLAYOUT_%s_%s' % (v, o) for v in d.getVar('FLASHLAYOUT_LABELS_VARS').split() for o in d.getVar('FLASHLAYOUT_LABELS_OVERRIDES').split()])}" FLASHLAYOUT_PARTITION_VARS = "ENABLE ID TYPE DEVICE OFFSET BIN2LOAD SIZE REPLACE_PATTERNS" -FLASHLAYOUT_PARTITION_CONFIGURED = "${@" ".join(map(lambda o: "%s" % d.getVar("FLASHLAYOUT_PARTITION_LABELS_%s" % o), d.getVar('FLASHLAYOUT_LABELS_OVERRIDES').split()))}" -FLASHLAYOUT_PARTITION_OVERRIDES = "${@' '.join('%s %s %s_%s' % (o, p, o, p) for o in d.getVar('FLASHLAYOUT_LABELS_OVERRIDES').split() for p in d.getVar('FLASHLAYOUT_PARTITION_CONFIGURED').split())}" +FLASHLAYOUT_PARTITION_CONFIGURED = "${@' '.join(dict.fromkeys(' '.join('%s' % d.getVar('FLASHLAYOUT_PARTITION_LABELS_%s' % o) for o in d.getVar('FLASHLAYOUT_LABELS_OVERRIDES').split()).split()))}" +FLASHLAYOUT_PARTITION_OVERRIDES = "${FLASHLAYOUT_LABELS_OVERRIDES} ${FLASHLAYOUT_PARTITION_CONFIGURED}" +FLASHLAYOUT_PARTITION_OVERRIDES += "${@' '.join('%s_%s' % (o, p) for o in d.getVar('FLASHLAYOUT_LABELS_OVERRIDES').split() for p in d.getVar('FLASHLAYOUT_PARTITION_CONFIGURED').split())}" do_create_flashlayout_config[vardeps] += "${@' '.join(['FLASHLAYOUT_PARTITION_%s_%s' % (v, o) for v in d.getVar('FLASHLAYOUT_PARTITION_VARS').split() for o in d.getVar('FLASHLAYOUT_PARTITION_OVERRIDES').split()])}" -FLASHLAYOUT_DEVICE_VARS = "ALIGNMENT_SIZE BOARD_ENABLE START_OFFSET" -FLASHLAYOUT_PARTITION_DEVICE_CONFIGURED = "${@" ".join(map(lambda p: "%s" % d.getVar("DEVICE_%s" % p), d.getVar('DEVICE_STORAGE_NAMES').split()))}" -do_create_flashlayout_config[vardeps] += "${@' '.join(['DEVICE_%s_%s' % (v, o) for v in d.getVar('FLASHLAYOUT_DEVICE_VARS').split() for o in d.getVar('FLASHLAYOUT_PARTITION_DEVICE_CONFIGURED').split()])}" +FLASHLAYOUT_DEVICE_VARS = "ALIGNMENT_SIZE BOARD_ENABLE START_OFFSET MAX_OFFSET" +do_create_flashlayout_config[vardeps] += "${@' '.join(['DEVICE_%s_%s' % (v, o) for v in d.getVar('FLASHLAYOUT_DEVICE_VARS').split() for o in d.getVar('DEVICE_STORAGE_NAMES').split()])}" diff --git a/conf/machine/include/st-machine-common-stm32mp.inc b/conf/machine/include/st-machine-common-stm32mp.inc index b40d68e..c7ddc47 100644 --- a/conf/machine/include/st-machine-common-stm32mp.inc +++ b/conf/machine/include/st-machine-common-stm32mp.inc @@ -33,7 +33,6 @@ MACHINE_FEATURES = "usbhost usbgadget alsa screen ext2" MACHINE_FEATURES_append = " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'optee', '', d)} " MACHINE_FEATURES_append = " tpm2 " -MACHINE_FEATURES_append = " autoresize " # Remove autoresize package from DISTRO_EXTRA_RRECOMMENDS to add it explicitly # in our bootfs image instead of rootfs DISTRO_EXTRA_RRECOMMENDS_remove = "${@bb.utils.contains('COMBINED_FEATURES', 'autoresize', '${AUTORESIZE}', '', d)}" @@ -41,6 +40,9 @@ DISTRO_EXTRA_RRECOMMENDS_remove = "${@bb.utils.contains('COMBINED_FEATURES', 'au # Use Little Kernel loader to program storage device MACHINE_FEATURES += "kloader" +# Use FIP image for boot loaders +MACHINE_FEATURES += "fip" + # Default serial consoles (TTYs) to enable using getty # Before kernel 4.18, serial console are ttyS3 but after is ttySTM0 SERIAL_CONSOLES = "115200;ttySTM0" @@ -67,6 +69,116 @@ STM32MP_DEVICETREE_append = " ${STM32MP_DT_FILES_EV} " # Enable Software watchdog when sysvinit MACHINE_EXTRA_RRECOMMENDS_append = " ${@bb.utils.contains('DISTRO_FEATURES','sysvinit',' watchdog ','',d)} " +# ========================================================================= +# Bootloader raw partition configuration : data, label, size (Kbytes) +# ========================================================================= +# ----------------------------------------------------------------------------- +# NOTE: There are few restrictions to follow: +# - The partition for the first boot loader should follow the naming +# rule: fsbl* +# - The partition for the secondary boot loader should follow the naming +# rule: ssbl or fip +# ----------------------------------------------------------------------------- +STM32MP_FSBL1_DATA ?= "${@bb.utils.contains('MACHINE_FEATURES', 'fip', 'arm-trusted-firmware/tf-a--.stm32', 'arm-trusted-firmware/tf-a--.stm32', d)}" +STM32MP_FSBL1_NAME ?= "fsbl1" +STM32MP_FSBL1_SIZE ?= "256" +STM32MP_FSBL2_DATA ?= "${STM32MP_FSBL1_DATA}" +STM32MP_FSBL2_NAME ?= "fsbl2" +STM32MP_FSBL2_SIZE ?= "${STM32MP_FSBL1_SIZE}" +STM32MP_SSBL1_DATA ?= "${@bb.utils.contains('MACHINE_FEATURES', 'fip', 'fip/fip--${FIP_SIGN_SUFFIX}.bin', 'u-boot/u-boot--trusted.stm32', d)}" +STM32MP_SSBL1_NAME ?= "${@bb.utils.contains('MACHINE_FEATURES', 'fip', 'fip', 'ssbl', d)}" +STM32MP_SSBL1_SIZE ?= "${@bb.utils.contains('MACHINE_FEATURES', 'fip', '4096', '2048', d)}" +STM32MP_SSBL2_DATA ?= "${STM32MP_SSBL1_DATA}" +STM32MP_SSBL2_NAME ?= "${@bb.utils.contains('MACHINE_FEATURES', 'fip', 'fip2', 'ssbl2', d)}" +STM32MP_SSBL2_SIZE ?= "${STM32MP_SSBL1_SIZE}" +STM32MP_UENV_DATA ?= "" +STM32MP_UENV_NAME ?= "env" +STM32MP_UENV_SIZE ?= "512" +STM32MP_TEEH_DATA ?= "optee/tee-header_v2-.stm32" +STM32MP_TEEH_NAME ?= "teeh" +STM32MP_TEEH_SIZE ?= "256" +STM32MP_TEED_DATA ?= "optee/tee-pageable_v2-.stm32" +STM32MP_TEED_NAME ?= "teed" +STM32MP_TEED_SIZE ?= "512" +STM32MP_TEEX_DATA ?= "optee/tee-pager_v2-.stm32" +STM32MP_TEEX_NAME ?= "teex" +STM32MP_TEEX_SIZE ?= "256" + +# Specific override for NAND device type regarding partition sizes to follow +# the hard coded configuration on U-Boot source code +STM32MP_FSBL1_SIZE_UBOOT ?= "1024" +STM32MP_TEEH_SIZE_UBOOT ?= "512" +STM32MP_TEEX_SIZE_UBOOT ?= "512" + +# Bootloader Partitions configuration +PARTITIONS_BOOTLOADER_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', 'emmc', '', d)}" +PARTITIONS_BOOTLOADER_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', 'nand-4-256', '', d)}" +PARTITIONS_BOOTLOADER_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard', 'nor-sdcard', '', d)}" +PARTITIONS_BOOTLOADER_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'sdcard', 'sdcard', '', d)}" +PARTITIONS_BOOTLOADER_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'spinand-2-128', 'spinand-2-128', '', d)}" + +# ,,,, +PARTITIONS_BOOTLOADER_CONFIG[emmc] ?= "\ + ${@ '${STM32MP_FSBL1_DATA},${STM32MP_FSBL1_NAME},${STM32MP_FSBL1_SIZE},Binary,1' if '${STM32MP_FSBL1_NAME}' else ''} \ + ${@ '${STM32MP_FSBL2_DATA},${STM32MP_FSBL2_NAME},${STM32MP_FSBL2_SIZE},Binary,1' if '${STM32MP_FSBL2_NAME}' else ''} \ + ${@ '${STM32MP_SSBL1_DATA},${STM32MP_SSBL1_NAME},${STM32MP_SSBL1_SIZE},Binary,1' if '${STM32MP_SSBL1_NAME}' else ''} \ + " +PARTITIONS_BOOTLOADER_CONFIG[nand-4-256] ?= "\ + ${@ '${STM32MP_FSBL1_DATA},${STM32MP_FSBL1_NAME},${STM32MP_FSBL1_SIZE_UBOOT},Binary,2' if '${STM32MP_FSBL1_NAME}' else ''} \ + ${@ '${STM32MP_SSBL1_DATA},${STM32MP_SSBL1_NAME},${STM32MP_SSBL1_SIZE},Binary,1' if '${STM32MP_SSBL1_NAME}' else ''} \ + ${@ '${STM32MP_SSBL2_DATA},${STM32MP_SSBL2_NAME},${STM32MP_SSBL2_SIZE},Binary,1' if '${STM32MP_SSBL2_NAME}' else ''} \ + " +PARTITIONS_BOOTLOADER_CONFIG[nor-sdcard] ?= "\ + ${@ '${STM32MP_FSBL1_DATA},${STM32MP_FSBL1_NAME},${STM32MP_FSBL1_SIZE},Binary,1' if '${STM32MP_FSBL1_NAME}' else ''} \ + ${@ '${STM32MP_FSBL2_DATA},${STM32MP_FSBL2_NAME},${STM32MP_FSBL2_SIZE},Binary,1' if '${STM32MP_FSBL2_NAME}' else ''} \ + ${@ '${STM32MP_SSBL1_DATA},${STM32MP_SSBL1_NAME},${STM32MP_SSBL1_SIZE},Binary,1' if '${STM32MP_SSBL1_NAME}' else ''} \ + ${@ '${STM32MP_UENV_DATA},${STM32MP_UENV_NAME},${STM32MP_UENV_SIZE},Binary,1' if '${STM32MP_UENV_NAME}' else ''} \ + " +PARTITIONS_BOOTLOADER_CONFIG[sdcard] ?= "\ + ${@ '${STM32MP_FSBL1_DATA},${STM32MP_FSBL1_NAME},${STM32MP_FSBL1_SIZE},Binary,1' if '${STM32MP_FSBL1_NAME}' else ''} \ + ${@ '${STM32MP_FSBL2_DATA},${STM32MP_FSBL2_NAME},${STM32MP_FSBL2_SIZE},Binary,1' if '${STM32MP_FSBL2_NAME}' else ''} \ + ${@ '${STM32MP_SSBL1_DATA},${STM32MP_SSBL1_NAME},${STM32MP_SSBL1_SIZE},Binary,1' if '${STM32MP_SSBL1_NAME}' else ''} \ + " +PARTITIONS_BOOTLOADER_CONFIG[spinand-2-128] ?= "\ + ${@ '${STM32MP_FSBL1_DATA},${STM32MP_FSBL1_NAME},${STM32MP_FSBL1_SIZE_UBOOT},Binary,2' if '${STM32MP_FSBL1_NAME}' else ''} \ + ${@ '${STM32MP_SSBL1_DATA},${STM32MP_SSBL1_NAME},${STM32MP_SSBL1_SIZE},Binary,1' if '${STM32MP_SSBL1_NAME}' else ''} \ + ${@ '${STM32MP_SSBL2_DATA},${STM32MP_SSBL2_NAME},${STM32MP_SSBL2_SIZE},Binary,1' if '${STM32MP_SSBL2_NAME}' else ''} \ + " + +# Optee Partitions configuration +PARTITIONS_OPTEE_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', 'emmc', '', d)}" +PARTITIONS_OPTEE_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', 'nand-4-256', '', d)}" +PARTITIONS_OPTEE_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard', 'nor-sdcard', '', d)}" +PARTITIONS_OPTEE_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'sdcard', 'sdcard', '', d)}" +PARTITIONS_OPTEE_CONFIG += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'spinand-2-128', 'spinand-2-128', '', d)}" + +# ,,,, +PARTITIONS_OPTEE_CONFIG[emmc] ?= "\ + ${@ '${STM32MP_TEEH_DATA},${STM32MP_TEEH_NAME},${STM32MP_TEEH_SIZE},Binary,1' if '${STM32MP_TEEH_NAME}' else ''} \ + ${@ '${STM32MP_TEED_DATA},${STM32MP_TEED_NAME},${STM32MP_TEED_SIZE},Binary,1' if '${STM32MP_TEED_NAME}' else ''} \ + ${@ '${STM32MP_TEEX_DATA},${STM32MP_TEEX_NAME},${STM32MP_TEEX_SIZE},Binary,1' if '${STM32MP_TEEX_NAME}' else ''} \ + " +PARTITIONS_OPTEE_CONFIG[nand-4-256] ?= "\ + ${@ '${STM32MP_TEEH_DATA},${STM32MP_TEEH_NAME},${STM32MP_TEEH_SIZE_UBOOT},Binary,1' if '${STM32MP_TEEH_NAME}' else ''} \ + ${@ '${STM32MP_TEED_DATA},${STM32MP_TEED_NAME},${STM32MP_TEED_SIZE},Binary,1' if '${STM32MP_TEED_NAME}' else ''} \ + ${@ '${STM32MP_TEEX_DATA},${STM32MP_TEEX_NAME},${STM32MP_TEEX_SIZE_UBOOT},Binary,1' if '${STM32MP_TEEX_NAME}' else ''} \ + " +PARTITIONS_OPTEE_CONFIG[nor-sdcard] ?= "\ + ${@ '${STM32MP_TEEH_DATA},${STM32MP_TEEH_NAME},${STM32MP_TEEH_SIZE},Binary,1' if '${STM32MP_TEEH_NAME}' else ''} \ + ${@ '${STM32MP_TEED_DATA},${STM32MP_TEED_NAME},${STM32MP_TEED_SIZE},Binary,1' if '${STM32MP_TEED_NAME}' else ''} \ + ${@ '${STM32MP_TEEX_DATA},${STM32MP_TEEX_NAME},${STM32MP_TEEX_SIZE},Binary,1' if '${STM32MP_TEEX_NAME}' else ''} \ + " +PARTITIONS_OPTEE_CONFIG[sdcard] ?= "\ + ${@ '${STM32MP_TEEH_DATA},${STM32MP_TEEH_NAME},${STM32MP_TEEH_SIZE},Binary,1' if '${STM32MP_TEEH_NAME}' else ''} \ + ${@ '${STM32MP_TEED_DATA},${STM32MP_TEED_NAME},${STM32MP_TEED_SIZE},Binary,1' if '${STM32MP_TEED_NAME}' else ''} \ + ${@ '${STM32MP_TEEX_DATA},${STM32MP_TEEX_NAME},${STM32MP_TEEX_SIZE},Binary,1' if '${STM32MP_TEEX_NAME}' else ''} \ + " +PARTITIONS_OPTEE_CONFIG[spinand-2-128] ?= "\ + ${@ '${STM32MP_TEEH_DATA},${STM32MP_TEEH_NAME},${STM32MP_TEEH_SIZE_UBOOT},Binary,1' if '${STM32MP_TEEH_NAME}' else ''} \ + ${@ '${STM32MP_TEED_DATA},${STM32MP_TEED_NAME},${STM32MP_TEED_SIZE},Binary,1' if '${STM32MP_TEED_NAME}' else ''} \ + ${@ '${STM32MP_TEEX_DATA},${STM32MP_TEEX_NAME},${STM32MP_TEEX_SIZE_UBOOT},Binary,1' if '${STM32MP_TEEX_NAME}' else ''} \ + " + # ========================================================================= # Image # ========================================================================= @@ -230,6 +342,11 @@ ST_TOOLS_FOR_SDK_append = " \ nativesdk-svd-tools \ " +# Fip tool +ST_TOOLS_FOR_SDK_append = " \ + ${@bb.utils.contains('MACHINE_FEATURES', 'fip', 'nativesdk-${FIPTOOL_WRAPPER}', '', d)} \ + " + # Make sure to append mkimage to SDK for kernel uImage build ST_DEPENDENCIES_BUILD_FOR_SDK = " \ ${@bb.utils.contains('KERNEL_IMAGETYPE', 'uImage', 'nativesdk-u-boot-mkimage', '', d)} \ @@ -262,16 +379,12 @@ TOOLCHAIN_TARGET_TASK_remove_pn-buildtools-tarball = " bash-dev libgomp-dev" # ========================================================================= # Kernel # ========================================================================= -# Select kernel version -PREFERRED_PROVIDER_virtual/kernel = "linux-stm32mp" - # Kernel image type KERNEL_IMAGETYPE = "${@bb.utils.contains('MACHINE_FEATURES', 'fit', 'fitImage', 'uImage', d)}" KERNEL_ALT_IMAGETYPE = " Image " KERNEL_ALT_IMAGETYPE =+ " vmlinux " KERNEL_ALT_IMAGETYPE =+ " ${@bb.utils.contains('MACHINE_FEATURES', 'fit', 'uImage', 'zImage', d)} " - # Maxsize authorized for uncompressed kernel binary # Define to null to skip kernel image size check KERNEL_IMAGE_MAXSIZE ?= "" @@ -300,22 +413,47 @@ LINUX_A7_EXAMPLES_DT ?= "" EXTRA_IMAGEDEPENDS += "virtual/bootloader" # Define default U-Boot config -UBOOT_CONFIG += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'trusted', 'trusted', '', d)}" -UBOOT_CONFIG += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'optee', '', d)}" +UBOOT_CONFIG += "${@bb.utils.contains_any('BOOTSCHEME_LABELS', 'optee trusted', 'trusted', '', d)}" # The 'basic' config is only available for stm32mp1 machines UBOOT_CONFIG_append_stm32mp1common = " basic " +# Select u-boot binary that needs specific devicetree suffix (from UBOOT_DEVICETREE) +# For legacy mode keep the 'u-boot.stm32' but for FIP feature we need both +# 'u-boot-nodtb.bin' and 'u-boot.dtb' : prefer 'u-boot.dtb' binary as 'u-boot-nodtb.bin' +# doesn't need any devicetree suffix (specific case for 'u-boot-nodtb' binary +# implemented on u-boot-stm32mp recipe) +BINARY_NAME = "${@bb.utils.contains('MACHINE_FEATURES', 'fip', 'u-boot.dtb', 'u-boot.stm32', d)}" # Define u-boot defconfig and binary to use for each UBOOT_CONFIG UBOOT_CONFIG[basic] = "stm32mp15_basic_defconfig,,u-boot.img" -UBOOT_CONFIG[trusted] = "stm32mp15_trusted_defconfig,,u-boot.stm32" -UBOOT_CONFIG[optee] = "stm32mp15_trusted_defconfig,,u-boot.stm32" +UBOOT_CONFIG[trusted] = "stm32mp15_trusted_defconfig,,${BINARY_NAME}" # List of U-Boot device tree to use UBOOT_DEVICETREE = "${STM32MP_DEVICETREE}" -# Define u-boot splashscreen file naming +# Define U-boot splashscreen file naming UBOOT_SPLASH_IMAGE = "splash" +# Enable MTDPART check for UBOOT_CONFIG +UBOOT_MTDPART_CHECK_ENABLE ?= "${@bb.utils.contains_any('BOOTSCHEME_LABELS', 'optee trusted', d.getVarFlag('UBOOT_CONFIG', 'trusted').split(',')[0], '', d)}" +# Set U-Boot MTD partition configurations +UBOOT_MTDPART_NAND_BOOT ?= "${@','.join(['%sk(%s)' % (align_size(d, 'NAND', l.split(',')[2], l.split(',')[4]), l.split(',')[1]) for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'nand-4-256').split()])}" +UBOOT_MTDPART_NAND_TEE ?= "${@','.join(['%sk(%s)' % (align_size(d, 'NAND', l.split(',')[2], l.split(',')[4]), l.split(',')[1]) for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'nand-4-256').split()])}" +UBOOT_MTDPART_NOR_BOOT ?= "${@','.join(['%sk(%s)' % (align_size(d, 'NOR', l.split(',')[2], l.split(',')[4]), l.split(',')[1]) for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'nor-sdcard').split()])}" +UBOOT_MTDPART_NOR_TEE ?= "${@','.join(['%sk(%s)' % (align_size(d, 'NOR', l.split(',')[2], l.split(',')[4]), l.split(',')[1]) for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'nor-sdcard').split()])}" +UBOOT_MTDPART_SPINAND_BOOT ?= "${@','.join(['%sk(%s)' % (align_size(d, 'SPINAND', l.split(',')[2], l.split(',')[4]), l.split(',')[1]) for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'spinand-2-128').split()])}" +UBOOT_MTDPART_SPINAND_TEE ?= "${@','.join(['%sk(%s)' % (align_size(d, 'SPINAND', l.split(',')[2], l.split(',')[4]), l.split(',')[1]) for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'spinand-2-128').split()])}" + +UBOOT_MTDPART_4LEGACY += "${@'CONFIG_MTDPARTS_NAND0_TEE=${UBOOT_MTDPART_NAND_TEE}' if bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', True, False, d) and bb.utils.contains('BOOTSCHEME_LABELS', 'optee', True, False, d) else ''}" +UBOOT_MTDPART_4LEGACY += "${@'CONFIG_MTDPARTS_NOR0_TEE=${UBOOT_MTDPART_NOR_TEE}' if bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard', True, False, d) and bb.utils.contains('BOOTSCHEME_LABELS', 'optee', True, False, d) else ''}" +UBOOT_MTDPART_4LEGACY += "${@'CONFIG_MTDPARTS_SPINAND0_TEE=${UBOOT_MTDPART_SPINAND_TEE}' if bb.utils.contains('BOOTDEVICE_LABELS', 'spinand-2-128', True, False, d) and bb.utils.contains('BOOTSCHEME_LABELS', 'optee', True, False, d) else ''}" + +UBOOT_MTDPART_CHECK ?= "\ + ${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', 'CONFIG_MTDPARTS_NAND0_BOOT=${UBOOT_MTDPART_NAND_BOOT}', '', d)} \ + ${@bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard', 'CONFIG_MTDPARTS_NOR0_BOOT=${UBOOT_MTDPART_NOR_BOOT}', '', d)} \ + ${@bb.utils.contains('BOOTDEVICE_LABELS', 'spinand-2-128', 'CONFIG_MTDPARTS_SPINAND0_BOOT=${UBOOT_MTDPART_SPINAND_BOOT}', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'fip', '', '${UBOOT_MTDPART_4LEGACY}', d)} \ + " + PREFERRED_PROVIDER_u-boot-fw-utils_stm32mp1common = "libubootenv" MACHINE_EXTRA_RRECOMMENDS_append_stm32mp1common = " \ @@ -325,23 +463,34 @@ MACHINE_EXTRA_RRECOMMENDS_append_stm32mp1common = " \ # ========================================================================= # trusted-firmware-a # ========================================================================= -# Add trusted-firmware-a serialboot to allow images programming -EXTRA_IMAGEDEPENDS += "virtual/trusted-firmware-a-serialboot" # Add optionnaly trusted-firmware-a EXTRA_IMAGEDEPENDS += "${@bb.utils.contains_any('BOOTSCHEME_LABELS', 'optee trusted', 'virtual/trusted-firmware-a', '', d)}" -# Define SECURE_PAYLOAD config to set for each TF_A_CONFIG -TF_A_CONFIG_serialboot = "AARCH32_SP=sp_min" -TF_A_CONFIG_optee = "AARCH32_SP=optee" -TF_A_CONFIG_trusted = "AARCH32_SP=sp_min" +# Configure trusted-firmware-a build +TF_A_CONFIG += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'optee', '', d)}" +TF_A_CONFIG += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'trusted', 'trusted', '', d)}" +# Manage specific config settings +TF_A_CONFIG_4LEGACY += "serialboot" +TF_A_CONFIG_4FIP += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', 'emmc', '', d)}" +TF_A_CONFIG_4FIP += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', 'nand', '', d)}" +TF_A_CONFIG_4FIP += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard', 'nor', '', d)}" +TF_A_CONFIG_4FIP += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'sdcard', 'sdcard', '', d)}" +TF_A_CONFIG_4FIP += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'spinand-2-128', 'spinand', '', d)}" +TF_A_CONFIG_4FIP += "uart" +TF_A_CONFIG_4FIP += "usb" +TF_A_CONFIG += "${@bb.utils.contains('MACHINE_FEATURES', 'fip', '${TF_A_CONFIG_4FIP}', '${TF_A_CONFIG_4LEGACY}', d)}" -# Manage proper update for TF_A_CONFIG_* var -tfaconfig_env[vardeps] += "${@bb.utils.contains('TF_A_CONFIG', 'serialboot', 'TF_A_CONFIG_serialboot', '', d)}" -tfaconfig_env[vardeps] += "${@bb.utils.contains('TF_A_CONFIG', 'optee', 'TF_A_CONFIG_optee', '', d)}" -tfaconfig_env[vardeps] += "${@bb.utils.contains('TF_A_CONFIG', 'trusted', 'TF_A_CONFIG_trusted', '', d)}" +# Append SSP config to TF_A_CONFIG +TF_A_SSP_ENABLE ?= "0" +TF_A_CONFIG += "${@bb.utils.contains('TF_A_SSP_ENABLE', '1', 'uart-ssp usb-ssp', '', d)}" -# List of TF-A device tree to use -TF_A_DEVICETREE = "${STM32MP_DEVICETREE}" +# Default configuration for signing trusted-firmware-a binary +TF_A_SIGN_ENABLE ?= "0" + +# Configure the default MTD_START_OFFSET +TF_A_MTD_START_OFFSET_NAND ?= "0x00200000" +TF_A_MTD_START_OFFSET_NOR ?= "0x00080000" +TF_A_MTD_START_OFFSET_SPINAND ?= "0x00200000" # ========================================================================= # optee @@ -349,6 +498,27 @@ TF_A_DEVICETREE = "${STM32MP_DEVICETREE}" # Map OPTEE configuration to device tree list OPTEE_CONF = "${STM32MP_DEVICETREE}" +# ========================================================================= +# fip +# ========================================================================= +# Configure fip build +FIP_CONFIG += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'optee', '', d)}" +FIP_CONFIG += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'trusted', 'trusted', '', d)}" + +# Define config for each FIP_CONFIG +FIP_CONFIG[optee] ?= "optee" +FIP_CONFIG[trusted] ?= "tfa" + +# List of device tree to use for fip binary creation +FIP_DEVICETREE ?= "${STM32MP_DEVICETREE}" + +# Define fiptool wrapper name +FIPTOOL_WRAPPER ?= "fiptool-stm32mp" + +# Manage specific config to sign FIP +FIP_SIGN_ENABLE ?= "${@bb.utils.contains('TF_A_SIGN_ENABLE', '1', '1', '', d)}" +FIP_SIGN_SUFFIX ?= "${@bb.utils.contains('FIP_SIGN_ENABLE', '1', '_Signed', '', d)}" + # ========================================================================= # Xserver # ========================================================================= diff --git a/conf/machine/include/st-machine-flashlayout-deleteall-stm32mp.inc b/conf/machine/include/st-machine-flashlayout-deleteall-stm32mp.inc index 2cf7459..0935108 100644 --- a/conf/machine/include/st-machine-flashlayout-deleteall-stm32mp.inc +++ b/conf/machine/include/st-machine-flashlayout-deleteall-stm32mp.inc @@ -20,36 +20,29 @@ FLASHLAYOUT_TYPE_LABELS_deleteall_eval = "${STM32MP_DT_FILES_ED} ${STM32MP_DT_F # NB: We re-use as much as possible partitions already defined in file # 'st-machine-flashlayout-stm32mp.inc' # ----------------------------------------------------------------------------- -FLASHLAYOUT_PARTITION_LABELS_deleteall = "fsbl1-boot ssbl-boot fsbl1 fsbl2 emmcall nandall norall sdcardall" +FLASHLAYOUT_PARTITION_LABELS_deleteall = "${FLASHLAYOUT_PROGRAMMER_SECTIONS} emmcboot0 emmcboot1 emmcall nandall norall sdcardall spinandall" # ----------------------------------------------------------------------------- # Partition configuration for each partition label -FLASHLAYOUT_PARTITION_ENABLE_deleteall = "PED" -FLASHLAYOUT_PARTITION_ENABLE_deleteall_fsbl1-boot = "-" -FLASHLAYOUT_PARTITION_ENABLE_deleteall_ssbl-boot = "-" - -FLASHLAYOUT_PARTITION_ID_emmcall = "0x30" -FLASHLAYOUT_PARTITION_ID_nandall = "0x40" -FLASHLAYOUT_PARTITION_ID_norall = "0x50" -FLASHLAYOUT_PARTITION_ID_sdcardall = "0x60" +FLASHLAYOUT_PARTITION_ENABLE_deleteall = "PED" +FLASHLAYOUT_PARTITION_ENABLE_deleteall_${STM32MP_FSBL1_NAME}-boot = "-" +FLASHLAYOUT_PARTITION_ENABLE_deleteall_${STM32MP_SSBL1_NAME}-boot = "-" FLASHLAYOUT_PARTITION_TYPE_emmcall = "RawImage" FLASHLAYOUT_PARTITION_TYPE_nandall = "RawImage" FLASHLAYOUT_PARTITION_TYPE_norall = "RawImage" FLASHLAYOUT_PARTITION_TYPE_sdcardall = "RawImage" +FLASHLAYOUT_PARTITION_TYPE_spinandall = "RawImage" -FLASHLAYOUT_PARTITION_DEVICE_deleteall = "none:fsbl1-boot ssbl-boot,${DEVICE_EMMC}:fsbl1 fsbl2 emmcall,${DEVICE_NAND}:nandall,${DEVICE_NOR}:norall,${DEVICE_SDCARD}:sdcardall" +FLASHLAYOUT_PARTITION_DEVICE_deleteall = "none:${FLASHLAYOUT_PROGRAMMER_SECTIONS},${DEVICE_EMMC}:emmcboot0 emmcboot1 emmcall,${DEVICE_NAND}:nandall,${DEVICE_NOR}:norall,${DEVICE_SDCARD}:sdcardall,${DEVICE_SPINAND}:spinandall" FLASHLAYOUT_PARTITION_OFFSET_deleteall = "0x0" -FLASHLAYOUT_PARTITION_OFFSET_deleteall_fsbl1 = "${DEVICE_START_OFFSET_BOOT0_EMMC}" -FLASHLAYOUT_PARTITION_OFFSET_deleteall_fsbl2 = "${DEVICE_START_OFFSET_BOOT1_EMMC}" - -FLASHLAYOUT_PARTITION_BIN2LOAD_deleteall_fsbl1 = "none" -FLASHLAYOUT_PARTITION_BIN2LOAD_deleteall_fsbl2 = "none" +FLASHLAYOUT_PARTITION_OFFSET_deleteall_emmcboot0 = "${DEVICE_START_OFFSET_BOOT0_EMMC}" +FLASHLAYOUT_PARTITION_OFFSET_deleteall_emmcboot1 = "${DEVICE_START_OFFSET_BOOT1_EMMC}" # ----------------------------------------------------------------------------- # The 'deleteall' bootscheme is a trick to generate flashlayout files to clean -# all memory devices on board. There are no specific 'deleteall' bootloader -# binaries so use the proper one ('serialboot', 'optee' or 'trusted'). -FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_fsbl1-boot_append = " deleteall;serialboot" -FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_ssbl-boot_append = " deleteall;trusted" +# all memory devices on board. There are no specific 'deleteall' bootloaders +# so we need to manage specific override for FLASHLAYOUT_PROGRAMMER_SECTIONS binaries +BOOTSCHEME_REPLACE = "${@'optee' if bb.utils.contains('BOOTSCHEME_LABELS', 'optee', True, False, d) and not bb.utils.contains('BOOTSCHEME_LABELS', 'trusted', True, False, d) else 'trusted'}" +FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_${STM32MP_SSBL1_NAME}-boot_append = " deleteall;${BOOTSCHEME_REPLACE}" diff --git a/conf/machine/include/st-machine-flashlayout-extensible-stm32mp.inc b/conf/machine/include/st-machine-flashlayout-extensible-stm32mp.inc index 0cf857a..cd5336b 100644 --- a/conf/machine/include/st-machine-flashlayout-extensible-stm32mp.inc +++ b/conf/machine/include/st-machine-flashlayout-extensible-stm32mp.inc @@ -13,16 +13,18 @@ FLASHLAYOUT_CONFIG_LABELS_extensible = "${@bb.utils.contains('BOOTDEVICE_LABELS' # ----------------------------------------------------------------------------- # Define label types # ----------------------------------------------------------------------------- -FLASHLAYOUT_TYPE_LABELS_extensible = "${STM32MP_DT_FILES_DK}" +FLASHLAYOUT_TYPE_LABELS_extensible = "${@d.getVar('STM32MP_DT_FILES_DK') or 'none'}" # ----------------------------------------------------------------------------- # Define partitions to use -# -# NB: To manage bootloader partitions, simplification is done by directly -# re-using 'fsbl1-boot' and 'ssbl-boot' partitions already defined in file -# 'st-machine-flashlayout-stm32mp.inc' +# NOTE: extensible scheme is ONLY compatible with sdcard and trusted bootscheme +# So we only set partition labels for this particular configuration # ----------------------------------------------------------------------------- -FLASHLAYOUT_PARTITION_LABELS_extensible = "fsbl1-boot ssbl-boot fsbl1 fsbl2 ssbl ${FLASHLAYOUT_PARTITION_IMAGES}" +FLASHLAYOUT_PARTITION_LABELS_extensible = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'sdcard').split()])} \ + ${FLASHLAYOUT_PARTITION_IMAGES} \ + " FLASHLAYOUT_PARTITION_LABELS_extensible_remove = "userfs" # ----------------------------------------------------------------------------- @@ -33,6 +35,3 @@ FLASHLAYOUT_PARTITION_LABELS_extensible_remove = "userfs" # Make sure to use 'trusted' bootscheme for binary naming instead of 'extensible' # each time it is required FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_extensible_prepend = "extensible;trusted " -# Additionnal replacement is expected for specific fsbl1 bootloader binary, as -# we should use the 'serialboot' one instead of the 'trusted' one -FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_extensible_fsbl1-boot_append = " trusted;serialboot" diff --git a/conf/machine/include/st-machine-flashlayout-stm32mp.inc b/conf/machine/include/st-machine-flashlayout-stm32mp.inc index 3023506..edf9810 100644 --- a/conf/machine/include/st-machine-flashlayout-stm32mp.inc +++ b/conf/machine/include/st-machine-flashlayout-stm32mp.inc @@ -4,7 +4,6 @@ inherit flashlayout-stm32mp # Add specific dependencies to get all binaries generated before flashlayout files FLASHLAYOUT_DEPEND_TASKS += "${@bb.utils.contains('EXTRA_IMAGEDEPENDS', 'virtual/trusted-firmware-a', 'virtual/trusted-firmware-a:do_deploy', '', d)}" -FLASHLAYOUT_DEPEND_TASKS += "${@bb.utils.contains('EXTRA_IMAGEDEPENDS', 'virtual/trusted-firmware-a-serialboot', 'virtual/trusted-firmware-a-serialboot:do_deploy', '', d)}" FLASHLAYOUT_DEPEND_TASKS += "${@bb.utils.contains('EXTRA_IMAGEDEPENDS', 'virtual/bootloader', 'virtual/bootloader:do_deploy', '', d)}" FLASHLAYOUT_DEPEND_TASKS += "${@bb.utils.contains('EXTRA_IMAGEDEPENDS', 'virtual/optee-os', 'virtual/optee-os:do_deploy', '', d)}" @@ -34,7 +33,7 @@ FLASHLAYOUT_DEPEND_TASKS += "${@bb.utils.contains('EXTRA_IMAGEDEPENDS', 'virtual # - FLASHLAYOUT_PARTITION_ENABLE # - FLASHLAYOUT_PARTITION_ID # - Item from FLASHLAYOUT_PARTITION_LABELS list -# - FLASHLAYOUT_PARTITION_TYPE +# - FLASHLAYOUT_PARTITION_TYPE with optional FLASHLAYOUT_PARTITION_COPY (in case greater than 1) # - FLASHLAYOUT_PARTITION_DEVICE # - FLASHLAYOUT_PARTITION_OFFSET # - FLASHLAYOUT_PARTITION_BIN2LOAD @@ -71,6 +70,7 @@ FLASHLAYOUT_CONFIG_LABELS += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', FLASHLAYOUT_CONFIG_LABELS += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', 'nand-4-256', '', d)}" FLASHLAYOUT_CONFIG_LABELS += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard', 'nor-sdcard', '', d)}" FLASHLAYOUT_CONFIG_LABELS += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'sdcard', 'sdcard', '', d)}" +FLASHLAYOUT_CONFIG_LABELS += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'spinand-2-128', 'spinand-2-128', '', d)}" # Set by default this variable to 0, and set to 1 only when we are using st-example-image-* ST_EXAMPLE_IMAGE ??= "0" @@ -78,10 +78,8 @@ ST_EXAMPLE_IMAGE ??= "0" #FIXME need to manage overall device size to abort flashlayout creation in case of oversizing the storage devices # Remove NAND flashlayout when we are using st-example-image-* as rootfs too big for a NAND device size of 1 GBytes -#FLASHLAYOUT_CONFIG_LABELS_remove = "${@bb.utils.contains('ST_EXAMPLE_IMAGE', '1', 'emmc', '', d)}" FLASHLAYOUT_CONFIG_LABELS_remove = "${@bb.utils.contains('ST_EXAMPLE_IMAGE', '1', 'nand-4-256', '', d)}" -#FLASHLAYOUT_CONFIG_LABELS_remove = "${@bb.utils.contains('ST_EXAMPLE_IMAGE', '1', 'nor-sdcard', '', d)}" -#FLASHLAYOUT_CONFIG_LABELS_remove = "${@bb.utils.contains('ST_EXAMPLE_IMAGE', '1', 'sdcard', '', d)}" +FLASHLAYOUT_CONFIG_LABELS_remove = "${@bb.utils.contains('ST_EXAMPLE_IMAGE', '1', 'spinand-2-128', '', d)}" # ----------------------------------------------------------------------------- # Define label types for each config @@ -114,12 +112,6 @@ FLASHLAYOUT_TYPE_LABELS_sdcard = "${STM32MP_DT_FILES_DK} ${STM32MP_DT_FILES_ED} # ----------------------------------------------------------------------------- # Define partitions to consider for flashlayout file generation # ----------------------------------------------------------------------------- -# NOTE: There are few restrictions to follow: -# - The partition for the first boot loader should follow the naming -# rule: fsbl* -# - The partition for the secondary boot loader should follow the naming -# rule: ssbl -# ----------------------------------------------------------------------------- # Priority var assignment (where are the usual override mechanism): # 1) FLASHLAYOUT_PARTITION_LABELS___ # 2) FLASHLAYOUT_PARTITION_LABELS__ @@ -130,24 +122,69 @@ FLASHLAYOUT_TYPE_LABELS_sdcard = "${STM32MP_DT_FILES_DK} ${STM32MP_DT_FILES_ED} # 7) FLASHLAYOUT_PARTITION_LABELS_ # 8) FLASHLAYOUT_PARTITION_LABELS # ----------------------------------------------------------------------------- +FLASHLAYOUT_PROGRAMMER_SECTIONS ?= "${STM32MP_FSBL1_NAME}-boot ${STM32MP_SSBL1_NAME}-boot" # FLASHLAYOUT_PARTITION_IMAGES is initalized through PARTITIONS_CONFIG within 'flashlayout-stm32mp' class FLASHLAYOUT_PARTITION_IMAGES ?= "" -# FLASHLAYOUT_BOOT_SEQUENCE is used to define the partition used at boot stage -FLASHLAYOUT_BOOT_SEQUENCE_TRUSTED ?= "fsbl1-boot ssbl-boot fsbl1 fsbl2 ssbl" -FLASHLAYOUT_BOOT_SEQUENCE_OPTEE ?= "fsbl1-boot ssbl-boot fsbl1 fsbl2 ssbl" -FLASHLAYOUT_BOOT_SEQUENCE_NAND_TRUSTED ?= "fsbl1-boot ssbl-boot fsbl1 ssbl ssbl2" -FLASHLAYOUT_BOOT_SEQUENCE_NAND_OPTEE ?= "fsbl1-boot ssbl-boot fsbl1 ssbl ssbl2" -FLASHLAYOUT_PARTITION_LABELS_optee_emmc = "${FLASHLAYOUT_BOOT_SEQUENCE_OPTEE} teeh teed teex ${FLASHLAYOUT_PARTITION_IMAGES}" -FLASHLAYOUT_PARTITION_LABELS_optee_nand-4-256 = "${FLASHLAYOUT_BOOT_SEQUENCE_NAND_OPTEE} teeh teed teex ubifs" -FLASHLAYOUT_PARTITION_LABELS_optee_nor-sdcard = "${FLASHLAYOUT_BOOT_SEQUENCE_OPTEE} env teeh teed teex empty ${FLASHLAYOUT_PARTITION_IMAGES}" -FLASHLAYOUT_PARTITION_LABELS_optee_sdcard = "${FLASHLAYOUT_BOOT_SEQUENCE_OPTEE} teeh teed teex ${FLASHLAYOUT_PARTITION_IMAGES}" +FLASHLAYOUT_PARTITION_LABELS_optee_emmc = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'emmc').split()])} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'fip', '', ' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'emmc').split()]), d)} \ + ${FLASHLAYOUT_PARTITION_IMAGES} \ + " +FLASHLAYOUT_PARTITION_LABELS_optee_nand-4-256 = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'nand-4-256').split()])} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'fip', '', ' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'nand-4-256').split()]), d)} \ + ubifs \ + " +FLASHLAYOUT_PARTITION_LABELS_optee_nor-sdcard = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'nor-sdcard').split()])} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'fip', '', ' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'nor-sdcard').split()]), d)} \ + empty \ + ${FLASHLAYOUT_PARTITION_IMAGES}\ + " +FLASHLAYOUT_PARTITION_LABELS_optee_sdcard = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'sdcard').split()])} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'fip', '', ' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'sdcard').split()]), d)} \ + ${FLASHLAYOUT_PARTITION_IMAGES} \ + " +FLASHLAYOUT_PARTITION_LABELS_optee_spinand-2-128 = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'spinand-2-128').split()])} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'fip', '', ' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_OPTEE_CONFIG', 'spinand-2-128').split()]), d)} \ + ubifs\ + " -FLASHLAYOUT_PARTITION_LABELS_trusted_emmc = "${FLASHLAYOUT_BOOT_SEQUENCE_TRUSTED} ${FLASHLAYOUT_PARTITION_IMAGES}" -FLASHLAYOUT_PARTITION_LABELS_trusted_nand-4-256 = "${FLASHLAYOUT_BOOT_SEQUENCE_NAND_TRUSTED} ubifs" -FLASHLAYOUT_PARTITION_LABELS_trusted_nor-sdcard = "${FLASHLAYOUT_BOOT_SEQUENCE_TRUSTED} env empty ${FLASHLAYOUT_PARTITION_IMAGES}" -FLASHLAYOUT_PARTITION_LABELS_trusted_sdcard = "${FLASHLAYOUT_BOOT_SEQUENCE_TRUSTED} ${FLASHLAYOUT_PARTITION_IMAGES}" +FLASHLAYOUT_PARTITION_LABELS_trusted_emmc = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'emmc').split()])} \ + ${FLASHLAYOUT_PARTITION_IMAGES} \ + " +FLASHLAYOUT_PARTITION_LABELS_trusted_nand-4-256 = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'nand-4-256').split()])} \ + ubifs \ + " +FLASHLAYOUT_PARTITION_LABELS_trusted_nor-sdcard = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'nor-sdcard').split()])} \ + empty \ + ${FLASHLAYOUT_PARTITION_IMAGES} \ + " +FLASHLAYOUT_PARTITION_LABELS_trusted_sdcard = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'sdcard').split()])} \ + ${FLASHLAYOUT_PARTITION_IMAGES} \ + " +FLASHLAYOUT_PARTITION_LABELS_trusted_spinand-2-128 = "\ + ${FLASHLAYOUT_PROGRAMMER_SECTIONS} \ + ${@' '.join(['%s' % l.split(',')[1] for l in d.getVarFlag('PARTITIONS_BOOTLOADER_CONFIG', 'spinand-2-128').split()])} \ + ubifs \ + " # ----------------------------------------------------------------------------- # Partition properties configuration @@ -164,112 +201,68 @@ FLASHLAYOUT_PARTITION_LABELS_trusted_sdcard = "${FLASHLAYOUT_BOOT_SEQUENCE_T # 8) FLASHLAYOUT_PARTITION_xxx # 9) Default 'FLASHLAYOUT_PARTITION_xxx' to 'none' when not defined # ----------------------------------------------------------------------------- -FLASHLAYOUT_PARTITION_ENABLE = "P" -FLASHLAYOUT_PARTITION_ENABLE_fsbl1-boot = "-" -FLASHLAYOUT_PARTITION_ENABLE_ssbl-boot = "-" +FLASHLAYOUT_PARTITION_ENABLE = "P" +FLASHLAYOUT_PARTITION_ENABLE_${STM32MP_FSBL1_NAME}-boot = "-" +FLASHLAYOUT_PARTITION_ENABLE_${STM32MP_SSBL1_NAME}-boot = "-" FLASHLAYOUT_PARTITION_ENABLE_empty = "PE" -FLASHLAYOUT_PARTITION_ENABLE_env = "PED" -# Due to association of u-boot and env, the ssbl partition need to be deleted -FLASHLAYOUT_PARTITION_ENABLE_sdcard_ssbl = "PD" -FLASHLAYOUT_PARTITION_ENABLE_emmc_ssbl = "PD" -# Due to potential swith between trused and optee, need to be delete teeh partitions -FLASHLAYOUT_PARTITION_ENABLE_sdcard_teeh = "PD" -FLASHLAYOUT_PARTITION_ENABLE_emmc_teeh = "PD" +FLASHLAYOUT_PARTITION_ENABLE_nor-sdcard_${STM32MP_UENV_NAME} = "PDE" +# Need to make sure to delete partition that contains U-Boot env before update (gpt partitions only) +FLASHLAYOUT_PARTITION_ENABLE_sdcard_${STM32MP_SSBL1_NAME} = "PD" +FLASHLAYOUT_PARTITION_ENABLE_emmc_${STM32MP_SSBL1_NAME} = "PD" # ----------------------------------------------------------------------------- # Partition ID # ----------------------------------------------------------------------------- -# The STM32CubeProgrammer supported ID range is: -# 0x00 to 0xFF -# Some IDs are reserved for internal usage on STM32CubeProgrammer and special -# management is implemented for binary with STM32 header. This means that for -# flashlayout files, available ID range is only: -# 0x01 to 0x0F for Boot partitions with STM32 header -# 0x10 to 0xF0 for User partitions programmed without header -# Note also that for FSBL and SSBL binaries loaded in RAM to program the devices -# there are two reserved IDs +# For FSBL and SSBL binaries loaded in RAM to program the devices there are two +# reserved IDs on STM32CubeProgrammer side: # 0x01 for FSBL # 0x03 for SSBL -FLASHLAYOUT_PARTITION_ID_fsbl1-boot = "0x01" -FLASHLAYOUT_PARTITION_ID_ssbl-boot = "0x03" -FLASHLAYOUT_PARTITION_ID_fsbl1 = "0x04" -FLASHLAYOUT_PARTITION_ID_fsbl2 = "0x05" -FLASHLAYOUT_PARTITION_ID_ssbl = "0x06" -FLASHLAYOUT_PARTITION_ID_ssbl2 = "0x07" -FLASHLAYOUT_PARTITION_ID_teeh = "0x0A" -FLASHLAYOUT_PARTITION_ID_teed = "0x0B" -FLASHLAYOUT_PARTITION_ID_teex = "0x0C" -FLASHLAYOUT_PARTITION_ID_empty = "0x10" -FLASHLAYOUT_PARTITION_ID_env = "0x20" -FLASHLAYOUT_PARTITION_ID_ubifs = "0x21" +FLASHLAYOUT_PARTITION_ID_${STM32MP_FSBL1_NAME}-boot = "0x01" +FLASHLAYOUT_PARTITION_ID_${STM32MP_SSBL1_NAME}-boot = "0x03" -FLASHLAYOUT_PARTITION_TYPE = "Binary" -FLASHLAYOUT_PARTITION_TYPE_nand-4-256_fsbl1 = "Binary(2)" -FLASHLAYOUT_PARTITION_TYPE_ubifs = "System" +FLASHLAYOUT_PARTITION_TYPE = "Binary" +FLASHLAYOUT_PARTITION_TYPE_ubifs = "System" -FLASHLAYOUT_PARTITION_DEVICE_emmc = "none:fsbl1-boot ssbl-boot,${DEVICE_EMMC}:default" -FLASHLAYOUT_PARTITION_DEVICE_nand-4-256 = "none:fsbl1-boot ssbl-boot,${DEVICE_NAND}:default" -FLASHLAYOUT_PARTITION_DEVICE_nor-sdcard = "none:fsbl1-boot ssbl-boot,${DEVICE_NOR}:default,${DEVICE_SDCARD}:${FLASHLAYOUT_PARTITION_IMAGES}" -FLASHLAYOUT_PARTITION_DEVICE_sdcard = "none:fsbl1-boot ssbl-boot,${DEVICE_SDCARD}:default" +FLASHLAYOUT_PARTITION_COPY = "1" -FLASHLAYOUT_PARTITION_OFFSET_fsbl1-boot = "0x0" -FLASHLAYOUT_PARTITION_OFFSET_ssbl-boot = "0x0" -FLASHLAYOUT_PARTITION_OFFSET_emmc_fsbl1 = "${DEVICE_START_OFFSET_BOOT0_EMMC}" -FLASHLAYOUT_PARTITION_OFFSET_emmc_fsbl2 = "${DEVICE_START_OFFSET_BOOT1_EMMC}" -FLASHLAYOUT_PARTITION_OFFSET_emmc_ssbl = "${DEVICE_START_OFFSET_EMMC}" +FLASHLAYOUT_PARTITION_DEVICE_emmc = "none:${FLASHLAYOUT_PROGRAMMER_SECTIONS},${DEVICE_EMMC}:default" +FLASHLAYOUT_PARTITION_DEVICE_nand-4-256 = "none:${FLASHLAYOUT_PROGRAMMER_SECTIONS},${DEVICE_NAND}:default" +FLASHLAYOUT_PARTITION_DEVICE_nor-sdcard = "none:${FLASHLAYOUT_PROGRAMMER_SECTIONS},${DEVICE_NOR}:default,${DEVICE_SDCARD}:${FLASHLAYOUT_PARTITION_IMAGES}" +FLASHLAYOUT_PARTITION_DEVICE_sdcard = "none:${FLASHLAYOUT_PROGRAMMER_SECTIONS},${DEVICE_SDCARD}:default" +FLASHLAYOUT_PARTITION_DEVICE_spinand-2-128 = "none:${FLASHLAYOUT_PROGRAMMER_SECTIONS},${DEVICE_SPINAND}:default" + +FLASHLAYOUT_PARTITION_OFFSET_${STM32MP_FSBL1_NAME}-boot = "0x0" +FLASHLAYOUT_PARTITION_OFFSET_${STM32MP_SSBL1_NAME}-boot = "0x0" +FLASHLAYOUT_PARTITION_OFFSET_emmc_${STM32MP_FSBL1_NAME} = "${DEVICE_START_OFFSET_BOOT0_EMMC}" +FLASHLAYOUT_PARTITION_OFFSET_emmc_${STM32MP_FSBL2_NAME} = "${DEVICE_START_OFFSET_BOOT1_EMMC}" +FLASHLAYOUT_PARTITION_OFFSET_emmc_${STM32MP_SSBL1_NAME} = "${DEVICE_START_OFFSET_EMMC}" # Size defined in Kbytes -FLASHLAYOUT_PARTITION_SIZE_fsbl1 = "256" -FLASHLAYOUT_PARTITION_SIZE_fsbl2 = "256" -FLASHLAYOUT_PARTITION_SIZE_ssbl = "2048" -FLASHLAYOUT_PARTITION_SIZE_ssbl2 = "2048" -FLASHLAYOUT_PARTITION_SIZE_env = "512" -FLASHLAYOUT_PARTITION_SIZE_teeh = "256" -FLASHLAYOUT_PARTITION_SIZE_teed = "512" -FLASHLAYOUT_PARTITION_SIZE_teex = "256" -FLASHLAYOUT_PARTITION_SIZE_empty = "0" -# Specific override for MTD partitions hard coded on U-Boot side -FLASHLAYOUT_PARTITION_SIZE_nand-4-256_fsbl1 = "2048" -FLASHLAYOUT_PARTITION_SIZE_nand-4-256_ssbl = "2048" -FLASHLAYOUT_PARTITION_SIZE_nand-4-256_ssbl2 = "2048" -FLASHLAYOUT_PARTITION_SIZE_nand-4-256_teeh = "512" -FLASHLAYOUT_PARTITION_SIZE_nand-4-256_teed = "512" -FLASHLAYOUT_PARTITION_SIZE_nand-4-256_teex = "512" -FLASHLAYOUT_PARTITION_SIZE_nor-sdcard_fsbl1 = "256" -FLASHLAYOUT_PARTITION_SIZE_nor-sdcard_fsbl2 = "256" -FLASHLAYOUT_PARTITION_SIZE_nor-sdcard_ssbl = "2048" -FLASHLAYOUT_PARTITION_SIZE_nor-sdcard_env = "512" -FLASHLAYOUT_PARTITION_SIZE_nor-sdcard_teeh = "256" -FLASHLAYOUT_PARTITION_SIZE_nor-sdcard_teed = "512" -FLASHLAYOUT_PARTITION_SIZE_nor-sdcard_teex = "256" +FLASHLAYOUT_PARTITION_SIZE_empty = "0" # Set binaries to use for each partition -FLASHLAYOUT_PARTITION_BIN2LOAD_fsbl1-boot = "arm-trusted-firmware/tf-a.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_ssbl-boot = "bootloader/u-boot.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_fsbl1 = "arm-trusted-firmware/tf-a.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_fsbl2 = "arm-trusted-firmware/tf-a.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_ssbl = "bootloader/u-boot.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_ssbl2 = "bootloader/u-boot.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_teeh = "optee/tee-header_v2.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_teed = "optee/tee-pageable_v2.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_teex = "optee/tee-pager_v2.stm32" -FLASHLAYOUT_PARTITION_BIN2LOAD_ubifs = "${IMAGE_LINK_NAME}_nand_4_256_multivolume.ubi" +# ----------------------------------------------------------------------------- +# Use following pattern in binary name to expand to specific label config: +# '' (to insert label from FLASHLAYOUT_CONFIG_LABELS - NB: substitution for all '-' in label by '_') +# '' (to insert label from FLASHLAYOUT_BOOTSCHEME_LABELS) +# '' (to insert label from FLASHLAYOUT_PARTITION_DEVICE) +# '' (to insert label from FLASHLAYOUT_TYPE_LABELS) +# These patterns are processed to expand binary name for each config. +# ----------------------------------------------------------------------------- +FLASHLAYOUT_PARTITION_BIN2LOAD_${STM32MP_FSBL1_NAME}-boot = "${@bb.utils.contains('MACHINE_FEATURES', 'fip', 'arm-trusted-firmware/tf-a--usb.stm32', 'arm-trusted-firmware/tf-a--serialboot.stm32', d)}" +FLASHLAYOUT_PARTITION_BIN2LOAD_${STM32MP_SSBL1_NAME}-boot = "${STM32MP_SSBL1_DATA}" +FLASHLAYOUT_PARTITION_BIN2LOAD_ubifs = "${IMAGE_LINK_NAME}__multivolume.ubi" # ----------------------------------------------------------------------------- # Use the 'FLASHLAYOUT_PARTITION_REPLACE_PATTERNS' var to allow dynamic binary -# renaming for the bootloader binaries. This is only required for fsbl1-boot and -# ssbl-boot partitions that provides the binary to flash the device. +# renaming for the bootloader binaries. This is only required for all FLASHLAYOUT_PROGRAMMER_SECTIONS +# partitions that provides the binary to flash the device. # The format to follow is: # '; ;' -# And the pattern to replace in binary name is only searched as: -# '-$' -# or -# '--' +# And the pattern to replace in binary name is searched as: +# '[-_]([-_.]|$)' # ----------------------------------------------------------------------------- -# We use specific tf-a serialboot mode for any bootscheme for fsbl1-boot -FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_fsbl1-boot_append = " optee;serialboot trusted;serialboot" - # The daughter board does not support Programmer mode, so use eval one -# (valid for both fsbl1-boot and ssbl-boot) -FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_fsbl1-boot_append = " ed1;ev1" -FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_ssbl-boot_append = " ed1;ev1" +# (valid for FLASHLAYOUT_PROGRAMMER_SECTIONS partitions) +FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_${STM32MP_FSBL1_NAME}-boot_append = " ed1;ev1" +FLASHLAYOUT_PARTITION_REPLACE_PATTERNS_${STM32MP_SSBL1_NAME}-boot_append = " ed1;ev1" diff --git a/conf/machine/include/st-machine-providers-stm32mp.inc b/conf/machine/include/st-machine-providers-stm32mp.inc index 4d9a7d6..26fcdab 100644 --- a/conf/machine/include/st-machine-providers-stm32mp.inc +++ b/conf/machine/include/st-machine-providers-stm32mp.inc @@ -13,11 +13,6 @@ PREFERRED_PROVIDER_u-boot = "u-boot-stm32mp" # trusted-firmware-a # ========================================================================= PREFERRED_PROVIDER_virtual/trusted-firmware-a = "tf-a-stm32mp" -PREFERRED_PROVIDER_virtual/trusted-firmware-a-serialboot = "tf-a-stm32mp-serialboot" -# Define default TF-A config -TF_A_CONFIG_append_pn-tf-a-stm32mp-serialboot = " serialboot " -TF_A_CONFIG_append_pn-tf-a-stm32mp = " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'trusted', 'trusted', '', d)} " -TF_A_CONFIG_append_pn-tf-a-stm32mp = " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'optee', '', d)} " # ========================================================================= # optee-os diff --git a/conf/machine/include/st-machine-storage-device-stm32mp.inc b/conf/machine/include/st-machine-storage-device-stm32mp.inc index e4391c4..cb7879a 100644 --- a/conf/machine/include/st-machine-storage-device-stm32mp.inc +++ b/conf/machine/include/st-machine-storage-device-stm32mp.inc @@ -3,7 +3,7 @@ # ----------------------------------------------------------------------------- # Define device storage name and type mapping # ----------------------------------------------------------------------------- -DEVICE_STORAGE ?= "EMMC:mmc1, NAND:nand0, NOR:nor0, SDCARD:mmc0" +DEVICE_STORAGE ?= "EMMC:mmc1, NAND:nand0, NOR:nor0, SDCARD:mmc0, SPINAND:spi-nand0" # ----------------------------------------------------------------------------- # Define device storage name alias @@ -12,6 +12,7 @@ DEVICE_STORAGE_NAMES += "EMMC" DEVICE_STORAGE_NAMES += "NAND" DEVICE_STORAGE_NAMES += "NOR" DEVICE_STORAGE_NAMES += "SDCARD" +DEVICE_STORAGE_NAMES += "SPINAND" # ----------------------------------------------------------------------------- # Define device storage type @@ -21,6 +22,7 @@ DEVICE_STORAGE_TYPES += "mmc1" DEVICE_STORAGE_TYPES += "mmc2" DEVICE_STORAGE_TYPES += "nand0" DEVICE_STORAGE_TYPES += "nor0" +DEVICE_STORAGE_TYPES += "spi-nand0" python () { """ @@ -60,9 +62,11 @@ python () { # ----------------------------------------------------------------------------- # EMMC # Extra space is required to store 'Protective MBR' and 'Primary GPT Header' -# Currently the required size is 17kBytes (i.e. 0x4400) +# Currently the required size is 17 KiB (i.e. 0x4400) # We need to align this size to get the first offset to use DEVICE_START_OFFSET_EMMC ?= "0x00080000" +# 32 Gbit +DEVICE_MAX_OFFSET_EMMC ?= "0x100000000" DEVICE_ALIGNMENT_SIZE_EMMC ?= "0x00080000" # Specific to EMMC, there are two boot partitions using specific offset to access @@ -79,35 +83,51 @@ DEVICE_BOARD_ENABLE_EMMC += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'emmc', ' # ----------------------------------------------------------------------------- # NAND DEVICE_START_OFFSET_NAND ?= "0x00000000" +# 8 Gbit +DEVICE_MAX_OFFSET_NAND ?= "0x40000000" DEVICE_ALIGNMENT_SIZE_NAND ?= "0x00040000" -# Configure the list of boards that enable EMMC +# Configure the list of boards that enable NAND DEVICE_BOARD_ENABLE_NAND += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', '${STM32MP_DT_FILES_ED}', '', d)}" DEVICE_BOARD_ENABLE_NAND += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nand-4-256', '${STM32MP_DT_FILES_EV}', '', d)}" # ----------------------------------------------------------------------------- # NOR DEVICE_START_OFFSET_NOR ?= "0x00000000" +# 512 Mbit, only 1 NOR is used +DEVICE_MAX_OFFSET_NOR ?= "0x04000000" DEVICE_ALIGNMENT_SIZE_NOR ?= "0x00010000" -# Configure the list of boards that enable EMMC +# Configure the list of boards that enable NOR DEVICE_BOARD_ENABLE_NOR += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'nor-sdcard' , '${STM32MP_DT_FILES_EV}', '', d)}" # ----------------------------------------------------------------------------- # SDCARD # Extra space is required to store 'Protective MBR' and 'Primary GPT Header' -# Currently the required size is 17kBytes (i.e. 0x4400) +# Currently the required size is 17 KiB (i.e. 0x4400) # We need to align this size to get the first offset to use DEVICE_START_OFFSET_SDCARD ?= "0x00004400" +# No limit for SDCARD +DEVICE_MAX_OFFSET_SDCARD ?= "none" DEVICE_ALIGNMENT_SIZE_SDCARD ?= "0x00000200" # Configure the rootfs partition uid used in gpt partition table for SDCARD DEVICE_PARTUUID_ROOTFS_SDCARD ?= "${@d.getVar(d.expand('DEVICE_PARTUUID_ROOTFS_${DEVICE_SDCARD}')) or ''}" # Configure the list of boards that enable SDCARD -DEVICE_BOARD_ENABLE_SDCARD += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'sdcard', '${STM32MP_DT_FILES_DK}', '', d)}" -DEVICE_BOARD_ENABLE_SDCARD += "${@bb.utils.contains_any('BOOTDEVICE_LABELS', [ 'sdcard', 'nor-sdcard' ], '${STM32MP_DT_FILES_ED}', '', d)}" -DEVICE_BOARD_ENABLE_SDCARD += "${@bb.utils.contains_any('BOOTDEVICE_LABELS', [ 'sdcard', 'nor-sdcard' ], '${STM32MP_DT_FILES_EV}', '', d)}" +DEVICE_BOARD_ENABLE_SDCARD += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'sdcard', '${STM32MP_DT_FILES_DK}', '', d)}" +DEVICE_BOARD_ENABLE_SDCARD += "${@bb.utils.contains_any('BOOTDEVICE_LABELS', [ 'sdcard', 'nor-sdcard' ], '${STM32MP_DT_FILES_ED}', '', d)}" +DEVICE_BOARD_ENABLE_SDCARD += "${@bb.utils.contains_any('BOOTDEVICE_LABELS', [ 'sdcard', 'nor-sdcard' ], '${STM32MP_DT_FILES_EV}', '', d)}" + +# ----------------------------------------------------------------------------- +# SPI NAND +DEVICE_START_OFFSET_SPINAND ?= "0x00000000" +# 2 Gbit +DEVICE_MAX_OFFSET_SPINAND ?= "0x10000000" +DEVICE_ALIGNMENT_SIZE_SPINAND ?= "0x00020000" + +# Configure the list of boards that enable SPINAND +DEVICE_BOARD_ENABLE_SPINAND += "${@bb.utils.contains('BOOTDEVICE_LABELS', 'spinand-2-128', '', '', d)}" # ----------------------------------------------------------------------------- # Fixed configuration from U-Boot source code diff --git a/conf/machine/stm32mp1-disco.conf b/conf/machine/stm32mp1-disco.conf index bfb17d3..aba817f 100644 --- a/conf/machine/stm32mp1-disco.conf +++ b/conf/machine/stm32mp1-disco.conf @@ -55,6 +55,7 @@ BLUETOOTH_LIST += "linux-firmware-bluetooth-bcm4343" # Wifi WIFI_LIST += "linux-firmware-bcm43430" +MACHINE_FEATURES += " ${@bb.utils.contains_any('BOOTDEVICE_LABELS', ['emmc', 'sdcard'], 'autoresize', '', d)} " # ========================================================================= # Kernel # ========================================================================= @@ -92,7 +93,6 @@ WIC_CREATE_EXTRA_ARGS = "--no-fstab-update" WKS_FILE_DEPENDS ?= " \ virtual/bootloader \ virtual/trusted-firmware-a \ - virtual/trusted-firmware-a-serialboot \ ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'virtual/optee-os', '', d)} \ st-image-bootfs \ ${@bb.utils.contains('ST_VENDORFS','1','st-image-vendorfs', '', d)} \ diff --git a/conf/machine/stm32mp1-eval.conf b/conf/machine/stm32mp1-eval.conf index 3441c1c..7b2942d 100644 --- a/conf/machine/stm32mp1-eval.conf +++ b/conf/machine/stm32mp1-eval.conf @@ -51,11 +51,14 @@ MACHINE_FEATURES += "${@'gpu' if d.getVar('ACCEPT_EULA_'+d.getVar('MACHINE')) == MACHINE_FEATURES += "m4copro" MACHINE_FEATURES += "fit" +MACHINE_FEATURES_remove = "fip" + # Bluetooth #BLUETOOTH_LIST += "linux-firmware-bluetooth-bcm4343" # Wifi #WIFI_LIST += "linux-firmware-bcm43430" +MACHINE_FEATURES += " ${@bb.utils.contains_any('BOOTDEVICE_LABELS', ['emmc', 'sdcard'], 'autoresize', '', d)} " # ========================================================================= # Kernel # ========================================================================= diff --git a/conf/machine/stm32mp1.conf b/conf/machine/stm32mp1.conf index 2c2fa4b..ae97e95 100644 --- a/conf/machine/stm32mp1.conf +++ b/conf/machine/stm32mp1.conf @@ -9,6 +9,11 @@ include conf/machine/include/st-machine-providers-stm32mp.inc # Define specific familly common machine name MACHINEOVERRIDES .= ":stm32mp1common" +# ========================================================================= +# SOC +# ========================================================================= +STM32MP_SOC_NAME = "stm32mp15" + # ========================================================================= # Chip architecture # ========================================================================= @@ -54,6 +59,8 @@ BLUETOOTH_LIST += "linux-firmware-bluetooth-bcm4343" # Wifi WIFI_LIST += "linux-firmware-bcm43430" +MACHINE_FEATURES += " ${@bb.utils.contains_any('BOOTDEVICE_LABELS', ['emmc', 'sdcard'], 'autoresize', '', d)} " + # ========================================================================= # Kernel # =========================================================================