aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandrine Bailleux <sandrine.bailleux@arm.com>2013-11-28 14:55:58 +0000
committerDan Handley <dan.handley@arm.com>2013-12-12 16:06:48 +0000
commitee12f6f7497882fdcc8acc7774c516739296799e (patch)
tree249e6ef6b93045864d616ee8db1294563ebf783c
parentdc98e5370ac81965ebcc322a279b8aad51258d9a (diff)
Remove useless copies of meminfo structures
Platform setup code has to reserve some memory for storing the memory layout information. It is populated in early platform setup code. blx_get_sec_mem_layout() functions used to return a copy of this structure. This patch modifies blx_get_sec_mem_layout() functions so that they now directly return a pointer to their memory layout structure. It ensures that the memory layout returned by blx_get_sec_mem_layout() is always up-to-date and also avoids a useless copy of the meminfo structure. Also rename blx_get_sec_mem_layout() to blx_plat_sec_mem_layout() to make it clear those functions are platform specific. Change-Id: Ic7a6f9d6b6236b14865ab48a9f5eff545ce56551
-rw-r--r--bl1/bl1_main.c11
-rw-r--r--bl2/bl2_main.c11
-rw-r--r--docs/change-log.md5
-rw-r--r--docs/porting-guide.md44
-rw-r--r--include/bl1.h2
-rw-r--r--include/bl2.h2
-rw-r--r--include/bl31.h2
-rw-r--r--plat/fvp/bl1_plat_setup.c4
-rw-r--r--plat/fvp/bl2_plat_setup.c4
-rw-r--r--plat/fvp/bl31_plat_setup.c4
10 files changed, 49 insertions, 40 deletions
diff --git a/bl1/bl1_main.c b/bl1/bl1_main.c
index ab9fa8c..5dfb564 100644
--- a/bl1/bl1_main.c
+++ b/bl1/bl1_main.c
@@ -50,7 +50,8 @@ void bl1_main(void)
unsigned long sctlr_el3 = read_sctlr();
unsigned long bl2_base;
unsigned int load_type = TOP_LOAD, spsr;
- meminfo bl1_tzram_layout, *bl2_tzram_layout = 0x0;
+ meminfo *bl1_tzram_layout;
+ meminfo *bl2_tzram_layout = 0x0;
/*
* Ensure that MMU/Caches and coherency are turned on
@@ -73,8 +74,8 @@ void bl1_main(void)
* Find out how much free trusted ram remains after BL1 load
* & load the BL2 image at its top
*/
- bl1_tzram_layout = bl1_get_sec_mem_layout();
- bl2_base = load_image(&bl1_tzram_layout,
+ bl1_tzram_layout = bl1_plat_sec_mem_layout();
+ bl2_base = load_image(bl1_tzram_layout,
(const char *) BL2_IMAGE_NAME,
load_type, BL2_BASE);
@@ -85,8 +86,8 @@ void bl1_main(void)
* to BL2. BL2 will read the memory layout before using its
* memory for other purposes.
*/
- bl2_tzram_layout = (meminfo *) bl1_tzram_layout.free_base;
- init_bl2_mem_layout(&bl1_tzram_layout,
+ bl2_tzram_layout = (meminfo *) bl1_tzram_layout->free_base;
+ init_bl2_mem_layout(bl1_tzram_layout,
bl2_tzram_layout,
load_type,
bl2_base);
diff --git a/bl2/bl2_main.c b/bl2/bl2_main.c
index c738677..2d976fc 100644
--- a/bl2/bl2_main.c
+++ b/bl2/bl2_main.c
@@ -46,7 +46,8 @@
******************************************************************************/
void bl2_main(void)
{
- meminfo bl2_tzram_layout, *bl31_tzram_layout;
+ meminfo *bl2_tzram_layout;
+ meminfo *bl31_tzram_layout;
el_change_info *ns_image_info;
unsigned long bl31_base, el_status;
unsigned int bl2_load, bl31_load, mode;
@@ -62,7 +63,7 @@ void bl2_main(void)
#endif
/* Find out how much free trusted ram remains after BL2 load */
- bl2_tzram_layout = bl2_get_sec_mem_layout();
+ bl2_tzram_layout = bl2_plat_sec_mem_layout();
/*
* Load BL31. BL1 tells BL2 whether it has been TOP or BOTTOM loaded.
@@ -70,10 +71,10 @@ void bl2_main(void)
* loaded opposite to BL2. This allows BL31 to reclaim BL2 memory
* while maintaining its free space in one contiguous chunk.
*/
- bl2_load = bl2_tzram_layout.attr & LOAD_MASK;
+ bl2_load = bl2_tzram_layout->attr & LOAD_MASK;
assert((bl2_load == TOP_LOAD) || (bl2_load == BOT_LOAD));
bl31_load = (bl2_load == TOP_LOAD) ? BOT_LOAD : TOP_LOAD;
- bl31_base = load_image(&bl2_tzram_layout, BL31_IMAGE_NAME,
+ bl31_base = load_image(bl2_tzram_layout, BL31_IMAGE_NAME,
bl31_load, BL31_BASE);
/* Assert if it has not been possible to load BL31 */
@@ -84,7 +85,7 @@ void bl2_main(void)
* will gobble up all the BL2 memory.
*/
bl31_tzram_layout = (meminfo *) get_el_change_mem_ptr();
- init_bl31_mem_layout(&bl2_tzram_layout, bl31_tzram_layout, bl31_load);
+ init_bl31_mem_layout(bl2_tzram_layout, bl31_tzram_layout, bl31_load);
/*
* BL2 also needs to tell BL31 where the non-trusted software image
diff --git a/docs/change-log.md b/docs/change-log.md
index 4e5b9aa..e813cb1 100644
--- a/docs/change-log.md
+++ b/docs/change-log.md
@@ -73,6 +73,11 @@ Detailed changes since last release
CPU_SUSPEND and CPU_OFF apis simultaneously across cpus & clusters should
not result in unexpected behaviour.
+* The API to return the memory layout structures for each bootloader stage has
+ undergone change. A pointer to these structures is returned instead of their
+ copy.
+
+
ARM Trusted Firmware - version 0.2
==================================
diff --git a/docs/porting-guide.md b/docs/porting-guide.md
index c0e6ace..aa1451f 100644
--- a/docs/porting-guide.md
+++ b/docs/porting-guide.md
@@ -436,14 +436,15 @@ implementation of the generic timer counter and initializes the console.
This function helps fulfill requirement 5 above.
-### Function : bl1_get_sec_mem_layout() [mandatory]
+### Function : bl1_plat_sec_mem_layout() [mandatory]
Argument : void
- Return : meminfo
+ Return : meminfo *
-This function executes with the MMU and data caches enabled. The `meminfo`
-structure returned by this function must contain the extents and availability of
-secure RAM for the BL1 stage.
+This function should only be called on the cold boot path. It executes with the
+MMU and data caches enabled. The pointer returned by this function must point to
+a `meminfo` structure containing the extents and availability of secure RAM for
+the BL1 stage.
meminfo.total_base = Base address of secure RAM visible to BL1
meminfo.total_size = Size of secure RAM visible to BL1
@@ -533,7 +534,7 @@ by the primary CPU. The arguments to this function are:
The platform must copy the contents of the `meminfo` structure into a private
variable as the original memory may be subsequently overwritten by BL2. The
copied structure is made available to all BL2 code through the
-`bl2_get_sec_mem_layout()` function.
+`bl2_plat_sec_mem_layout()` function.
### Function : bl2_plat_arch_setup() [mandatory]
@@ -576,17 +577,17 @@ initialized by the platform to point to memory where an `el_change_info`
structure can be populated.
-### Function : bl2_get_sec_mem_layout() [mandatory]
+### Function : bl2_plat_sec_mem_layout() [mandatory]
Argument : void
- Return : meminfo
+ Return : meminfo *
-This function may execute with the MMU and data caches enabled if the platform
-port does the necessary initialization in `bl2_plat_arch_setup()`. It is only
-called by the primary CPU.
+This function should only be called on the cold boot path. It may execute with
+the MMU and data caches enabled if the platform port does the necessary
+initialization in `bl2_plat_arch_setup()`. It is only called by the primary CPU.
-The purpose of this function is to return a `meminfo` structure populated with
-the extents of secure RAM available for BL2 to use. See
+The purpose of this function is to return a pointer to a `meminfo` structure
+populated with the extents of secure RAM available for BL2 to use. See
`bl2_early_platform_setup()` above.
@@ -663,7 +664,7 @@ by the primary CPU. The arguments to this function are:
The platform must copy the contents of the `meminfo` structure into a private
variable as the original memory may be subsequently overwritten by BL3-1. The
copied structure is made available to all BL3-1 code through the
-`bl31_get_sec_mem_layout()` function.
+`bl31_plat_sec_mem_layout()` function.
### Function : bl31_plat_arch_setup() [mandatory]
@@ -713,17 +714,18 @@ function must return a pointer to the `el_change_info` structure (that was
copied during `bl31_early_platform_setup()`).
-### Function : bl31_get_sec_mem_layout() [mandatory]
+### Function : bl31_plat_sec_mem_layout() [mandatory]
Argument : void
- Return : meminfo
+ Return : meminfo *
-This function may execute with the MMU and data caches enabled if the platform
-port does the necessary initializations in `bl31_plat_arch_setup()`. It is only
-called by the primary CPU.
+This function should only be called on the cold boot path. This function may
+execute with the MMU and data caches enabled if the platform port does the
+necessary initializations in `bl31_plat_arch_setup()`. It is only called by the
+primary CPU.
-The purpose of this function is to return a `meminfo` structure populated with
-the extents of secure RAM available for BL3-1 to use. See
+The purpose of this function is to return a pointer to a `meminfo` structure
+populated with the extents of secure RAM available for BL3-1 to use. See
`bl31_early_platform_setup()` above.
diff --git a/include/bl1.h b/include/bl1.h
index 81b5bc4..9920cb8 100644
--- a/include/bl1.h
+++ b/include/bl1.h
@@ -45,7 +45,7 @@
* Function prototypes
*****************************************/
extern void bl1_platform_setup(void);
-extern meminfo bl1_get_sec_mem_layout(void);
+extern meminfo *bl1_plat_sec_mem_layout(void);
#endif /*__ASSEMBLY__*/
diff --git a/include/bl2.h b/include/bl2.h
index 3981a86..e105641 100644
--- a/include/bl2.h
+++ b/include/bl2.h
@@ -42,7 +42,7 @@ extern unsigned long long bl2_entrypoint;
* Function prototypes
*****************************************/
extern void bl2_platform_setup(void);
-extern meminfo bl2_get_sec_mem_layout(void);
+extern meminfo *bl2_plat_sec_mem_layout(void);
extern meminfo bl2_get_ns_mem_layout(void);
#endif /* __BL2_H__ */
diff --git a/include/bl31.h b/include/bl31.h
index dbf7e5a..acb1229 100644
--- a/include/bl31.h
+++ b/include/bl31.h
@@ -42,7 +42,7 @@ extern unsigned long bl31_entrypoint;
* Function prototypes
******************************************************************************/
extern void bl31_platform_setup(void);
-extern meminfo bl31_get_sec_mem_layout(void);
+extern meminfo *bl31_plat_sec_mem_layout(void);
extern el_change_info* bl31_get_next_image_info(unsigned long);
extern void gic_cpuif_deactivate(unsigned int);
extern void gic_cpuif_setup(unsigned int);
diff --git a/plat/fvp/bl1_plat_setup.c b/plat/fvp/bl1_plat_setup.c
index 9d19bb8..8fe4c95 100644
--- a/plat/fvp/bl1_plat_setup.c
+++ b/plat/fvp/bl1_plat_setup.c
@@ -63,9 +63,9 @@ extern unsigned long __BL1_RAM_END__;
/* Data structure which holds the extents of the trusted SRAM for BL1*/
static meminfo bl1_tzram_layout;
-meminfo bl1_get_sec_mem_layout(void)
+meminfo *bl1_plat_sec_mem_layout(void)
{
- return bl1_tzram_layout;
+ return &bl1_tzram_layout;
}
/*******************************************************************************
diff --git a/plat/fvp/bl2_plat_setup.c b/plat/fvp/bl2_plat_setup.c
index 7212df1..978cc9b 100644
--- a/plat/fvp/bl2_plat_setup.c
+++ b/plat/fvp/bl2_plat_setup.c
@@ -72,9 +72,9 @@ static meminfo bl2_tzram_layout
__attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE),
section("tzfw_coherent_mem")));
-meminfo bl2_get_sec_mem_layout(void)
+meminfo *bl2_plat_sec_mem_layout(void)
{
- return bl2_tzram_layout;
+ return &bl2_tzram_layout;
}
/*******************************************************************************
diff --git a/plat/fvp/bl31_plat_setup.c b/plat/fvp/bl31_plat_setup.c
index ab8e378..221b85a 100644
--- a/plat/fvp/bl31_plat_setup.c
+++ b/plat/fvp/bl31_plat_setup.c
@@ -85,9 +85,9 @@ static meminfo bl31_tzram_layout
__attribute__ ((aligned(PLATFORM_CACHE_LINE_SIZE),
section("tzfw_coherent_mem")));
-meminfo bl31_get_sec_mem_layout(void)
+meminfo *bl31_plat_sec_mem_layout(void)
{
- return bl31_tzram_layout;
+ return &bl31_tzram_layout;
}
/*******************************************************************************