blob: 9cd48ae3dbe222dda76845c0910f9a0fbfe88b5b [file] [log] [blame]
/** @file
Dynamic Table Manager Dxe
Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Library/DebugLib.h>
#include <Library/UefiLib.h>
#include <Library/PcdLib.h>
#include <Library/UefiBootServicesTableLib.h>
// Module specific include files.
#include <AcpiTableGenerator.h>
#include <ConfigurationManagerObject.h>
#include <ConfigurationManagerHelper.h>
#include <DeviceTreeTableGenerator.h>
#include <Library/TableHelperLib.h>
#include <Library/MetadataHandlerLib.h>
#include <Protocol/ConfigurationManagerProtocol.h>
#include <Protocol/DynamicTableFactoryProtocol.h>
#include "DynamicTableManagerDxe.h"
STATIC VOID *mAcpiTableProtocolRegistration;
STATIC VOID *mSmbiosProtocolRegistration;
/** Entrypoint of Dynamic Table Manager Dxe.
The Dynamic Table Manager uses the Configuration Manager Protocol
to get the list of ACPI and SMBIOS tables to install. For each table
in the list it requests the corresponding ACPI/SMBIOS table factory for
a generator capable of building the ACPI/SMBIOS table.
If a suitable table generator is found, it invokes the generator interface
to build the table. The Dynamic Table Manager then installs the
table and invokes another generator interface to free any resources
allocated for building the table.
Since platforms may support generation of either ACPI or SMBIOS or both
tables, register for notification of the corresponding protocols being
ready and dispatch their table builds accordingly.
@param ImageHandle Handle to the image.
@param SystemTable Pointer to the system table.
@retval EFI_SUCCESS Success.
@retval EFI_OUT_OF_RESOURCES Memory allocation failed.
**/
EFI_STATUS
EFIAPI
DynamicTableManagerDxeInitialize (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_EVENT AcpiEvent;
EFI_EVENT SmbiosEvent;
AcpiEvent = EfiCreateProtocolNotifyEvent (
&gEfiAcpiTableProtocolGuid,
TPL_CALLBACK,
AcpiTableProtocolReady,
NULL,
&mAcpiTableProtocolRegistration
);
if (AcpiEvent == NULL) {
DEBUG ((
DEBUG_ERROR,
"Failed to register ACPI protocol notification event.\n"
));
return EFI_OUT_OF_RESOURCES;
}
SmbiosEvent = EfiCreateProtocolNotifyEvent (
&gEfiSmbiosProtocolGuid,
TPL_CALLBACK,
SmbiosProtocolReady,
NULL,
&mSmbiosProtocolRegistration
);
if (SmbiosEvent == NULL) {
DEBUG ((
DEBUG_ERROR,
"Failed to register SMBIOS protocol notification event.\n"
));
gBS->CloseEvent (AcpiEvent);
return EFI_OUT_OF_RESOURCES;
}
return EFI_SUCCESS;
}