DynamicTablesPkg: Add AddSsdtAcpiHeader()

To fetch the Oem information from the ConfigurationManagerProtocol
and the AcpiTableInfo, and populate the SSDT ACPI header when
creating a RootNode via the AmlLib, create AddSsdtAcpiHeader().

Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
This commit is contained in:
Pierre Gondois 2021-10-08 15:46:14 +01:00 committed by mergify[bot]
parent 25cf58a163
commit bfaf7c8b9e
2 changed files with 122 additions and 0 deletions

View File

@ -12,6 +12,8 @@
#ifndef TABLE_HELPER_LIB_H_
#define TABLE_HELPER_LIB_H_
#include <Library/AmlLib/AmlLib.h>
/** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO
object from the Configuration Manager.
@ -62,6 +64,39 @@ AddAcpiHeader (
IN CONST UINT32 Length
);
/** Build a RootNode containing SSDT ACPI header information using the AmlLib.
The function utilizes the ACPI table Generator and the Configuration
Manager protocol to obtain any information required for constructing the
header. It then creates a RootNode. The SSDT ACPI header is part of the
RootNode.
This is essentially a wrapper around AmlCodeGenDefinitionBlock ()
from the AmlLib.
@param [in] CfgMgrProtocol Pointer to the Configuration Manager
protocol interface.
@param [in] Generator Pointer to the ACPI table Generator.
@param [in] AcpiTableInfo Pointer to the ACPI table info structure.
@param [out] RootNode If success, contains the created RootNode.
The SSDT ACPI header is part of the RootNode.
@retval EFI_SUCCESS Success.
@retval EFI_INVALID_PARAMETER A parameter is invalid.
@retval EFI_NOT_FOUND The required object information is not found.
@retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration
Manager is less than the Object size for the
requested object.
**/
EFI_STATUS
EFIAPI
AddSsdtAcpiHeader (
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,
IN CONST ACPI_TABLE_GENERATOR * CONST Generator,
IN CONST CM_STD_OBJ_ACPI_TABLE_INFO * CONST AcpiTableInfo,
OUT AML_ROOT_NODE_HANDLE * RootNode
);
/**
Function prototype for testing if two arbitrary objects are equal.

View File

@ -185,6 +185,93 @@ error_handler:
return Status;
}
/** Build a RootNode containing SSDT ACPI header information using the AmlLib.
The function utilizes the ACPI table Generator and the Configuration
Manager protocol to obtain any information required for constructing the
header. It then creates a RootNode. The SSDT ACPI header is part of the
RootNode.
This is essentially a wrapper around AmlCodeGenDefinitionBlock ()
from the AmlLib.
@param [in] CfgMgrProtocol Pointer to the Configuration Manager
protocol interface.
@param [in] Generator Pointer to the ACPI table Generator.
@param [in] AcpiTableInfo Pointer to the ACPI table info structure.
@param [out] RootNode If success, contains the created RootNode.
The SSDT ACPI header is part of the RootNode.
@retval EFI_SUCCESS Success.
@retval EFI_INVALID_PARAMETER A parameter is invalid.
@retval EFI_NOT_FOUND The required object information is not found.
@retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration
Manager is less than the Object size for the
requested object.
**/
EFI_STATUS
EFIAPI
AddSsdtAcpiHeader (
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,
IN CONST ACPI_TABLE_GENERATOR * CONST Generator,
IN CONST CM_STD_OBJ_ACPI_TABLE_INFO * CONST AcpiTableInfo,
OUT AML_ROOT_NODE_HANDLE * RootNode
)
{
EFI_STATUS Status;
UINT64 OemTableId;
UINT32 OemRevision;
CM_STD_OBJ_CONFIGURATION_MANAGER_INFO * CfgMfrInfo;
ASSERT (CfgMgrProtocol != NULL);
ASSERT (Generator != NULL);
ASSERT (AcpiTableInfo != NULL);
if ((CfgMgrProtocol == NULL) ||
(Generator == NULL) ||
(AcpiTableInfo == NULL)) {
return EFI_INVALID_PARAMETER;
}
Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"ERROR: Failed to get Configuration Manager info. Status = %r\n",
Status
));
return Status;
}
if (AcpiTableInfo->OemTableId != 0) {
OemTableId = AcpiTableInfo->OemTableId;
} else {
OemTableId = SIGNATURE_32 (
CfgMfrInfo->OemId[0],
CfgMfrInfo->OemId[1],
CfgMfrInfo->OemId[2],
CfgMfrInfo->OemId[3]
) |
((UINT64)Generator->AcpiTableSignature << 32);
}
if (AcpiTableInfo->OemRevision != 0) {
OemRevision = AcpiTableInfo->OemRevision;
} else {
OemRevision = CfgMfrInfo->Revision;
}
Status = AmlCodeGenDefinitionBlock (
"SSDT",
(CONST CHAR8*)&CfgMfrInfo->OemId,
(CONST CHAR8*)&OemTableId,
OemRevision,
RootNode
);
ASSERT_EFI_ERROR (Status);
return Status;
}
/**
Test and report if a duplicate entry exists in the given array of comparable
elements.