[PATCH 5/5] fwu: DeveloperBox: add support for FWU

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Sep 1 09:22:59 CEST 2022


On 9/1/22 09:07, Heinrich Schuchardt wrote:
> On 7/22/22 19:43, jassisinghbrar at gmail.com wrote:
>> From: Jassi Brar <jaswinder.singh at linaro.org>
>>
>> Add code to support FWU_MULTI_BANK_UPDATE.
>> The platform does not have gpt-partition storage for
>> Banks and MetaData, rather it used SPI-NOR backed
>> mtd regions for the purpose.
>>
>> Signed-off-by: Masami Hiramatsu <masami.hiramatsu at linaro.org>
>> Signed-off-by: Jassi Brar <jaswinder.singh at linaro.org>
>> ---
>>   board/socionext/developerbox/Makefile       |  1 +
>>   board/socionext/developerbox/developerbox.c | 13 +++
>>   board/socionext/developerbox/fwu_plat.c     | 95 ++++++++++++++++++++
>>   configs/synquacer_developerbox_defconfig    | 13 ++-
>>   doc/board/socionext/developerbox.rst        | 96 +++++++++++++++++++++
>>   include/configs/synquacer.h                 | 10 +++
>>   6 files changed, 226 insertions(+), 2 deletions(-)
>>   create mode 100644 board/socionext/developerbox/fwu_plat.c
>>
>> diff --git a/board/socionext/developerbox/Makefile
>> b/board/socionext/developerbox/Makefile
>> index 4a46de995a..9b80ee38e7 100644
>> --- a/board/socionext/developerbox/Makefile
>> +++ b/board/socionext/developerbox/Makefile
>> @@ -7,3 +7,4 @@
>>   #
>>
>>   obj-y    := developerbox.o
>> +obj-$(CONFIG_FWU_MULTI_BANK_UPDATE) += fwu_plat.o
>> diff --git a/board/socionext/developerbox/developerbox.c
>> b/board/socionext/developerbox/developerbox.c
>> index f5a5fe0121..ad2260e3d7 100644
>> --- a/board/socionext/developerbox/developerbox.c
>> +++ b/board/socionext/developerbox/developerbox.c
>> @@ -20,6 +20,13 @@
>>
>>   #if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
>>   struct efi_fw_image fw_images[] = {
>> +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
>> +    {
>> +        .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
>> +        .fw_name = u"DEVELOPERBOX-FIP",
>
> The design is flawed. These fields should be moved to the device-tree.

Currently we are changing C files for each board were we enable firmware
updates. Probably an even better place then the device-tree would be a
Kconfig file. The only problem with Kconfig is that it does not easily
allow to edit arrays. But we could use a string like:

GUID,name,index,GUID,name,index,...

Best regards

Heinrich>
>> +        .image_index = 1,
>> +    },
>> +#else
>>       {
>>           .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
>>           .fw_name = u"DEVELOPERBOX-UBOOT",
>> @@ -35,12 +42,18 @@ struct efi_fw_image fw_images[] = {
>>           .fw_name = u"DEVELOPERBOX-OPTEE",
>>           .image_index = 3,
>>       },
>> +#endif
>>   };
>>
>>   struct efi_capsule_update_info update_info = {
>> +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
>> +    .dfu_string = "mtd nor1=bank0 raw 600000 400000;"
>> +            "bank1 raw a00000 400000;",
>> +#else
>>       .dfu_string = "mtd nor1=u-boot.bin raw 200000 100000;"
>>               "fip.bin raw 180000 78000;"
>>               "optee.bin raw 500000 100000",
>> +#endif
>>       .images = fw_images,
>>   };
>>
>> diff --git a/board/socionext/developerbox/fwu_plat.c
>> b/board/socionext/developerbox/fwu_plat.c
>> new file mode 100644
>> index 0000000000..9fb5cb28b3
>> --- /dev/null
>> +++ b/board/socionext/developerbox/fwu_plat.c
>> @@ -0,0 +1,95 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2021, Linaro Limited
>> + */
>> +
>> +#include <dfu.h>
>> +#include <efi_loader.h>
>> +#include <flash.h>
>> +#include <fwu.h>
>> +#include <fwu_mdata.h>
>> +#include <malloc.h>
>> +#include <memalign.h>
>> +#include <mtd.h>
>> +#include <spi.h>
>> +#include <spi_flash.h>
>> +#include <uuid.h>
>> +
>> +#include <linux/errno.h>
>> +#include <linux/types.h>
>> +#include <u-boot/crc.h>
>> +
>> +#define DFU_ALT_BUF_LEN 256
>> +#define DFU_ALT_NUM_MAX (CONFIG_FWU_NUM_IMAGES_PER_BANK *
>> CONFIG_FWU_NUM_BANKS)
>> +
>> +/* Generate dfu_alt_info from partitions */
>> +void set_dfu_alt_info(char *interface, char *devstr)
>> +{
>> +    int ret;
>> +    struct mtd_info *mtd;
>> +    static char *buf = NULL;
>> +
>> +    if (!buf) {
>> +        buf = malloc_cache_aligned(DFU_ALT_BUF_LEN);
>> +        memset(buf, 0, DFU_ALT_BUF_LEN);
>> +
>> +        mtd_probe_devices();
>> +
>> +        mtd = get_mtd_device_nm("nor1");
>> +        if (IS_ERR_OR_NULL(mtd))
>> +            return;
>> +
>> +        ret = fwu_gen_alt_info_from_mtd(buf, DFU_ALT_BUF_LEN, mtd);
>> +        if (ret < 0) {
>> +            log_err("Error: Failed to generate dfu_alt_info. (%d)\n",
>> ret);
>> +            return;
>> +        }
>> +        log_debug("Make dfu_alt_info: '%s'\n", buf);
>> +    }
>> +    env_set("dfu_alt_info", buf);
>> +}
>> +
>> +int fwu_plat_get_alt_num(struct udevice __always_unused *dev,
>> +             efi_guid_t *image_id, int *alt_num)
>> +{
>> +    return mtd_plat_get_alt_num(image_id, alt_num, "nor1", 0);
>> +}
>> +
>> +int fwu_plat_get_update_index(u32 *update_idx)
>> +{
>> +    int ret;
>> +    u32 active_idx;
>> +
>> +    ret = fwu_get_active_index(&active_idx);
>> +
>> +    if (ret < 0)
>> +        return ret;
>> +
>> +    *update_idx = 1 - active_idx;
>> +
>> +    return ret;
>> +}
>> +
>> +void fwu_plat_get_bootidx(void *boot_idx)
>> +{
>> +    int ret;
>> +    u32 active_idx;
>> +    u32 *bootidx = boot_idx;
>> +
>> +    ret = fwu_get_active_index(&active_idx);
>> +
>> +    if (ret < 0)
>> +        *bootidx = -1;
>> +
>> +    *bootidx = active_idx;
>> +}
>> +
>> +int board_late_init(void)
>> +{
>> +    /* Make mmc available for EFI, otherwise efi subsystem
>> +     * complains "No EFI system partition" during bootup.
>> +     */
>> +    run_command("mmc dev 0", 0);
>> +
>> +    return 0;
>> +}
>> diff --git a/configs/synquacer_developerbox_defconfig
>> b/configs/synquacer_developerbox_defconfig
>> index add6041e27..ded31ada6e 100644
>> --- a/configs/synquacer_developerbox_defconfig
>> +++ b/configs/synquacer_developerbox_defconfig
>> @@ -1,10 +1,11 @@
>>   CONFIG_ARM=y
>>   CONFIG_ARCH_SYNQUACER=y
>> -CONFIG_SYS_TEXT_BASE=0x08200000
>> +CONFIG_POSITION_INDEPENDENT=y
>> +CONFIG_SYS_TEXT_BASE=0
>>   CONFIG_SYS_MALLOC_LEN=0x1000000
>>   CONFIG_SYS_MALLOC_F_LEN=0x400
>>   CONFIG_ENV_SIZE=0x30000
>> -CONFIG_ENV_OFFSET=0x300000
>> +CONFIG_ENV_OFFSET=0x580000
>>   CONFIG_ENV_SECT_SIZE=0x10000
>>   CONFIG_DM_GPIO=y
>>   CONFIG_DEFAULT_DEVICE_TREE="synquacer-sc2a11-developerbox"
>> @@ -93,3 +94,11 @@ CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y
>>   CONFIG_EFI_CAPSULE_ON_DISK=y
>>   CONFIG_EFI_IGNORE_OSINDICATIONS=y
>>   CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
>> +CONFIG_EFI_SECURE_BOOT=y
>> +CONFIG_BOARD_LATE_INIT=y
>> +CONFIG_FWU_MULTI_BANK_UPDATE=y
>> +CONFIG_DM_FWU_MDATA=y
>> +CONFIG_FWU_MDATA_MTD=y
>> +CONFIG_FWU_NUM_BANKS=2
>> +CONFIG_FWU_NUM_IMAGES_PER_BANK=1
>> +CONFIG_CMD_FWU_METADATA=y
>> diff --git a/doc/board/socionext/developerbox.rst
>> b/doc/board/socionext/developerbox.rst
>> index 2d943c23be..f52820c2b0 100644
>> --- a/doc/board/socionext/developerbox.rst
>> +++ b/doc/board/socionext/developerbox.rst
>> @@ -85,3 +85,99 @@ Once the flasher tool is running we are ready flash
>> the UEFI image::
>>
>>   After transferring the SPI_NOR_UBOOT.fd, turn off the DSW2-7 and
>> reset the board.
>>
>> +
>> +Enable FWU Multi Bank Update
>> +============================
>> +
>> +DeveloperBox supports the FWU Multi Bank Update. You *MUST* update
>> both *SCP firmware* and *TF-A* for this feature. This will change the
>> layout and the boot process but you can switch back to the normal one
>> by changing the DSW 1-4 off.
>> +
>> +Configure U-Boot
>> +----------------
>> +
>> +To enable the FWU Multi Bank Update on the DeveloperBox, you need to
>> add following configurations to
>> configs/synquacer_developerbox_defconfig ::
>> +
>> + CONFIG_FWU_MULTI_BANK_UPDATE=y
>> + CONFIG_DM_FWU_MDATA=y
>> + CONFIG_FWU_MDATA_MTD=y
>> + CONFIG_FWU_NUM_BANKS=2
>> + CONFIG_FWU_NUM_IMAGES_PER_BANK=1
>> + CONFIG_CMD_FWU_METADATA=y
>> +
>> +And build it::
>> +
>> +  cd u-boot/
>> +  export ARCH=arm64
>> +  export CROSS_COMPILE=aarch64-linux-gnu-
>> +  make synqucer_developerbox_defconfig
>> +  make -j `noproc`
>> +  cd ../
>> +
>> +By default, the CONFIG_FWU_NUM_BANKS and
>> COFNIG_FWU_NUM_IMAGES_PER_BANKS are set to 2 and 1 respectively. This
>> uses FIP (Firmware Image Package) type image which contains TF-A,
>> U-Boot and OP-TEE (the OP-TEE is optional.)
>> +You can use fiptool to compose the FIP image from those firmware images.
>> +
>> +Rebuild SCP firmware
>> +--------------------
>> +
>> +Rebuild SCP firmware which supports FWU Multi Bank Update as below::
>> +
>> +  cd SCP-firmware/
>> +  OUT=./build/product/synquacer
>> +  ROMFW_FILE=$OUT/scp_romfw/$SCP_BUILD_MODE/bin/scp_romfw.bin
>> +  RAMFW_FILE=$OUT/scp_ramfw/$SCP_BUILD_MODE/bin/scp_ramfw.bin
>> +  ROMRAMFW_FILE=scp_romramfw_release.bin
>> +
>> +  make CC=$ARM_EMB_GCC PRODUCT=synquacer MODE=release
>> +  tr "\000" "\377" < /dev/zero | dd of=${ROMRAMFW_FILE} bs=1
>> count=196608
>> +  dd if=${ROMFW_FILE} of=${ROMRAMFW_FILE} bs=1 conv=notrunc seek=0
>> +  dd if=${RAMFW_FILE} of=${ROMRAMFW_FILE} bs=1 seek=65536
>> +  cd ../
>> +
>> +And you can get the `scp_romramfw_release.bin` file
>> +
>> +Rebuild TF-A and FIP
>> +--------------------
>> +
>> +Rebuild TF-A which supports FWU Multi Bank Update as below::
>> +
>> +  cd arm-trusted-firmware/
>> +  make CROSS_COMPILE=aarch64-linux-gnu- -j`nproc` PLAT=synquacer \
>> +     SPD=opteed SQ_RESET_TO_BL2=1 GENERATE_COT=1
>> MBEDTLS_DIR=../mbedtls \
>> +     BL33=../u-boot/u-boot.bin all fip fiptool
>> +
>> +And make a FIP image.::
>> +
>> +  cp build/synquacer/release/fip.bin SPI_NOR_NEWFIP.fd
>> +  tools/fiptool/fiptool update --tb-fw
>> build/synquacer/release/bl2.bin SPI_NOR_NEWFIP.fd
>> +
>> +
>> +UUIDs for the FWU Multi Bank Update
>> +-----------------------------------
>> +
>> +FWU multi-bank update requires some UUIDs. The DeveloperBox platform
>> uses following UUIDs.
>> +
>> + - Location UUID for the FIP image: 17e86d77-41f9-4fd7-87ec-a55df9842de5
>> + - Image type UUID for the FIP image:
>> 10c36d7d-ca52-b843-b7b9-f9d6c501d108
>> + - Image UUID for Bank0 : 5a66a702-99fd-4fef-a392-c26e261a2828
>> + - Image UUID for Bank1 : a8f868a1-6e5c-4757-878d-ce63375ef2c0
>> +
>> +These UUIDs are used for making a FWU metadata image.
>> +
>> +Install via flash writer
>> +------------------------
>> +
>> +As explained in above section, the new FIP image and the FWU metadata
>> image can be installed via NOR flash writer. Note that the
>> installation offsets for the FWU multi bank update supported firmware.
>> +
>> +Once the flasher tool is running we are ready flash the images.::
>> +Write the FIP image to the 0x600000 offset.::
>> +
>> +  flash rawwrite 600000 180000
>> +  >> Send SPI_NOR_NEWFIP.fd via XMODEM (Control-A S in minicom) <<
>> +
>> +And write the new SCP firmware.::
>> +
>> +  flash write cm3
>> +  >> Send scp_romramfw_release.bin via XMODEM (Control-A S in
>> minicom) <<
>> +
>> +At last, turn on the DSW 3-4 on the board, and reboot.
>> +Note that if DSW 3-4 is turned off, the DeveloperBox will boot from
>> +the original EDK2 firmware (or non-FWU U-Boot if you already installed.)
>> diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
>> index 5686a5b910..7995be852d 100644
>> --- a/include/configs/synquacer.h
>> +++ b/include/configs/synquacer.h
>> @@ -46,19 +46,29 @@
>>
>>   /* Since U-Boot 64bit PCIe support is limited, disable 64bit MMIO
>> support */
>>
>> +#ifdef CONFIG_FWU_MULTI_BANK_UPDATE
>> +#define DEFAULT_DFU_ALT_INFO
>> +#else
>>   #define DEFAULT_DFU_ALT_INFO "dfu_alt_info="                \
>>               "mtd nor1=u-boot.bin raw 200000 100000;"    \
>>               "fip.bin raw 180000 78000;"            \
>>               "optee.bin raw 500000 100000\0"
>> +#endif
>>
>>   /* GUIDs for capsule updatable firmware images */
>>   #define DEVELOPERBOX_UBOOT_IMAGE_GUID \
>>       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
>>            0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
>>
>> +#ifdef CONFIG_FWU_MULTI_BANK_UPDATE
>> +#define DEVELOPERBOX_FIP_IMAGE_GUID \
>> +    EFI_GUID(0x7d6dc310, 0x52ca, 0x43b8, 0xb7, 0xb9, \
>> +         0xf9, 0xd6, 0xc5, 0x01, 0xd1, 0x08)
>> +#else
>>   #define DEVELOPERBOX_FIP_IMAGE_GUID \
>>       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
>>            0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
>> +#endif
>>
>>   #define DEVELOPERBOX_OPTEE_IMAGE_GUID \
>>       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
>



More information about the U-Boot mailing list