/** @file This is the driver that initializes the Intel System Agent. Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SaInitDxe.h" #include "SaInit.h" #include #include /** SystemAgent Dxe Initialization. @param[in] ImageHandle Handle for the image of this driver @param[in] SystemTable Pointer to the EFI System Table @retval EFI_SUCCESS The function completed successfully @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate **/ EFI_STATUS EFIAPI SaInitEntryPointDxe ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; VOID *Registration; DEBUG ((DEBUG_INFO, "SaInitDxe Start\n")); Status = SaAcpiInit (ImageHandle); /// /// Create PCI Enumeration Completed callback for SA /// EfiCreateProtocolNotifyEvent ( &gEfiPciEnumerationCompleteProtocolGuid, TPL_CALLBACK, SaPciEnumCompleteCallback, NULL, &Registration ); DEBUG ((DEBUG_INFO, "SaInitDxe End\n")); return EFI_SUCCESS; } /** This function gets registered as a callback to perform SA initialization before EndOfDxe @param[in] Event - A pointer to the Event that triggered the callback. @param[in] Context - A pointer to private data registered with the callback function. **/ VOID EFIAPI SaPciEnumCompleteCallback ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; VOID *ProtocolPointer; DEBUG ((DEBUG_INFO, "SaPciEnumCompleteCallback Start\n")); /// /// Check if this is first time called by EfiCreateProtocolNotifyEvent() or not, /// if it is, we will skip it until real event is triggered /// Status = gBS->LocateProtocol (&gEfiPciEnumerationCompleteProtocolGuid, NULL, (VOID **) &ProtocolPointer); if (EFI_SUCCESS != Status) { return; } gBS->CloseEvent (Event); UpdateDmarEndOfDxe (); return; }