public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Sami Mujawar" <sami.mujawar@arm.com>
To: Pierre.Gondois@arm.com, devel@edk2.groups.io
Cc: Alexei Fedorov <Alexei.Fedorov@arm.com>, "nd@arm.com" <nd@arm.com>
Subject: Re: [PATCH 11/14] DynamicTablesPkg: Add PCCT Generator
Date: Wed, 26 Oct 2022 13:35:22 +0100	[thread overview]
Message-ID: <944663d1-1326-27c4-4423-97ad50cc8432@arm.com> (raw)
In-Reply-To: <20221010092058.118714-12-Pierre.Gondois@arm.com>

Hi Pierre,

There is a change required for this patch marked inline as [SAMI].

If you agree, I will make the changes before merging.

Regards,

Sami Mujawar

On 10/10/2022 10:20 am, Pierre.Gondois@arm.com wrote:
> From: Pierre Gondois <pierre.gondois@arm.com>
>
> The Platform Communication Channel Table (PCCT) generator collates
> the relevant information required for generating a PCCT table from
> configuration manager using the configuration manager protocol.
> The DynamicTablesManager then install the PCCT table.
>
>  From ACPI 6.4, s14 PLATFORM COMMUNICATIONS CHANNEL (PCC):
>    The platform communication channel (PCC) is a generic mechanism
>    for OSPM to communicate with an entity in the platform.
>
> Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
> ---
>   DynamicTablesPkg/DynamicTables.dsc.inc        |    4 +-
>   DynamicTablesPkg/Include/AcpiTableGenerator.h |    3 +-
>   .../Arm/AcpiPcctLibArm/AcpiPcctLibArm.inf     |   30 +
>   .../Acpi/Arm/AcpiPcctLibArm/PcctGenerator.c   | 1186 +++++++++++++++++
>   .../Acpi/Arm/AcpiPcctLibArm/PcctGenerator.h   |   43 +
>   .../ConfigurationManagerObjectParser.c        |   46 +-
>   6 files changed, 1287 insertions(+), 25 deletions(-)
>   create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/AcpiPcctLibArm.inf
>   create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.c
>   create mode 100644 DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.h
>
> diff --git a/DynamicTablesPkg/DynamicTables.dsc.inc b/DynamicTablesPkg/DynamicTables.dsc.inc
> index 3d4fa0c4c4b6..3e38fa0d0d99 100644
> --- a/DynamicTablesPkg/DynamicTables.dsc.inc
> +++ b/DynamicTablesPkg/DynamicTables.dsc.inc
> @@ -1,7 +1,7 @@
>   ## @file
>   #  Dsc include file for Dynamic Tables Framework.
>   #
> -#  Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>
> +#  Copyright (c) 2017 - 2022, Arm Limited. All rights reserved.<BR>
>   #
>   #  SPDX-License-Identifier: BSD-2-Clause-Patent
>   #
> @@ -33,6 +33,7 @@ [Components.common]
>     DynamicTablesPkg/Library/Acpi/Arm/AcpiRawLibArm/AcpiRawLibArm.inf
>     DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/AcpiSpcrLibArm.inf
>     DynamicTablesPkg/Library/Acpi/Arm/AcpiSratLibArm/AcpiSratLibArm.inf
> +  DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/AcpiPcctLibArm.inf
>   
>     # AML Fixup
>     DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortLibArm.inf
> @@ -57,6 +58,7 @@ [Components.common]
>         NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiRawLibArm/AcpiRawLibArm.inf
>         NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/AcpiSpcrLibArm.inf
>         NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSratLibArm/AcpiSratLibArm.inf
> +      NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/AcpiPcctLibArm.inf
>   
>         # AML Fixup
>         NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtSerialPortLibArm/SsdtSerialPortLibArm.inf
> diff --git a/DynamicTablesPkg/Include/AcpiTableGenerator.h b/DynamicTablesPkg/Include/AcpiTableGenerator.h
> index f962dbff57df..d0eda011c301 100644
> --- a/DynamicTablesPkg/Include/AcpiTableGenerator.h
> +++ b/DynamicTablesPkg/Include/AcpiTableGenerator.h
> @@ -1,6 +1,6 @@
>   /** @file
>   
> -  Copyright (c) 2017 - 2021, Arm Limited. All rights reserved.<BR>
> +  Copyright (c) 2017 - 2022, Arm Limited. All rights reserved.<BR>
>   
>     SPDX-License-Identifier: BSD-2-Clause-Patent
>   
> @@ -98,6 +98,7 @@ typedef enum StdAcpiTableId {
>     EStdAcpiTableIdSsdtCmn600,                    ///< SSDT Cmn-600 Generator
>     EStdAcpiTableIdSsdtCpuTopology,               ///< SSDT Cpu Topology
>     EStdAcpiTableIdSsdtPciExpress,                ///< SSDT Pci Express Generator
> +  EStdAcpiTableIdPcct,                          ///< PCCT Generator
>     EStdAcpiTableIdMax
>   } ESTD_ACPI_TABLE_ID;
>   
> diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/AcpiPcctLibArm.inf b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/AcpiPcctLibArm.inf
> new file mode 100644
> index 000000000000..da54585c2dd9
> --- /dev/null
> +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/AcpiPcctLibArm.inf
> @@ -0,0 +1,30 @@
> +## @file
> +#  Pcct Table Generator
> +#
> +#  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +##
> +
> +[Defines]
> +  INF_VERSION    = 0x0001001B
> +  BASE_NAME      = AcpiPcctLibArm
> +  FILE_GUID      = 38FE945C-D6ED-4CD6-8D20-FCEF3260D15A
> +  VERSION_STRING = 1.0
> +  MODULE_TYPE    = DXE_DRIVER
> +  LIBRARY_CLASS  = NULL|DXE_DRIVER
> +  CONSTRUCTOR    = AcpiPcctLibConstructor
> +  DESTRUCTOR     = AcpiPcctLibDestructor
> +
> +[Sources]
> +  PcctGenerator.c
> +  PcctGenerator.h
> +
> +[Packages]
> +  DynamicTablesPkg/DynamicTablesPkg.dec
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.c
> new file mode 100644
> index 000000000000..36caf4aaeab7
> --- /dev/null
> +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.c
> @@ -0,0 +1,1186 @@
> +/** @file
> +  PCCT Table Generator
> +
> +  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +  @par Reference(s):
> +  - ACPI 6.4 Specification - January 2021
> +    s14 PLATFORM COMMUNICATIONS CHANNEL (PCC)
> +
> +**/
> +
> +#include <Library/AcpiLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Protocol/AcpiTable.h>
> +
> +// Module specific include files.
> +#include <AcpiTableGenerator.h>
> +#include <ConfigurationManagerObject.h>
> +#include <ConfigurationManagerHelper.h>
> +#include <Library/TableHelperLib.h>
> +#include <Protocol/ConfigurationManagerProtocol.h>
> +#include "PcctGenerator.h"
> +
> +/** ARM standard PCCT Generator
> +
> +Requirements:
> +  The following Configuration Manager Object(s) are required by
> +  this Generator:
> +  - EArmObjPccSubspaceType0Info
> +  - EArmObjPccSubspaceType1Info
> +  - EArmObjPccSubspaceType2Info
> +  - EArmObjPccSubspaceType3Info
> +  - EArmObjPccSubspaceType4Info
> +  - EArmObjPccSubspaceType5Info
> +*/
> +
> +/** This macro expands to a function that retrieves the PCC
> +    Subspace of Type 0 Information from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> +  EObjNameSpaceArm,
> +  EArmObjPccSubspaceType0Info,
> +  CM_ARM_PCC_SUBSPACE_TYPE0_INFO
> +  );
> +
> +/** This macro expands to a function that retrieves the PCC
> +    Subspace of Type 1 Information from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> +  EObjNameSpaceArm,
> +  EArmObjPccSubspaceType1Info,
> +  CM_ARM_PCC_SUBSPACE_TYPE1_INFO
> +  );
> +
> +/** This macro expands to a function that retrieves the PCC
> +    Subspace of Type 2 Information from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> +  EObjNameSpaceArm,
> +  EArmObjPccSubspaceType2Info,
> +  CM_ARM_PCC_SUBSPACE_TYPE2_INFO
> +  );
> +
> +/** This macro expands to a function that retrieves the PCC
> +    Subspace of Type 3 Information from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> +  EObjNameSpaceArm,
> +  EArmObjPccSubspaceType3Info,
> +  CM_ARM_PCC_SUBSPACE_TYPE3_INFO
> +  );
> +
> +/** This macro expands to a function that retrieves the PCC
> +    Subspace of Type 4 Information from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> +  EObjNameSpaceArm,
> +  EArmObjPccSubspaceType4Info,
> +  CM_ARM_PCC_SUBSPACE_TYPE4_INFO
> +  );
> +
> +/** This macro expands to a function that retrieves the PCC
> +    Subspace of Type 5 Information from the Configuration Manager.
> +*/
> +GET_OBJECT_LIST (
> +  EObjNameSpaceArm,
> +  EArmObjPccSubspaceType5Info,
> +  CM_ARM_PCC_SUBSPACE_TYPE5_INFO
> +  );
> +
> +/** The Platform is capable of generating an interrupt
> +    to indicate completion of a command.
> +
> +  Cf: s14.1.1 Platform Communications Channel Global Flags
> +  Platform Interrupt flag
> +  and s14.1.6 Extended PCC subspaces (types 3 and 4)
> +    If a responder subspace is included in the PCCT,
> +    then the global Platform Interrupt flag must be set to 1
> +
> +  Set this variable and populate the PCCT flag accordingly if either:
> +   - One of the PCCT Subspace uses interrupts.
> +   - A PCC Subspace of type 4 is used.
> +*/
> +STATIC BOOLEAN  mHasPlatformInterrupt;
> +
> +/** Initialize the MappingTable.
> +
> +  @param [in] MappingTable  The mapping table structure.
> +  @param [in] Count         Number of entries to allocate in the
> +                            MappingTable.
> +
> +  @retval EFI_SUCCESS            Success.
> +  @retval EFI_INVALID_PARAMETER  Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +MappingTableInitialize (
> +  IN  MAPPING_TABLE  *MappingTable,
> +  IN  UINT32         Count
> +  )
> +{
> +  VOID  **Table;
> +
> +  if ((MappingTable == NULL)  ||
> +      (Count == 0))
> +  {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Table = AllocateZeroPool (sizeof (*Table) * Count);
> +  if (Table == NULL) {
> +    ASSERT (0);
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  MappingTable->Table    = Table;
> +  MappingTable->MaxIndex = Count;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Free the MappingTable.
> +
> +  @param [in, out]  MappingTable  The mapping table structure.
> +**/
> +STATIC
> +VOID
> +EFIAPI
> +MappingTableFree (
> +  IN  OUT MAPPING_TABLE  *MappingTable
> +  )
> +{
> +  ASSERT (MappingTable != NULL);
> +  ASSERT (MappingTable->Table != NULL);
> +
> +  if (MappingTable->Table != NULL) {
> +    FreePool (MappingTable->Table);
> +  }
> +}
> +
> +/** Add a new entry for CmArmPccSubspace at Index.
> +
> +  @param [in] MappingTable      The mapping table structure.
> +  @param [in] CmArmPccSubspace  Pointer to a CM_ARM_PCC_SUBSPACE_TYPE[X]_INFO.
> +  @param [in] Index             Index at which CmArmPccSubspace must be added.
> +                                This is the Subspace Id.
> +
> +  @retval EFI_SUCCESS            Success.
> +  @retval EFI_BUFFER_TOO_SMALL   Buffer too small.
> +  @retval EFI_INVALID_PARAMETER  Invalid parameter.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +MappingTableAdd (
> +  IN  MAPPING_TABLE  *MappingTable,
> +  IN  VOID           *CmArmPccSubspace,
> +  IN  UINT32         Index
> +  )
> +{
> +  if ((MappingTable == NULL)        ||
> +      (MappingTable->Table == NULL) ||
> +      (CmArmPccSubspace == NULL))
> +  {
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if ((Index >= MappingTable->MaxIndex) ||
> +      (MappingTable->Table[Index] != 0))
> +  {
> +    ASSERT_EFI_ERROR (EFI_BUFFER_TOO_SMALL);
> +    return EFI_BUFFER_TOO_SMALL;
> +  }
> +
> +  // Just map the Pcc Subspace in the Table.
> +  MappingTable->Table[Index] = CmArmPccSubspace;
> +  return EFI_SUCCESS;
> +}
> +
> +/** Parse the CmPccArray objects and add them to the MappingTable.
> +
> +  @param [in] MappingTable     The mapping table structure.
> +  @param [in] CmPccArray       Pointer to an array of CM_ARM_PCC_SUBSPACE_TYPE[X]_INFO.
> +  @param [in] CmPccCount       Count of objects in CmPccArray.
> +
> +  @retval EFI_SUCCESS            Success.
> +  @retval EFI_BUFFER_TOO_SMALL   Buffer too small.
> +  @retval EFI_INVALID_PARAMETER  Invalid parameter.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +MapPccSubspaceId (
> +  IN  MAPPING_TABLE  *MappingTable,
> +  IN  VOID           *CmPccArray,
> +  IN  UINT32         CmPccCount
> +  )
> +{
> +  EFI_STATUS                 Status;
> +  UINT8                      *PccBuffer;
> +  UINT32                     Index;
> +  UINT32                     CmObjSize;
> +  PCC_SUBSPACE_GENERIC_INFO  *GenericPcc;
> +
> +  if (CmPccCount == 0) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  if ((CmPccArray == NULL) || (MappingTable == NULL)) {
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  GenericPcc = (PCC_SUBSPACE_GENERIC_INFO *)CmPccArray;
> +
> +  switch (GenericPcc->Type) {
> +    case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_GENERIC:
> +      CmObjSize = sizeof (CM_ARM_PCC_SUBSPACE_TYPE0_INFO);
> +      break;
> +
> +    case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_1_HW_REDUCED_COMMUNICATIONS:
> +      CmObjSize = sizeof (CM_ARM_PCC_SUBSPACE_TYPE1_INFO);
> +      break;
> +
> +    case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_2_HW_REDUCED_COMMUNICATIONS:
> +      CmObjSize = sizeof (CM_ARM_PCC_SUBSPACE_TYPE2_INFO);
> +      break;
> +
> +    case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_3_EXTENDED_PCC:
> +      CmObjSize = sizeof (CM_ARM_PCC_SUBSPACE_TYPE3_INFO);
> +      break;
> +
> +    case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC:
> +      CmObjSize = sizeof (CM_ARM_PCC_SUBSPACE_TYPE4_INFO);
> +      break;
> +
> +    case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_5_HW_REGISTERS_COMMUNICATIONS:
> +      CmObjSize = sizeof (CM_ARM_PCC_SUBSPACE_TYPE5_INFO);
> +      break;
> +
> +    default:
> +      ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +      return EFI_INVALID_PARAMETER;
> +  }
> +
> +  PccBuffer = (UINT8 *)CmPccArray;
> +
> +  // Map the Pcc channel to their Subspace Id.
> +  for (Index = 0; Index < CmPccCount; Index++) {
> +    GenericPcc = (PCC_SUBSPACE_GENERIC_INFO *)PccBuffer;
> +
> +    Status = MappingTableAdd (
> +               MappingTable,
> +               PccBuffer,
> +               GenericPcc->SubspaceId
> +               );
> +    if (EFI_ERROR (Status)) {
> +      ASSERT_EFI_ERROR (Status);
> +      return Status;
> +    }
> +
> +    PccBuffer += CmObjSize;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Add one PCCT Subspace structure of Type 0 (Generic).
> +
> +  @param [in]  PccCmObj   Pointer to a CmObj PCCT Subspace info structure.
> +  @param [in]  PccAcpi    Pointer to the ACPI PCCT Subspace structure to populate.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AddSubspaceStructType0 (
> +  IN  CM_ARM_PCC_SUBSPACE_TYPE0_INFO      *PccCmObj,
> +  IN  EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC  *PccAcpi
> +  )
> +{
> +  PCC_MAILBOX_REGISTER_INFO         *Doorbell;
> +  PCC_SUBSPACE_CHANNEL_TIMING_INFO  *ChannelTiming;
> +
> +  if ((PccCmObj == NULL) ||
> +      (PccCmObj->Type != EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_GENERIC)  ||
> +      (PccAcpi == NULL))
> +  {
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Doorbell      = &PccCmObj->DoorbellReg;
> +  ChannelTiming = &PccCmObj->ChannelTiming;
> +
> +  PccAcpi->Type                    = PccCmObj->Type;
> +  PccAcpi->Length                  = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC);
> +  *(UINT32 *)&PccAcpi->Reserved[0] = EFI_ACPI_RESERVED_DWORD;
> +  *(UINT16 *)&PccAcpi->Reserved[4] = EFI_ACPI_RESERVED_WORD;
> +  PccAcpi->BaseAddress             = PccCmObj->BaseAddress;
> +  PccAcpi->AddressLength           = PccCmObj->AddressLength;
> +
> +  CopyMem (
> +    &PccAcpi->DoorbellRegister,
> +    &Doorbell->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->DoorbellPreserve = Doorbell->PreserveMask;
> +  PccAcpi->DoorbellWrite    = Doorbell->WriteMask;
> +
> +  PccAcpi->NominalLatency               = ChannelTiming->NominalLatency;
> +  PccAcpi->MaximumPeriodicAccessRate    = ChannelTiming->MaxPeriodicAccessRate;
> +  PccAcpi->MinimumRequestTurnaroundTime = ChannelTiming->MinRequestTurnaroundTime;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Add one PCCT subspace structure of Type 1 (HW-Reduced).
> +
> +  @param [in]  PccCmObj   Pointer to a CmObj PCCT Subspace info structure.
> +  @param [in]  PccAcpi    Pointer to the ACPI PCCT Subspace structure to populate.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AddSubspaceStructType1 (
> +  IN  CM_ARM_PCC_SUBSPACE_TYPE1_INFO                          *PccCmObj,
> +  IN  EFI_ACPI_6_4_PCCT_SUBSPACE_1_HW_REDUCED_COMMUNICATIONS  *PccAcpi
> +  )
> +{
> +  CM_ARM_PCC_SUBSPACE_TYPE0_INFO    *GenericPccCmObj;
> +  PCC_MAILBOX_REGISTER_INFO         *Doorbell;
> +  PCC_SUBSPACE_CHANNEL_TIMING_INFO  *ChannelTiming;
> +
> +  GenericPccCmObj = (CM_ARM_PCC_SUBSPACE_TYPE0_INFO *)PccCmObj;
> +
> +  if ((PccCmObj == NULL) ||
> +      (GenericPccCmObj->Type != EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_1_HW_REDUCED_COMMUNICATIONS)  ||
> +      (PccAcpi == NULL))
> +  {
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Doorbell      = &GenericPccCmObj->DoorbellReg;
> +  ChannelTiming = &GenericPccCmObj->ChannelTiming;
> +
> +  PccAcpi->Type                   = GenericPccCmObj->Type;
> +  PccAcpi->Length                 = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_1_HW_REDUCED_COMMUNICATIONS);
> +  PccAcpi->PlatformInterrupt      = PccCmObj->PlatIrq.Interrupt;
> +  PccAcpi->PlatformInterruptFlags = PccCmObj->PlatIrq.Flags;
> +  PccAcpi->Reserved               = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->BaseAddress            = GenericPccCmObj->BaseAddress;
> +  PccAcpi->AddressLength          = GenericPccCmObj->AddressLength;
> +
> +  CopyMem (
> +    &PccAcpi->DoorbellRegister,
> +    &Doorbell->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->DoorbellPreserve = Doorbell->PreserveMask;
> +  PccAcpi->DoorbellWrite    = Doorbell->WriteMask;
> +
> +  PccAcpi->NominalLatency               = ChannelTiming->NominalLatency;
> +  PccAcpi->MaximumPeriodicAccessRate    = ChannelTiming->MaxPeriodicAccessRate;
> +  PccAcpi->MinimumRequestTurnaroundTime = ChannelTiming->MinRequestTurnaroundTime;
> +
> +  if ((PccCmObj->PlatIrq.Interrupt != 0)) {
> +    mHasPlatformInterrupt = TRUE;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Add one PCCT subspace structure of Type 2 (HW-Reduced).
> +
> +  @param [in]  PccCmObj   Pointer to a CmObj PCCT Subspace info structure.
> +  @param [in]  PccAcpi    Pointer to the ACPI PCCT Subspace structure to populate.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AddSubspaceStructType2 (
> +  IN  CM_ARM_PCC_SUBSPACE_TYPE2_INFO                          *PccCmObj,
> +  IN  EFI_ACPI_6_4_PCCT_SUBSPACE_2_HW_REDUCED_COMMUNICATIONS  *PccAcpi
> +  )
> +{
> +  CM_ARM_PCC_SUBSPACE_TYPE0_INFO    *GenericPccCmObj;
> +  PCC_MAILBOX_REGISTER_INFO         *Doorbell;
> +  PCC_MAILBOX_REGISTER_INFO         *PlatIrqAck;
> +  PCC_SUBSPACE_CHANNEL_TIMING_INFO  *ChannelTiming;
> +
> +  GenericPccCmObj = (CM_ARM_PCC_SUBSPACE_TYPE0_INFO *)PccCmObj;
> +
> +  if ((PccCmObj == NULL) ||
> +      (GenericPccCmObj->Type != EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_2_HW_REDUCED_COMMUNICATIONS)  ||
> +      (PccAcpi == NULL))
> +  {
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Doorbell      = &GenericPccCmObj->DoorbellReg;
> +  PlatIrqAck    = &PccCmObj->PlatIrqAckReg;
> +  ChannelTiming = &GenericPccCmObj->ChannelTiming;
> +
> +  PccAcpi->Type                   = GenericPccCmObj->Type;
> +  PccAcpi->Length                 = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_2_HW_REDUCED_COMMUNICATIONS);
> +  PccAcpi->PlatformInterrupt      = PccCmObj->PlatIrq.Interrupt;
> +  PccAcpi->PlatformInterruptFlags = PccCmObj->PlatIrq.Flags;
> +  PccAcpi->BaseAddress            = GenericPccCmObj->BaseAddress;
> +  PccAcpi->Reserved               = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->BaseAddress            = GenericPccCmObj->BaseAddress;
> +  PccAcpi->AddressLength          = GenericPccCmObj->AddressLength;
> +
> +  CopyMem (
> +    &PccAcpi->DoorbellRegister,
> +    &Doorbell->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->DoorbellPreserve = Doorbell->PreserveMask;
> +  PccAcpi->DoorbellWrite    = Doorbell->WriteMask;
> +
> +  PccAcpi->NominalLatency               = ChannelTiming->NominalLatency;
> +  PccAcpi->MaximumPeriodicAccessRate    = ChannelTiming->MaxPeriodicAccessRate;
> +  PccAcpi->MinimumRequestTurnaroundTime = ChannelTiming->MinRequestTurnaroundTime;
> +
> +  CopyMem (
> +    &PccAcpi->PlatformInterruptAckRegister,
> +    &PlatIrqAck->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->PlatformInterruptAckPreserve = PlatIrqAck->PreserveMask;
> +  PccAcpi->PlatformInterruptAckWrite    = PlatIrqAck->WriteMask;
> +
> +  if ((PccCmObj->PlatIrq.Interrupt != 0)) {
> +    mHasPlatformInterrupt = TRUE;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Add one PCCT subspace structure of Type 3 or 4 (Extended).
> +
> +  @param [in]  PccCmObj   Pointer to a CmObj PCCT Subspace info structure.
> +  @param [in]  PccAcpi    Pointer to the ACPI PCCT Subspace structure to populate.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AddSubspaceStructType34 (
> +  IN  CM_ARM_PCC_SUBSPACE_TYPE3_INFO             *PccCmObj,
> +  IN  EFI_ACPI_6_4_PCCT_SUBSPACE_3_EXTENDED_PCC  *PccAcpi
> +  )
> +{
> +  CM_ARM_PCC_SUBSPACE_TYPE0_INFO    *GenericPccCmObj;
> +  PCC_MAILBOX_REGISTER_INFO         *Doorbell;
> +  PCC_MAILBOX_REGISTER_INFO         *PlatIrqAck;
> +  PCC_MAILBOX_REGISTER_INFO         *CmdCompleteCheck;
> +  PCC_MAILBOX_REGISTER_INFO         *CmdCompleteUpdate;
> +  PCC_MAILBOX_REGISTER_INFO         *ErrorStatus;
> +  PCC_SUBSPACE_CHANNEL_TIMING_INFO  *ChannelTiming;
> +
> +  GenericPccCmObj = (CM_ARM_PCC_SUBSPACE_TYPE0_INFO *)PccCmObj;
> +
> +  if ((PccCmObj == NULL) ||
> +      ((GenericPccCmObj->Type != EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_3_EXTENDED_PCC) &&
> +       (GenericPccCmObj->Type != EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC)) ||
> +      (PccAcpi == NULL))
> +  {
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Doorbell          = &GenericPccCmObj->DoorbellReg;
> +  PlatIrqAck        = &PccCmObj->PlatIrqAckReg;
> +  CmdCompleteCheck  = &PccCmObj->CmdCompleteCheckReg;
> +  CmdCompleteUpdate = &PccCmObj->CmdCompleteUpdateReg;
> +  ErrorStatus       = &PccCmObj->ErrorStatusReg;
> +  ChannelTiming     = &GenericPccCmObj->ChannelTiming;
> +
> +  PccAcpi->Type                   = GenericPccCmObj->Type;
> +  PccAcpi->Length                 = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_3_EXTENDED_PCC);
> +  PccAcpi->PlatformInterrupt      = PccCmObj->PlatIrq.Interrupt;
> +  PccAcpi->PlatformInterruptFlags = PccCmObj->PlatIrq.Flags;
> +  PccAcpi->Reserved               = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->BaseAddress            = GenericPccCmObj->BaseAddress;
> +  PccAcpi->AddressLength          = GenericPccCmObj->AddressLength;
> +
> +  CopyMem (
> +    &PccAcpi->DoorbellRegister,
> +    &Doorbell->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->DoorbellPreserve = Doorbell->PreserveMask;
> +  PccAcpi->DoorbellWrite    = Doorbell->WriteMask;
> +
> +  PccAcpi->NominalLatency               = ChannelTiming->NominalLatency;
> +  PccAcpi->MaximumPeriodicAccessRate    = ChannelTiming->MaxPeriodicAccessRate;
> +  PccAcpi->MinimumRequestTurnaroundTime = ChannelTiming->MinRequestTurnaroundTime;
> +
> +  CopyMem (
> +    &PccAcpi->PlatformInterruptAckRegister,
> +    &PlatIrqAck->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->PlatformInterruptAckPreserve = PlatIrqAck->PreserveMask;
> +  PccAcpi->PlatformInterruptAckSet      = PlatIrqAck->WriteMask;
> +
> +  PccAcpi->Reserved1[0] = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->Reserved1[1] = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->Reserved1[1] = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->Reserved1[3] = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->Reserved1[4] = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->Reserved1[5] = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->Reserved1[6] = EFI_ACPI_RESERVED_BYTE;
> +  PccAcpi->Reserved1[7] = EFI_ACPI_RESERVED_BYTE;
> +
> +  CopyMem (
> +    &PccAcpi->CommandCompleteCheckRegister,
> +    &CmdCompleteCheck->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->CommandCompleteCheckMask = CmdCompleteCheck->PreserveMask;
> +  // No Write mask.
> +
> +  CopyMem (
> +    &PccAcpi->CommandCompleteUpdateRegister,
> +    &CmdCompleteUpdate->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->CommandCompleteUpdatePreserve = CmdCompleteUpdate->PreserveMask;
> +  PccAcpi->CommandCompleteUpdateSet      = CmdCompleteUpdate->WriteMask;
> +
> +  CopyMem (
> +    &PccAcpi->ErrorStatusRegister,
> +    &ErrorStatus->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->ErrorStatusMask = ErrorStatus->PreserveMask;
> +  // No Write mask.
> +
> +  if (GenericPccCmObj->Type == EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC) {
> +    mHasPlatformInterrupt = TRUE;
> +  } else if ((PccCmObj->PlatIrq.Interrupt != 0)) {
> +    mHasPlatformInterrupt = TRUE;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Add one PCCT subspace structure of Type 5 (HW-Registers).
> +
> +  @param [in]  PccCmObj   Pointer to a CmObj PCCT Subspace info structure.
> +  @param [in]  PccAcpi    Pointer to the ACPI PCCT Subspace structure to populate.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AddSubspaceStructType5 (
> +  IN  CM_ARM_PCC_SUBSPACE_TYPE5_INFO                            *PccCmObj,
> +  IN  EFI_ACPI_6_4_PCCT_SUBSPACE_5_HW_REGISTERS_COMMUNICATIONS  *PccAcpi
> +  )
> +{
> +  CM_ARM_PCC_SUBSPACE_TYPE0_INFO    *GenericPccCmObj;
> +  PCC_MAILBOX_REGISTER_INFO         *Doorbell;
> +  PCC_MAILBOX_REGISTER_INFO         *CmdCompleteCheck;
> +  PCC_MAILBOX_REGISTER_INFO         *ErrorStatus;
> +  PCC_SUBSPACE_CHANNEL_TIMING_INFO  *ChannelTiming;
> +
> +  GenericPccCmObj = (CM_ARM_PCC_SUBSPACE_TYPE0_INFO *)PccCmObj;
> +
> +  if ((PccCmObj == NULL) ||
> +      (GenericPccCmObj->Type != EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_5_HW_REGISTERS_COMMUNICATIONS)  ||
> +      (PccAcpi == NULL))
> +  {
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Doorbell         = &GenericPccCmObj->DoorbellReg;
> +  CmdCompleteCheck = &PccCmObj->CmdCompleteCheckReg;
> +  ErrorStatus      = &PccCmObj->ErrorStatusReg;
> +  ChannelTiming    = &GenericPccCmObj->ChannelTiming;
> +
> +  PccAcpi->Type                    = GenericPccCmObj->Type;
> +  PccAcpi->Length                  = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_5_HW_REGISTERS_COMMUNICATIONS);
> +  PccAcpi->Version                 = PccCmObj->Version;
> +  PccAcpi->BaseAddress             = GenericPccCmObj->BaseAddress;
> +  PccAcpi->SharedMemoryRangeLength = GenericPccCmObj->AddressLength;
> +
> +  CopyMem (
> +    &PccAcpi->DoorbellRegister,
> +    &Doorbell->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->DoorbellPreserve = Doorbell->PreserveMask;
> +  PccAcpi->DoorbellWrite    = Doorbell->WriteMask;
> +
> +  CopyMem (
> +    &PccAcpi->CommandCompleteCheckRegister,
> +    &CmdCompleteCheck->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->CommandCompleteCheckMask = CmdCompleteCheck->PreserveMask;
> +  // No Write mask.
> +
> +  CopyMem (
> +    &PccAcpi->ErrorStatusRegister,
> +    &ErrorStatus->Register,
> +    sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE)
> +    );
> +  PccAcpi->ErrorStatusMask = ErrorStatus->PreserveMask;
> +  // No Write mask.
> +
> +  PccAcpi->NominalLatency = ChannelTiming->NominalLatency;
> +  // No MaximumPeriodicAccessRate.
> +  PccAcpi->MinimumRequestTurnaroundTime = ChannelTiming->MinRequestTurnaroundTime;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Populate the PCCT table using the MappingTable.
> +
> +  @param [in] MappingTable  The mapping table structure.
> +  @param [in] Pcc           Pointer to an array of Pcc Subpace structures.
> +  @param [in] Size          Size of the Pcc array.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_BUFFER_TOO_SMALL  Buffer too small.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +PopulatePcctTable (
> +  IN  MAPPING_TABLE  *MappingTable,
> +  IN  VOID           *Pcc,
> +  IN  UINT32         Size
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT8       *PccBuffer;
> +  UINT32      CmObjSize;
> +  UINT32      Index;
> +  UINT32      MaxIndex;
> +  VOID        **Table;
> +  VOID        *CurrentPccSubspace;
> +
> +  ASSERT (MappingTable != NULL);
> +  ASSERT (MappingTable->Table != NULL);
> +
> +  PccBuffer = Pcc;
> +  MaxIndex  = MappingTable->MaxIndex;
> +  Table     = MappingTable->Table;
> +
> +  for (Index = 0; Index < MaxIndex; Index++) {
> +    CurrentPccSubspace = Table[Index];
> +    if (CurrentPccSubspace == NULL) {
> +      ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +      return EFI_INVALID_PARAMETER;
> +    }
> +
> +    switch (((PCC_SUBSPACE_GENERIC_INFO *)CurrentPccSubspace)->Type) {
> +      case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_GENERIC:
> +        Status = AddSubspaceStructType0 (
> +                   (CM_ARM_PCC_SUBSPACE_TYPE0_INFO *)CurrentPccSubspace,
> +                   (EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC *)PccBuffer
> +                   );
> +
> +        CmObjSize = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC);
> +        break;
> +
> +      case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_1_HW_REDUCED_COMMUNICATIONS:
> +        Status = AddSubspaceStructType1 (
> +                   (CM_ARM_PCC_SUBSPACE_TYPE1_INFO *)CurrentPccSubspace,
> +                   (EFI_ACPI_6_4_PCCT_SUBSPACE_1_HW_REDUCED_COMMUNICATIONS *)PccBuffer
> +                   );
> +
> +        CmObjSize = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_1_HW_REDUCED_COMMUNICATIONS);
> +        break;
> +
> +      case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_2_HW_REDUCED_COMMUNICATIONS:
> +        Status = AddSubspaceStructType2 (
> +                   (CM_ARM_PCC_SUBSPACE_TYPE2_INFO *)CurrentPccSubspace,
> +                   (EFI_ACPI_6_4_PCCT_SUBSPACE_2_HW_REDUCED_COMMUNICATIONS *)PccBuffer
> +                   );
> +
> +        CmObjSize = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_2_HW_REDUCED_COMMUNICATIONS);
> +        break;
> +
> +      case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_3_EXTENDED_PCC:
> +        Status = AddSubspaceStructType34 (
> +                   (CM_ARM_PCC_SUBSPACE_TYPE3_INFO *)CurrentPccSubspace,
> +                   (EFI_ACPI_6_4_PCCT_SUBSPACE_3_EXTENDED_PCC *)PccBuffer
> +                   );
> +
> +        CmObjSize = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_3_EXTENDED_PCC);
> +        break;
> +
> +      case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC:
> +        Status = AddSubspaceStructType34 (
> +                   (CM_ARM_PCC_SUBSPACE_TYPE4_INFO *)CurrentPccSubspace,
> +                   (EFI_ACPI_6_4_PCCT_SUBSPACE_4_EXTENDED_PCC *)PccBuffer
> +                   );
> +
> +        CmObjSize = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_4_EXTENDED_PCC);
> +        break;
> +
> +      case EFI_ACPI_6_4_PCCT_SUBSPACE_TYPE_5_HW_REGISTERS_COMMUNICATIONS:
> +        Status = AddSubspaceStructType5 (
> +                   (CM_ARM_PCC_SUBSPACE_TYPE5_INFO *)CurrentPccSubspace,
> +                   (EFI_ACPI_6_4_PCCT_SUBSPACE_5_HW_REGISTERS_COMMUNICATIONS *)PccBuffer
> +                   );
> +
> +        CmObjSize = sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_5_HW_REGISTERS_COMMUNICATIONS);
> +        break;
> +
> +      default:
> +        ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +        return EFI_INVALID_PARAMETER;
> +    } // switch
> +
> +    if (EFI_ERROR (Status)) {
> +      ASSERT_EFI_ERROR (Status);
> +      return Status;
> +    }
> +
> +    if (Size < CmObjSize) {
> +      ASSERT_EFI_ERROR (EFI_BUFFER_TOO_SMALL);
> +      return EFI_BUFFER_TOO_SMALL;
> +    }
> +
> +    PccBuffer += CmObjSize;
> +    Size      -= CmObjSize;
> +  } // for
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/** Construct the PCCT ACPI table.
> +
> +  Called by the Dynamic Table Manager, this function invokes the
> +  Configuration Manager protocol interface to get the required hardware
> +  information for generating the ACPI table.
> +
> +  If this function allocates any resources then they must be freed
> +  in the FreeXXXXTableResources function.
> +
> +  @param [in]  This           Pointer to the table generator.
> +  @param [in]  AcpiTableInfo  Pointer to the ACPI Table Info.
> +  @param [in]  CfgMgrProtocol Pointer to the Configuration Manager
> +                              Protocol Interface.
> +  @param [out] Table          Pointer to the constructed ACPI Table.
> +
> +  @retval EFI_SUCCESS           Table generated successfully.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +  @retval EFI_NOT_FOUND         The required object was not found.
> +  @retval EFI_BAD_BUFFER_SIZE   The size returned by the Configuration
> +                                Manager is less than the Object size for the
> +                                requested object.
> +  @retval EFI_BUFFER_TOO_SMALL   Buffer too small.
> +  @retval EFI_OUT_OF_RESOURCES  Memory allocation failed.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +BuildPcctTable (
> +  IN  CONST ACPI_TABLE_GENERATOR                  *CONST  This,
> +  IN  CONST CM_STD_OBJ_ACPI_TABLE_INFO            *CONST  AcpiTableInfo,
> +  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
> +  OUT       EFI_ACPI_DESCRIPTION_HEADER          **CONST  Table
> +  )
> +{
> +  EFI_STATUS                                                Status;
> +  ACPI_PCCT_GENERATOR                                       *Generator;
> +  UINT32                                                    TableSize;
> +  EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER  *Pcct;
> +  UINT8                                                     *Buffer;
> +
> +  MAPPING_TABLE  *MappingTable;
> +  UINT32         MappingTableCount;
> +
> +  CM_ARM_PCC_SUBSPACE_TYPE0_INFO  *PccType0;
> +  UINT32                          PccType0Count;
> +  CM_ARM_PCC_SUBSPACE_TYPE1_INFO  *PccType1;
> +  UINT32                          PccType1Count;
> +  CM_ARM_PCC_SUBSPACE_TYPE2_INFO  *PccType2;
> +  UINT32                          PccType2Count;
> +  CM_ARM_PCC_SUBSPACE_TYPE3_INFO  *PccType3;
> +  UINT32                          PccType3Count;
> +  CM_ARM_PCC_SUBSPACE_TYPE4_INFO  *PccType4;
> +  UINT32                          PccType4Count;
> +  CM_ARM_PCC_SUBSPACE_TYPE5_INFO  *PccType5;
> +  UINT32                          PccType5Count;
> +
> +  ASSERT (This != NULL);
> +  ASSERT (AcpiTableInfo != NULL);
> +  ASSERT (CfgMgrProtocol != NULL);
> +  ASSERT (Table != NULL);
> +  ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
> +  ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
> +
> +  if ((AcpiTableInfo->AcpiTableRevision < This->MinAcpiTableRevision) ||
> +      (AcpiTableInfo->AcpiTableRevision > This->AcpiTableRevision))
> +  {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: PCCT: Requested table revision = %d, is not supported."
> +      "Supported table revision: Minimum = %d, Maximum = %d\n",
> +      AcpiTableInfo->AcpiTableRevision,
> +      This->MinAcpiTableRevision,
> +      This->AcpiTableRevision
> +      ));
> +    ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Generator    = (ACPI_PCCT_GENERATOR *)This;
> +  MappingTable = &Generator->MappingTable;
> +  *Table       = NULL;
> +
> +  // First get all the Pcc Subpace CmObj of type X.
> +
> +  Status = GetEArmObjPccSubspaceType0Info (
> +             CfgMgrProtocol,
> +             CM_NULL_TOKEN,
> +             &PccType0,
> +             &PccType0Count
> +             );
> +  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = GetEArmObjPccSubspaceType1Info (
> +             CfgMgrProtocol,
> +             CM_NULL_TOKEN,
> +             &PccType1,
> +             &PccType1Count
> +             );
> +  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = GetEArmObjPccSubspaceType2Info (
> +             CfgMgrProtocol,
> +             CM_NULL_TOKEN,
> +             &PccType2,
> +             &PccType2Count
> +             );
> +  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = GetEArmObjPccSubspaceType3Info (
> +             CfgMgrProtocol,
> +             CM_NULL_TOKEN,
> +             &PccType3,
> +             &PccType3Count
> +             );
> +  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = GetEArmObjPccSubspaceType4Info (
> +             CfgMgrProtocol,
> +             CM_NULL_TOKEN,
> +             &PccType4,
> +             &PccType4Count
> +             );
> +  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = GetEArmObjPccSubspaceType5Info (
> +             CfgMgrProtocol,
> +             CM_NULL_TOKEN,
> +             &PccType5,
> +             &PccType5Count
> +             );
> +  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  // Count the number of Pcc Subspaces.
> +  MappingTableCount  = PccType0Count;
> +  MappingTableCount += PccType1Count;
> +  MappingTableCount += PccType2Count;
> +  MappingTableCount += PccType3Count;
> +  MappingTableCount += PccType4Count;
> +  MappingTableCount += PccType5Count;
> +
> +  Status = MappingTableInitialize (MappingTable, MappingTableCount);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  // Map the Subspace Ids for all types.
> +
> +  Status = MapPccSubspaceId (MappingTable, PccType0, PccType0Count);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = MapPccSubspaceId (MappingTable, PccType1, PccType1Count);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = MapPccSubspaceId (MappingTable, PccType2, PccType2Count);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = MapPccSubspaceId (MappingTable, PccType3, PccType3Count);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = MapPccSubspaceId (MappingTable, PccType4, PccType4Count);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Status = MapPccSubspaceId (MappingTable, PccType5, PccType5Count);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  // Compute the size of the PCCT table.
> +  TableSize  = sizeof (EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER);
> +  TableSize += PccType0Count * sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_GENERIC);
> +  TableSize += PccType1Count * sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_1_HW_REDUCED_COMMUNICATIONS);
> +  TableSize += PccType2Count * sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_2_HW_REDUCED_COMMUNICATIONS);
> +  TableSize += PccType3Count * sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_3_EXTENDED_PCC);
> +  TableSize += PccType4Count * sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_4_EXTENDED_PCC);
> +  TableSize += PccType5Count * sizeof (EFI_ACPI_6_4_PCCT_SUBSPACE_5_HW_REGISTERS_COMMUNICATIONS);
> +
> +  // Allocate a Buffer for the PCCT table.
> +  *Table = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (TableSize);
> +  if (*Table == NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Pcct = (EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER *)*Table;
> +
> +  Status = AddAcpiHeader (
> +             CfgMgrProtocol,
> +             This,
> +             &Pcct->Header,
> +             AcpiTableInfo,
> +             TableSize
> +             );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: PCCT: Failed to add ACPI header. Status = %r\n",
> +      Status
> +      ));
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  Buffer     = (UINT8 *)Pcct;
> +  Buffer    += sizeof (EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER);
> +  TableSize -= sizeof (EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_HEADER);
> +
> +  // Populate the PCCT table by following the Subspace Id mapping.
> +  Status = PopulatePcctTable (MappingTable, Buffer, TableSize);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT_EFI_ERROR (Status);
> +    goto error_handler;
> +  }
> +
> +  // Setup the Reserved fields once mHasPlatformInterrupt hase been populated.
> +  Pcct->Flags    = mHasPlatformInterrupt;
> +  Pcct->Reserved = EFI_ACPI_RESERVED_QWORD;
> +
> +  MappingTableFree (MappingTable);
> +
> +  return Status;
> +
> +error_handler:
> +  DEBUG ((
> +    DEBUG_ERROR,
> +    "ERROR: PCCT: Failed to install table. Status = %r\n",
> +    Status
> +    ));
> +
> +  if (*Table != NULL) {
> +    FreePool (*Table);
> +    *Table = NULL;
> +  }
> +
> +  MappingTableFree (MappingTable);
> +
> +  return Status;
> +}
> +
> +/** Free any resources allocated for constructing the PCCT.
> +
> +  @param [in]      This           Pointer to the table generator.
> +  @param [in]      AcpiTableInfo  Pointer to the ACPI Table Info.
> +  @param [in]      CfgMgrProtocol Pointer to the Configuration Manager
> +                                  Protocol Interface.
> +  @param [in, out] Table          Pointer to the ACPI Table.
> +
> +  @retval EFI_SUCCESS           The resources were freed successfully.
> +  @retval EFI_INVALID_PARAMETER The table pointer is NULL or invalid.
> +**/
> +STATIC
> +EFI_STATUS
> +FreePcctTableResources (
> +  IN      CONST ACPI_TABLE_GENERATOR                  *CONST  This,
> +  IN      CONST CM_STD_OBJ_ACPI_TABLE_INFO            *CONST  AcpiTableInfo,
> +  IN      CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
> +  IN OUT        EFI_ACPI_DESCRIPTION_HEADER          **CONST  Table
> +  )
> +{
> +  ASSERT (This != NULL);
> +  ASSERT (AcpiTableInfo != NULL);
> +  ASSERT (CfgMgrProtocol != NULL);
> +  ASSERT (AcpiTableInfo->TableGeneratorId == This->GeneratorID);
> +  ASSERT (AcpiTableInfo->AcpiTableSignature == This->AcpiTableSignature);
> +
> +  if ((Table == NULL) || (*Table == NULL)) {
> +    DEBUG ((DEBUG_ERROR, "ERROR: PCCT: Invalid Table Pointer\n"));
> +    ASSERT ((Table != NULL) && (*Table != NULL));
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  FreePool (*Table);
> +  *Table = NULL;
> +  return EFI_SUCCESS;
> +}
> +
> +/** This macro defines the PCCT Table Generator revision.
> +*/
> +#define PCCT_GENERATOR_REVISION  CREATE_REVISION (1, 0)
> +
> +/** The interface for the PCCT Table Generator.
> +*/
> +STATIC
> +ACPI_PCCT_GENERATOR  PcctGenerator = {
> +  // ACPI table generator header
> +  {
> +    // Generator ID
> +    CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdPcct),
> +    // Generator Description
> +    L"ACPI.STD.PCCT.GENERATOR",
> +    // ACPI Table Signature
> +    EFI_ACPI_6_4_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE,
> +    // ACPI Table Revision supported by this Generator
> +    EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_REVISION,
> +    // Minimum ACPI Table Revision supported by this Generator
> +    EFI_ACPI_6_4_PLATFORM_COMMUNICATION_CHANNEL_TABLE_REVISION,
> +    // Creator ID
> +    TABLE_GENERATOR_CREATOR_ID_ARM,
> +    // Creator Revision
> +    PCCT_GENERATOR_REVISION,
> +    // Build Table function
> +    BuildPcctTable,
> +    // Free Resource function
> +    FreePcctTableResources,
> +    // Extended build function not needed
> +    NULL,
> +    // Extended build function not implemented by the generator.
> +    // Hence extended free resource function is not required.
> +    NULL
> +  },
> +
> +  // Private fields are defined from here.
> +
> +  // Mapping Table
> +  {
> +    // Table
> +    NULL,
> +    // MaxIndex
> +    0,
> +  },
> +};
> +
> +/** Register the Generator with the ACPI Table Factory.
> +
> +  @param [in]  ImageHandle  The handle to the image.
> +  @param [in]  SystemTable  Pointer to the System Table.
> +
> +  @retval EFI_SUCCESS           The Generator is registered.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +  @retval EFI_ALREADY_STARTED   The Generator for the Table ID
> +                                is already registered.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AcpiPcctLibConstructor (
> +  IN  EFI_HANDLE        ImageHandle,
> +  IN  EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = RegisterAcpiTableGenerator (&PcctGenerator.Header);
> +  DEBUG ((DEBUG_INFO, "PCCT: Register Generator. Status = %r\n", Status));
> +  ASSERT_EFI_ERROR (Status);
> +  return Status;
> +}
> +
> +/** Deregister the Generator from the ACPI Table Factory.
> +
> +  @param [in]  ImageHandle  The handle to the image.
> +  @param [in]  SystemTable  Pointer to the System Table.
> +
> +  @retval EFI_SUCCESS           The Generator is deregistered.
> +  @retval EFI_INVALID_PARAMETER A parameter is invalid.
> +  @retval EFI_NOT_FOUND         The Generator is not registered.
> +**/
> +EFI_STATUS
> +EFIAPI
> +AcpiPcctLibDestructor (
> +  IN  EFI_HANDLE        ImageHandle,
> +  IN  EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = DeregisterAcpiTableGenerator (&PcctGenerator.Header);
> +  DEBUG ((DEBUG_INFO, "PCCT: Deregister Generator. Status = %r\n", Status));
> +  ASSERT_EFI_ERROR (Status);
> +  return Status;
> +}
> diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.h b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.h
> new file mode 100644
> index 000000000000..0631a1f5b74b
> --- /dev/null
> +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPcctLibArm/PcctGenerator.h
> @@ -0,0 +1,43 @@
> +/** @file
> +  PCCT Table Generator
> +
> +  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +  @par Reference(s):
> +  - ACPI 6.4 Specification - January 2021
> +    s14 PLATFORM COMMUNICATIONS CHANNEL (PCC)
> +
> +**/
> +
> +#ifndef PCCT_GENERATOR_H_
> +#define PCCT_GENERATOR_H_
> +
> +#pragma pack(1)
> +
> +/** Structure used to map a Pcc Subspace to an index.
> +*/
> +typedef struct MappingTable {
> +  /// Mapping table for Subspace Ids.
> +  /// Subspace ID/Index <-> CM_ARM_PCC_SUBSPACE_TYPE[X]_INFO pointer
> +  VOID      **Table;
> +
> +  /// Number of entries in the Table.
> +  UINT32    MaxIndex;
> +} MAPPING_TABLE;
> +
> +/** A structure holding the Pcct generator and additional private data.
> +*/
> +typedef struct AcpiPcctGenerator {
> +  /// ACPI Table generator header
> +  ACPI_TABLE_GENERATOR    Header;
> +
> +  // Private fields are defined from here.
> +
> +  /// Table to map: Subspace ID/Index <-> CM_ARM_PCC_SUBSPACE_TYPE[X]_INFO pointer
> +  MAPPING_TABLE           MappingTable;
> +} ACPI_PCCT_GENERATOR;
> +
> +#pragma pack()
> +
> +#endif // PCCT_GENERATOR_H_
> diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c
> index 21d1f3f08b16..4d7aa7963fae 100644
> --- a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c
> +++ b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c

[SAMI] The changes in ConfigurationManagerObjectParser.c should be in 
the previous patch 10/14. Otherise it would break git bisect.

If you agree, I will move the changes in 
ConfigurationManagerObjectParser.c in patch 10/14 before merging.

[/SAMI]

> @@ -539,7 +539,7 @@ STATIC CONST CM_OBJ_PARSER  CmArmCpcInfoParser[] = {
>     { "NominalFrequencyInteger",               4,                                               "0x%lx", NULL },
>   };
>   
> -/** A parser for the CM_ARM_MAILBOX_REGISTER_INFO struct.
> +/** A parser for the PCC_MAILBOX_REGISTER_INFO struct.
>   */
>   STATIC CONST CM_OBJ_PARSER  CmArmMailboxRegisterInfoParser[] = {
>     { "Register",     sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE), NULL,     NULL,
> @@ -548,7 +548,7 @@ STATIC CONST CM_OBJ_PARSER  CmArmMailboxRegisterInfoParser[] = {
>     { "WriteMask",    8,                                               "0x%llx", NULL },
>   };
>   
> -/** A parser for the CM_ARM_PCC_SUBSPACE_CHANNEL_TIMING_INFO struct.
> +/** A parser for the PCC_SUBSPACE_CHANNEL_TIMING_INFO struct.
>   */
>   STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceChannelTimingInfoParser[] = {
>     { "NominalLatency",           4, "0x%x", NULL },
> @@ -559,14 +559,14 @@ STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceChannelTimingInfoParser[] = {
>   /** A parser for EArmObjPccSubspaceType0Info.
>   */
>   STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType0InfoParser[] = {
> -  { "SubspaceId",    1,                                                "0x%x",   NULL },
> -  { "Type",          1,                                                "0x%x",   NULL },
> -  { "BaseAddress",   8,                                                "0x%llx", NULL },
> -  { "AddressLength", 8,                                                "0x%llx", NULL },
> -  { "DoorbellReg",   sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "SubspaceId",    1,                                         "0x%x",   NULL },
> +  { "Type",          1,                                         "0x%x",   NULL },
> +  { "BaseAddress",   8,                                         "0x%llx", NULL },
> +  { "AddressLength", 8,                                         "0x%llx", NULL },
> +  { "DoorbellReg",   sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
> -  { "DoorbellReg",   sizeof (CM_ARM_PCC_SUBSPACE_CHANNEL_TIMING_INFO),
> +  { "DoorbellReg",   sizeof (PCC_SUBSPACE_CHANNEL_TIMING_INFO),
>       NULL, NULL, CmArmPccSubspaceChannelTimingInfoParser,
>       ARRAY_SIZE (CmArmPccSubspaceChannelTimingInfoParser) },
>   };
> @@ -574,7 +574,7 @@ STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType0InfoParser[] = {
>   /** A parser for EArmObjPccSubspaceType1Info.
>   */
>   STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType1InfoParser[] = {
> -  { "GenericPccInfo", sizeof (CM_ARM_PCC_SUBSPACE_GENERIC_INFO),
> +  { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
>       NULL, NULL, CmArmPccSubspaceType0InfoParser,
>       ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
>     { "PlatIrq",        sizeof (CM_ARM_GENERIC_INTERRUPT),
> @@ -585,12 +585,12 @@ STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType1InfoParser[] = {
>   /** A parser for EArmObjPccSubspaceType2Info.
>   */
>   STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType2InfoParser[] = {
> -  { "GenericPccInfo", sizeof (CM_ARM_PCC_SUBSPACE_GENERIC_INFO),
> +  { "GenericPccInfo", sizeof (PCC_SUBSPACE_GENERIC_INFO),
>       NULL, NULL, CmArmPccSubspaceType0InfoParser,
>       ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
> -  { "PlatIrq",        sizeof (CM_ARM_GENERIC_INTERRUPT),        NULL,NULL,
> +  { "PlatIrq",        sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,NULL,
>       CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
> -  { "PlatIrqAckReg",  sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "PlatIrqAckReg",  sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
>   };
> @@ -598,21 +598,21 @@ STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType2InfoParser[] = {
>   /** A parser for EArmObjPccSubspaceType3Info or EArmObjPccSubspaceType4Info.
>   */
>   STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType34InfoParser[] = {
> -  { "GenericPccInfo",       sizeof (CM_ARM_PCC_SUBSPACE_GENERIC_INFO),
> +  { "GenericPccInfo",       sizeof (PCC_SUBSPACE_GENERIC_INFO),
>       NULL, NULL, CmArmPccSubspaceType0InfoParser,
>       ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
> -  { "PlatIrq",              sizeof (CM_ARM_GENERIC_INTERRUPT),        NULL,NULL,
> +  { "PlatIrq",              sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,NULL,
>       CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
> -  { "PlatIrqAckReg",        sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "PlatIrqAckReg",        sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
> -  { "CmdCompleteCheckReg",  sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "CmdCompleteCheckReg",  sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
> -  { "CmdCompleteUpdateReg", sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "CmdCompleteUpdateReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
> -  { "ErrorStatusReg",       sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "ErrorStatusReg",       sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
>   };
> @@ -620,16 +620,16 @@ STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType34InfoParser[] = {
>   /** A parser for EArmObjPccSubspaceType5Info.
>   */
>   STATIC CONST CM_OBJ_PARSER  CmArmPccSubspaceType5InfoParser[] = {
> -  { "GenericPccInfo",      sizeof (CM_ARM_PCC_SUBSPACE_GENERIC_INFO),
> +  { "GenericPccInfo",      sizeof (PCC_SUBSPACE_GENERIC_INFO),
>       NULL, NULL, CmArmPccSubspaceType0InfoParser,
>       ARRAY_SIZE (CmArmPccSubspaceType0InfoParser) },
> -  { "Version",             2,                                        "0x%x",NULL },
> -  { "PlatIrq",             sizeof (CM_ARM_GENERIC_INTERRUPT),        NULL,  NULL,
> +  { "Version",             2,                                 "0x%x",NULL },
> +  { "PlatIrq",             sizeof (CM_ARM_GENERIC_INTERRUPT), NULL,  NULL,
>       CmArmGenericInterruptParser, ARRAY_SIZE (CmArmGenericInterruptParser) },
> -  { "CmdCompleteCheckReg", sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "CmdCompleteCheckReg", sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
> -  { "ErrorStatusReg",      sizeof (CM_ARM_MAILBOX_REGISTER_INFO),
> +  { "ErrorStatusReg",      sizeof (PCC_MAILBOX_REGISTER_INFO),
>       NULL, NULL, CmArmMailboxRegisterInfoParser,
>       ARRAY_SIZE (CmArmMailboxRegisterInfoParser) },
>   };

  reply	other threads:[~2022-10-26 12:35 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-10  9:20 [PATCH 00/14] Add PCCT generator and various fixes PierreGondois
2022-10-10  9:20 ` [PATCH 01/14] DynamicTablesPkg: Use correct print formatter PierreGondois
2022-10-26 12:36   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 02/14] DynamicTablesPkg: Add PrintString to CmObjParser PierreGondois
2022-10-26 12:36   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 03/14] DynamicTablesPkg: Update CmObjParser for IORT Rev E.d PierreGondois
2022-10-26 12:34   ` Sami Mujawar
2022-10-28 10:05     ` PierreGondois
2022-10-10  9:20 ` [PATCH 04/14] DynamicTablesPkg: Update CmObjParser for MinorRevision PierreGondois
2022-10-26 12:36   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 05/14] DynamicTablesPkg: Fix GTBlock and GTBlockTimerFrame CmObjParsers PierreGondois
2022-10-26 12:37   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 06/14] DynamicTablesPkg: Fix wrong/missing fields in CmObjParser PierreGondois
2022-10-26 12:34   ` Sami Mujawar
2022-10-28 10:05     ` PierreGondois
2022-10-10  9:20 ` [PATCH 07/14] DynamicTablesPkg: Remove deprecated APIs PierreGondois
2022-10-26 12:37   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 08/14] DynamicTablesPkg: FdtHwInfoParserLib: Remove wrong comment PierreGondois
2022-10-26 12:37   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 09/14] DynamicTablesPkg: Fix Ssdt PCI generation comments PierreGondois
2022-10-26 12:37   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 10/14] DynamicTablesPkg: Add PCCT related objects PierreGondois
2022-10-26 12:34   ` Sami Mujawar
2022-10-28 10:04     ` PierreGondois
2022-10-10  9:20 ` [PATCH 11/14] DynamicTablesPkg: Add PCCT Generator PierreGondois
2022-10-26 12:35   ` Sami Mujawar [this message]
2022-10-28 10:02     ` PierreGondois
2022-10-10  9:20 ` [PATCH 12/14] DynamicTablesPkg/AmlLib: Allow larger AccessSize for Pcc address space PierreGondois
2022-10-26 12:34   ` Sami Mujawar
2022-10-28 10:04     ` PierreGondois
2022-10-10  9:20 ` [PATCH 13/14] DynamicTablesPkg: Readme.md: Update available tables for generation PierreGondois
2022-10-26 12:07   ` Sami Mujawar
2022-10-10  9:20 ` [PATCH 14/14] ShellPkg/AcpiView: Update PCCT fields for ACPI 6.5 PierreGondois
2022-10-26 12:06   ` Sami Mujawar
     [not found] ` <171CAABD595C9750.32766@groups.io>
2022-10-10  9:48   ` [edk2-devel] " PierreGondois
2022-10-11  1:41     ` Ni, Ray
2022-10-31 13:34 ` [edk2-devel] [PATCH 00/14] Add PCCT generator and various fixes Sami Mujawar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=944663d1-1326-27c4-4423-97ad50cc8432@arm.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox