aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Dykes <mark.dykes@arm.com>2021-09-09 17:46:03 +0200
committerTrustedFirmware Code Review <review@review.trustedfirmware.org>2021-09-09 17:46:03 +0200
commit4b431230e58a9d9c72b0c0ebb0333472178da71b (patch)
tree00db072e0ae18d46f55579438b1dbf2997000bfb
parent6c7cc938f161275cf37223bd4a34fc87de8d008c (diff)
parent18b415be9d631b3e0c3a3caacc5f02edb9413f6b (diff)
downloadtrusted-firmware-a-4b431230e58a9d9c72b0c0ebb0333472178da71b.tar.gz
Merge "feat(plat/st): improve FIP image loading from MMC" into integration
-rw-r--r--plat/st/common/bl2_io_storage.c8
-rw-r--r--plat/st/stm32mp1/bl2_plat_setup.c14
2 files changed, 21 insertions, 1 deletions
diff --git a/plat/st/common/bl2_io_storage.c b/plat/st/common/bl2_io_storage.c
index 01c289db80..6c7618abab 100644
--- a/plat/st/common/bl2_io_storage.c
+++ b/plat/st/common/bl2_io_storage.c
@@ -9,6 +9,7 @@
#include <arch_helpers.h>
#include <common/debug.h>
+#include <common/desc_image_load.h>
#include <drivers/io/io_block.h>
#include <drivers/io/io_driver.h>
#include <drivers/io/io_fip.h>
@@ -45,7 +46,7 @@ static io_block_spec_t gpt_block_spec = {
static uint32_t block_buffer[MMC_BLOCK_SIZE] __aligned(MMC_BLOCK_SIZE);
-static const io_block_dev_spec_t mmc_block_dev_spec = {
+static io_block_dev_spec_t mmc_block_dev_spec = {
/* It's used as temp buffer in block driver */
.buffer = {
.offset = (size_t)&block_buffer,
@@ -423,6 +424,11 @@ int bl2_plat_handle_pre_image_load(unsigned int image_id)
image_block_spec.length = entry->length;
gpt_init_done = true;
+ } else {
+ bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
+
+ mmc_block_dev_spec.buffer.offset = bl_mem_params->image_info.image_base;
+ mmc_block_dev_spec.buffer.length = bl_mem_params->image_info.image_max_size;
}
break;
diff --git a/plat/st/stm32mp1/bl2_plat_setup.c b/plat/st/stm32mp1/bl2_plat_setup.c
index 83e5cd1360..53177f6285 100644
--- a/plat/st/stm32mp1/bl2_plat_setup.c
+++ b/plat/st/stm32mp1/bl2_plat_setup.c
@@ -15,6 +15,7 @@
#include <common/desc_image_load.h>
#include <drivers/delay_timer.h>
#include <drivers/generic_delay_timer.h>
+#include <drivers/mmc.h>
#include <drivers/st/bsec.h>
#include <drivers/st/stm32_console.h>
#include <drivers/st/stm32_iwdg.h>
@@ -395,6 +396,19 @@ int bl2_plat_handle_post_image_load(unsigned int image_id)
break;
}
+#if STM32MP_SDMMC || STM32MP_EMMC
+ /*
+ * Invalidate remaining data read from MMC but not flushed by load_image_flush().
+ * We take the worst case which is 2 MMC blocks.
+ */
+ if ((image_id != FW_CONFIG_ID) &&
+ ((bl_mem_params->image_info.h.attr & IMAGE_ATTRIB_SKIP_LOADING) == 0U)) {
+ inv_dcache_range(bl_mem_params->image_info.image_base +
+ bl_mem_params->image_info.image_size,
+ 2U * MMC_BLOCK_SIZE);
+ }
+#endif /* STM32MP_SDMMC || STM32MP_EMMC */
+
return err;
}