Hi Pierre, Thank you for this patch.
Reviewed-by: Sami Mujawar <[email protected]> Regards, Sami Mujawar On 07/10/2021 04:31 PM, [email protected] wrote:
From: Pierre Gondois <[email protected]> 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(). Signed-off-by: Pierre Gondois <[email protected]> --- .../Include/Library/TableHelperLib.h | 35 ++++++++ .../Common/TableHelperLib/TableHelper.c | 87 +++++++++++++++++++ 2 files changed, 122 insertions(+) diff --git a/DynamicTablesPkg/Include/Library/TableHelperLib.h b/DynamicTablesPkg/Include/Library/TableHelperLib.h index 6d362ff99a27..76f9e8c25fea 100644 --- a/DynamicTablesPkg/Include/Library/TableHelperLib.h +++ b/DynamicTablesPkg/Include/Library/TableHelperLib.h @@ -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. diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c index f98da7ffdd67..d92c82eac99e 100644 --- a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c @@ -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.
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#81674): https://edk2.groups.io/g/devel/message/81674 Mute This Topic: https://groups.io/mt/86148197/21656 Group Owner: [email protected] Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
