/** @file This driver will register two callbacks to call fsp's notifies. Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php. THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #include #include #include #include #include #include #include #include #include #include #include /** 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 ) { 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 ; } Status = BoardInitAfterPciEnumeration (); ASSERT_EFI_ERROR(Status); TestPointPciEnumerationDonePciBusMasterDisabled (); TestPointPciEnumerationDonePciResourceAllocated (); } /** This stage is notified when system exists platform manufacture authentication. @param Event Event whose notification function is being invoked. @param Context Pointer to the notification function's context, which is always zero in current implementation. **/ VOID EFIAPI OnEndOfDxe ( IN EFI_EVENT Event, IN VOID *Context ) { gBS->CloseEvent (Event); TestPointEndOfDxeNoThirdPartyPciOptionRom (); TestPointEndOfDxeDmaAcpiTableFunctional (); TestPointEndOfDxeDmaProtectionEnabled (); } /** SmmReadyToLock 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 OnDxeSmmReadyToLock ( IN EFI_EVENT Event, IN VOID *Context ) { 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 ( &gEfiDxeSmmReadyToLockProtocolGuid, NULL, &Interface ); if (EFI_ERROR (Status)) { return ; } TestPointDxeSmmReadyToLockSmramAligned (); TestPointDxeSmmReadyToLockWsmtTableFunctional (); } /** Notification function of EVT_GROUP_READY_TO_BOOT event group. It runs after most ReadyToBoot event signaled. 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 OnReadyToBootLater ( IN EFI_EVENT Event, IN VOID *Context ) { DEBUG ((DEBUG_INFO, "OnReadyToBootLater\n")); gBS->CloseEvent (Event); TestPointReadyToBootMemoryTypeInformationFunctional (); TestPointReadyToBootUefiMemoryAttributeTableFunctional (); TestPointReadyToBootUefiBootVariableFunctional (); TestPointReadyToBootUefiConsoleVariableFunctional (); TestPointReadyToBootHstiTableFunctional (); TestPointReadyToBootAcpiTableFunctional (); TestPointReadyToBootGcdResourceFunctional (); TestPointDxeSmmReadyToBootSmiHandlerInstrument (); TestPointDxeSmmReadyToBootSmmPageProtection (); TestPointReadyToBootUefiSecureBootEnabled (); TestPointReadyToBootPiSignedFvBootEnabled (); TestPointReadyToBootTcgTrustedBootEnabled (); TestPointReadyToBootTcgMorEnabled (); TestPointReadyToBootEsrtTableFunctional (); } /** 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 ) { EFI_STATUS Status; EFI_EVENT ReadyToBootLaterEvent; DEBUG ((DEBUG_INFO, "OnReadyToBoot\n")); gBS->CloseEvent (Event); Status = BoardInitReadyToBoot (); ASSERT_EFI_ERROR(Status); Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, OnReadyToBootLater, NULL, &ReadyToBootLaterEvent ); ASSERT_EFI_ERROR (Status); gBS->SignalEvent (ReadyToBootLaterEvent); } /** This stage is notified just before the firmware/Preboot environment transfers management of all system resources to the OS or next level execution environment. @param Event Event whose notification function is being invoked. @param Context Pointer to the notification function's context, which is always zero in current implementation. **/ VOID EFIAPI OnEndOfFirmware ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; gBS->CloseEvent (Event); Status = BoardInitEndOfFirmware (); ASSERT_EFI_ERROR(Status); TestPointExitBootServices (); } /** Main entry for the FSP DXE module. This routine registers two callbacks to call fsp's notifies. @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @retval EFI_SUCCESS The entry point is executed successfully. @retval other Some error occurs when executing this entry point. **/ EFI_STATUS BoardNotificationInitEntryPoint ( VOID ) { EFI_STATUS Status; EFI_EVENT ReadyToBootEvent; VOID *Registration; EFI_EVENT ProtocolNotifyEvent; EFI_EVENT ExitBootServicesEvent; EFI_EVENT EndOfDxeEvent; VOID *SmmReadyToLockRegistration; EFI_EVENT SmmReadyToLockEvent; ProtocolNotifyEvent = EfiCreateProtocolNotifyEvent ( &gEfiPciEnumerationCompleteProtocolGuid, TPL_CALLBACK, OnPciEnumerationComplete, NULL, &Registration ); ASSERT (ProtocolNotifyEvent != NULL); Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, OnEndOfDxe, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent ); ASSERT_EFI_ERROR (Status); SmmReadyToLockEvent = EfiCreateProtocolNotifyEvent ( &gEfiDxeSmmReadyToLockProtocolGuid, TPL_CALLBACK, OnDxeSmmReadyToLock, NULL, &SmmReadyToLockRegistration ); ASSERT (SmmReadyToLockEvent != NULL); Status = EfiCreateEventReadyToBootEx ( TPL_CALLBACK, OnReadyToBoot, NULL, &ReadyToBootEvent ); ASSERT_EFI_ERROR (Status); Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, OnEndOfFirmware, NULL, &gEfiEventExitBootServicesGuid, &ExitBootServicesEvent ); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; } /** Initialize DXE Platform. @param[in] ImageHandle Image handle of this driver. @param[in] SystemTable Global system service table. @retval EFI_SUCCESS Initialization complete. @exception EFI_UNSUPPORTED The chipset is unsupported by this driver. @retval EFI_OUT_OF_RESOURCES Do not have enough resources to initialize the driver. @retval EFI_DEVICE_ERROR Device error, driver exits abnormally. **/ EFI_STATUS EFIAPI PlatformInitDxeEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { BoardNotificationInitEntryPoint (); return EFI_SUCCESS; }