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 <saratcha@xilinx.com>
This commit is contained in:
Sarat Chand Savitala 2015-07-02 18:49:38 +05:30 committed by Nava kishore Manne
parent 0133313ae5
commit 64e5e95917
3 changed files with 44 additions and 9 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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;
}