]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Sync up Pcd Library Instances and PCD Driver/PEIM with Pcd spec 0.51 and Mde 0.51
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
index 2663be159dd54884d9cd460bdb9a97a7429d19ac..974095f2841e462f9bc5a1d320e6b15e0fafc57f 100644 (file)
@@ -83,16 +83,16 @@ PcdPeimInit (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
 PeiPcdSetSku (\r
-  IN  UINTN                  SkuId\r
+  IN  SKU_ID                  SkuId\r
   )\r
 {\r
 \r
-  GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
+  GetPcdDatabase()->Init.SystemSkuId = SkuId;\r
 \r
-  return  EFI_SUCCESS;\r
+  return;\r
 }\r
 \r
 \r
@@ -100,7 +100,7 @@ PeiPcdSetSku (
 UINT8\r
 EFIAPI\r
 PeiPcdGet8 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
@@ -111,7 +111,7 @@ PeiPcdGet8 (
 UINT16\r
 EFIAPI\r
 PeiPcdGet16 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
@@ -122,7 +122,7 @@ PeiPcdGet16 (
 UINT32\r
 EFIAPI\r
 PeiPcdGet32 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
@@ -133,7 +133,7 @@ PeiPcdGet32 (
 UINT64\r
 EFIAPI\r
 PeiPcdGet64 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
@@ -144,7 +144,7 @@ PeiPcdGet64 (
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtr (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   return GetWorker (TokenNumber, 0);\r
@@ -155,7 +155,7 @@ PeiPcdGetPtr (
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBool (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
@@ -166,7 +166,7 @@ PeiPcdGetBool (
 UINTN\r
 EFIAPI\r
 PeiPcdGetSize (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
@@ -180,7 +180,7 @@ UINT8
 EFIAPI\r
 PeiPcdGet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  ExTokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
@@ -192,7 +192,7 @@ UINT16
 EFIAPI\r
 PeiPcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  ExTokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
@@ -204,7 +204,7 @@ UINT32
 EFIAPI\r
 PeiPcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  ExTokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
@@ -216,7 +216,7 @@ UINT64
 EFIAPI\r
 PeiPcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  ExTokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
@@ -228,7 +228,7 @@ VOID *
 EFIAPI\r
 PeiPcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  ExTokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   return ExGetWorker (Guid, ExTokenNumber, 0);\r
@@ -240,7 +240,7 @@ BOOLEAN
 EFIAPI\r
 PeiPcdGetBoolEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  ExTokenNumber\r
+  IN PCD_TOKEN_NUMBER                  ExTokenNumber\r
   )\r
 {\r
   return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
@@ -252,7 +252,7 @@ UINTN
 EFIAPI\r
 PeiPcdGetSizeEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  ExTokenNumber\r
+  IN PCD_TOKEN_NUMBER                  ExTokenNumber\r
   )\r
 {\r
   EX_PCD_ENTRY_ATTRIBUTE      Attr;\r
@@ -267,7 +267,7 @@ PeiPcdGetSizeEx (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet8 (\r
-  IN UINTN             TokenNumber,\r
+  IN PCD_TOKEN_NUMBER             TokenNumber,\r
   IN UINT8             Value\r
   )\r
 {\r
@@ -279,7 +279,7 @@ PeiPcdSet8 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16 (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN UINT16             Value\r
   )\r
 {\r
@@ -291,7 +291,7 @@ PeiPcdSet16 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32 (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN UINT32             Value\r
   )\r
 {\r
@@ -303,7 +303,7 @@ PeiPcdSet32 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64 (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN UINT64             Value\r
   )\r
 {\r
@@ -314,16 +314,12 @@ PeiPcdSet64 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtr (\r
-  IN UINTN              TokenNumber,\r
-  IN CONST VOID         *Value\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
+  IN UINTN                         SizeOfBuffer,\r
+  IN VOID                          *Buffer\r
   )\r
 {\r
-  //\r
-  // BugBug, please change the Size to Input size when sync with spec\r
-  //\r
-  //ASSERT (sizeof (Value) == GetPcdDatabase()->Init.SizeTable[TokenNumber]);\r
-\r
-  return SetWorker (TokenNumber, (VOID *) Value, GetPcdDatabase()->Init.SizeTable[TokenNumber], TRUE);\r
+  return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
 }\r
 \r
 \r
@@ -331,7 +327,7 @@ PeiPcdSetPtr (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBool (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN BOOLEAN            Value\r
   )\r
 {\r
@@ -344,7 +340,7 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet8Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT8                  Value\r
   )\r
 {\r
@@ -363,7 +359,7 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet16Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT16                 Value\r
   )\r
 {\r
@@ -382,7 +378,7 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet32Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT32                 Value\r
   )\r
 {\r
@@ -401,7 +397,7 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet64Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT64                 Value\r
   )\r
 {\r
@@ -420,15 +416,16 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetPtrEx (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN CONST VOID             *Value\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
+  IN UINTN                  SizeOfBuffer,\r
+  IN VOID                   *Value\r
   )\r
 {\r
   return          ExSetWorker(\r
                               ExTokenNumber, \r
                               Guid,\r
-                              (VOID *) Value, \r
-                              sizeof (Value)\r
+                              Value, \r
+                              SizeOfBuffer\r
                               TRUE\r
                               );\r
 }\r
@@ -439,7 +436,7 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetBoolEx (\r
   IN CONST EFI_GUID       *Guid,\r
-  IN UINTN                ExTokenNumber,\r
+  IN PCD_TOKEN_NUMBER     ExTokenNumber,\r
   IN BOOLEAN              Value\r
   )\r
 {\r
@@ -458,7 +455,7 @@ PeiPcdSetBoolEx (
 EFI_STATUS\r
 EFIAPI\r
 PcdRegisterCallBackOnSet (\r
-  IN  UINTN                       ExTokenNumber,\r
+  IN  PCD_TOKEN_NUMBER            ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
@@ -471,7 +468,7 @@ PcdRegisterCallBackOnSet (
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
-  IN  UINTN                       ExTokenNumber,\r
+  IN  PCD_TOKEN_NUMBER            ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
@@ -485,22 +482,138 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdGetNextToken (\r
   IN CONST EFI_GUID               *Guid, OPTIONAL\r
-  IN OUT  UINTN                   *TokenNumber\r
+  IN OUT  PCD_TOKEN_NUMBER                   *TokenNumber\r
   )\r
 {\r
+  UINTN               GuidTableIdx;\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
+  EFI_GUID            *MatchGuid;\r
+  DYNAMICEX_MAPPING   *ExMapTable;\r
+  UINTN               i;\r
+  BOOLEAN             Found;\r
+    \r
   if (Guid == NULL) {\r
     *TokenNumber++;\r
 \r
-    if (*TokenNumber >= PEI_LOCAL_TOKEN_NUMBER) {\r
+    if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
       *TokenNumber = 0;\r
     }\r
+    \r
+  } else {\r
+\r
+    if (PEI_EXMAP_TABLE_EMPTY) {\r
+      *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    \r
+    //\r
+    // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
+    // 1) ExGuid\r
+    // 2) ExTokenNumber\r
+    //\r
+    PeiPcdDb = GetPcdDatabase ();\r
+    \r
+    MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
+\r
+    if (MatchGuid == NULL) {\r
+      *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
+      return EFI_NOT_FOUND;\r
+    }\r
+\r
+    GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
+\r
+    ExMapTable = PeiPcdDb->Init.ExMapTable;\r
+\r
+    Found = FALSE;\r
+    for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+      if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
+        Found = TRUE;\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (Found) {\r
+      if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
+        *TokenNumber = ExMapTable[i].ExTokenNumber;\r
+         return EFI_SUCCESS;\r
+      }\r
+      \r
+      for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
+        if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
+          i++;\r
+          if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
+            *TokenNumber = ExMapTable[i].ExTokenNumber;\r
+            return EFI_SUCCESS;\r
+          } else {\r
+            *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
+            return EFI_SUCCESS;\r
+          }\r
+        }\r
+      }\r
+\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    \r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_GUID *\r
+EFIAPI\r
+PeiPcdGetNextTokenSpaceGuid (\r
+  IN CONST EFI_GUID               *Guid\r
+  )\r
+{\r
+  UINTN               GuidTableIdx;\r
+  EFI_GUID            *MatchGuid;\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
+  DYNAMICEX_MAPPING   *ExMapTable;\r
+  UINTN               i;\r
+  BOOLEAN             Found;\r
+\r
+  if (PEI_EXMAP_TABLE_EMPTY) {\r
+    return NULL;\r
   }\r
 \r
   //\r
-  // BugBug: Haven't implemented the portion to get Next Token for GuidSpace is not Local GuidSpace.\r
+  // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
+  // 1) ExGuid\r
+  // 2) ExTokenNumber\r
   //\r
+  PeiPcdDb = GetPcdDatabase ();\r
 \r
-  return EFI_SUCCESS;\r
-}\r
+  MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
+\r
+  if (MatchGuid == NULL) {\r
+    return NULL;\r
+  }\r
+  \r
+  GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
 \r
+  ExMapTable = PeiPcdDb->Init.ExMapTable;\r
+\r
+  Found = FALSE;\r
+  for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+    if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
+      Found = TRUE;\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (Found) {\r
+    for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
+      if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
+        if (i < PEI_EXMAPPING_TABLE_SIZE) {\r
+          return &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
+        } else {\r
+          return NULL;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+\r
+}\r
 \r