public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chris Jones" <christopher.jones@arm.com>
To: <devel@edk2.groups.io>
Cc: <michael.d.kinney@intel.com>, <gaoliming@byosoft.com.cn>,
	<zhiguang.liu@intel.com>, <ray.ni@intel.com>,
	<zhichao.gao@intel.com>, <Alexei.Fedorov@arm.com>,
	<Sami.Mujawar@arm.com>, <nd@arm.com>
Subject: [PATCH v3 7/7] DynamicTablesPkg: Add CacheId to PPTT generator
Date: Wed, 8 Dec 2021 16:06:30 +0000	[thread overview]
Message-ID: <20211208160630.10923-8-christopher.jones@arm.com> (raw)
In-Reply-To: <20211208160630.10923-1-christopher.jones@arm.com>

Bugzilla: 3697 (https://bugzilla.tianocore.org/show_bug.cgi?id=3697)

Update the PPTT generator with the CacheId field as defined in table
5.140 of the ACPI 6.4 specification.

Also add validations to ensure that the cache id generated is unique.

Signed-off-by: Chris Jones <christopher.jones@arm.com>
---
 DynamicTablesPkg/Include/ArmNameSpaceObjects.h                   |   4 +-
 DynamicTablesPkg/Library/Acpi/Arm/AcpiPpttLibArm/PpttGenerator.c | 102 ++++++++++++++++++--
 2 files changed, 96 insertions(+), 10 deletions(-)

diff --git a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
index 3246e8884723ac85340bf880a3859800726be3c1..6ea03fca487b96577b8fd8105bc3d22047ff5697 100644
--- a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
+++ b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
@@ -741,10 +741,12 @@ typedef struct CmArmCacheInfo {
   /// PPTT_ARM_CCIDX_CACHE_ASSOCIATIVITY_MAX. Therfore this field
   /// is 32-bit wide.
   UINT32             Associativity;
-  /// Cache attributes (ACPI 6.3 - January 2019, PPTT, Table 5-156)
+  /// Cache attributes (ACPI 6.4 - January 2021, PPTT, Table 5.140)
   UINT8              Attributes;
   /// Line size in bytes
   UINT16             LineSize;
+  /// Unique ID for the cache
+  UINT32             CacheId;
 } CM_ARM_CACHE_INFO;
 
 /** A structure that describes a reference to another Configuration Manager
diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiPpttLibArm/PpttGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPpttLibArm/PpttGenerator.c
index 3d416ca78ec16a1929ede87abbe4f8f4464ef0cf..6b74572ea2dd8478f14d013e6cb7394216e45d8d 100644
--- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiPpttLibArm/PpttGenerator.c
+++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiPpttLibArm/PpttGenerator.c
@@ -726,6 +726,35 @@ AddProcHierarchyNodes (
   return Status;
 }
 
+/**
+  Test whether CacheId is unique among the CacheIdList.
+
+  @param [in]  CacheId          Cache ID to check.
+  @param [in]  CacheIdList      List of already existing cache IDs.
+  @param [in]  CacheIdListSize  Size of CacheIdList.
+
+  @retval TRUE                  CacheId does not exist in CacheIdList.
+  @retval FALSE                 CacheId already exists in CacheIdList.
+**/
+STATIC
+BOOLEAN
+IsCacheIdUnique (
+  IN CONST UINT32  CacheId,
+  IN CONST UINT32  *CacheIdList,
+  IN CONST UINT32  CacheIdListSize
+  )
+{
+  UINT32  Index;
+
+  for (Index = 0; Index < CacheIdListSize; Index++) {
+    if (CacheIdList[Index] == CacheId) {
+      return FALSE;
+    }
+  }
+
+  return TRUE;
+}
+
 /**
   Update the Cache Type Structure (Type 1) information.
 
@@ -738,10 +767,12 @@ AddProcHierarchyNodes (
   @param [in]  Pptt                 Pointer to PPTT table structure.
   @param [in]  NodesStartOffset     Offset from the start of PPTT table to the
                                     start of Cache Type Structures.
+  @param [in]  Revision             Revision of the PPTT table being requested.
 
   @retval EFI_SUCCESS               Structures updated successfully.
   @retval EFI_INVALID_PARAMETER     A parameter is invalid.
   @retval EFI_NOT_FOUND             A required object was not found.
+  @retval EFI_OUT_OF_RESOURCES      Out of resources.
 **/
 STATIC
 EFI_STATUS
@@ -749,7 +780,8 @@ AddCacheTypeStructures (
   IN  CONST ACPI_PPTT_GENERATOR                   *CONST             Generator,
   IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST             CfgMgrProtocol,
   IN  CONST EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_HEADER  *Pptt,
-  IN  CONST UINT32                                                   NodesStartOffset
+  IN  CONST UINT32                                                   NodesStartOffset,
+  IN  CONST UINT32                                                   Revision
   )
 {
   EFI_STATUS                         Status;
@@ -758,6 +790,9 @@ AddCacheTypeStructures (
   CM_ARM_CACHE_INFO                  *CacheInfoNode;
   PPTT_NODE_INDEXER                  *CacheNodeIterator;
   UINT32                             NodeCount;
+  BOOLEAN                            CacheIdUnique;
+  UINT32                             TotalNodeCount;
+  UINT32                             *FoundCacheIds;
 
   ASSERT (
     (Generator != NULL) &&
@@ -770,6 +805,13 @@ AddCacheTypeStructures (
 
   CacheNodeIterator = Generator->CacheStructIndexedList;
   NodeCount         = Generator->CacheStructCount;
+  TotalNodeCount    = NodeCount;
+
+  FoundCacheIds = AllocateZeroPool (TotalNodeCount * sizeof (*FoundCacheIds));
+  if (FoundCacheIds == NULL) {
+    DEBUG ((DEBUG_ERROR, "ERROR: PPTT: Failed to allocate resources.\n"));
+    return EFI_OUT_OF_RESOURCES;
+  }
 
   while (NodeCount-- != 0) {
     CacheInfoNode = (CM_ARM_CACHE_INFO *)CacheNodeIterator->Object;
@@ -789,6 +831,7 @@ AddCacheTypeStructures (
     CacheStruct->Flags.CacheTypeValid      = 1;
     CacheStruct->Flags.WritePolicyValid    = 1;
     CacheStruct->Flags.LineSizeValid       = 1;
+    CacheStruct->Flags.CacheIdValid        = 1;
     CacheStruct->Flags.Reserved            = 0;
 
     // Populate the reference to the next level of cache
@@ -811,7 +854,7 @@ AddCacheTypeStructures (
           CacheInfoNode->Token,
           Status
           ));
-        return Status;
+        goto cleanup;
       }
 
       // Update Cache Structure with the offset for the next level of cache
@@ -835,7 +878,7 @@ AddCacheTypeStructures (
         CacheInfoNode->NumberOfSets,
         Status
         ));
-      return Status;
+      goto cleanup;
     }
 
     if (CacheInfoNode->NumberOfSets > PPTT_ARM_CACHE_NUMBER_OF_SETS_MAX) {
@@ -862,7 +905,7 @@ AddCacheTypeStructures (
         CacheInfoNode->Associativity,
         Status
         ));
-      return Status;
+      goto cleanup;
     }
 
     // Validate the Associativity field based on the architecture specification
@@ -881,7 +924,7 @@ AddCacheTypeStructures (
         CacheInfoNode->Associativity,
         Status
         ));
-      return Status;
+      goto cleanup;
     }
 
     if (CacheInfoNode->Associativity > PPTT_ARM_CACHE_ASSOCIATIVITY_MAX) {
@@ -923,7 +966,7 @@ AddCacheTypeStructures (
         CacheInfoNode->LineSize,
         Status
         ));
-      return Status;
+      goto cleanup;
     }
 
     if ((CacheInfoNode->LineSize & (CacheInfoNode->LineSize - 1)) != 0) {
@@ -935,18 +978,58 @@ AddCacheTypeStructures (
         CacheInfoNode->LineSize,
         Status
         ));
-      return Status;
+      goto cleanup;
     }
 
     CacheStruct->LineSize = CacheInfoNode->LineSize;
 
+    if (Revision >= 3) {
+      // Validate and populate cache id
+      if (CacheInfoNode->CacheId == 0) {
+        Status = EFI_INVALID_PARAMETER;
+        DEBUG ((
+          DEBUG_ERROR,
+          "ERROR: PPTT: The cache id cannot be zero. Status = %r\n",
+          Status
+          ));
+        goto cleanup;
+      }
+
+      CacheIdUnique = IsCacheIdUnique (
+                        CacheInfoNode->CacheId,
+                        FoundCacheIds,
+                        TotalNodeCount
+                        );
+      if (!CacheIdUnique) {
+        Status = EFI_INVALID_PARAMETER;
+        DEBUG ((
+          DEBUG_ERROR,
+          "ERROR: PPTT: The cache id is not unique. " \
+          "CacheId = %d. Status = %r\n",
+          CacheInfoNode->CacheId,
+          Status
+          ));
+        goto cleanup;
+      }
+
+      // Store the cache id so we can check future cache ids for uniqueness
+      FoundCacheIds[NodeCount] = CacheInfoNode->CacheId;
+
+      CacheStruct->CacheId = CacheInfoNode->CacheId;
+    }
+
     // Next Cache Type Structure
     CacheStruct = (EFI_ACPI_6_4_PPTT_STRUCTURE_CACHE *)((UINT8 *)CacheStruct +
                                                         CacheStruct->Length);
     CacheNodeIterator++;
   } // Cache Type Structure
 
-  return EFI_SUCCESS;
+  Status = EFI_SUCCESS;
+
+cleanup:
+  FreePool (FoundCacheIds);
+
+  return Status;
 }
 
 /**
@@ -1205,7 +1288,8 @@ BuildPpttTable (
                Generator,
                CfgMgrProtocol,
                Pptt,
-               CacheStructOffset
+               CacheStructOffset,
+               AcpiTableInfo->AcpiTableRevision
                );
     if (EFI_ERROR (Status)) {
       DEBUG ((
-- 
Guid("CE165669-3EF3-493F-B85D-6190EE5B9759")


  parent reply	other threads:[~2021-12-08 16:06 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-08 16:06 [PATCH v3 0/7] Support ACPI 6.4 PPTT changes Chris Jones
2021-12-08 16:06 ` [PATCH v3 1/7] MdePkg: Add missing Cache ID (in)valid define Chris Jones
2021-12-08 16:06 ` [PATCH v3 2/7] MdePkg: Remove PPTT ID type structure Chris Jones
2021-12-08 16:06 ` [PATCH v3 3/7] ShellPkg: Update Acpiview PPTT parser to ACPI 6.4 Chris Jones
2021-12-08 16:06 ` [PATCH v3 4/7] ShellPkg: Add Cache ID to PPTT parser Chris Jones
2021-12-08 16:06 ` [PATCH v3 5/7] DynamicTablesPkg: Remove PPTT ID structure from ACPI 6.4 generator Chris Jones
2021-12-08 16:06 ` [PATCH v3 6/7] DynamicTablesPkg: Update PPTT generator to ACPI 6.4 Chris Jones
2021-12-08 16:06 ` Chris Jones [this message]
2021-12-09 13:19   ` [PATCH v3 7/7] DynamicTablesPkg: Add CacheId to PPTT generator Sami Mujawar
2021-12-09 13:42     ` Chris Jones
2021-12-09 17:00 ` [PATCH v3 0/7] Support ACPI 6.4 PPTT changes Sami Mujawar
     [not found] ` <16BF24D08620153C.20064@groups.io>
2021-12-10 20:10   ` [edk2-devel] " 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=20211208160630.10923-8-christopher.jones@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