Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
5627c1ed
Unverified
Commit
5627c1ed
authored
Dec 01, 2017
by
davidcunado-arm
Committed by
GitHub
Dec 01, 2017
Browse files
Merge pull request #1175 from soby-mathew/sm/juno-a32-bl32-changes
Fix issues for AArch32 builds on ARM platforms
parents
3642ca95
a9f9b608
Changes
10
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
5627c1ed
...
...
@@ -383,6 +383,17 @@ ifdef SCP_BL2
NEED_SCP_BL2 := yes
endif
# For AArch32, BL31 is not currently supported.
ifneq (${ARCH},aarch32)
ifdef BL31_SOURCES
# When booting an EL3 payload, there is no need to compile the BL31 image nor
# put it in the FIP.
ifndef EL3_PAYLOAD_BASE
NEED_BL31 := yes
endif
endif
endif
# Process TBB related flags
ifneq (${GENERATE_COT},0)
# Common cert_create options
...
...
@@ -434,17 +445,11 @@ NEED_BL2U := yes
include bl2u/bl2u.mk
endif
# For AArch32, BL31 is not currently supported.
ifneq (${ARCH},aarch32)
ifeq (${NEED_BL31},yes)
ifdef BL31_SOURCES
# When booting an EL3 payload, there is no need to compile the BL31 image nor
# put it in the FIP.
ifndef EL3_PAYLOAD_BASE
NEED_BL31 := yes
include bl31/bl31.mk
endif
endif
endif
################################################################################
# Build options checks
...
...
bl32/sp_min/sp_min.ld.S
View file @
5627c1ed
...
...
@@ -110,6 +110,10 @@ SECTIONS
__DATA_END__
=
.
;
}
>
RAM
#ifdef BL32_PROGBITS_LIMIT
ASSERT
(.
<=
BL32_PROGBITS_LIMIT
,
"BL32 progbits has exceeded its limit."
)
#endif
stacks
(
NOLOAD
)
:
{
__STACKS_START__
=
.
;
*(
tzfw_normal_stacks
)
...
...
docs/user-guide.rst
View file @
5627c1ed
...
...
@@ -1212,7 +1212,7 @@ corrupted binaries.
make ARCH=aarch64 PLAT=juno LOAD_IMAGE_V2=1 JUNO_AARCH32_EL3_RUNTIME=1 \
BL33=<path-to-juno32-oe-uboot>/SOFTWARE/bl33-uboot.bin \
SCP_BL2=<path-to-juno32-oe-uboot>/SOFTWARE/scp_bl2.bin
SPD=tspd
\
SCP_BL2=<path-to-juno32-oe-uboot>/SOFTWARE/scp_bl2.bin \
BL32=<path-to-bl32>/bl32.bin all fip
The resulting BL1 and FIP images may be found in:
...
...
include/plat/arm/board/common/board_arm_def.h
View file @
5627c1ed
...
...
@@ -96,6 +96,14 @@
#define PLAT_ARM_MAX_BL31_SIZE 0x1D000
#endif
#ifdef AARCH32
/*
* PLAT_ARM_MAX_BL32_SIZE is calculated for SP_MIN as the AArch32 Secure
* Payload.
*/
# define PLAT_ARM_MAX_BL32_SIZE 0x1D000
#endif
#endif
/* ARM_BOARD_OPTIMISE_MEM */
#define MAX_IO_DEVICES 3
...
...
include/plat/arm/common/arm_def.h
View file @
5627c1ed
...
...
@@ -326,14 +326,21 @@
/*******************************************************************************
* BL2 specific defines.
******************************************************************************/
#if ARM_BL31_IN_DRAM
|| (defined(AARCH32) && !defined(JUNO_AARCH32_EL3_RUNTIME))
#if ARM_BL31_IN_DRAM
/*
* For AArch32 BL31 is not applicable.
* For AArch64 BL31 is loaded in the DRAM.
* Put BL2 just below BL1.
*/
#define BL2_BASE (BL1_RW_BASE - PLAT_ARM_MAX_BL2_SIZE)
#define BL2_LIMIT BL1_RW_BASE
#elif defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME
/*
* Put BL2 just below BL32.
*/
#define BL2_BASE (BL32_BASE - PLAT_ARM_MAX_BL2_SIZE)
#define BL2_LIMIT BL32_BASE
#else
/*
* Put BL2 just below BL31.
...
...
@@ -370,76 +377,86 @@
#define BL31_LIMIT (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE)
#endif
#if defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME
/*******************************************************************************
* BL32 specific defines.
* BL32 specific defines for EL3 runtime in AArch32 mode
******************************************************************************/
# if RESET_TO_SP_MIN && !JUNO_AARCH32_EL3_RUNTIME
/* SP_MIN is the only BL image in SRAM. Allocate the whole of SRAM to BL32 */
# define BL32_BASE ARM_BL_RAM_BASE
# define BL32_LIMIT (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE)
# else
/* Put BL32 at the top of the Trusted SRAM.*/
# define BL32_BASE (ARM_BL_RAM_BASE + \
ARM_BL_RAM_SIZE - \
PLAT_ARM_MAX_BL32_SIZE)
# define BL32_PROGBITS_LIMIT BL1_RW_BASE
# define BL32_LIMIT (ARM_BL_RAM_BASE + ARM_BL_RAM_SIZE)
# endif
/* RESET_TO_SP_MIN && !JUNO_AARCH32_EL3_RUNTIME */
#else
/*******************************************************************************
* BL32 specific defines for EL3 runtime in AArch64 mode
******************************************************************************/
/*
* On ARM standard platforms, the TSP can execute from Trusted SRAM,
* Trusted DRAM (if available) or the DRAM region secured by the TrustZone
* controller.
*/
#if ENABLE_SPM
# define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000))
# define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - ULL(0x200000))
# define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000))
# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \
#
if ENABLE_SPM
#
define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000))
#
define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - ULL(0x200000))
#
define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + ULL(0x200000))
#
define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \
ARM_AP_TZC_DRAM1_SIZE)
#elif ARM_BL31_IN_DRAM
# define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + \
#
elif ARM_BL31_IN_DRAM
#
define TSP_SEC_MEM_BASE (ARM_AP_TZC_DRAM1_BASE + \
PLAT_ARM_MAX_BL31_SIZE)
# define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - \
#
define TSP_SEC_MEM_SIZE (ARM_AP_TZC_DRAM1_SIZE - \
PLAT_ARM_MAX_BL31_SIZE)
# define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + \
#
define BL32_BASE (ARM_AP_TZC_DRAM1_BASE + \
PLAT_ARM_MAX_BL31_SIZE)
# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \
#
define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \
ARM_AP_TZC_DRAM1_SIZE)
#elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_SRAM_ID
# define TSP_SEC_MEM_BASE ARM_BL_RAM_BASE
# define TSP_SEC_MEM_SIZE ARM_BL_RAM_SIZE
# define TSP_PROGBITS_LIMIT BL2_BASE
# define BL32_BASE ARM_BL_RAM_BASE
# define BL32_LIMIT BL31_BASE
#elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_DRAM_ID
# define TSP_SEC_MEM_BASE PLAT_ARM_TRUSTED_DRAM_BASE
# define TSP_SEC_MEM_SIZE PLAT_ARM_TRUSTED_DRAM_SIZE
# define BL32_BASE PLAT_ARM_TRUSTED_DRAM_BASE
# define BL32_LIMIT (PLAT_ARM_TRUSTED_DRAM_BASE \
#
elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_SRAM_ID
#
define TSP_SEC_MEM_BASE ARM_BL_RAM_BASE
#
define TSP_SEC_MEM_SIZE ARM_BL_RAM_SIZE
#
define TSP_PROGBITS_LIMIT BL2_BASE
#
define BL32_BASE ARM_BL_RAM_BASE
#
define BL32_LIMIT BL31_BASE
#
elif ARM_TSP_RAM_LOCATION_ID == ARM_TRUSTED_DRAM_ID
#
define TSP_SEC_MEM_BASE PLAT_ARM_TRUSTED_DRAM_BASE
#
define TSP_SEC_MEM_SIZE PLAT_ARM_TRUSTED_DRAM_SIZE
#
define BL32_BASE PLAT_ARM_TRUSTED_DRAM_BASE
#
define BL32_LIMIT (PLAT_ARM_TRUSTED_DRAM_BASE \
+ (1 << 21))
#elif ARM_TSP_RAM_LOCATION_ID == ARM_DRAM_ID
# define TSP_SEC_MEM_BASE ARM_AP_TZC_DRAM1_BASE
# define TSP_SEC_MEM_SIZE ARM_AP_TZC_DRAM1_SIZE
# define BL32_BASE ARM_AP_TZC_DRAM1_BASE
# define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \
#
elif ARM_TSP_RAM_LOCATION_ID == ARM_DRAM_ID
#
define TSP_SEC_MEM_BASE ARM_AP_TZC_DRAM1_BASE
#
define TSP_SEC_MEM_SIZE ARM_AP_TZC_DRAM1_SIZE
#
define BL32_BASE ARM_AP_TZC_DRAM1_BASE
#
define BL32_LIMIT (ARM_AP_TZC_DRAM1_BASE + \
ARM_AP_TZC_DRAM1_SIZE)
#else
# error "Unsupported ARM_TSP_RAM_LOCATION_ID value"
#endif
# else
# error "Unsupported ARM_TSP_RAM_LOCATION_ID value"
# endif
#endif
/* AARCH32 || JUNO_AARCH32_EL3_RUNTIME */
/*
* BL32 is mandatory in AArch32. In AArch64, undefine BL32_BASE if there is no
* SPD and no SPM, as they are the only ones that can be used as BL32.
*/
#if
ndef AARCH32
#if
!(defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME)
# if defined(SPD_none) && !ENABLE_SPM
# undef BL32_BASE
# endif
#endif
# endif
/* defined(SPD_none) && !ENABLE_SPM */
#endif
/* !(defined(AARCH32) || JUNO_AARCH32_EL3_RUNTIME) */
/*******************************************************************************
* FWU Images: NS_BL1U, BL2U & NS_BL2U defines.
******************************************************************************/
#define BL2U_BASE BL2_BASE
#if ARM_BL31_IN_DRAM || (defined(AARCH32) && !defined(JUNO_AARCH32_EL3_RUNTIME))
/*
* For AArch32 BL31 is not applicable.
* For AArch64 BL31 is loaded in the DRAM.
* BL2U extends up to BL1.
*/
#define BL2U_LIMIT BL1_RW_BASE
#else
/* BL2U extends up to BL31. */
#define BL2U_LIMIT BL31_BASE
#endif
#define BL2U_LIMIT BL2_LIMIT
#define NS_BL2U_BASE ARM_NS_DRAM1_BASE
#define NS_BL1U_BASE (PLAT_ARM_NVM_BASE + 0x03EB8000)
...
...
make_helpers/tbbr/tbbr_tools.mk
View file @
5627c1ed
...
...
@@ -77,6 +77,7 @@ ifneq (${SCP_BL2},)
endif
ifeq
(${ARCH},aarch64)
ifeq
(${NEED_BL31},yes)
# Add the BL31 CoT (key cert + img cert + image)
$(if
${BL31},$(eval
$(call
CERT_ADD_CMD_OPT,${BL31},--soc-fw,true)),\
$(eval
$(call
CERT_ADD_CMD_OPT,$(call
IMG_BIN,31),--soc-fw,true)))
...
...
@@ -86,6 +87,7 @@ $(eval $(call CERT_ADD_CMD_OPT,${BUILD_PLAT}/soc_fw_key.crt,--soc-fw-key-cert))
$(eval
$(call
FIP_ADD_PAYLOAD,${BUILD_PLAT}/soc_fw_content.crt,--soc-fw-cert))
$(eval
$(call
FIP_ADD_PAYLOAD,${BUILD_PLAT}/soc_fw_key.crt,--soc-fw-key-cert))
endif
endif
# Add the BL32 CoT (key cert + img cert + image)
ifeq
(${NEED_BL32},yes)
...
...
plat/arm/board/juno/include/platform_def.h
View file @
5627c1ed
...
...
@@ -128,6 +128,15 @@
*/
#define PLAT_ARM_MAX_BL31_SIZE 0x1E000
#if JUNO_AARCH32_EL3_RUNTIME
/*
* PLAT_ARM_MAX_BL32_SIZE is calculated for SP_MIN as the AArch32 Secure
* Payload. We also need to take care of SCP_BL2 size as well, as the SCP_BL2
* is loaded into the space BL32 -> BL1_RW_BASE
*/
# define PLAT_ARM_MAX_BL32_SIZE 0x1E000
#endif
/*
* Since free SRAM space is scant, enable the ASSERTION message size
* optimization by fixing the PLAT_LOG_LEVEL_ASSERT to LOG_LEVEL_INFO (40).
...
...
plat/arm/board/juno/juno_bl2_setup.c
View file @
5627c1ed
...
...
@@ -29,33 +29,4 @@ int bl2_plat_handle_post_image_load(unsigned int image_id)
return
err
;
}
#if !CSS_USE_SCMI_SDS_DRIVER
/*
* We need to override some of the platform functions when booting SP_MIN
* on Juno AArch32. These needs to be done only for SCPI/BOM SCP systems as
* in case of SDS, the structures remain in memory and doesn't need to be
* overwritten.
*/
static
unsigned
int
scp_boot_config
;
void
bl2_early_platform_setup
(
meminfo_t
*
mem_layout
)
{
arm_bl2_early_platform_setup
(
mem_layout
);
/* Save SCP Boot config before it gets overwritten by SCP_BL2 loading */
VERBOSE
(
"BL2: Saving SCP Boot config = 0x%x
\n
"
,
scp_boot_config
);
scp_boot_config
=
mmio_read_32
(
SCP_BOOT_CFG_ADDR
);
}
void
bl2_platform_setup
(
void
)
{
arm_bl2_platform_setup
();
mmio_write_32
(
SCP_BOOT_CFG_ADDR
,
scp_boot_config
);
VERBOSE
(
"BL2: Restored SCP Boot config = 0x%x
\n
"
,
scp_boot_config
);
}
#endif
#endif
/* JUNO_AARCH32_EL3_RUNTIME */
plat/arm/board/juno/platform.mk
View file @
5627c1ed
...
...
@@ -31,6 +31,19 @@ JUNO_AARCH32_EL3_RUNTIME := 0
$(eval
$(call
assert_boolean,JUNO_AARCH32_EL3_RUNTIME))
$(eval
$(call
add_define,JUNO_AARCH32_EL3_RUNTIME))
ifeq
(${JUNO_AARCH32_EL3_RUNTIME}, 1)
# Include BL32 in FIP
NEED_BL32
:=
yes
# BL31 is not required
override
BL31_SOURCES
=
# The BL32 needs to be built separately invoking the AARCH32 compiler and
# be specifed via `BL32` build option.
ifneq
(${ARCH}, aarch32)
override
BL32_SOURCES
=
endif
endif
ifeq
(${ARCH},aarch64)
BL1_SOURCES
+=
lib/cpus/aarch64/cortex_a53.S
\
lib/cpus/aarch64/cortex_a57.S
\
...
...
plat/arm/css/common/css_bl2_setup.c
View file @
5627c1ed
...
...
@@ -49,13 +49,13 @@ int bl2_plat_handle_scp_bl2(image_info_t *scp_bl2_image_info)
}
#if !CSS_USE_SCMI_SDS_DRIVER
# ifdef
EL3_PAYLOAD_BASE
# if
def
ined(
EL3_PAYLOAD_BASE
) || JUNO_AARCH32_EL3_RUNTIME
/*
* We need to override some of the platform functions when booting an EL3
* payload. Th
ese
needs to be done only for
SCPI/BOM SCP systems as
* in case of SDS, the structures remain in memory and
doesn't need to be
* overwritten.
* payload
or SP_MIN on Juno AArch32
. Th
is
needs to be done only for
*
SCPI/BOM SCP systems as
in case of SDS, the structures remain in memory and
*
don't need to be
overwritten.
*/
static
unsigned
int
scp_boot_config
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment