Allow other architectures to reuse the AcpiSratLib by extracting
the Arm specific part of the table generation.

Signed-off-by: Pierre Gondois <pierre.gond...@arm.com>
---
 .../Acpi/Common/AcpiSratLib/AcpiSratLib.inf   |   7 +
 .../Common/AcpiSratLib/Arm/ArmSratGenerator.c | 262 ++++++++++++++++++
 .../AcpiSratLib/Common/CommonSratGenerator.c  |  77 +++++
 .../Acpi/Common/AcpiSratLib/SratGenerator.c   | 214 ++------------
 .../Acpi/Common/AcpiSratLib/SratGenerator.h   |  59 ++++
 5 files changed, 422 insertions(+), 197 deletions(-)
 create mode 100644 
DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c
 create mode 100644 
DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Common/CommonSratGenerator.c
 create mode 100644 
DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.h

diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf 
b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf
index 2f23f4e668e5..c2f24a23ccd8 100644
--- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf
+++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/AcpiSratLib.inf
@@ -18,6 +18,13 @@ [Defines]
 
 [Sources]
   SratGenerator.c
+  SratGenerator.h
+
+[Sources.ARM, Sources.AARCH64]
+  Arm/ArmSratGenerator.c
+
+[Sources.IA32, Sources.X64]
+  Common/CommonSratGenerator.c
 
 [Packages]
   EmbeddedPkg/EmbeddedPkg.dec
diff --git 
a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c 
b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c
new file mode 100644
index 000000000000..3d36b25e1840
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Arm/ArmSratGenerator.c
@@ -0,0 +1,262 @@
+/** @file
+  Arm SRAT Table Generator
+
+  Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - ACPI 6.3 Specification, January 2019
+
+  @par Glossary:
+  - Cm or CM   - Configuration Manager
+  - Obj or OBJ - Object
+**/
+
+#include <Library/AcpiLib.h>
+#include <Library/BaseLib.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 "SratGenerator.h"
+
+/**
+  ARM standard SRAT Generator
+
+  Requirements:
+    The following Configuration Manager Object(s) are used by this Generator:
+    - EArmObjGicCInfo (REQUIRED)
+    - EArmObjGicItsInfo (OPTIONAL)
+*/
+
+/** This macro expands to a function that retrieves the GIC
+    CPU interface Information from the Configuration Manager.
+*/
+GET_OBJECT_LIST (
+  EObjNameSpaceArm,
+  EArmObjGicCInfo,
+  CM_ARM_GICC_INFO
+  );
+
+/** This macro expands to a function that retrieves the GIC
+    Interrupt Translation Service Information from the
+    Configuration Manager.
+*/
+GET_OBJECT_LIST (
+  EObjNameSpaceArm,
+  EArmObjGicItsInfo,
+  CM_ARM_GIC_ITS_INFO
+  );
+
+/** Enum of the Arm specific CM objects required to
+    build the arch specific information of the SRAT table.
+*/
+typedef enum ArmSratSubTableType {
+  EArmGicCSubTableType,
+  EArmGicItsSubTableType,
+  EArmSubTableTypeMax,
+} EARM_SRAT_SUB_TABLE_TYPE;
+
+typedef struct SratSubTable {
+  /// Start offset of the arch specific sub-table.
+  UINT32    Offset;
+
+  /// Count
+  UINT32    Count;
+
+  /// Array of CmInfo objects of the relevant type.
+  VOID      *CmInfo;
+} SRAT_SUB_TABLE;
+
+STATIC SRAT_SUB_TABLE  mSratSubTable[EArmSubTableTypeMax];
+
+/** Reserve arch sub-tables space.
+
+  @param [in] CfgMgrProtocol   Pointer to the Configuration Manager
+  @param [in, out] ArchOffset  On input, contains the offset where arch 
specific
+                               sub-tables can be written. It is expected that
+                               there enough space to write all the arch 
specific
+                               sub-tables from this offset onward.
+                               On ouput, contains the ending offset of the arch
+                               specific sub-tables.
+
+  @retval EFI_SUCCESS           Table generated 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
+ArchReserveOffsets (
+  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
+  IN OUT UINT32                                           *ArchOffset
+  )
+{
+  EFI_STATUS  Status;
+
+  ASSERT (CfgMgrProtocol != NULL);
+  ASSERT (ArchOffset != NULL);
+
+  Status = GetEArmObjGicCInfo (
+             CfgMgrProtocol,
+             CM_NULL_TOKEN,
+             (CM_ARM_GICC_INFO **)&mSratSubTable[EArmGicCSubTableType].CmInfo,
+             &mSratSubTable[EArmGicCSubTableType].Count
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: SRAT: Failed to get GICC Info. Status = %r\n",
+      Status
+      ));
+    return Status;
+  }
+
+  if (mSratSubTable[EArmGicCSubTableType].Count == 0) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: SRAT: GIC CPU Interface information not provided.\n"
+      ));
+    ASSERT (0);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = GetEArmObjGicItsInfo (
+             CfgMgrProtocol,
+             CM_NULL_TOKEN,
+             (CM_ARM_GIC_ITS_INFO 
**)&mSratSubTable[EArmGicItsSubTableType].CmInfo,
+             &mSratSubTable[EArmGicItsSubTableType].Count
+             );
+  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: SRAT: Failed to get GIC ITS Info. Status = %r\n",
+      Status
+      ));
+    return Status;
+  }
+
+  mSratSubTable[EArmGicCSubTableType].Offset = *ArchOffset;
+  *ArchOffset                               += (sizeof 
(EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE) *
+                                                
mSratSubTable[EArmGicCSubTableType].Count);
+
+  if (mSratSubTable[EArmGicItsSubTableType].Count != 0) {
+    mSratSubTable[EArmGicItsSubTableType].Offset = *ArchOffset;
+    *ArchOffset                                 += (sizeof 
(EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE) *
+                                                    
mSratSubTable[EArmGicItsSubTableType].Count);
+  }
+
+  return EFI_SUCCESS;
+}
+
+/** Add the GICC Affinity Structures in the SRAT Table.
+
+  @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
+                                Protocol Interface.
+  @param [in]  Srat             Pointer to the SRAT Table.
+**/
+STATIC
+VOID
+EFIAPI
+AddGICCAffinity (
+  IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL         *CONST  CfgMgrProtocol,
+  IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST  Srat
+  )
+{
+  EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE  *GicCAff;
+  CM_ARM_GICC_INFO                      *GicCInfo;
+
+  GicCInfo = mSratSubTable[EArmGicCSubTableType].CmInfo;
+  GicCAff  = (EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE *)((UINT8 *)Srat +
+                                                      
mSratSubTable[EArmGicCSubTableType].Offset);
+
+  while (mSratSubTable[EArmGicCSubTableType].Count-- != 0) {
+    DEBUG ((DEBUG_INFO, "SRAT: GicCAff = 0x%p\n", GicCAff));
+
+    GicCAff->Type             = EFI_ACPI_6_3_GICC_AFFINITY;
+    GicCAff->Length           = sizeof (EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE);
+    GicCAff->ProximityDomain  = GicCInfo->ProximityDomain;
+    GicCAff->AcpiProcessorUid = GicCInfo->AcpiProcessorUid;
+    GicCAff->Flags            = GicCInfo->AffinityFlags;
+    GicCAff->ClockDomain      = GicCInfo->ClockDomain;
+
+    // Next
+    GicCAff++;
+    GicCInfo++;
+  }// while
+}
+
+/** Add the GIC ITS Affinity Structures in the SRAT Table.
+
+  @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
+                                Protocol Interface.
+  @param [in]  Srat             Pointer to the SRAT Table.
+**/
+STATIC
+VOID
+EFIAPI
+AddGICItsAffinity (
+  IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL         *CONST  CfgMgrProtocol,
+  IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST  Srat
+  )
+{
+  EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE  *GicItsAff;
+  CM_ARM_GIC_ITS_INFO                      *GicItsInfo;
+
+  GicItsInfo = mSratSubTable[EArmGicItsSubTableType].CmInfo;
+  GicItsAff  = (EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE *)((UINT8 *)Srat +
+                                                           
mSratSubTable[EArmGicItsSubTableType].Offset);
+
+  while (mSratSubTable[EArmGicItsSubTableType].Count-- != 0) {
+    DEBUG ((DEBUG_INFO, "SRAT: GicItsAff = 0x%p\n", GicItsAff));
+
+    GicItsAff->Type            = EFI_ACPI_6_3_GIC_ITS_AFFINITY;
+    GicItsAff->Length          = sizeof 
(EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE);
+    GicItsAff->ProximityDomain = GicItsInfo->ProximityDomain;
+    GicItsAff->Reserved[0]     = EFI_ACPI_RESERVED_BYTE;
+    GicItsAff->Reserved[1]     = EFI_ACPI_RESERVED_BYTE;
+    GicItsAff->ItsId           = GicItsInfo->GicItsId;
+
+    // Next
+    GicItsAff++;
+    GicItsInfo++;
+  }// while
+}
+
+/** Add the arch specific sub-tables to the SRAT table.
+
+  These sub-tables are written in the space reserved beforehand.
+
+  @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
+                                Protocol Interface.
+  @param [in]  Srat             Pointer to the SRAT Table.
+
+  @retval EFI_SUCCESS           Table generated successfully.
+**/
+EFI_STATUS
+EFIAPI
+AddArchObjects (
+  IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL         *CONST  CfgMgrProtocol,
+  IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST  Srat
+  )
+{
+  ASSERT (CfgMgrProtocol != NULL);
+  ASSERT (Srat != NULL);
+
+  AddGICCAffinity (CfgMgrProtocol, Srat);
+
+  if (mSratSubTable[EArmGicCSubTableType].Count != 0) {
+    AddGICItsAffinity (CfgMgrProtocol, Srat);
+  }
+
+  return EFI_SUCCESS;
+}
diff --git 
a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Common/CommonSratGenerator.c 
b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Common/CommonSratGenerator.c
new file mode 100644
index 000000000000..bc69fbf7f3bb
--- /dev/null
+++ 
b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/Common/CommonSratGenerator.c
@@ -0,0 +1,77 @@
+/** @file
+  Common SRAT Table Generator
+
+  Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - ACPI 6.3 Specification, January 2019
+
+  @par Glossary:
+  - Cm or CM   - Configuration Manager
+  - Obj or OBJ - Object
+**/
+
+#include <Library/AcpiLib.h>
+#include <Library/BaseLib.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 "SratGenerator.h"
+
+/** Reserve arch sub-tables space.
+
+  @param [in] CfgMgrProtocol   Pointer to the Configuration Manager
+  @param [in, out] ArchOffset  On input, contains the offset where arch 
specific
+                               sub-tables can be written. It is expected that
+                               there enough space to write all the arch 
specific
+                               sub-tables from this offset onward.
+                               On ouput, contains the ending offset of the arch
+                               specific sub-tables.
+
+  @retval EFI_SUCCESS           Table generated 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
+ArchReserveOffsets (
+  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
+  IN OUT UINT32                                           *ArchOffset
+  )
+{
+  // Nothing to do.
+  return EFI_SUCCESS;
+}
+
+/** Add the arch specific sub-tables to the SRAT table.
+
+  These sub-tables are written in the space reserved beforehand.
+
+  @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
+                                Protocol Interface.
+  @param [in]  Srat             Pointer to the SRAT Table.
+
+  @retval EFI_SUCCESS           Table generated successfully.
+**/
+EFI_STATUS
+EFIAPI
+AddArchObjects (
+  IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL         *CONST  CfgMgrProtocol,
+  IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST  Srat
+  )
+{
+  // Nothing to do.
+  return EFI_SUCCESS;
+}
diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c 
b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c
index 48c9970a7151..dcdacc4e966e 100644
--- a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c
+++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.c
@@ -25,38 +25,19 @@
 #include <Library/TableHelperLib.h>
 #include <Protocol/ConfigurationManagerProtocol.h>
 
+#include "SratGenerator.h"
+
 /**
-  ARM standard SRAT Generator
+  Standard SRAT Generator
 
   Requirements:
     The following Configuration Manager Object(s) are used by this Generator:
-    - EArmObjGicCInfo (REQUIRED)
-    - EArmObjGicItsInfo (OPTIONAL)
     - EArchCommonObjMemoryAffinityInfo (OPTIONAL)
     - EArchCommonObjGenericInitiatorAffinityInfo (OPTIONAL)
     - EArchCommonObjDeviceHandleAcpi (OPTIONAL)
     - EArchCommonObjDeviceHandlePci (OPTIONAL)
 */
 
-/** This macro expands to a function that retrieves the GIC
-    CPU interface Information from the Configuration Manager.
-*/
-GET_OBJECT_LIST (
-  EObjNameSpaceArm,
-  EArmObjGicCInfo,
-  CM_ARM_GICC_INFO
-  );
-
-/** This macro expands to a function that retrieves the GIC
-    Interrupt Translation Service Information from the
-    Configuration Manager.
-*/
-GET_OBJECT_LIST (
-  EObjNameSpaceArm,
-  EArmObjGicItsInfo,
-  CM_ARM_GIC_ITS_INFO
-  );
-
 /**
   This macro expands to a function that retrieves the Memory Affinity
   information from the Configuration Manager.
@@ -121,102 +102,6 @@ GetBdf (
   return Bdf;
 }
 
-/** Add the GICC Affinity Structures in the SRAT Table.
-
-  @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
-                                Protocol Interface.
-  @param [in]  Srat             Pointer to the SRAT Table.
-  @param [in]  GicCAffOffset    Offset of the GICC Affinity
-                                information in the SRAT Table.
-  @param [in]  GicCInfo         Pointer to the GIC CPU Information list.
-  @param [in]  GicCCount        Count of GIC CPU Interfaces.
-
-  @retval EFI_SUCCESS           Table generated successfully.
-**/
-STATIC
-EFI_STATUS
-AddGICCAffinity (
-  IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL         *CONST  CfgMgrProtocol,
-  IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST  Srat,
-  IN CONST UINT32                                               GicCAffOffset,
-  IN CONST CM_ARM_GICC_INFO                                     *GicCInfo,
-  IN       UINT32                                               GicCCount
-  )
-{
-  EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE  *GicCAff;
-
-  ASSERT (Srat != NULL);
-  ASSERT (GicCInfo != NULL);
-
-  GicCAff = (EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE *)((UINT8 *)Srat +
-                                                     GicCAffOffset);
-
-  while (GicCCount-- != 0) {
-    DEBUG ((DEBUG_INFO, "SRAT: GicCAff = 0x%p\n", GicCAff));
-
-    GicCAff->Type             = EFI_ACPI_6_3_GICC_AFFINITY;
-    GicCAff->Length           = sizeof (EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE);
-    GicCAff->ProximityDomain  = GicCInfo->ProximityDomain;
-    GicCAff->AcpiProcessorUid = GicCInfo->AcpiProcessorUid;
-    GicCAff->Flags            = GicCInfo->AffinityFlags;
-    GicCAff->ClockDomain      = GicCInfo->ClockDomain;
-
-    // Next
-    GicCAff++;
-    GicCInfo++;
-  }// while
-
-  return EFI_SUCCESS;
-}
-
-/** Add the GIC ITS Affinity Structures in the SRAT Table.
-
-  @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
-                                Protocol Interface.
-  @param [in]  Srat             Pointer to the SRAT Table.
-  @param [in]  GicItsAffOffset  Offset of the GIC ITS Affinity
-                                information in the SRAT Table.
-  @param [in]  GicItsInfo       Pointer to the GIC ITS Information list.
-  @param [in]  GicItsCount      Count of GIC ITS.
-
-  @retval EFI_SUCCESS           Table generated successfully.
-**/
-STATIC
-EFI_STATUS
-AddGICItsAffinity (
-  IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL         *CONST  CfgMgrProtocol,
-  IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST  Srat,
-  IN CONST UINT32                                               
GicItsAffOffset,
-  IN CONST CM_ARM_GIC_ITS_INFO                                  *GicItsInfo,
-  IN       UINT32                                               GicItsCount
-  )
-{
-  EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE  *GicItsAff;
-
-  ASSERT (Srat != NULL);
-  ASSERT (GicItsInfo != NULL);
-
-  GicItsAff = (EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE *)((UINT8 *)Srat +
-                                                          GicItsAffOffset);
-
-  while (GicItsCount-- != 0) {
-    DEBUG ((DEBUG_INFO, "SRAT: GicItsAff = 0x%p\n", GicItsAff));
-
-    GicItsAff->Type            = EFI_ACPI_6_3_GIC_ITS_AFFINITY;
-    GicItsAff->Length          = sizeof 
(EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE);
-    GicItsAff->ProximityDomain = GicItsInfo->ProximityDomain;
-    GicItsAff->Reserved[0]     = EFI_ACPI_RESERVED_BYTE;
-    GicItsAff->Reserved[1]     = EFI_ACPI_RESERVED_BYTE;
-    GicItsAff->ItsId           = GicItsInfo->GicItsId;
-
-    // Next
-    GicItsAff++;
-    GicItsInfo++;
-  }// while
-
-  return EFI_SUCCESS;
-}
-
 /** Add the Memory Affinity Structures in the SRAT Table.
 
   @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
@@ -455,18 +340,12 @@ BuildSratTable (
 {
   EFI_STATUS  Status;
   UINT32      TableSize;
-  UINT32      GicCCount;
-  UINT32      GicItsCount;
   UINT32      MemAffCount;
   UINT32      GenInitiatorAffCount;
 
-  UINT32  GicCAffOffset;
-  UINT32  GicItsAffOffset;
   UINT32  MemAffOffset;
   UINT32  GenInitiatorAffOffset;
 
-  CM_ARM_GICC_INFO                                *GicCInfo;
-  CM_ARM_GIC_ITS_INFO                             *GicItsInfo;
   CM_ARCH_COMMON_MEMORY_AFFINITY_INFO             *MemAffInfo;
   CM_ARCH_COMMON_GENERIC_INITIATOR_AFFINITY_INFO  *GenInitiatorAffInfo;
 
@@ -497,46 +376,6 @@ BuildSratTable (
 
   *Table = NULL;
 
-  Status = GetEArmObjGicCInfo (
-             CfgMgrProtocol,
-             CM_NULL_TOKEN,
-             &GicCInfo,
-             &GicCCount
-             );
-  if (EFI_ERROR (Status)) {
-    DEBUG ((
-      DEBUG_ERROR,
-      "ERROR: SRAT: Failed to get GICC Info. Status = %r\n",
-      Status
-      ));
-    goto error_handler;
-  }
-
-  if (GicCCount == 0) {
-    DEBUG ((
-      DEBUG_ERROR,
-      "ERROR: SRAT: GIC CPU Interface information not provided.\n"
-      ));
-    ASSERT (0);
-    Status = EFI_INVALID_PARAMETER;
-    goto error_handler;
-  }
-
-  Status = GetEArmObjGicItsInfo (
-             CfgMgrProtocol,
-             CM_NULL_TOKEN,
-             &GicItsInfo,
-             &GicItsCount
-             );
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
-    DEBUG ((
-      DEBUG_ERROR,
-      "ERROR: SRAT: Failed to get GIC ITS Info. Status = %r\n",
-      Status
-      ));
-    goto error_handler;
-  }
-
   Status = GetEArchCommonObjMemoryAffinityInfo (
              CfgMgrProtocol,
              CM_NULL_TOKEN,
@@ -571,13 +410,18 @@ BuildSratTable (
   // Calculate the size of the SRAT table
   TableSize = sizeof (EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER);
 
-  GicCAffOffset = TableSize;
-  TableSize    += (sizeof (EFI_ACPI_6_3_GICC_AFFINITY_STRUCTURE) * GicCCount);
-
-  if (GicItsCount != 0) {
-    GicItsAffOffset = TableSize;
-    TableSize      += (sizeof (EFI_ACPI_6_3_GIC_ITS_AFFINITY_STRUCTURE) *
-                       GicItsCount);
+  // Place the Arch specific subtables/structures first and
+  // reserve the offsets. The common subtables/structures
+  // are placed next.
+  Status = ArchReserveOffsets (CfgMgrProtocol, &TableSize);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: SRAT: Failed to reserve arch offsets."
+      " Status = %r\n",
+      Status
+      ));
+    goto error_handler;
   }
 
   if (MemAffCount != 0) {
@@ -636,40 +480,16 @@ BuildSratTable (
   Srat->Reserved1 = 1;
   Srat->Reserved2 = EFI_ACPI_RESERVED_QWORD;
 
-  Status = AddGICCAffinity (
-             CfgMgrProtocol,
-             Srat,
-             GicCAffOffset,
-             GicCInfo,
-             GicCCount
-             );
+  Status = AddArchObjects (CfgMgrProtocol, Srat);
   if (EFI_ERROR (Status)) {
     DEBUG ((
       DEBUG_ERROR,
-      "ERROR: SRAT: Failed to add GICC Affinity structures. Status = %r\n",
+      "ERROR: SRAT: Failed to add arch objects header. Status = %r\n",
       Status
       ));
     goto error_handler;
   }
 
-  if (GicItsCount != 0) {
-    Status = AddGICItsAffinity (
-               CfgMgrProtocol,
-               Srat,
-               GicItsAffOffset,
-               GicItsInfo,
-               GicItsCount
-               );
-    if (EFI_ERROR (Status)) {
-      DEBUG ((
-        DEBUG_ERROR,
-        "ERROR: SRAT: Failed to add GIC ITS Affinity structures. Status = 
%r\n",
-        Status
-        ));
-      goto error_handler;
-    }
-  }
-
   if (MemAffCount != 0) {
     Status = AddMemoryAffinity (
                CfgMgrProtocol,
diff --git a/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.h 
b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.h
new file mode 100644
index 000000000000..106d0084947e
--- /dev/null
+++ b/DynamicTablesPkg/Library/Acpi/Common/AcpiSratLib/SratGenerator.h
@@ -0,0 +1,59 @@
+/** @file
+  SRAT Table Generator
+
+  Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - ACPI 6.3 Specification, January 2019
+
+  @par Glossary:
+  - Cm or CM   - Configuration Manager
+  - Obj or OBJ - Object
+**/
+
+#ifndef SRAT_GENERATOR_H_
+#define SRAT_GENERATOR_H_
+
+/** Reserve arch sub-tables space.
+
+  @param [in] CfgMgrProtocol   Pointer to the Configuration Manager
+  @param [in, out] ArchOffset  On input, contains the offset where arch 
specific
+                               sub-tables can be written. It is expected that
+                               there enough space to write all the arch 
specific
+                               sub-tables from this offset onward.
+                               On ouput, contains the ending offset of the arch
+                               specific sub-tables.
+
+  @retval EFI_SUCCESS           Table generated 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
+ArchReserveOffsets (
+  IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST  CfgMgrProtocol,
+  IN OUT UINT32                                           *ArchOffset
+  );
+
+/** Add the arch specific sub-tables to the SRAT table.
+
+  These sub-tables are written in the space reserved beforehand.
+
+  @param [in]  CfgMgrProtocol   Pointer to the Configuration Manager
+                                Protocol Interface.
+  @param [in]  Srat             Pointer to the SRAT Table.
+
+  @retval EFI_SUCCESS           Table generated successfully.
+**/
+EFI_STATUS
+EFIAPI
+AddArchObjects (
+  IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL         *CONST  CfgMgrProtocol,
+  IN EFI_ACPI_6_3_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER *CONST  Srat
+  );
+
+#endif // SRAT_GENERATOR_H_
-- 
2.25.1



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


Reply via email to