diff --git a/docs/porting-guide.md b/docs/porting-guide.md index 5e823e8150a2a50f726b1365dd7eaca393a84e34..82bed6b0480e278362277878e7b41c8556f18832 100644 --- a/docs/porting-guide.md +++ b/docs/porting-guide.md @@ -468,9 +468,11 @@ for placing the executing secondary CPU in a platform-specific state until the primary CPU performs the necessary actions to bring it out of that state and allow entry into the OS. This function must not return. -In the ARM FVP port, each secondary CPU powers itself off. The primary CPU is -responsible for powering up the secondary CPU when normal world software -requires them. +In the ARM FVP port, when using the normal boot flow, each secondary CPU powers +itself off. The primary CPU is responsible for powering up the secondary CPUs +when normal world software requires them. When booting an EL3 payload instead, +they stay powered on and are put in a holding pen until their mailbox gets +populated. This function fulfills requirement 2 above. diff --git a/plat/arm/board/fvp/aarch64/fvp_helpers.S b/plat/arm/board/fvp/aarch64/fvp_helpers.S index 865c615a3ee0e9382e8349baf99502f698fb14be..2c24e61f95c09874db837a3ef21c9e34465b94ad 100644 --- a/plat/arm/board/fvp/aarch64/fvp_helpers.S +++ b/plat/arm/board/fvp/aarch64/fvp_helpers.S @@ -60,6 +60,7 @@ * ----------------------------------------------------- */ func plat_secondary_cold_boot_setup +#ifndef EL3_PAYLOAD_BASE /* --------------------------------------------- * Power down this cpu. * TODO: Do we need to worry about powering the @@ -93,6 +94,18 @@ func plat_secondary_cold_boot_setup wfi cb_panic: b cb_panic +#else + mov_imm x0, PLAT_ARM_TRUSTED_MAILBOX_BASE + + /* Wait until the entrypoint gets populated */ +poll_mailbox: + ldr x1, [x0] + cbz x1, 1f + br x1 +1: + wfe + b poll_mailbox +#endif /* EL3_PAYLOAD_BASE */ endfunc plat_secondary_cold_boot_setup /* ---------------------------------------------------------------------