diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf index 055f3ad0ee..8e98053994 100644 --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf @@ -57,10 +57,10 @@ [Protocols] gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED - gEfiPciEnumerationCompleteProtocolGuid # PROTOCOL SOMETIMES_CONSUMED [Guids] gEfiXenInfoGuid + gRootBridgesConnectedEventGroupGuid [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile diff --git a/OvmfPkg/AcpiPlatformDxe/EntryPoint.c b/OvmfPkg/AcpiPlatformDxe/EntryPoint.c index d713b0d44b..1bfd31a037 100644 --- a/OvmfPkg/AcpiPlatformDxe/EntryPoint.c +++ b/OvmfPkg/AcpiPlatformDxe/EntryPoint.c @@ -13,7 +13,7 @@ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include +#include #include "AcpiPlatform.h" STATIC @@ -38,14 +38,15 @@ FindAcpiTableProtocol ( STATIC VOID EFIAPI -OnPciEnumerated ( +OnRootBridgesConnected ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; - DEBUG ((EFI_D_INFO, "%a: PCI enumeration complete, installing ACPI tables\n", + DEBUG ((EFI_D_INFO, + "%a: root bridges have been connected, installing ACPI tables\n", __FUNCTION__)); Status = InstallAcpiTables (FindAcpiTableProtocol ()); if (EFI_ERROR (Status)) { @@ -63,9 +64,7 @@ AcpiPlatformEntryPoint ( ) { EFI_STATUS Status; - VOID *Interface; - EFI_EVENT PciEnumerated; - VOID *Registration; + EFI_EVENT RootBridgesConnected; // // If the platform doesn't support PCI, or PCI enumeration has been disabled, @@ -79,36 +78,17 @@ AcpiPlatformEntryPoint ( } // - // Similarly, if PCI enumeration has already completed, install the tables - // immediately. + // Otherwise, delay installing the ACPI tables until root bridges are + // connected. The entry point's return status will only reflect the callback + // setup. (Note that we're a DXE_DRIVER; our entry point function is invoked + // strictly before BDS is entered and can connect the root bridges.) // - Status = gBS->LocateProtocol (&gEfiPciEnumerationCompleteProtocolGuid, - NULL /* Registration */, &Interface); + Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, + OnRootBridgesConnected, NULL /* Context */, + &gRootBridgesConnectedEventGroupGuid, &RootBridgesConnected); if (!EFI_ERROR (Status)) { - DEBUG ((EFI_D_INFO, "%a: PCI enumeration already complete, " - "installing ACPI tables\n", __FUNCTION__)); - return InstallAcpiTables (FindAcpiTableProtocol ()); - } - ASSERT (Status == EFI_NOT_FOUND); - - // - // Otherwise, delay installing the ACPI tables until PCI enumeration - // completes. The entry point's return status will only reflect the callback - // setup. - // - Status = gBS->CreateEvent (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, OnPciEnumerated, - NULL /* Context */, &PciEnumerated); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->RegisterProtocolNotify ( - &gEfiPciEnumerationCompleteProtocolGuid, PciEnumerated, - &Registration); - if (EFI_ERROR (Status)) { - gBS->CloseEvent (PciEnumerated); - } else { - DEBUG ((EFI_D_INFO, "%a: PCI enumeration pending, registered callback\n", + DEBUG ((EFI_D_INFO, + "%a: waiting for root bridges to be connected, registered callback\n", __FUNCTION__)); } diff --git a/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpiPlatformDxe.inf b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpiPlatformDxe.inf index 22ce165852..c073b2a47e 100644 --- a/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpiPlatformDxe.inf +++ b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpiPlatformDxe.inf @@ -47,7 +47,9 @@ [Protocols] gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED - gEfiPciEnumerationCompleteProtocolGuid # PROTOCOL SOMETIMES_CONSUMED + +[Guids] + gRootBridgesConnectedEventGroupGuid [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration