meta-dcm/recipes-bsp/fip-stm32mp/fip-stm32mp.bbappend

315 lines
20 KiB
Plaintext

COMPATIBLE_MACHINE:append = "|stm32mp157c-dcm"
# Ensure fwconfig directory exists before FIP creation
do_deploy:prepend() {
bbplain "=== FIP DCM PREPARATION ==="
# Get the exact sysroot path that FIP uses
FIP_SYSROOT="${RECIPE_SYSROOT}"
FW_CONFIG_DIR="${FIP_SYSROOT}/arm-trusted-firmware/fwconfig"
bbplain "FIP_SYSROOT: ${FIP_SYSROOT}"
bbplain "FW_CONFIG_DIR: ${FW_CONFIG_DIR}"
# Create the fwconfig directory if it doesn't exist
if [ ! -d "${FW_CONFIG_DIR}" ]; then
bbplain "Creating missing fwconfig directory: ${FW_CONFIG_DIR}"
mkdir -p "${FW_CONFIG_DIR}"
else
bbplain "fwconfig directory already exists"
fi
# Check if fw-config files already exist
if [ ! -f "${FW_CONFIG_DIR}/fw-config.dtb" ]; then
bbplain "Creating fw-config DTB files for FIP..."
# Method 1: Try to copy from TF-A deploy directory
TFA_DEPLOY_DIR="${DEPLOY_DIR_IMAGE}"
if [ -f "${TFA_DEPLOY_DIR}/fw-config.dtb" ]; then
bbplain "Copying fw-config from TF-A deploy directory"
cp "${TFA_DEPLOY_DIR}/fw-config.dtb" "${FW_CONFIG_DIR}/"
else
bbplain "TF-A fw-config not found in deploy, creating minimal version"
# Create minimal binary DTB as fallback
printf '\xd0\x0d\xfe\xed\x00\x00\x00\x38\x00\x00\x00\x28\x00\x00\x00\x28\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00' > "${FW_CONFIG_DIR}/fw-config.dtb"
fi
# Create all the naming variants that found_file() function might look for
if [ -f "${FW_CONFIG_DIR}/fw-config.dtb" ]; then
cd "${FW_CONFIG_DIR}"
# Create all possible naming patterns that the found_file function searches for
cp fw-config.dtb fw_config.dtb
# DTB-STORAGE pattern
cp fw-config.dtb fw-config-stm32mp157c-dcm-sdcard.dtb
cp fw-config.dtb fw_config-stm32mp157c-dcm-sdcard.dtb
# DTB-CONFIG pattern
cp fw-config.dtb fw-config-stm32mp157c-dcm-optee-sdcard.dtb
cp fw-config.dtb fw_config-stm32mp157c-dcm-optee-sdcard.dtb
# DTB-SECONDARY_CONFIG pattern
cp fw-config.dtb fw-config-stm32mp157c-dcm-optee.dtb
cp fw-config.dtb fw_config-stm32mp157c-dcm-optee.dtb
# DTB pattern
cp fw-config.dtb fw-config-stm32mp157c-dcm.dtb
cp fw-config.dtb fw_config-stm32mp157c-dcm.dtb
# STORAGE pattern
cp fw-config.dtb fw-config-sdcard.dtb
cp fw-config.dtb fw_config-sdcard.dtb
# CONFIG pattern
cp fw-config.dtb fw-config-optee-sdcard.dtb
cp fw-config.dtb fw_config-optee-sdcard.dtb
# SECONDARY_CONFIG pattern
cp fw-config.dtb fw-config-optee.dtb
cp fw-config.dtb fw_config-optee.dtb
# SOC-STORAGE pattern
cp fw-config.dtb fw-config-stm32mp15-sdcard.dtb
cp fw-config.dtb fw_config-stm32mp15-sdcard.dtb
# SOC-CONFIG pattern
cp fw-config.dtb fw-config-stm32mp15-optee-sdcard.dtb
cp fw-config.dtb fw_config-stm32mp15-optee-sdcard.dtb
# SOC-SECONDARY_CONFIG pattern
cp fw-config.dtb fw-config-stm32mp15-optee.dtb
cp fw-config.dtb fw_config-stm32mp15-optee.dtb
# SOC pattern
cp fw-config.dtb fw-config-stm32mp15.dtb
cp fw-config.dtb fw_config-stm32mp15.dtb
# Legacy machine-specific patterns
cp fw-config.dtb fw-config-stm32mp157c-dcm.dtb
cp fw-config.dtb stm32mp157c-dcm-fw-config.dtb
cp fw-config.dtb stm32mp157c-dcm-fw-config-optee.dtb
# CRITICAL: Also create the exact file the FIP script is looking for
cp fw-config.dtb stm32mp157c-dcm-fw-config.dtb
cd -
bbplain "Created $(ls -1 ${FW_CONFIG_DIR}/*.dtb | wc -l) fw-config variants"
fi
else
bbplain "fw-config.dtb already exists in fwconfig directory"
fi
# Also ensure OP-TEE files have compatible naming
OPTEE_DIR="${FIP_SYSROOT}/optee"
if [ -d "${OPTEE_DIR}" ]; then
bbplain "Checking OP-TEE file naming compatibility..."
# Look for _v2 files and create compatible versions - FIXED Shell syntax
for file in "${OPTEE_DIR}"/tee-*_v2-*.bin; do
if [ -f "$file" ]; then
filename=$(basename "$file")
# Create standard naming variants (remove _v2 and long suffixes) - POSIX compatible
case "$filename" in
tee-header_v2-*)
standard_name=$(echo "$filename" | sed 's/_v2-stm32mp157c-dcm-stm32mp157c-dcm/-stm32mp157c-dcm-optee-sdcard/')
cp "$file" "${OPTEE_DIR}/$standard_name"
# Also create simpler variants
simple_name=$(echo "$filename" | sed 's/_v2-stm32mp157c-dcm-stm32mp157c-dcm//')
cp "$file" "${OPTEE_DIR}/$simple_name"
bbplain "Created OP-TEE header variants: $standard_name, $simple_name"
;;
tee-pager_v2-*)
standard_name=$(echo "$filename" | sed 's/_v2-stm32mp157c-dcm-stm32mp157c-dcm/-stm32mp157c-dcm-optee-sdcard/')
cp "$file" "${OPTEE_DIR}/$standard_name"
simple_name=$(echo "$filename" | sed 's/_v2-stm32mp157c-dcm-stm32mp157c-dcm//')
cp "$file" "${OPTEE_DIR}/$simple_name"
bbplain "Created OP-TEE pager variants: $standard_name, $simple_name"
;;
tee-pageable_v2-*)
standard_name=$(echo "$filename" | sed 's/_v2-stm32mp157c-dcm-stm32mp157c-dcm/-stm32mp157c-dcm-optee-sdcard/')
cp "$file" "${OPTEE_DIR}/$standard_name"
simple_name=$(echo "$filename" | sed 's/_v2-stm32mp157c-dcm-stm32mp157c-dcm//')
cp "$file" "${OPTEE_DIR}/$simple_name"
bbplain "Created OP-TEE pageable variants: $standard_name, $simple_name"
;;
esac
fi
done
fi
# CRITICAL: Copy fw-config files to ALL possible search paths the FIP script might use
bbplain "=== COPYING FW-CONFIG TO ALL POSSIBLE SEARCH PATHS ==="
if [ -f "${FW_CONFIG_DIR}/fw-config.dtb" ]; then
# Copy to root arm-trusted-firmware directory (where FIP might expect it)
ATF_ROOT="${FIP_SYSROOT}/arm-trusted-firmware"
cp "${FW_CONFIG_DIR}/fw-config.dtb" "${ATF_ROOT}/" 2>/dev/null || true
cp "${FW_CONFIG_DIR}/fw_config-stm32mp157c-dcm-sdcard.dtb" "${ATF_ROOT}/" 2>/dev/null || true
cp "${FW_CONFIG_DIR}/fw_config.dtb" "${ATF_ROOT}/" 2>/dev/null || true
# CRITICAL: Create the EXACT file the FIP script is looking for
cp "${FW_CONFIG_DIR}/fw-config.dtb" "${ATF_ROOT}/stm32mp157c-dcm-fw-config.dtb" 2>/dev/null || true
cp "${FW_CONFIG_DIR}/fw-config.dtb" "${FW_CONFIG_DIR}/stm32mp157c-dcm-fw-config.dtb" 2>/dev/null || true
# Copy all variants to ATF root
for dtb_file in "${FW_CONFIG_DIR}"/*.dtb; do
if [ -f "$dtb_file" ]; then
filename=$(basename "$dtb_file")
cp "$dtb_file" "${ATF_ROOT}/$filename" 2>/dev/null || true
fi
done
# Copy to any other directories that might exist
for search_dir in "${FIP_SYSROOT}/arm-trusted-firmware"/*; do
if [ -d "$search_dir" ]; then
bbplain "Copying fw-config to: $search_dir"
cp "${FW_CONFIG_DIR}/fw-config.dtb" "$search_dir/" 2>/dev/null || true
cp "${FW_CONFIG_DIR}/fw_config-stm32mp157c-dcm-sdcard.dtb" "$search_dir/" 2>/dev/null || true
cp "${FW_CONFIG_DIR}/fw_config.dtb" "$search_dir/" 2>/dev/null || true
fi
done
# Also copy to the sysroot root (just in case)
cp "${FW_CONFIG_DIR}/fw-config.dtb" "${FIP_SYSROOT}/" 2>/dev/null || true
cp "${FW_CONFIG_DIR}/fw_config-stm32mp157c-dcm-sdcard.dtb" "${FIP_SYSROOT}/" 2>/dev/null || true
bbplain "fw-config files copied to all possible search locations"
fi
# CRITICAL: Create enhanced FIP script with runtime patching
bbplain "=== CREATING ENHANCED FIP SCRIPT ==="
FIP_SCRIPT="${RECIPE_SYSROOT_NATIVE}/usr/bin/create_st_fip_binary.sh"
if [ -f "$FIP_SCRIPT" ]; then
bbplain "Found FIP script at: $FIP_SCRIPT"
# Create a backup
cp "$FIP_SCRIPT" "${FIP_SCRIPT}.backup" 2>/dev/null || true
# Create enhanced found_file function in a separate file
echo '#!/bin/bash' > "${WORKDIR}/enhanced_found_file.sh"
echo '' >> "${WORKDIR}/enhanced_found_file.sh"
echo 'function found_file(){' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' local path_search=$1' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' local file_prefix=$2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' local file_extension=$3' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM DEBUG: found_file called ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "path_search: $path_search" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "file_prefix: $file_prefix" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "file_extension: $file_extension" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # DCM: Enhanced search for ANY fw-config related prefix' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' if [[ "$file_prefix" == *"fw-config"* ]] || [[ "$file_prefix" == *"fw_config"* ]]; then' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM: Searching for fw-config variant: $file_prefix ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # Try exact match first' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix.$file_extension" ] && echo "$path_search/$file_prefix.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/../fwconfig/$file_prefix.$file_extension" ] && echo "$path_search/../fwconfig/$file_prefix.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/fwconfig/$file_prefix.$file_extension" ] && echo "$path_search/fwconfig/$file_prefix.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # Try our created fw-config files with generic names' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/fwconfig/fw-config.$file_extension" ] && echo "$path_search/fwconfig/fw-config.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/fwconfig/fw_config.$file_extension" ] && echo "$path_search/fwconfig/fw_config.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/../fwconfig/fw-config.$file_extension" ] && echo "$path_search/../fwconfig/fw-config.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/../fwconfig/fw_config.$file_extension" ] && echo "$path_search/../fwconfig/fw_config.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # Try in arm-trusted-firmware root directory' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/../fw-config.$file_extension" ] && echo "$path_search/../fw-config.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/../fw_config.$file_extension" ] && echo "$path_search/../fw_config.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/../$file_prefix.$file_extension" ] && echo "$path_search/../$file_prefix.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM: fw-config variant not found anywhere ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' fi' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # DCM: Enhanced search for OP-TEE files (_v2 variants)' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' if [[ "$file_prefix" == *"tee-"*"_v2"* ]]; then' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM: Searching for OP-TEE variant: $file_prefix ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # Convert _v2 to non-v2 names' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' base_name=$(echo "$file_prefix" | sed "s/_v2//")' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM: Trying base name: $base_name ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # Try our created OP-TEE files' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$base_name.$file_extension" ] && echo "$path_search/$base_name.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$base_name-stm32mp157c-dcm-optee-sdcard.$file_extension" ] && echo "$path_search/$base_name-stm32mp157c-dcm-optee-sdcard.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$base_name-stm32mp157c-dcm-optee.$file_extension" ] && echo "$path_search/$base_name-stm32mp157c-dcm-optee.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$base_name-stm32mp157c-dcm.$file_extension" ] && echo "$path_search/$base_name-stm32mp157c-dcm.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM: OP-TEE variant not found ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' fi' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # DCM: Enhanced search for U-Boot files' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' if [[ "$file_prefix" == *"u-boot"* ]]; then' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM: Searching for U-Boot variant: $file_prefix ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # Try common U-Boot naming patterns' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-stm32mp15-default.$file_extension" ] && echo "$path_search/$file_prefix-stm32mp15-default.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-stm32mp157c-dcm.$file_extension" ] && echo "$path_search/$file_prefix-stm32mp157c-dcm.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-stm32mp15.$file_extension" ] && echo "$path_search/$file_prefix-stm32mp15.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "=== DCM: U-Boot variant not found ===" >&2' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' fi' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' # Original search strategy' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_DTB-$SEARCH_STORAGE.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_DTB-$SEARCH_STORAGE.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_DTB-$SEARCH_CONFIG.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_DTB-$SEARCH_CONFIG.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_DTB.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_DTB.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_STORAGE.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_STORAGE.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_CONFIG.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_CONFIG.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_SOC_NAME-$SEARCH_STORAGE.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_SOC_NAME-$SEARCH_STORAGE.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_SOC_NAME-$SEARCH_CONFIG.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_SOC_NAME-$SEARCH_CONFIG.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' [ -e "$path_search/$file_prefix-$SEARCH_SOC_NAME.$file_extension" ] && echo "$path_search/$file_prefix-$SEARCH_SOC_NAME.$file_extension" && return' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' ' >> "${WORKDIR}/enhanced_found_file.sh"
echo ' echo "NOTFOUND"' >> "${WORKDIR}/enhanced_found_file.sh"
echo '}' >> "${WORKDIR}/enhanced_found_file.sh"
echo '' >> "${WORKDIR}/enhanced_found_file.sh"
# Create new FIP script that sources our enhanced function first
echo '#!/bin/bash' > "${FIP_SCRIPT}.new"
echo '' >> "${FIP_SCRIPT}.new"
echo '# DCM Enhanced FIP Script' >> "${FIP_SCRIPT}.new"
echo 'echo "=== DCM FIP SCRIPT PATCH ACTIVE ===" >&2' >> "${FIP_SCRIPT}.new"
echo '' >> "${FIP_SCRIPT}.new"
# Add our enhanced found_file function
cat "${WORKDIR}/enhanced_found_file.sh" >> "${FIP_SCRIPT}.new"
# Add the original script content, excluding the original found_file function
awk '
BEGIN { in_function = 0; skip_shebang = 1 }
/^#!/ && skip_shebang { skip_shebang = 0; next }
/^function found_file/ { in_function = 1; next }
in_function && /^}$/ { in_function = 0; next }
!in_function { print }
' "${FIP_SCRIPT}.backup" >> "${FIP_SCRIPT}.new"
# Replace the original script
mv "${FIP_SCRIPT}.new" "$FIP_SCRIPT"
chmod +x "$FIP_SCRIPT"
bbplain "FIP script enhanced successfully"
else
bbwarn "FIP script not found at $FIP_SCRIPT"
fi
# Final verification
if [ -d "${FW_CONFIG_DIR}" ]; then
FILE_COUNT=$(ls -1 "${FW_CONFIG_DIR}"/*.dtb 2>/dev/null | wc -l)
bbplain "✓ FW_conf directory verified: ${FW_CONFIG_DIR} contains ${FILE_COUNT} DTB files"
else
bbfatal "✗ FW_conf directory still missing: ${FW_CONFIG_DIR}"
fi
bbplain "=== FIP DCM PREPARATION COMPLETED ==="
}