image_classes_dynamic: Support arbitrary address size Some of our 64bit platforms now have a flash peripheral that resides outside of the 32bit address space. We now need 9 or more nibbles to express the size. To better support this, we make the address replacement dynamic. The lower 7 nibbles of the address (28 bits) are used for the offset into the flash, while the upper nibbles are used for the address to the peripheral. Tested: Built a 7xx and 8xx platform that use dynamic images and verified manually that their command lines reflect valid flash addresses. Google-Bug-Id: 397986419 Change-Id: Ifc1caa9fdc0ae038cf8ad1d1360b99ce30c8773a Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/classes/image_types_gbmc_dynamic.bbclass b/classes/image_types_gbmc_dynamic.bbclass index e88a377..34ed1c0 100644 --- a/classes/image_types_gbmc_dynamic.bbclass +++ b/classes/image_types_gbmc_dynamic.bbclass
@@ -243,22 +243,18 @@ dtc-native:do_populate_sysroot \ " -# Addresses are always exactly 8 hex characters long, to avoid changing binary -# size when performing the replacement -UIMAGE_FLASH_NUM = "${@"[0-9a-fA-F]"*8}" -UIMAGE_FLASH_NUM:aspeed-g7 = "${@"[0-9a-fA-F]"*9}" -UIMAGE_FLASH_BASE = "invalid" -UIMAGE_FLASH_BASE:npcm7xx = "80000000" -UIMAGE_FLASH_BASE:npcm8xx = "80000000" -UIMAGE_FLASH_BASE:aspeed-g6 = "20000000" -UIMAGE_FLASH_BASE:aspeed-g7 = "100000000" +# Flash addresses are always 7 nibbles long, however the absolute memory address +# may require up to 64 bits (9 additional nibbles). We need to ensure the +# replacement never changes the binary size. +UIMAGE_FLASH_NUM = "${@"[0-9a-fA-F]"*7}" +UIMAGE_FLASH_DYN = "${@"[0-9a-fA-F]\\\\?"*9}" # Bootloaders should use the following variables if they want dynamic replacement # of fitImage location and size. We do not perform any other replacement to # avoid accidentally breaking u-boot. -# - `uimage_flash_addr=XXXXXXXX` The direct mapped address of the image in memory -# - `uimage_flash_offs=XXXXXXXX` The offset of the image in the SPI -# - `uimage_flash_size=XXXXXXXX` The size of the image +# - `uimage_flash_addr=XXXXXXXX[;\0]` The direct mapped address of the image in memory +# - `uimage_flash_offs=XXXXXXXX[;\0]` The offset of the image in the SPI +# - `uimage_flash_size=XXXXXXXX[;\0]` The size of the image do_modify_bootloaders() { bin=${DEPLOY_DIR_IMAGE}/${UBOOT_BINARY}.${MERGED_SUFFIX} if [ ! -e $bin ]; then @@ -268,24 +264,24 @@ # Partitions are 64K aligned, with u-boot then (64K) image descriptor then kernel kern_off=$(expr '(' $msize + 65535 ')' / 65536 '*' 65536 + 65536) # Match the uimage_flash_addr format below the base + kernel offset - addr=$(printf '%08x' $(expr $(printf "%d" 0x${UIMAGE_FLASH_BASE}) + $kern_off)) - off=$(printf '%08x' $kern_off) - size=$(printf '%08x' $(stat -c '%s' $(readlink -f ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}))) + addr=$(printf '%07x' $kern_off) + off=$(printf '%07x' $kern_off) + size=$(printf '%07x' $(stat -c '%s' $(readlink -f ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}))) + set -x replaced= - if grep -q 'uimage_flash_offs=${UIMAGE_FLASH_NUM}' $bin; then - sed -i "s,uimage_flash_offs=${UIMAGE_FLASH_NUM},uimage_flash_offs=$off,g" $bin + if grep -q "uimage_flash_offs=${UIMAGE_FLASH_DYN}${UIMAGE_FLASH_NUM}[;\\x0]" $bin; then + sed -i "s,\\(uimage_flash_offs=${UIMAGE_FLASH_DYN}\\)${UIMAGE_FLASH_NUM}\\([;\\x0\]\),\\1$off\\2,g" $bin replaced=1 fi - if grep -q 'uimage_flash_addr=${UIMAGE_FLASH_NUM}' $bin; then - sed -i "s,uimage_flash_addr=${UIMAGE_FLASH_NUM},uimage_flash_addr=$addr,g" $bin + if grep -q "uimage_flash_addr=${UIMAGE_FLASH_DYN}${UIMAGE_FLASH_NUM}[;\\x0]" $bin; then + sed -i "s,\\(uimage_flash_addr=${UIMAGE_FLASH_DYN}\\)${UIMAGE_FLASH_NUM}\\([;\\x0]\\),\\1$addr\\2,g" $bin replaced=1 fi if [ -z "$replaced" ]; then echo "Don't know how to inject kernel offset into u-boot" >&2 exit 1 fi - echo "Set uimage_flash_addr to $addr" - sed -i "s,uimage_flash_size=${UIMAGE_FLASH_NUM},uimage_flash_size=$size,g" $bin + sed -i "s,\\(uimage_flash_size=${UIMAGE_FLASH_DYN}\\)${UIMAGE_FLASH_NUM};,\\1$size;,g" $bin } MODIFY_BOOTLOADER_DEPENDS = ""