Hi Leif,

Thanks so much for merging it.

Happy Holidays!

Best regards,
Nhi

On 17/12/2021 22:56, Leif Lindholm wrote:
Hi Nhi,

I have now pushed this patch as c63a10ecb7d6, and will get back to the
rest of the Altra port.

/
     Leif

On Thu, Sep 09, 2021 at 00:02:36 +0700, Nhi Pham wrote:
Thanks Abner.

I will correct the description for the function AcpiLocateTableBySignature
in the v3.

Best regards,
Nhi

On 08/09/2021 11:53, Chang, Abner (HPS SW/FW Technologist) wrote:
After below comments are addressed,

Reviewed-by: Abner Chang <abner.ch...@hpe.com>

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Nhi Pham via groups.io
Sent: Friday, September 3, 2021 11:44 PM
To: devel@edk2.groups.io
Cc: patc...@amperecomputing.com; Nhi Pham
<n...@os.amperecomputing.com>; Leif Lindholm <l...@nuviainc.com>; Ard
Biesheuvel <ardb+tianoc...@kernel.org>; Chang, Abner (HPS SW/FW
Technologist) <abner.ch...@hpe.com>; Schaefer, Daniel
<daniel.schae...@hpe.com>
Subject: [edk2-devel] [PATCH v2 1/1] EmbeddedPkg/AcpiLib: Add more
helper functions

This adds more helper functions that assist in calculating the checksum,
locating an ACPI table by signature, and updating an AML integer object.

Cc: Leif Lindholm <l...@nuviainc.com>
Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org>
Cc: Abner Chang <abner.ch...@hpe.com>
Cc: Daniel Schaefer <daniel.schae...@hpe.com>
Signed-off-by: Nhi Pham <n...@os.amperecomputing.com>
---
Changes since v1:
+ Add copyright [Abner]
+ Improve the AcpiLocateTableBySignature function to remove the caution
for the usage of SSDT table. [Abner]
+ AcpiAmlObjectUpdateInteger: Use the AcpiSdtProtocol->SetOption to
update
the value of data object. [Abner]

   EmbeddedPkg/Library/AcpiLib/AcpiLib.inf |   3 +
   EmbeddedPkg/Include/Library/AcpiLib.h   |  69 +++++++
   EmbeddedPkg/Library/AcpiLib/AcpiLib.c   | 214 ++++++++++++++++++++
   3 files changed, 286 insertions(+)

diff --git a/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf
b/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf
index 538fe09cca29..01b12c9423a9 100644
--- a/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf
+++ b/EmbeddedPkg/Library/AcpiLib/AcpiLib.inf
@@ -1,6 +1,7 @@
   #/** @file
   #
   #  Copyright (c) 2014, ARM Ltd. All rights reserved.
+#  Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
   #
   #  SPDX-License-Identifier: BSD-2-Clause-Patent
   #
@@ -23,6 +24,8 @@ [Packages]
     EmbeddedPkg/EmbeddedPkg.dec

   [LibraryClasses]
+  BaseLib
+  BaseMemoryLib
     DebugLib
     UefiBootServicesTableLib

diff --git a/EmbeddedPkg/Include/Library/AcpiLib.h
b/EmbeddedPkg/Include/Library/AcpiLib.h
index c142446d9d59..933582b7f607 100644
--- a/EmbeddedPkg/Include/Library/AcpiLib.h
+++ b/EmbeddedPkg/Include/Library/AcpiLib.h
@@ -2,6 +2,7 @@
     Helper Library for ACPI

     Copyright (c) 2014-2016, ARM Ltd. All rights reserved.
+  Copyright (c) 2021, Ampere Computing LLC. All rights reserved.

     SPDX-License-Identifier: BSD-2-Clause-Patent

@@ -13,6 +14,7 @@
   #include <Uefi.h>

   #include <IndustryStandard/Acpi10.h>
+#include <Protocol/AcpiSystemDescriptionTable.h>

   //
   // Macros for the Generic Address Space
@@ -128,4 +130,71 @@ LocateAndInstallAcpiFromFv (
     IN CONST EFI_GUID* AcpiFile
     );

+/**
+  This function calculates and updates a UINT8 checksum
+  in an ACPI description table header.
+
+  @param  Buffer          Pointer to buffer to checksum
+  @param  Size            Number of bytes to checksum
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.
+
+**/
+EFI_STATUS
+EFIAPI
+AcpiUpdateChecksum (
+  IN OUT  UINT8      *Buffer,
+  IN      UINTN      Size
+  );
+
+/**
+  This function uses the ACPI SDT protocol to locate an ACPI table
+  with a given signature that only have a single instance.
+
+  @param  AcpiTableSdtProtocol    Pointer to ACPI SDT protocol.
+  @param  TableSignature          ACPI table signature.
+  @param  Index                   The zero-based index of the table where to
search the table.
+  @param  Table                   Pointer to the table.
+  @param  TableKey                Pointer to the table key.
+
+  @return EFI_SUCCESS             The function completed successfully.
+  @return EFI_INVALID_PARAMETER   At least one of parameters is invalid.
+  @retval EFI_NOT_FOUND           The requested index is too large and a
table was not found.
+
+**/
+EFI_STATUS
+EFIAPI
+AcpiLocateTableBySignature (
+  IN      EFI_ACPI_SDT_PROTOCOL           *AcpiSdtProtocol,
+  IN      UINT32                          TableSignature,
+  IN OUT  UINTN                           *Index,
+  OUT     EFI_ACPI_DESCRIPTION_HEADER     **Table,
+  OUT     UINTN                           *TableKey
+  );
+
+/**
+  This function updates the integer value of an AML Object.
+
+  @param  AcpiTableSdtProtocol    Pointer to ACPI SDT protocol.
+  @param  TableHandle             Points to the table representing the starting
point
+                                  for the object path search.
+  @param  AsciiObjectPath         Pointer to the ACPI path of the object being
updated.
+  @param  Value                   New value to write to the object.
+
+  @return EFI_SUCCESS             The function completed successfully.
+  @return EFI_INVALID_PARAMETER   At least one of parameters is invalid
or the data type
+                                  of the ACPI object is not an integer value.
+  @retval EFI_NOT_FOUND           The object is not found with the given path.
+
+**/
+EFI_STATUS
+EFIAPI
+AcpiAmlObjectUpdateInteger (
+  IN  EFI_ACPI_SDT_PROTOCOL           *AcpiSdtProtocol,
+  IN  EFI_ACPI_HANDLE                 TableHandle,
+  IN  CHAR8                           *AsciiObjectPath,
+  IN  UINTN                           Value
+  );
+
   #endif // __ACPI_LIB_H__
diff --git a/EmbeddedPkg/Library/AcpiLib/AcpiLib.c
b/EmbeddedPkg/Library/AcpiLib/AcpiLib.c
index ff7d678433d5..393133f54381 100644
--- a/EmbeddedPkg/Library/AcpiLib/AcpiLib.c
+++ b/EmbeddedPkg/Library/AcpiLib/AcpiLib.c
@@ -1,6 +1,7 @@
   /** @file
   *
   *  Copyright (c) 2014-2015, ARM Limited. All rights reserved.
+*  Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
   *
   *  SPDX-License-Identifier: BSD-2-Clause-Patent
   *
@@ -9,9 +10,12 @@
   #include <Uefi.h>

   #include <Library/AcpiLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
   #include <Library/DebugLib.h>
   #include <Library/UefiBootServicesTableLib.h>

+#include <Protocol/AcpiSystemDescriptionTable.h>
   #include <Protocol/AcpiTable.h>
   #include <Protocol/FirmwareVolume2.h>

@@ -170,3 +174,213 @@ LocateAndInstallAcpiFromFv (
   {
     return LocateAndInstallAcpiFromFvConditional (AcpiFile, NULL);
   }
+
+/**
+  This function calculates and updates a UINT8 checksum
+  in an ACPI description table header.
+
+  @param  Buffer          Pointer to buffer to checksum
+  @param  Size            Number of bytes to checksum
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.
+
+**/
+EFI_STATUS
+EFIAPI
+AcpiUpdateChecksum (
+  IN OUT  UINT8      *Buffer,
+  IN      UINTN      Size
+  )
+{
+  UINTN ChecksumOffset;
+
+  if (Buffer == NULL || Size == 0) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER,
Checksum);
+
+  //
+  // Set checksum to 0 first
+  //
+  Buffer[ChecksumOffset] = 0;
+
+  //
+  // Update checksum value
+  //
+  Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Size);
+
+  return EFI_SUCCESS;
+}
+
+/**
+  This function uses the ACPI SDT protocol to locate an ACPI table
+  with a given signature that only have a single instance.
Is the description correct? I think this function can be used to search
the given signature which could have multiple instances, right?

+
+  @param  AcpiTableSdtProtocol    Pointer to ACPI SDT protocol.
+  @param  TableSignature          ACPI table signature.
+  @param  Index                   The zero-based index of the table where to
search the table.
Could you please mention that the index will be updated to the next instance
if the table is found with the matched TableSignature?


+  @param  Table                   Pointer to the table.
+  @param  TableKey                Pointer to the table key.
+
+  @return EFI_SUCCESS             The function completed successfully.
+  @return EFI_INVALID_PARAMETER   At least one of parameters is invalid.
+  @retval EFI_NOT_FOUND           The requested index is too large and a
table was not found.
+
+**/
+EFI_STATUS
+EFIAPI
+AcpiLocateTableBySignature (
+  IN      EFI_ACPI_SDT_PROTOCOL           *AcpiSdtProtocol,
+  IN      UINT32                          TableSignature,
+  IN OUT  UINTN                           *Index,
+  OUT     EFI_ACPI_DESCRIPTION_HEADER     **Table,
+  OUT     UINTN                           *TableKey
+  )
+{
+  EFI_STATUS              Status;
+  EFI_ACPI_SDT_HEADER     *TempTable;
+  EFI_ACPI_TABLE_VERSION  TableVersion;
+  UINTN                   TableIndex;
+
+  if (AcpiSdtProtocol == NULL
+      || Table == NULL
+      || TableKey == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = EFI_SUCCESS;
+
+  //
+  // Search for ACPI Table with matching signature
+  //
+  TableVersion = 0;
+  TableIndex = *Index;
+  while (!EFI_ERROR (Status)) {
+    Status = AcpiSdtProtocol->GetAcpiTable (
+                                TableIndex,
+                                &TempTable,
+                                &TableVersion,
+                                TableKey
+                                );
+    if (!EFI_ERROR (Status)) {
+      TableIndex++;
+
+      if (((EFI_ACPI_DESCRIPTION_HEADER *)TempTable)->Signature ==
TableSignature) {
+        *Table = (EFI_ACPI_DESCRIPTION_HEADER *)TempTable;
+        *Index = TableIndex;
+        break;
+      }
+    }
+  }
+
+  return Status;
+}
+
+/**
+  This function updates the integer value of an AML Object.
+
+  @param  AcpiTableSdtProtocol    Pointer to ACPI SDT protocol.
+  @param  TableHandle             Points to the table representing the starting
point
+                                  for the object path search.
+  @param  AsciiObjectPath         Pointer to the ACPI path of the object being
updated.
+  @param  Value                   New value to write to the object.
+
+  @return EFI_SUCCESS             The function completed successfully.
+  @return EFI_INVALID_PARAMETER   At least one of parameters is invalid
or the data type
+                                  of the ACPI object is not an integer value.
+  @retval EFI_NOT_FOUND           The object is not found with the given path.
+
+**/
+EFI_STATUS
+EFIAPI
+AcpiAmlObjectUpdateInteger (
+  IN  EFI_ACPI_SDT_PROTOCOL           *AcpiSdtProtocol,
+  IN  EFI_ACPI_HANDLE                 TableHandle,
+  IN  CHAR8                           *AsciiObjectPath,
+  IN  UINTN                           Value
+  )
+{
+  EFI_STATUS            Status;
+  EFI_ACPI_HANDLE       ObjectHandle;
+  EFI_ACPI_HANDLE       DataHandle;
+  EFI_ACPI_DATA_TYPE    DataType;
+  UINT8                 *Buffer;
+  UINTN                 BufferSize;
+  UINTN                 DataSize;
+
+  if (AcpiSdtProtocol == NULL || AsciiObjectPath == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  ObjectHandle = NULL;
+  Status = AcpiSdtProtocol->FindPath (TableHandle, AsciiObjectPath,
&ObjectHandle);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = AcpiSdtProtocol->GetOption (ObjectHandle, 0, &DataType, (VOID
*)&Buffer, &BufferSize);
+  if (EFI_ERROR (Status)) {
+    Status = EFI_NOT_FOUND;
+    goto Exit;
+  }
+  ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);
+  ASSERT (Buffer != NULL);
+
+  if (Buffer[0] != AML_NAME_OP) {
+    Status = EFI_NOT_FOUND;
+    goto Exit;
+  }
+
+  //
+  // Get handle of data object
+  //
+  DataHandle = NULL;
+  Status = AcpiSdtProtocol->GetChild (ObjectHandle, &DataHandle);
+  ASSERT_EFI_ERROR (Status);
+
+  Status = AcpiSdtProtocol->GetOption (DataHandle, 0, &DataType, (VOID
Ok, that is fine to use 0 as you mentioned AML_OP_PARSE_INDEX_GET_OPCODE was 
defined privately. The better way
is to define this in EmbeddedPkg/Library/AcpiLib.h. Sorry I don't have chance 
to reply your last mail.

Abner

*)&Buffer, &BufferSize);
+  ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);
+  ASSERT (Buffer != NULL);
+
+  if (Buffer[0] == AML_ZERO_OP || Buffer[0] == AML_ONE_OP) {
+    Status = AcpiSdtProtocol->SetOption (DataHandle, 0, (VOID *)&Value,
sizeof (UINT8));
+    ASSERT_EFI_ERROR (Status);
+  } else {
+    //
+    // Check the size of data object
+    //
+    switch (Buffer[0]) {
+    case AML_BYTE_PREFIX:
+      DataSize = sizeof (UINT8);
+      break;
+
+    case AML_WORD_PREFIX:
+      DataSize = sizeof (UINT16);
+      break;
+
+    case AML_DWORD_PREFIX:
+      DataSize = sizeof (UINT32);
+      break;
+
+    case AML_QWORD_PREFIX:
+      DataSize = sizeof (UINT64);
+      break;
+
+    default:
+      // The data type of the ACPI object is not an integer
+      Status = EFI_INVALID_PARAMETER;
+      goto Exit;
+    }
+
+    Status = AcpiSdtProtocol->SetOption (DataHandle, 1, (VOID *)&Value,
DataSize);
+    ASSERT_EFI_ERROR (Status);
+  }
+
+Exit:
+  AcpiSdtProtocol->Close (DataHandle);
+  AcpiSdtProtocol->Close (ObjectHandle);
+
+  return Status;
+}
--
2.17.1







-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#85091): https://edk2.groups.io/g/devel/message/85091
Mute This Topic: https://groups.io/mt/85354717/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to