REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the DynamicTablesPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			341 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Table Helper
 | |
| 
 | |
|   Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #include <Protocol/AcpiTable.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| 
 | |
| // Module specific include files.
 | |
| #include <AcpiTableGenerator.h>
 | |
| #include <ConfigurationManagerObject.h>
 | |
| #include <Library/TableHelperLib.h>
 | |
| #include <Protocol/ConfigurationManagerProtocol.h>
 | |
| 
 | |
| /** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO
 | |
|     object from the Configuration Manager.
 | |
| 
 | |
|   @param [in]  CfgMgrProtocol Pointer to the Configuration Manager protocol
 | |
|                               interface.
 | |
|   @param [out] CfgMfrInfo     Pointer to the Configuration Manager Info
 | |
|                               object structure.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The object is returned.
 | |
|   @retval EFI_INVALID_PARAMETER The Object ID is invalid.
 | |
|   @retval EFI_NOT_FOUND         The requested Object is not found.
 | |
|   @retval EFI_BAD_BUFFER_SIZE   The size returned by the Configuration
 | |
|                                 Manager is less than the Object size.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| GetCgfMgrInfo (
 | |
|   IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL      *CONST  CfgMgrProtocol,
 | |
|   OUT       CM_STD_OBJ_CONFIGURATION_MANAGER_INFO             **CfgMfrInfo
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS         Status;
 | |
|   CM_OBJ_DESCRIPTOR  CmObjectDesc;
 | |
| 
 | |
|   ASSERT (CfgMgrProtocol != NULL);
 | |
|   ASSERT (CfgMfrInfo != NULL);
 | |
| 
 | |
|   *CfgMfrInfo = NULL;
 | |
|   Status      = CfgMgrProtocol->GetObject (
 | |
|                                   CfgMgrProtocol,
 | |
|                                   CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo),
 | |
|                                   CM_NULL_TOKEN,
 | |
|                                   &CmObjectDesc
 | |
|                                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     DEBUG ((
 | |
|       DEBUG_ERROR,
 | |
|       "ERROR: Failed to Get Configuration Manager Info. Status = %r\n",
 | |
|       Status
 | |
|       ));
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   if (CmObjectDesc.ObjectId != CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo)) {
 | |
|     DEBUG ((
 | |
|       DEBUG_ERROR,
 | |
|       "ERROR: EStdObjCfgMgrInfo: Invalid ObjectId = 0x%x, expected Id = 0x%x\n",
 | |
|       CmObjectDesc.ObjectId,
 | |
|       CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo)
 | |
|       ));
 | |
|     ASSERT (FALSE);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   if (CmObjectDesc.Size <
 | |
|       (sizeof (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO) * CmObjectDesc.Count))
 | |
|   {
 | |
|     DEBUG ((
 | |
|       DEBUG_ERROR,
 | |
|       "ERROR: EStdObjCfgMgrInfo: Buffer too small, size  = 0x%x\n",
 | |
|       CmObjectDesc.Size
 | |
|       ));
 | |
|     ASSERT (FALSE);
 | |
|     return EFI_BAD_BUFFER_SIZE;
 | |
|   }
 | |
| 
 | |
|   *CfgMfrInfo = (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO *)CmObjectDesc.Data;
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /** The AddAcpiHeader function updates the ACPI header structure pointed by
 | |
|     the AcpiHeader. It utilizes the ACPI table Generator and the Configuration
 | |
|     Manager protocol to obtain any information required for constructing the
 | |
|     header.
 | |
| 
 | |
|   @param [in]     CfgMgrProtocol Pointer to the Configuration Manager
 | |
|                                  protocol interface.
 | |
|   @param [in]     Generator      Pointer to the ACPI table Generator.
 | |
|   @param [in,out] AcpiHeader     Pointer to the ACPI table header to be
 | |
|                                  updated.
 | |
|   @param [in]     AcpiTableInfo  Pointer to the ACPI table info structure.
 | |
|   @param [in]     Length         Length of the ACPI table.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The ACPI table is updated successfully.
 | |
|   @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
 | |
| AddAcpiHeader (
 | |
|   IN      CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
 | |
|   IN      CONST ACPI_TABLE_GENERATOR                  *CONST  Generator,
 | |
|   IN OUT  EFI_ACPI_DESCRIPTION_HEADER                 *CONST  AcpiHeader,
 | |
|   IN      CONST CM_STD_OBJ_ACPI_TABLE_INFO            *CONST  AcpiTableInfo,
 | |
|   IN      CONST UINT32                                        Length
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                             Status;
 | |
|   CM_STD_OBJ_CONFIGURATION_MANAGER_INFO  *CfgMfrInfo;
 | |
| 
 | |
|   ASSERT (CfgMgrProtocol != NULL);
 | |
|   ASSERT (Generator != NULL);
 | |
|   ASSERT (AcpiHeader != NULL);
 | |
|   ASSERT (AcpiTableInfo != NULL);
 | |
|   ASSERT (Length >= sizeof (EFI_ACPI_DESCRIPTION_HEADER));
 | |
| 
 | |
|   if ((CfgMgrProtocol == NULL) ||
 | |
|       (Generator == NULL) ||
 | |
|       (AcpiHeader == NULL) ||
 | |
|       (AcpiTableInfo == NULL) ||
 | |
|       (Length < sizeof (EFI_ACPI_DESCRIPTION_HEADER))
 | |
|       )
 | |
|   {
 | |
|     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
 | |
|       ));
 | |
|     goto error_handler;
 | |
|   }
 | |
| 
 | |
|   // UINT32  Signature
 | |
|   AcpiHeader->Signature = Generator->AcpiTableSignature;
 | |
|   // UINT32  Length
 | |
|   AcpiHeader->Length = Length;
 | |
|   // UINT8   Revision
 | |
|   AcpiHeader->Revision = AcpiTableInfo->AcpiTableRevision;
 | |
|   // UINT8   Checksum
 | |
|   AcpiHeader->Checksum = 0;
 | |
| 
 | |
|   // UINT8   OemId[6]
 | |
|   CopyMem (AcpiHeader->OemId, CfgMfrInfo->OemId, sizeof (AcpiHeader->OemId));
 | |
| 
 | |
|   // UINT64  OemTableId
 | |
|   if (AcpiTableInfo->OemTableId != 0) {
 | |
|     AcpiHeader->OemTableId = AcpiTableInfo->OemTableId;
 | |
|   } else {
 | |
|     AcpiHeader->OemTableId = SIGNATURE_32 (
 | |
|                                CfgMfrInfo->OemId[0],
 | |
|                                CfgMfrInfo->OemId[1],
 | |
|                                CfgMfrInfo->OemId[2],
 | |
|                                CfgMfrInfo->OemId[3]
 | |
|                                ) |
 | |
|                              ((UINT64)Generator->AcpiTableSignature << 32);
 | |
|   }
 | |
| 
 | |
|   // UINT32  OemRevision
 | |
|   if (AcpiTableInfo->OemRevision != 0) {
 | |
|     AcpiHeader->OemRevision = AcpiTableInfo->OemRevision;
 | |
|   } else {
 | |
|     AcpiHeader->OemRevision = CfgMfrInfo->Revision;
 | |
|   }
 | |
| 
 | |
|   // UINT32  CreatorId
 | |
|   AcpiHeader->CreatorId = Generator->CreatorId;
 | |
|   // UINT32  CreatorRevision
 | |
|   AcpiHeader->CreatorRevision = Generator->CreatorRevision;
 | |
| 
 | |
| 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.
 | |
| 
 | |
|   @param [in] Array                 Array of elements to test for duplicates.
 | |
|   @param [in] Count                 Number of elements in Array.
 | |
|   @param [in] ElementSize           Size of an element in bytes
 | |
|   @param [in] EqualTestFunction     The function to call to check if any two
 | |
|                                     elements are equal.
 | |
| 
 | |
|   @retval TRUE                      A duplicate element was found or one of
 | |
|                                     the input arguments is invalid.
 | |
|   @retval FALSE                     Every element in Array is unique.
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| FindDuplicateValue (
 | |
|   IN  CONST VOID          *Array,
 | |
|   IN  CONST UINTN         Count,
 | |
|   IN  CONST UINTN         ElementSize,
 | |
|   IN        PFN_IS_EQUAL  EqualTestFunction
 | |
|   )
 | |
| {
 | |
|   UINTN  Index1;
 | |
|   UINTN  Index2;
 | |
|   UINT8  *Element1;
 | |
|   UINT8  *Element2;
 | |
| 
 | |
|   if (Array == NULL) {
 | |
|     DEBUG ((DEBUG_ERROR, "ERROR: FindDuplicateValues: Array is NULL.\n"));
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   if (ElementSize == 0) {
 | |
|     DEBUG ((DEBUG_ERROR, "ERROR: FindDuplicateValues: ElementSize is 0.\n"));
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   if (EqualTestFunction == NULL) {
 | |
|     DEBUG ((
 | |
|       DEBUG_ERROR,
 | |
|       "ERROR: FindDuplicateValues: EqualTestFunction is NULL.\n"
 | |
|       ));
 | |
|     return TRUE;
 | |
|   }
 | |
| 
 | |
|   if (Count < 2) {
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   for (Index1 = 0; Index1 < Count - 1; Index1++) {
 | |
|     for (Index2 = Index1 + 1; Index2 < Count; Index2++) {
 | |
|       Element1 = (UINT8 *)Array + (Index1 * ElementSize);
 | |
|       Element2 = (UINT8 *)Array + (Index2 * ElementSize);
 | |
| 
 | |
|       if (EqualTestFunction (Element1, Element2, Index1, Index2)) {
 | |
|         return TRUE;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return FALSE;
 | |
| }
 |