From 64e5e95917a17f055c8428d2c7963a1156ccc2e0 Mon Sep 17 00:00:00 2001 From: Sarat Chand Savitala Date: Thu, 2 Jul 2015 18:49:38 +0530 Subject: [PATCH] sw_apps:zynqmp_fsbl: Fix in ATF handoff parameters for destination CPU This fix populates the correct A53 CPU to which FSBL has to hand off when partition is ATF. Signed-off-by: Sarat Chand Savitala --- .../zynqmp_fsbl/src/xfsbl_image_header.c | 37 +++++++++++++++++-- .../zynqmp_fsbl/src/xfsbl_image_header.h | 13 +++++-- .../zynqmp_fsbl/src/xfsbl_initialization.c | 3 +- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.c index 38328930..540396b9 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.c +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.c @@ -288,7 +288,8 @@ END: *****************************************************************************/ u32 XFsbl_ReadImageHeader(XFsblPs_ImageHeader * ImageHeader, XFsblPs_DeviceOps * DeviceOps, - u32 FlashImageOffsetAddress) + u32 FlashImageOffsetAddress, + u32 RunningCpu) { u32 Status = XFSBL_SUCCESS; u32 ImageHeaderTableAddressOffset=0U; @@ -398,6 +399,12 @@ u32 XFsbl_ReadImageHeader(XFsblPs_ImageHeader * ImageHeader, DestnCPU = XFsbl_GetDestinationCpu(CurrPartitionHdr); + /* if destination cpu is not present, it means it is for same cpu */ + if (DestnCPU == XIH_PH_ATTRB_DEST_CPU_NONE) + { + DestnCPU = RunningCpu; + } + if ((PartitionIndex > 1) && (EntryCount < XFSBL_MAX_ENTRIES_FOR_ATF) && (CurrPartitionHdr->DestinationExecutionAddress != 0U) && (((DestnCPU >= XIH_PH_ATTRB_DEST_CPU_A53_0) && @@ -543,6 +550,13 @@ u32 XFsbl_ValidatePartitionHeader( DestinationCpu = XFsbl_GetDestinationCpu(PartitionHeader); + + /* if destination cpu is not present, it means it is for same cpu */ + if (DestinationCpu == XIH_PH_ATTRB_DEST_CPU_NONE) + { + DestinationCpu = RunningCpu; + } + DestinationDevice = XFsbl_GetDestinationDevice(PartitionHeader); /** * Partition fields Validation @@ -796,9 +810,24 @@ static void XFsbl_SetATFHandoffParameters( ((PartitionAttributes & XIH_PH_ATTRB_TR_SECURE_MASK) << XIH_ATTRB_TR_SECURE_SHIFT_DIFF) | ((PartitionAttributes & XIH_PH_ATTRB_TARGET_EL_MASK) - << XIH_ATTRB_TARGET_EL_SHIFT_DIFF) | - ((PartitionAttributes & XIH_PH_ATTRB_DEST_CPU_A53_MASK) - >> XIH_ATTRB_DEST_CPU_A53_SHIFT_DIFF)); + << XIH_ATTRB_TARGET_EL_SHIFT_DIFF)); + + /* Update CPU number based on destination CPU */ + if ((PartitionAttributes & XIH_PH_ATTRB_DEST_CPU_MASK) + == XIH_PH_ATTRB_DEST_CPU_A53_0) { + PartitionFlags |= XIH_PART_FLAGS_DEST_CPU_A53_0; + } + else if ((PartitionAttributes & XIH_PH_ATTRB_DEST_CPU_MASK) + == XIH_PH_ATTRB_DEST_CPU_A53_1) { + PartitionFlags |= XIH_PART_FLAGS_DEST_CPU_A53_1; + } + else if ((PartitionAttributes & XIH_PH_ATTRB_DEST_CPU_MASK) + == XIH_PH_ATTRB_DEST_CPU_A53_2) { + PartitionFlags |= XIH_PART_FLAGS_DEST_CPU_A53_2; + } + else { + PartitionFlags |= XIH_PART_FLAGS_DEST_CPU_A53_3; + } /* Insert magic string */ if (EntryCount == 0) diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.h b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.h index 3afb606c..2f72a0ed 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.h +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_image_header.h @@ -141,7 +141,6 @@ extern "C" { #define XIH_PH_ATTRB_A53_EXEC_ST_MASK (0x0008U) #define XIH_PH_ATTRB_TARGET_EL_MASK (0x0006U) #define XIH_PH_ATTRB_TR_SECURE_MASK (0x0001U) -#define XIH_PH_ATTRB_DEST_CPU_A53_MASK (0x0600U) /** * Partition Attribute Values @@ -183,15 +182,20 @@ extern "C" { * ENDIAN 1 18 17 right * SECURE 2 0 2 left * EL 3:4 1:2 2 left - * CPU_A53 5:6 9:10 4 right + * CPU_A53 5:6 8:10 */ #define XIH_ATTRB_A53_EXEC_ST_SHIFT_DIFF (3U) #define XIH_ATTRB_ENDIAN_SHIFT_DIFF (17U) #define XIH_ATTRB_TR_SECURE_SHIFT_DIFF (2U) #define XIH_ATTRB_TARGET_EL_SHIFT_DIFF (2U) -#define XIH_ATTRB_DEST_CPU_A53_SHIFT_DIFF (4U) +#define XIH_PART_FLAGS_DEST_CPU_A53_MASK (0x60U) +#define XIH_PART_FLAGS_DEST_CPU_A53_0 (0x00U) +#define XIH_PART_FLAGS_DEST_CPU_A53_1 (0x20U) +#define XIH_PART_FLAGS_DEST_CPU_A53_2 (0x40U) +#define XIH_PART_FLAGS_DEST_CPU_A53_3 (0x60U) + /* Number of entries possible in ATF: 4 cores * 2 (secure, nonsecure) */ #define XFSBL_MAX_ENTRIES_FOR_ATF 8 @@ -286,7 +290,8 @@ __inline u32 XFsbl_GetA53ExecState( /************************** Function Prototypes ******************************/ u32 XFsbl_ValidateChecksum(u32 Buffer[], u32 Length); u32 XFsbl_ReadImageHeader(XFsblPs_ImageHeader * ImageHeader, - XFsblPs_DeviceOps * DeviceOps, u32 FlashImageOffsetAddress); + XFsblPs_DeviceOps * DeviceOps, u32 FlashImageOffsetAddress, + u32 RunningCpu); u32 XFsbl_ValidateImageHeader(XFsblPs_ImageHeaderTable * ImageHeaderTable); u32 XFsbl_ValidatePartitionHeader(XFsblPs_PartitionHeader * PartitionHeader, u32 RunningCpu); diff --git a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_initialization.c b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_initialization.c index 36bed682..2270f40b 100644 --- a/lib/sw_apps/zynqmp_fsbl/src/xfsbl_initialization.c +++ b/lib/sw_apps/zynqmp_fsbl/src/xfsbl_initialization.c @@ -646,7 +646,8 @@ static u32 XFsbl_ValidateHeader(XFsblPs * FsblInstancePtr) */ Status = XFsbl_ReadImageHeader(&FsblInstancePtr->ImageHeader, &FsblInstancePtr->DeviceOps, - FlashImageOffsetAddress); + FlashImageOffsetAddress, + FsblInstancePtr->ProcessorID); if (XFSBL_SUCCESS != Status) { goto END; }