/** This function handles S3 resume task at the end of PEI @param[in] PeiServices Pointer to PEI Services Table. @param[in] NotifyDesc Pointer to the descriptor for the Notification event that caused this function to execute. @param[in] Ppi Pointer to the PPI data associated with this function. @retval EFI_STATUS Always return EFI_SUCCESS **/ EFI_STATUS EFIAPI S3EndOfPeiNotify ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc, IN VOID *Ppi ) { NOTIFY_PHASE_PARAMS NotifyPhaseParams; EFI_STATUS Status; FSP_INFO_HEADER *FspHeader; FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase)); if (FspHeader == NULL) { return EFI_DEVICE_ERROR; } DEBUG ((DEBUG_INFO, "S3EndOfPeiNotify enter\n")); NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration; Status = CallFspNotifyPhase (FspHeader, &NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration status: 0x%x\n", Status)); NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot; Status = CallFspNotifyPhase (FspHeader, &NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot status: 0x%x\n", Status)); return EFI_SUCCESS; }
/** This function handles S3 resume task at the end of PEI @param[in] PeiServices Pointer to PEI Services Table. @param[in] NotifyDesc Pointer to the descriptor for the Notification event that caused this function to execute. @param[in] Ppi Pointer to the PPI data associated with this function. @retval EFI_STATUS Always return EFI_SUCCESS **/ EFI_STATUS EFIAPI S3EndOfPeiNotify ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc, IN VOID *Ppi ) { NOTIFY_PHASE_PARAMS NotifyPhaseParams; FSP_STATUS FspStatus; FSP_INFO_HEADER *FspHeader; FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase)); if (FspHeader == NULL) { return EFI_DEVICE_ERROR; } NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration; FspStatus = CallFspNotifyPhase (FspHeader, &NotifyPhaseParams); if (FspStatus != FSP_SUCCESS) { DEBUG((DEBUG_ERROR, "FSP S3NotifyPhase AfterPciEnumeration failed, status: 0x%x\n", FspStatus)); } else { DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration Success.\n")); } NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot; FspStatus = CallFspNotifyPhase (FspHeader, &NotifyPhaseParams); if (FspStatus != FSP_SUCCESS) { DEBUG((DEBUG_ERROR, "FSP S3NotifyPhase ReadyToBoot failed, status: 0x%x\n", FspStatus)); } else { DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot Success.\n")); } return EFI_SUCCESS; }
/** This function handles S3 resume task at the end of PEI @param[in] PeiServices Pointer to PEI Services Table. @param[in] NotifyDesc Pointer to the descriptor for the Notification event that caused this function to execute. @param[in] Ppi Pointer to the PPI data associated with this function. @retval EFI_STATUS Always return EFI_SUCCESS **/ EFI_STATUS EFIAPI S3EndOfPeiNotify( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc, IN VOID *Ppi ) { NOTIFY_PHASE_PARAMS NotifyPhaseParams; EFI_STATUS Status; DEBUG((DEBUG_INFO, "S3EndOfPeiNotify enter\n")); NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration; Status = CallFspNotifyPhase (&NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration status: 0x%x\n", Status)); NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot; Status = CallFspNotifyPhase (&NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot status: 0x%x\n", Status)); NotifyPhaseParams.Phase = EnumInitPhaseEndOfFirmware; Status = CallFspNotifyPhase (&NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase EndOfFirmware status: 0x%x\n", Status)); return EFI_SUCCESS; }
/** This function handles S3 resume task at the end of PEI @param[in] PeiServices Pointer to PEI Services Table. @param[in] NotifyDesc Pointer to the descriptor for the Notification event that caused this function to execute. @param[in] Ppi Pointer to the PPI data associated with this function. @retval EFI_STATUS Always return EFI_SUCCESS **/ EFI_STATUS EFIAPI S3EndOfPeiNotify( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc, IN VOID *Ppi ) { NOTIFY_PHASE_PARAMS NotifyPhaseParams; EFI_STATUS Status; DEBUG((DEBUG_INFO, "S3EndOfPeiNotify enter\n")); NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration; Status = CallFspNotifyPhase (&NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration status: 0x%x\n", Status)); // // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status // if ((Status >= FSP_STATUS_RESET_REQUIRED_COLD) && (Status <= FSP_STATUS_RESET_REQUIRED_8)) { DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration requested reset 0x%x\n", Status)); CallFspWrapperResetSystem ((UINT32)Status); } NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot; Status = CallFspNotifyPhase (&NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot status: 0x%x\n", Status)); // // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status // if ((Status >= FSP_STATUS_RESET_REQUIRED_COLD) && (Status <= FSP_STATUS_RESET_REQUIRED_8)) { DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot requested reset 0x%x\n", Status)); CallFspWrapperResetSystem ((UINT32)Status); } NotifyPhaseParams.Phase = EnumInitPhaseEndOfFirmware; Status = CallFspNotifyPhase (&NotifyPhaseParams); DEBUG((DEBUG_INFO, "FSP S3NotifyPhase EndOfFirmware status: 0x%x\n", Status)); // // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status // if ((Status >= FSP_STATUS_RESET_REQUIRED_COLD) && (Status <= FSP_STATUS_RESET_REQUIRED_8)) { DEBUG((DEBUG_INFO, "FSP S3NotifyPhase EndOfFirmware requested reset 0x%x\n", Status)); CallFspWrapperResetSystem ((UINT32)Status); } return EFI_SUCCESS; }
/** PciEnumerationComplete Protocol notification event handler. @param[in] Event Event whose notification function is being invoked. @param[in] Context Pointer to the notification function's context. **/ VOID EFIAPI OnPciEnumerationComplete ( IN EFI_EVENT Event, IN VOID *Context ) { NOTIFY_PHASE_PARAMS NotifyPhaseParams; EFI_STATUS Status; VOID *Interface; // // Try to locate it because gEfiPciEnumerationCompleteProtocolGuid will trigger it once when registration. // Just return if it is not found. // Status = gBS->LocateProtocol ( &gEfiPciEnumerationCompleteProtocolGuid, NULL, &Interface ); if (EFI_ERROR (Status)) { return ; } NotifyPhaseParams.Phase = EnumInitPhaseAfterPciEnumeration; Status = CallFspNotifyPhase (mFspHeader, &NotifyPhaseParams); if (Status != EFI_SUCCESS) { DEBUG((DEBUG_ERROR, "FSP NotifyPhase AfterPciEnumeration failed, status: 0x%x\n", Status)); } else { DEBUG((DEBUG_INFO, "FSP NotifyPhase AfterPciEnumeration Success.\n")); } }
/** Notification function of EVT_GROUP_READY_TO_BOOT event group. This is a notification function registered on EVT_GROUP_READY_TO_BOOT event group. When the Boot Manager is about to load and execute a boot option, it reclaims variable storage if free size is below the threshold. @param[in] Event Event whose notification function is being invoked. @param[in] Context Pointer to the notification function's context. **/ VOID EFIAPI OnReadyToBoot ( IN EFI_EVENT Event, IN VOID *Context ) { NOTIFY_PHASE_PARAMS NotifyPhaseParams; EFI_STATUS Status; gBS->CloseEvent (Event); NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot; Status = CallFspNotifyPhase (mFspHeader, &NotifyPhaseParams); if (Status != EFI_SUCCESS) { DEBUG((DEBUG_ERROR, "FSP NotifyPhase ReadyToBoot failed, status: 0x%x\n", Status)); } else { DEBUG((DEBUG_INFO, "FSP NotifyPhase ReadyToBoot Success.\n")); } }