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]]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to