aboutsummaryrefslogtreecommitdiff
path: root/plat/fvp
diff options
context:
space:
mode:
authorAchin Gupta <achin.gupta@arm.com>2014-02-19 17:18:23 +0000
committerDan Handley <dan.handley@arm.com>2014-02-20 19:06:34 +0000
commite4d084ea9629703166e59d116d4aefbd6f2be531 (patch)
tree68e863ffaea93a977f7590e2e52139d0ea96a0fb /plat/fvp
parenta7934d69508872919787742c7680b68807c24361 (diff)
Rework BL2 to BL3-1 hand over interface
This patch reworks BL2 to BL3-1 hand over interface by introducing a composite structure (bl31_args) that holds the superset of information that needs to be passed from BL2 to BL3-1. - The extents of secure memory available to BL3-1 - The extents of memory available to BL3-2 (not yet implemented) and BL3-3 - Information to execute BL3-2 (not yet implemented) and BL3-3 images This patch also introduces a new platform API (bl2_get_bl31_args_ptr) that needs to be implemented by the platform code to export reference to bl31_args structure which has been allocated in platform-defined memory. The platform will initialize the extents of memory available to BL3-3 during early platform setup in bl31_args structure. This obviates the need for bl2_get_ns_mem_layout platform API. BL2 calls the bl2_get_bl31_args_ptr function to get a reference to bl31_args structure. It uses the 'bl33_meminfo' field of this structure to load the BL3-3 image. It sets the entry point information for the BL3-3 image in the 'bl33_image_info' field of this structure. The reference to this structure is passed to the BL3-1 image. Also fixes issue ARM-software/tf-issues#25 Change-Id: Ic36426196dd5ebf89e60ff42643bed01b3500517
Diffstat (limited to 'plat/fvp')
-rw-r--r--plat/fvp/bl2_plat_setup.c38
-rw-r--r--plat/fvp/bl31_plat_setup.c53
-rw-r--r--plat/fvp/platform.h13
3 files changed, 47 insertions, 57 deletions
diff --git a/plat/fvp/bl2_plat_setup.c b/plat/fvp/bl2_plat_setup.c
index f8c922e..2e367d7 100644
--- a/plat/fvp/bl2_plat_setup.c
+++ b/plat/fvp/bl2_plat_setup.c
@@ -70,19 +70,25 @@ extern unsigned char **bl2_el_change_mem_ptr;
static meminfo bl2_tzram_layout
__attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE),
section("tzfw_coherent_mem")));
-/* Data structure which holds the extents of the Non-Secure DRAM for BL33 */
-static meminfo bl33_dram_layout
-__attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE),
- section("tzfw_coherent_mem")));
+
+/*******************************************************************************
+ * Reference to structure which holds the arguments which need to be passed
+ * to BL31
+ ******************************************************************************/
+static bl31_args *bl2_to_bl31_args;
meminfo *bl2_plat_sec_mem_layout(void)
{
return &bl2_tzram_layout;
}
-meminfo *bl2_get_ns_mem_layout(void)
+/*******************************************************************************
+ * This function returns a pointer to the memory that the platform has kept
+ * aside to pass all the information that BL31 could need.
+ ******************************************************************************/
+bl31_args *bl2_get_bl31_args_ptr(void)
{
- return &bl33_dram_layout;
+ return bl2_to_bl31_args;
}
/*******************************************************************************
@@ -101,16 +107,6 @@ void bl2_early_platform_setup(meminfo *mem_layout,
bl2_tzram_layout.attr = mem_layout->attr;
bl2_tzram_layout.next = 0;
- /* Setup the BL3-3 memory layout.
- * Normal World Firmware loaded into main DRAM.
- */
- bl33_dram_layout.total_base = DRAM_BASE;
- bl33_dram_layout.total_size = DRAM_SIZE;
- bl33_dram_layout.free_base = DRAM_BASE;
- bl33_dram_layout.free_size = DRAM_SIZE;
- bl33_dram_layout.attr = 0;
- bl33_dram_layout.next = 0;
-
/* Initialize the platform config for future decision making */
platform_config_setup();
@@ -127,7 +123,15 @@ void bl2_platform_setup()
io_setup();
/* Use the Trusted DRAM for passing args to BL31 */
- bl2_el_change_mem_ptr = (unsigned char **) TZDRAM_BASE;
+ bl2_to_bl31_args = (bl31_args *) TZDRAM_BASE;
+
+ /* Populate the extents of memory available for loading BL33 */
+ bl2_to_bl31_args->bl33_meminfo.total_base = DRAM_BASE;
+ bl2_to_bl31_args->bl33_meminfo.total_size = DRAM_SIZE;
+ bl2_to_bl31_args->bl33_meminfo.free_base = DRAM_BASE;
+ bl2_to_bl31_args->bl33_meminfo.free_size = DRAM_SIZE;
+ bl2_to_bl31_args->bl33_meminfo.attr = 0;
+ bl2_to_bl31_args->bl33_meminfo.next = 0;
}
/*******************************************************************************
diff --git a/plat/fvp/bl31_plat_setup.c b/plat/fvp/bl31_plat_setup.c
index 425fad6..019b8e1 100644
--- a/plat/fvp/bl31_plat_setup.c
+++ b/plat/fvp/bl31_plat_setup.c
@@ -30,6 +30,7 @@
#include <platform.h>
#include <fvp_pwrc.h>
+#include <bl_common.h>
/*******************************************************************************
* Declarations of linker defined symbols which will help us find the layout
@@ -61,22 +62,14 @@ extern unsigned long __COHERENT_RAM_END__;
#define BL31_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__)
/*******************************************************************************
- * This data structure holds information copied by BL31 from BL2 to pass
- * control to the normal world software images.
- * TODO: Can this be moved out of device memory.
+ * Reference to structure which holds the arguments that have been passed to
+ * BL31 from BL2.
******************************************************************************/
-static el_change_info ns_entry_info
-__attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE),
- section("tzfw_coherent_mem")));
-
-/* Data structure which holds the extents of the trusted SRAM for BL31 */
-static meminfo bl31_tzram_layout
-__attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE),
- section("tzfw_coherent_mem")));
+static bl31_args *bl2_to_bl31_args;
meminfo *bl31_plat_sec_mem_layout(void)
{
- return &bl31_tzram_layout;
+ return &bl2_to_bl31_args->bl31_meminfo;
}
/*******************************************************************************
@@ -87,34 +80,24 @@ meminfo *bl31_plat_sec_mem_layout(void)
******************************************************************************/
el_change_info *bl31_get_next_image_info(void)
{
- return &ns_entry_info;
+ return &bl2_to_bl31_args->bl33_image_info;
}
/*******************************************************************************
- * Perform any BL31 specific platform actions. Here we copy parameters passed
- * by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they are lost
- * (potentially). This is done before the MMU is initialized so that the memory
- * layout can be used while creating page tables.
+ * Perform any BL31 specific platform actions. Here is an opportunity to copy
+ * parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they
+ * are lost (potentially). This needs to be done before the MMU is initialized
+ * so that the memory layout can be used while creating page tables. On the FVP
+ * we know that BL2 has populated the parameters in secure DRAM. So we just use
+ * the reference passed in 'from_bl2' instead of copying. The 'data' parameter
+ * is not used since all the information is contained in 'from_bl2'. Also, BL2
+ * has flushed this information to memory, so we are guaranteed to pick up good
+ * data
******************************************************************************/
-void bl31_early_platform_setup(meminfo *mem_layout,
+void bl31_early_platform_setup(bl31_args *from_bl2,
void *data)
{
- el_change_info *image_info = (el_change_info *) data;
-
- /* Setup the BL31 memory layout */
- bl31_tzram_layout.total_base = mem_layout->total_base;
- bl31_tzram_layout.total_size = mem_layout->total_size;
- bl31_tzram_layout.free_base = mem_layout->free_base;
- bl31_tzram_layout.free_size = mem_layout->free_size;
- bl31_tzram_layout.attr = mem_layout->attr;
- bl31_tzram_layout.next = 0;
-
- /* Save information about jumping into the normal world */
- ns_entry_info.entrypoint = image_info->entrypoint;
- ns_entry_info.spsr = image_info->spsr;
- ns_entry_info.args = image_info->args;
- ns_entry_info.security_state = image_info->security_state;
- ns_entry_info.next = image_info->next;
+ bl2_to_bl31_args = from_bl2;
/* Initialize the platform config for future decision making */
platform_config_setup();
@@ -163,7 +146,7 @@ void bl31_platform_setup()
******************************************************************************/
void bl31_plat_arch_setup()
{
- configure_mmu(&bl31_tzram_layout,
+ configure_mmu(&bl2_to_bl31_args->bl31_meminfo,
BL31_RO_BASE,
BL31_RO_LIMIT,
BL31_COHERENT_RAM_BASE,
diff --git a/plat/fvp/platform.h b/plat/fvp/platform.h
index 5826d35..76a9fca 100644
--- a/plat/fvp/platform.h
+++ b/plat/fvp/platform.h
@@ -53,17 +53,20 @@
/* Trusted Boot Firmware BL2 */
#define BL2_IMAGE_NAME "bl2.bin"
+
/* EL3 Runtime Firmware BL31 */
-#define BL31_IMAGE_NAME "bl31.bin"
+#define BL31_IMAGE_NAME "bl31.bin"
+
/* Secure Payload BL32 (Trusted OS) */
-#define BL32_IMAGE_NAME "bl32.bin"
+#define BL32_IMAGE_NAME "bl32.bin"
+
/* Non-Trusted Firmware BL33 and its load address */
-#define BL33_IMAGE_NAME "bl33.bin" /* e.g. UEFI */
-#define NS_IMAGE_OFFSET (DRAM_BASE + 0x8000000) /* DRAM + 128MB */
+#define BL33_IMAGE_NAME "bl33.bin" /* e.g. UEFI */
+#define NS_IMAGE_OFFSET (DRAM_BASE + 0x8000000) /* DRAM + 128MB */
+
/* Firmware Image Package */
#define FIP_IMAGE_NAME "fip.bin"
-
#define PLATFORM_CACHE_LINE_SIZE 64
#define PLATFORM_CLUSTER_COUNT 2ull
#define PLATFORM_CLUSTER0_CORE_COUNT 4