/** @file | |
The boot services environment configuration library for the ACPI Parameter Buffer Sample PRM module. | |
Copyright (c) Microsoft Corporation | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <Library/BaseLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Protocol/PrmConfig.h> | |
STATIC EFI_HANDLE mPrmConfigProtocolHandle; | |
// {dc2a58a6-5927-4776-b995-d118a27335a2} | |
STATIC CONST EFI_GUID mPrmModuleGuid = { | |
0xdc2a58a6, 0x5927, 0x4776, { 0xb9, 0x95, 0xd1, 0x18, 0xa2, 0x73, 0x35, 0xa2 } | |
}; | |
// {2e4f2d13-6240-4ed0-a401-c723fbdc34e8} | |
STATIC CONST EFI_GUID mCheckParamBufferPrmHandlerGuid = { | |
0x2e4f2d13, 0x6240, 0x4ed0, { 0xa4, 0x01, 0xc7, 0x23, 0xfb, 0xdc, 0x34, 0xe8 } | |
}; | |
/** | |
Constructor of the PRM configuration library. | |
@param[in] ImageHandle The image handle of the driver. | |
@param[in] SystemTable The EFI System Table pointer. | |
@retval EFI_SUCCESS The shell command handlers were installed successfully. | |
@retval EFI_UNSUPPORTED The shell level required was not found. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
AcpiParameterBufferModuleConfigLibConstructor ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
EFI_STATUS Status; | |
VOID *AcpiParameterBuffer; | |
ACPI_PARAMETER_BUFFER_DESCRIPTOR *AcpiParamBufferDescriptor; | |
PRM_CONFIG_PROTOCOL *PrmConfigProtocol; | |
AcpiParameterBuffer = NULL; | |
AcpiParamBufferDescriptor = NULL; | |
PrmConfigProtocol = NULL; | |
/* | |
In this sample PRM module, the protocol describing this sample module's resources is simply | |
installed in the constructor. | |
However, if some data is not available until later, this constructor could register a callback | |
on the dependency for the data to be available (e.g. ability to communicate with some device) | |
and then install the protocol. The requirement is that the protocol is installed before end of DXE. | |
*/ | |
// Allocate the ACPI parameter buffer | |
// A parameter buffer is arbitrary data that is handler specific. This handler buffer is specified | |
// to consist of a UINT32 that represents the test data signature ('T', 'E', 'S', 'T'). | |
AcpiParameterBuffer = AllocateRuntimeZeroPool (sizeof (UINT32)); | |
ASSERT (AcpiParameterBuffer != NULL); | |
if (AcpiParameterBuffer == NULL) { | |
Status = EFI_OUT_OF_RESOURCES; | |
goto Done; | |
} | |
// Allocate the ACPI Parameter Buffer Descriptor structure for a single PRM handler | |
AcpiParamBufferDescriptor = AllocateZeroPool (sizeof (*AcpiParamBufferDescriptor)); | |
ASSERT (AcpiParamBufferDescriptor != NULL); | |
if (AcpiParamBufferDescriptor == NULL) { | |
Status = EFI_OUT_OF_RESOURCES; | |
goto Done; | |
} | |
// Allocate the PRM Configuration protocol structure for this PRM module | |
PrmConfigProtocol = AllocateZeroPool (sizeof (*PrmConfigProtocol)); | |
ASSERT (PrmConfigProtocol != NULL); | |
if (PrmConfigProtocol == NULL) { | |
Status = EFI_OUT_OF_RESOURCES; | |
goto Done; | |
} | |
CopyGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, &mPrmModuleGuid); | |
// Populate the ACPI Parameter Buffer Descriptor structure | |
CopyGuid (&AcpiParamBufferDescriptor->HandlerGuid, &mCheckParamBufferPrmHandlerGuid); | |
AcpiParamBufferDescriptor->AcpiParameterBufferAddress = (UINT64)(UINTN)AcpiParameterBuffer; | |
// Populate the PRM Module Context Buffers structure | |
PrmConfigProtocol->ModuleContextBuffers.AcpiParameterBufferDescriptorCount = 1; | |
PrmConfigProtocol->ModuleContextBuffers.AcpiParameterBufferDescriptors = AcpiParamBufferDescriptor; | |
// | |
// Install the PRM Configuration Protocol for this module. This indicates the configuration | |
// library has completed resource initialization for the PRM module. | |
// | |
Status = gBS->InstallProtocolInterface ( | |
&mPrmConfigProtocolHandle, | |
&gPrmConfigProtocolGuid, | |
EFI_NATIVE_INTERFACE, | |
(VOID *)PrmConfigProtocol | |
); | |
Done: | |
if (EFI_ERROR (Status)) { | |
if (AcpiParameterBuffer != NULL) { | |
FreePool (AcpiParameterBuffer); | |
} | |
if (AcpiParamBufferDescriptor != NULL) { | |
FreePool (AcpiParamBufferDescriptor); | |
} | |
if (PrmConfigProtocol != NULL) { | |
FreePool (PrmConfigProtocol); | |
} | |
} | |
return Status; | |
} |