diff options
author | Jose Marinho <jose.marinho@arm.com> | 2021-07-14 15:37:54 +0100 |
---|---|---|
committer | Jose Marinho <jose.marinho@arm.com> | 2021-07-14 15:37:54 +0100 |
commit | ba79c7a89d5b30a6108ca91dba8c7bd24deae1c2 (patch) | |
tree | ec78de07e8a72369bebf629b7063fd895498d0df | |
parent | 6e0d5790c15e4b08d761b597fff58fd1f9259e5b (diff) |
add FWU functionality to imx8mm plat
-rw-r--r-- | bl2/bl2_main.c | 8 | ||||
-rw-r--r-- | drivers/fwu/fwu.c | 10 | ||||
-rw-r--r-- | plat/imx/imx8m/imx8mm/imx8mm_io_storage.c | 92 | ||||
-rw-r--r-- | plat/imx/imx8m/imx8mm/platform.mk | 10 |
4 files changed, 90 insertions, 30 deletions
diff --git a/bl2/bl2_main.c b/bl2/bl2_main.c index 34b49f70f..f87d2d4e2 100644 --- a/bl2/bl2_main.c +++ b/bl2/bl2_main.c @@ -89,15 +89,15 @@ void bl2_main(void) printf("bl2 running\n"); +#if PSA_FWU_SUPPORT + fwu_init(); +#endif /* PSA_FWU_SUPPORT */ + bool imx8mm_set_recovery(void); do { /* Perform remaining generic architectural setup in S-EL1 */ bl2_arch_setup(); -#if PSA_FWU_SUPPORT - fwu_init(); -#endif /* PSA_FWU_SUPPORT */ - #if TRUSTED_BOARD_BOOT /* Initialize authentication module */ auth_mod_init(); diff --git a/drivers/fwu/fwu.c b/drivers/fwu/fwu.c index 316cad955..852edddc2 100644 --- a/drivers/fwu/fwu.c +++ b/drivers/fwu/fwu.c @@ -37,6 +37,13 @@ static int fwu_metadata_crc_check(void) { unsigned char *data = (unsigned char *)&metadata; + printf("---------Metadata dump TF-A------------\n"); + + for (int i=0; i<sizeof(struct fwu_metadata); i++) + printf("%x ", ((uint8_t *)&metadata)[i]); + //XXX: disable crc check for now as there's a mismatch with the + //edk2 implementation + return 0; uint32_t calc_crc = tf_crc32(0U, data + sizeof(metadata.crc_32), (sizeof(metadata) - sizeof(metadata.crc_32))); @@ -175,6 +182,8 @@ bool fwu_is_trial_run_state(void) ******************************************************************************/ void fwu_init(void) { + printf("------------fwu init ----------------\n"); + /* Load FWU metadata which will be used to load the images in the * active bank as per PSA FWU specification */ int result = fwu_metadata_load(FWU_METADATA_IMAGE_ID); @@ -189,6 +198,7 @@ void fwu_init(void) panic(); } } + printf("Metadta read correctly\n"); plat_fwu_set_images_source(&metadata); diff --git a/plat/imx/imx8m/imx8mm/imx8mm_io_storage.c b/plat/imx/imx8m/imx8mm/imx8mm_io_storage.c index 013c6812e..24da0f3c3 100644 --- a/plat/imx/imx8m/imx8mm/imx8mm_io_storage.c +++ b/plat/imx/imx8m/imx8mm/imx8mm_io_storage.c @@ -6,6 +6,7 @@ #include <assert.h> +#include <drivers/fwu/fwu_metadata.h> #include <drivers/io/io_block.h> #include <drivers/io/io_driver.h> #include <drivers/io/io_fip.h> @@ -39,11 +40,21 @@ __unused static const io_block_spec_t mmc_fip_spec = { .length = IMX8MM_FIP_SIZE }; -__unused static const io_block_spec_t spinor_fip_spec = { +__unused static io_block_spec_t spinor_fip_spec_metadata = { .offset = 0x8000000, .length = IMX8MM_FIP_SIZE }; +__unused static const io_block_spec_t spinor_fip_spec_A = { + .offset = 0x8000000, + .length = IMX8MM_FIP_SIZE +}; + +__unused static const io_block_spec_t spinor_fip_spec_B = { + .offset = 0x8300000, + .length = IMX8MM_FIP_SIZE +}; + __unused static const io_block_dev_spec_t mmc_dev_spec = { /* It's used as temp buffer in block driver. */ .buffer = { @@ -143,27 +154,26 @@ struct plat_io_policy { }; - +#define RESCUE 0 static struct plat_io_policy policies[] = { #ifndef IMX8MM_FIP_MMAP [FIP_IMAGE_ID] = { -#if 1 +#if RESCUE==1 &mmc_dev_handle, (uintptr_t)&mmc_fip_spec, open_mmc #else &spinor_dev_handle, - (uintptr_t)&spinor_fip_spec, + (uintptr_t)&spinor_fip_spec_A, open_memmap_spi #endif }, -#else - [FIP_IMAGE_ID] = { - &memmap_dev_handle, - (uintptr_t)&fip_block_spec, - open_memmap - }, #endif + [FWU_METADATA_IMAGE_ID] = { + &spinor_dev_handle, + (uintptr_t)&spinor_fip_spec_metadata, + open_memmap_spi + }, [BL31_IMAGE_ID] = { &fip_dev_handle, (uintptr_t)&bl31_uuid_spec, @@ -233,6 +243,52 @@ static struct plat_io_policy policies[] = { #endif /* TRUSTED_BOARD_BOOT */ }; +int plat_fwu_set_metadata_image_source(unsigned int image_id, + uintptr_t *handle, + uintptr_t *image_spec) +{ + int result = -1; + struct plat_io_policy *policy; + + assert((image_id == FWU_METADATA_IMAGE_ID) || + (image_id == BKUP_FWU_METADATA_IMAGE_ID)); + + policy = &policies[FWU_METADATA_IMAGE_ID]; + + if (image_id == FWU_METADATA_IMAGE_ID) + spinor_fip_spec_metadata.offset = 0x8600000; + else + spinor_fip_spec_metadata.offset = 0x8601000; + + *image_spec = (uintptr_t)&spinor_fip_spec_metadata; + *handle = *policy->dev_handle; + + result = 0; + + return result; +} + +/* + * Select FIP A or FIP B depending on the active_index value in the metadata. + * TODO: Obtain the offset to set in the image spec based on the GPT information. + */ +void plat_fwu_set_images_source(struct fwu_metadata *metadata) +{ +#if RESCUE==0 + uint32_t active_idx; + + active_idx = metadata->active_index; + + if (active_idx) { + INFO("FIP A selected\n"); + policies[FIP_IMAGE_ID].image_spec = (uintptr_t)&spinor_fip_spec_A; + } else { + INFO("FIP B selected\n"); + policies[FIP_IMAGE_ID].image_spec = (uintptr_t)&spinor_fip_spec_B; + } +#endif +} + void plat_error_handler(int err) { return; @@ -302,22 +358,6 @@ __unused static int open_mmc(const uintptr_t spec) } return result; } -#else -static int open_memmap(const uintptr_t spec) -{ - int result; - uintptr_t local_image_handle; - printf("imx8mm open_memmap\n"); - result = io_dev_init(memmap_dev_handle, (uintptr_t)NULL); - if (result == 0) { - result = io_open(memmap_dev_handle, spec, &local_image_handle); - if (result == 0) { - VERBOSE("Using Memmap\n"); - io_close(local_image_handle); - } - } - return result; -} #endif __unused static int open_memmap_spi(const uintptr_t spec) diff --git a/plat/imx/imx8m/imx8mm/platform.mk b/plat/imx/imx8m/imx8mm/platform.mk index 29155e703..d5bef2ca6 100644 --- a/plat/imx/imx8m/imx8mm/platform.mk +++ b/plat/imx/imx8m/imx8mm/platform.mk @@ -45,7 +45,11 @@ BL31_SOURCES += plat/imx/common/imx8_helpers.S \ ${IMX_GIC_SOURCES} ifeq (${NEED_BL2},yes) + +include lib/zlib/zlib.mk + BL2_SOURCES += common/desc_image_load.c \ + ${ZLIB_SOURCES} \ plat/imx/common/imx8_helpers.S \ plat/imx/common/imx_uart_console.S \ plat/imx/imx8m/imx8mm/imx8mm_bl2_el3_setup.c \ @@ -60,6 +64,7 @@ BL2_SOURCES += common/desc_image_load.c \ ${PLAT_GIC_SOURCES} \ ${PLAT_DRAM_SOURCES} \ drivers/mmc/mmc.c \ + drivers/fwu/fwu.c \ drivers/io/io_block.c \ drivers/io/io_fip.c \ drivers/io/io_memmap.c \ @@ -74,6 +79,7 @@ BL2_SOURCES += common/desc_image_load.c \ drivers/mtd/nor/spi_nor.c \ drivers/mtd/spi-mem/spi_mem.c \ lib/optee/optee_utils.c + endif # Add the build options to pack BLx images and kernel device tree @@ -104,6 +110,10 @@ $(eval $(call add_define_val,NXP_FSPI_LE,1)) $(eval $(call add_define_val,FLEXSPI_NOR_BOOT,1)) $(eval $(call add_define_val,CONFIG_FSPI_AHB,1)) +NR_OF_IMAGES_IN_FW_BANK := 1 +NR_OF_FW_BANKS := 2 +PSA_FWU_SUPPORT := 1 + ifneq (${TRUSTED_BOARD_BOOT},0) include drivers/auth/mbedtls/mbedtls_crypto.mk |