Allow BL3-2 platform definitions to be optional

The generic image loading and IO FIP code no longer forces the
platform to create BL3-2 (Secure-EL1 Payload) specific
definitions. The BL3-2 loading code in bl2/bl2main.c is wrapped
by a #ifdef BL32_BASE blocks, allowing the BL3-2 definitions to
be optional. Similarly for the name_uuid array defintion in
drivers/io/io_fip.c.

Also update the porting guide to reflect this change.

The BL3-2 platform definitions remain non-configurably present
in the FVP port.

Fixes ARM-software/tf-issues#68

Change-Id: Iea28b4e94d87a31f5522f271e290919a8a955460
This commit is contained in:
Dan Handley 2014-04-15 11:38:38 +01:00 committed by Andrew Thoelke
parent d846780e89
commit 0a145c9593
3 changed files with 38 additions and 31 deletions

View File

@ -134,32 +134,35 @@ void bl2_main(void)
bl2_plat_bl33_post_load_actions(bl2_to_bl31_params->bl33_image,
bl2_to_bl31_params->bl33_ep);
#ifdef BL32_BASE
/*
* Load the BL32 image if there's one. It is upto to platform
* to specify where BL32 should be loaded if it exists. It
* could create space in the secure sram or point to a
* completely different memory. A zero size indicates that the
* platform does not want to load a BL32 image.
* completely different memory.
*
* If a platform does not want to attempt to load BL3-2 image
* it must leave BL32_BASE undefined
*/
bl2_plat_get_bl32_meminfo(&bl32_mem_info);
if (bl32_mem_info.total_size) {
e = load_image(&bl32_mem_info,
BL32_IMAGE_NAME,
bl32_mem_info.attr &
LOAD_MASK,
BL32_BASE,
bl2_to_bl31_params->bl32_image,
bl2_to_bl31_params->bl32_ep);
e = load_image(&bl32_mem_info,
BL32_IMAGE_NAME,
bl32_mem_info.attr &
LOAD_MASK,
BL32_BASE,
bl2_to_bl31_params->bl32_image,
bl2_to_bl31_params->bl32_ep);
/* Halt if failed to load normal world firmware. */
if (e) {
WARN("Failed to load BL3-2.\n");
} else {
bl2_plat_bl32_post_load_actions(
bl2_to_bl31_params->bl32_image,
bl2_to_bl31_params->bl32_ep);
}
/* Issue a diagnostic if no Secure Payload could be loaded */
if (e) {
WARN("Failed to load BL3-2.\n");
} else {
bl2_plat_bl32_post_load_actions(
bl2_to_bl31_params->bl32_image,
bl2_to_bl31_params->bl32_ep);
}
#endif /* BL32_BASE */
/*
* Run BL31 via an SMC to BL1. Information on how to pass control to

View File

@ -555,23 +555,24 @@ using the `platform_is_primary_cpu()` function. BL1 passed control to BL2 at
if the platform wants to restrict the amount of memory visible to BL3-1.
Details of this function are given below.
4. Loading the BL3-2 binary image (if present) in platform provided memory
using semi-hosting. To load the BL3-2 image, BL2 makes use of the
`bl32_meminfo` field in the `bl31_args` structure to which a pointer is
4. (Optional) Loading the BL3-2 binary image (if present) from platform
provided non-volatile storage. To load the BL3-2 image, BL2 makes use of
the `bl32_meminfo` field in the `bl31_args` structure to which a pointer is
returned by the `bl2_get_bl31_args_ptr()` function. The platform also
defines the address in memory where BL3-2 is loaded through the constant
`BL32_BASE`. BL2 uses this information to determine if there is enough
memory to load the BL3-2 image.
defines the address in memory where BL3-2 is loaded through the optional
constant `BL32_BASE`. BL2 uses this information to determine if there is
enough memory to load the BL3-2 image. If `BL32_BASE` is not defined then
this and the following two steps are not performed.
5. Arranging to pass control to the BL3-2 image (if present) that has been
pre-loaded at `BL32_BASE`. BL2 populates an `el_change_info` structure
in memory provided by the platform with information about how BL3-1 should
pass control to the BL3-2 image. This structure follows the
5. (Optional) Arranging to pass control to the BL3-2 image (if present) that
has been pre-loaded at `BL32_BASE`. BL2 populates an `el_change_info`
structure in memory provided by the platform with information about how
BL3-1 should pass control to the BL3-2 image. This structure follows the
`el_change_info` structure populated for the normal world BL image in 2.
above.
6. Populating a `meminfo` structure with the following information in
memory that is accessible by BL3-1 immediately upon entry.
6. (Optional) Populating a `meminfo` structure with the following information
in memory that is accessible by BL3-1 immediately upon entry.
meminfo.total_base = Base address of memory visible to BL3-2
meminfo.total_size = Size of memory visible to BL3-2
@ -581,7 +582,7 @@ using the `platform_is_primary_cpu()` function. BL1 passed control to BL2 at
BL3-2
BL2 populates this information in the `bl32_meminfo` field of the pointer
returned by the `bl2_get_bl31_args_ptr() function.
returned by the `bl2_get_bl31_args_ptr()` function.
The following functions must be implemented by the platform port to enable BL2
to perform the above tasks.

View File

@ -65,7 +65,10 @@ typedef struct {
static const plat_fip_name_uuid_t name_uuid[] = {
{BL2_IMAGE_NAME, UUID_TRUSTED_BOOT_FIRMWARE_BL2},
{BL31_IMAGE_NAME, UUID_EL3_RUNTIME_FIRMWARE_BL31},
#ifdef BL32_IMAGE_NAME
/* BL3-2 is optional in the platform */
{BL32_IMAGE_NAME, UUID_SECURE_PAYLOAD_BL32},
#endif /* BL32_IMAGE_NAME */
{BL33_IMAGE_NAME, UUID_NON_TRUSTED_FIRMWARE_BL33},
};