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:
parent
0133313ae5
commit
64e5e95917
3 changed files with 44 additions and 9 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue