]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/PCD/Pei/Service.c
Update the copyright notice format
[mirror_edk2.git] / MdeModulePkg / Universal / PCD / Pei / Service.c
index fddab6be580f71768065fac5cb053c261cd79895..7ed4117a58075cbcbfa2ec39f10c692313cccbf6 100644 (file)
@@ -1,8 +1,9 @@
 /** @file\r
-Private functions used by PCD PEIM.\r
+  The driver internal functions are implmented here.\r
+  They build Pei PCD database, and provide access service to PCD database.\r
 \r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -10,9 +11,6 @@ http://opensource.org/licenses/bsd-license.php
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-\r
-Module Name: Service.c\r
-\r
 **/\r
 \r
 #include "Service.h"\r
@@ -30,6 +28,7 @@ Module Name: Service.c
   @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.\r
   @retval EFI_OUT_OF_RESOURCES If the callback function can't be registered because there is not free\r
                                 slot left in the CallbackFnTable.\r
+  @retval EFI_INVALID_PARAMETER If the callback function want to be de-registered can not be found.\r
 **/\r
 EFI_STATUS\r
 PeiRegisterCallBackWorker (\r
@@ -59,7 +58,10 @@ PeiRegisterCallBackWorker (
     ASSERT (TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1);\r
   } else {\r
     TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
-\r
+    if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    \r
     //\r
     // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
     // We have to decrement TokenNumber by 1 to make it usable\r
@@ -82,24 +84,24 @@ PeiRegisterCallBackWorker (
   ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
   ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
+  GuidHob = GetFirstGuidHob (&gEfiCallerIdGuid);\r
   ASSERT (GuidHob != NULL);\r
   \r
   CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
-  CallbackTable = CallbackTable + (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
+  CallbackTable = CallbackTable + (TokenNumber * PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
 \r
   Compare = Register? NULL: CallBackFunction;\r
   Assign  = Register? CallBackFunction: NULL;\r
 \r
 \r
-  for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
+  for (Idx = 0; Idx < PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
     if (CallbackTable[Idx] == Compare) {\r
       CallbackTable[Idx] = Assign;\r
       return EFI_SUCCESS;\r
     }\r
   }\r
 \r
-  return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
+  return Register? EFI_OUT_OF_RESOURCES : EFI_INVALID_PARAMETER;\r
 \r
 }\r
 \r
@@ -125,9 +127,9 @@ BuildPcdDatabase (
   \r
   CopyMem (&Database->Init, &gPEIPcdDbInit, sizeof (gPEIPcdDbInit));\r
 \r
-  SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
+  SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
 \r
-  CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
+  CallbackFnTable = BuildGuidHob (&gEfiCallerIdGuid, SizeOfCallbackFnTable);\r
   \r
   ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
 }\r
@@ -169,9 +171,8 @@ GetHiiVariable (
                           &Size,\r
                           NULL\r
                           );\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-\r
 \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
     Status = PeiServicesAllocatePool (Size, &Buffer);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
@@ -189,7 +190,7 @@ GetHiiVariable (
     *VariableData = Buffer;\r
 \r
     return EFI_SUCCESS;\r
-  } \r
+  }\r
 \r
   return EFI_NOT_FOUND;\r
 }\r
@@ -295,17 +296,17 @@ InvokeCallbackOnSet (
     ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
   }\r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
+  GuidHob = GetFirstGuidHob (&gEfiCallerIdGuid);\r
   ASSERT (GuidHob != NULL);\r
   \r
   CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
 \r
-  CallbackTable += (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
+  CallbackTable += (TokenNumber * PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
 \r
-  for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
+  for (Idx = 0; Idx < PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
     if (CallbackTable[Idx] != NULL) {\r
       CallbackTable[Idx] (Guid,\r
-                          (Guid == NULL)? TokenNumber: ExTokenNumber,\r
+                          (Guid == NULL) ? (TokenNumber + 1) : ExTokenNumber,\r
                           Data,\r
                           Size\r
                           );\r
@@ -344,6 +345,7 @@ SetValueWorker (
 \r
   @retval EFI_INVALID_PARAMETER  If this PCD type is VPD, VPD PCD can not be set.\r
   @retval EFI_INVALID_PARAMETER  If Size can not be set to size table.\r
+  @retval EFI_INVALID_PARAMETER  If Size of non-Ptr type PCD does not match the size information in PCD database.\r
   @retval EFI_NOT_FOUND          If value type of PCD entry is intergrate, but not in\r
                                  range of UINT8, UINT16, UINT32, UINT64\r
   @retval EFI_NOT_FOUND          Can not find the PCD type according to token number.                                \r
@@ -363,7 +365,7 @@ SetWorker (
   VOID                *InternalData;\r
   UINTN               MaxSize;\r
 \r
-  if (!FeaturePcdGet(PcdPeiPcdDatabaseSetEnabled)) {\r
+  if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) {\r
     return EFI_UNSUPPORTED;\r
   }\r
   \r
@@ -383,8 +385,14 @@ SetWorker (
 \r
   LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
 \r
-  if (!PtrType) {\r
-    ASSERT (PeiPcdGetSize(TokenNumber + 1) == *Size);\r
+  if (PtrType) {\r
+    if (*Size > PeiPcdGetSize (TokenNumber + 1)) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  } else {\r
+    if (*Size != PeiPcdGetSize (TokenNumber + 1)) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
   }\r
 \r
   //\r
@@ -411,6 +419,7 @@ SetWorker (
   switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
     case PCD_TYPE_HII:\r
+    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
     {\r
       ASSERT (FALSE);\r
       return EFI_INVALID_PARAMETER;\r
@@ -517,12 +526,15 @@ ExSetWorker (
 {\r
   UINTN                     TokenNumber;\r
 \r
-  if (!FeaturePcdGet(PcdPeiPcdDatabaseSetEnabled)) {\r
+  if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
   TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
-\r
+  if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  \r
   InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, *Size);\r
 \r
   return SetWorker (TokenNumber, Data, Size, PtrType);\r
@@ -545,12 +557,7 @@ ExGetWorker (
   IN UINTN            ExTokenNumber,\r
   IN UINTN            GetSize\r
   )\r
-{\r
-  if (!FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) {\r
-    ASSERT (FALSE);\r
-    return 0;\r
-  }\r
-  \r
+{ \r
   return GetWorker (GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize);\r
 }\r
 \r
@@ -581,7 +588,7 @@ GetWorker (
   EFI_STATUS          Status;\r
   UINTN               DataSize;\r
   VOID                *Data;\r
-  UINT16              *StringTable;\r
+  UINT              *StringTable;\r
   UINT16              StringTableIdx;\r
   PEI_PCD_DATABASE    *PeiPcdDb;\r
   UINT32              LocalTokenNumber;\r
@@ -622,15 +629,16 @@ GetWorker (
     {\r
       VPD_HEAD *VpdHead;\r
       VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
-      return (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
+      return (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
     }\r
       \r
+    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
     case PCD_TYPE_HII:\r
     {\r
       VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
       \r
       Guid = &(PeiPcdDb->Init.GuidTable[VariableHead->GuidTableIndex]);\r
-      Name = &StringTable[VariableHead->StringIndex];\r
+      Name = (UINT16*)&StringTable[VariableHead->StringIndex];\r
 \r
       Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
 \r
@@ -640,7 +648,11 @@ GetWorker (
         //\r
         // Return the default value specified by Platform Integrator \r
         //\r
-        return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset);\r
+        if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
+          return (VOID*)&StringTable[*(UINT16*)((UINT8*)PeiPcdDb + VariableHead->DefaultValueOffset)];\r
+        } else {\r
+          return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset);\r
+        }\r
       }\r
     }\r
 \r
@@ -648,7 +660,7 @@ GetWorker (
       return (VOID *) ((UINT8 *)PeiPcdDb + Offset);\r
 \r
     case PCD_TYPE_STRING:\r
-      StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
+      StringTableIdx = * (UINT16*) ((UINT8 *) PeiPcdDb + Offset);\r
       return (VOID *) (&StringTable[StringTableIdx]);\r
 \r
     default:\r
@@ -710,9 +722,7 @@ GetExPcdTokenNumber (
     }\r
   }\r
   \r
-  ASSERT (FALSE);\r
-  \r
-  return 0;\r
+  return PCD_INVALID_TOKEN_NUMBER;\r
 }\r
 \r
 /**\r