/** * * @param * * @return * * @note * * *****************************************************************************/ static void XFsbl_FiqHandler (void) { XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_FIQ_EXCEPTION\n\r"); XFsbl_ErrorLockDown(XFSBL_ERROR_FIQ_EXCEPTION); }
/** * * @param * * @return * * @note * * *****************************************************************************/ static void XFsbl_DataAbortHandler (void) { XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_DATA_ABORT_EXCEPTION\n\r"); XFsbl_ErrorLockDown(XFSBL_ERROR_DATA_ABORT_EXCEPTION); }
/** * * @param * * @return * * @note * * *****************************************************************************/ static void XFsbl_UndefHandler (void) { XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_UNDEFINED_EXCEPTION\n\r"); XFsbl_ErrorLockDown(XFSBL_ERROR_UNDEFINED_EXCEPTION); }
/** * * @param * * @return * * @note * *****************************************************************************/ static void XFsbl_PreFetchAbortHandler (void) { XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_PREFETCH_ABORT_EXCEPTION\n\r"); XFsbl_ErrorLockDown(XFSBL_ERROR_PREFETCH_ABORT_EXCEPTION); }
/** This is the FSBL main function and is implemented stage wise. * * @param None * * @return None * *****************************************************************************/ int main(void ) { /** * Local variables */ u32 FsblStatus = XFSBL_SUCCESS; u32 FsblStage = XFSBL_STAGE1; u32 PartitionNum=0U; u32 EarlyHandoff = FALSE; /** * Initialize globals. */ FsblInstancePtr.ErrorCode = FsblStatus; while (1) { switch (FsblStage) { case XFSBL_STAGE1: { /** * Initialize the system */ XFsbl_CfgInitialize(&FsblInstancePtr); FsblStatus = XFsbl_Initialize(&FsblInstancePtr); if (XFSBL_SUCCESS != FsblStatus) { FsblStatus += XFSBL_ERROR_STAGE_1; FsblStage = XFSBL_STAGE_ERR; } else { /** * * Include the code for FSBL time measurements * Initialize the global timer and get the value */ FsblStage = XFSBL_STAGE2; } }break; case XFSBL_STAGE2: { XFsbl_Printf(DEBUG_INFO, "================= In Stage 2 ============ \n\r"); /** * Primary Device * Secondary boot device * DeviceOps * image header * partition header */ FsblStatus = XFsbl_BootDeviceInitAndValidate(&FsblInstancePtr); if ( (XFSBL_SUCCESS != FsblStatus) && (XFSBL_STATUS_JTAG != FsblStatus) ) { XFsbl_Printf(DEBUG_GENERAL,"Boot Device " "Initialization failed 0x%0lx\n\r", FsblStatus); FsblStatus += XFSBL_ERROR_STAGE_2; FsblStage = XFSBL_STAGE_ERR; } else if (XFSBL_STATUS_JTAG == FsblStatus) { /** * This is JTAG boot mode, go to the handoff stage */ FsblStage = XFSBL_STAGE4; } else { XFsbl_Printf(DEBUG_INFO,"Initialization Success \n\r"); /** * Start the partition loading from 1 * 0th partition will be FSBL */ PartitionNum = 0x1U; FsblStage = XFSBL_STAGE3; } } break; case XFSBL_STAGE3: { XFsbl_Printf(DEBUG_INFO, "======= In Stage 3, Partition No:%d ======= \n\r", PartitionNum); /** * Load the partitions * image header * partition header * partition parameters */ FsblStatus = XFsbl_PartitionLoad(&FsblInstancePtr, PartitionNum); if (XFSBL_SUCCESS != FsblStatus) { /** * Error */ XFsbl_Printf(DEBUG_GENERAL,"Partition %d Load Failed, 0x%0lx\n\r", PartitionNum, FsblStatus); FsblStatus += XFSBL_ERROR_STAGE_3; FsblStage = XFSBL_STAGE_ERR; } else { XFsbl_Printf(DEBUG_INFO,"Partition %d Load Success \n\r", PartitionNum); /** * Check loading all partitions is completed */ FsblStatus = XFsbl_CheckEarlyHandoff(&FsblInstancePtr, PartitionNum); if (PartitionNum < (FsblInstancePtr.ImageHeader.ImageHeaderTable.NoOfPartitions-1U)) { if (TRUE == FsblStatus) { EarlyHandoff = TRUE; FsblStage = XFSBL_STAGE4; } else { /** * No need to change the Fsbl Stage * Load the next partition */ PartitionNum++; } } else { /** * No more partitions present, go to handoff stage */ XFsbl_Printf(DEBUG_INFO,"All Partitions Loaded \n\r"); FsblStage = XFSBL_STAGE4; EarlyHandoff = FsblStatus; } } /* End of else loop for Load Success */ } break; case XFSBL_STAGE4: { XFsbl_Printf(DEBUG_INFO, "================= In Stage 4 ============ \n\r"); /** * Handoff to the applications * Handoff address * xip * ps7 post config */ FsblStatus = XFsbl_Handoff(&FsblInstancePtr, PartitionNum, EarlyHandoff); if (XFSBL_STATUS_CONTINUE_PARTITION_LOAD == FsblStatus) { XFsbl_Printf(DEBUG_INFO,"Early handoff to a application complete \n\r"); XFsbl_Printf(DEBUG_INFO,"Continuing to load remaining partitions \n\r"); PartitionNum++; FsblStage = XFSBL_STAGE3; } else if (XFSBL_STATUS_CONTINUE_OTHER_HANDOFF == FsblStatus) { XFsbl_Printf(DEBUG_INFO,"Early handoff to a application complete \n\r"); XFsbl_Printf(DEBUG_INFO,"Continuing handoff to other applications, if present \n\r"); EarlyHandoff = FALSE; } else if (XFSBL_SUCCESS != FsblStatus) { /** * Error */ XFsbl_Printf(DEBUG_GENERAL,"Handoff Failed 0x%0lx\n\r", FsblStatus); FsblStatus += XFSBL_ERROR_STAGE_4; FsblStage = XFSBL_STAGE_ERR; } else { /** * we should never be here */ FsblStage = XFSBL_STAGE_DEFAULT; } } break; case XFSBL_STAGE_ERR: { XFsbl_Printf(DEBUG_INFO, "================= In Stage Err ============ \n\r"); XFsbl_ErrorLockDown(FsblStatus); /** * we should never be here */ FsblStage = XFSBL_STAGE_DEFAULT; }break; case XFSBL_STAGE_DEFAULT: default: { /** * we should never be here */ XFsbl_Printf(DEBUG_GENERAL,"In default stage: " "We should never be here \n\r"); /** * Exit FSBL */ XFsbl_HandoffExit(0U, XFSBL_NO_HANDOFFEXIT); }break; } /* End of switch(FsblStage) */ } /* End of while(1) */ /** * We should never be here */ XFsbl_Printf(DEBUG_GENERAL,"In default stage: " "We should never be here \n\r"); /** * Exit FSBL */ XFsbl_HandoffExit(0U, XFSBL_NO_HANDOFFEXIT); return 0; }