+++ /dev/null
-/** @file PCD PEIM\r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. 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
- \r
-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: Pcd.c\r
-\r
-**/\r
-\r
-#include "Service.h"\r
-\r
-\r
-PCD_PPI mPcdPpiInstance = {\r
- PeiPcdSetSku,\r
-\r
- PeiPcdGet8,\r
- PeiPcdGet16, \r
- PeiPcdGet32, \r
- PeiPcdGet64, \r
- PeiPcdGetPtr, \r
- PeiPcdGetBool, \r
- PeiPcdGetSize,\r
-\r
- PeiPcdGet8Ex,\r
- PeiPcdGet16Ex, \r
- PeiPcdGet32Ex, \r
- PeiPcdGet64Ex, \r
- PeiPcdGetPtrEx, \r
- PeiPcdGetBoolEx, \r
- PeiPcdGetSizeEx,\r
- \r
- PeiPcdSet8,\r
- PeiPcdSet16, \r
- PeiPcdSet32, \r
- PeiPcdSet64, \r
- PeiPcdSetPtr, \r
- PeiPcdSetBool, \r
-\r
- PeiPcdSet8Ex,\r
- PeiPcdSet16Ex, \r
- PeiPcdSet32Ex, \r
- PeiPcdSet64Ex, \r
- PeiPcdSetPtrEx, \r
- PeiPcdSetBoolEx,\r
-\r
- PeiRegisterCallBackOnSet,\r
- PcdUnRegisterCallBackOnSet,\r
- PeiPcdGetNextToken,\r
- PeiPcdGetNextTokenSpace\r
-};\r
-\r
-\r
-\r
-STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {\r
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
- &gPcdPpiGuid,\r
- &mPcdPpiInstance\r
-};\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdPeimInit (\r
- IN EFI_FFS_FILE_HEADER *FfsHeader,\r
- IN EFI_PEI_SERVICES **PeiServices\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- BuildPcdDatabase ();\r
- \r
- Status = PeiServicesInstallPpi (&mPpiPCD);\r
-\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- return EFI_SUCCESS;\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-PeiPcdSetSku (\r
- IN UINTN SkuId\r
- )\r
-{\r
-\r
- GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
-\r
- return;\r
-}\r
-\r
-\r
-\r
-UINT8\r
-EFIAPI\r
-PeiPcdGet8 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
-}\r
-\r
-\r
-\r
-UINT16\r
-EFIAPI\r
-PeiPcdGet16 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
-}\r
-\r
-\r
-\r
-UINT32\r
-EFIAPI\r
-PeiPcdGet32 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
-}\r
-\r
-\r
-\r
-UINT64\r
-EFIAPI\r
-PeiPcdGet64 (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
-}\r
-\r
-\r
-\r
-VOID *\r
-EFIAPI\r
-PeiPcdGetPtr (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- return GetWorker (TokenNumber, 0);\r
-}\r
-\r
-\r
-\r
-BOOLEAN\r
-EFIAPI\r
-PeiPcdGetBool (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
-}\r
-\r
-\r
-\r
-UINTN\r
-EFIAPI\r
-PeiPcdGetSize (\r
- IN UINTN TokenNumber\r
- )\r
-{\r
- PEI_PCD_DATABASE *PeiPcdDb;\r
- UINTN Size;\r
- UINTN MaxSize;\r
-\r
- //\r
- // If DebugAssertEnabled is TRUE, we still need to provide the GET size\r
- // function as GetWorker and SetWoker need this function to do ASSERT.\r
- //\r
- if ((!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) &&\r
- (!DebugAssertEnabled ())) {\r
- return 0;\r
- }\r
-\r
- PeiPcdDb = GetPcdDatabase ();\r
- //\r
- // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
- // We have to decrement TokenNumber by 1 to make it usable\r
- // as the array index.\r
- //\r
- TokenNumber--;\r
-\r
- // EBC compiler is very choosy. It may report warning about comparison\r
- // between UINTN and 0 . So we add 1 in each size of the \r
- // comparison.\r
- ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
-\r
- Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
-\r
- if (Size == 0) {\r
- //\r
- // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
- //\r
- return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
- } else {\r
- return Size;\r
- }\r
-\r
-}\r
-\r
-\r
-\r
-UINT8\r
-EFIAPI\r
-PeiPcdGet8Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
- )\r
-{\r
- return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
-}\r
-\r
-\r
-\r
-UINT16\r
-EFIAPI\r
-PeiPcdGet16Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
- )\r
-{\r
- return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
-}\r
-\r
-\r
-\r
-UINT32\r
-EFIAPI\r
-PeiPcdGet32Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
- )\r
-{\r
- return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
-}\r
-\r
-\r
-\r
-UINT64\r
-EFIAPI\r
-PeiPcdGet64Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
- )\r
-{\r
- return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
-}\r
-\r
-\r
-\r
-VOID *\r
-EFIAPI\r
-PeiPcdGetPtrEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
- )\r
-{\r
- return ExGetWorker (Guid, ExTokenNumber, 0);\r
-}\r
-\r
-\r
-\r
-BOOLEAN\r
-EFIAPI\r
-PeiPcdGetBoolEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
- )\r
-{\r
- return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
-}\r
-\r
-\r
-\r
-UINTN\r
-EFIAPI\r
-PeiPcdGetSizeEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
- )\r
-{\r
- if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) {\r
- return 0;\r
- }\r
-\r
- return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet8 (\r
- IN UINTN TokenNumber,\r
- IN UINT8 Value\r
- )\r
-{\r
- return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet16 (\r
- IN UINTN TokenNumber,\r
- IN UINT16 Value\r
- )\r
-{\r
- return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet32 (\r
- IN UINTN TokenNumber,\r
- IN UINT32 Value\r
- )\r
-{\r
- return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet64 (\r
- IN UINTN TokenNumber,\r
- IN UINT64 Value\r
- )\r
-{\r
- return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSetPtr (\r
- IN UINTN TokenNumber,\r
- IN OUT UINTN *SizeOfBuffer,\r
- IN VOID *Buffer\r
- )\r
-{\r
- return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSetBool (\r
- IN UINTN TokenNumber,\r
- IN BOOLEAN Value\r
- )\r
-{\r
- return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet8Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT8 Value\r
- )\r
-{\r
- return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet16Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT16 Value\r
- )\r
-{\r
- return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet32Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT32 Value\r
- )\r
-{\r
- return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSet64Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT64 Value\r
- )\r
-{\r
- return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSetPtrEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINTN *SizeOfBuffer,\r
- IN VOID *Value\r
- )\r
-{\r
- return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdSetBoolEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN BOOLEAN Value\r
- )\r
-{\r
- return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
-}\r
-\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiRegisterCallBackOnSet (\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN UINTN ExTokenNumber,\r
- IN PCD_PPI_CALLBACK CallBackFunction\r
- )\r
-{\r
- if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- ASSERT (CallBackFunction != NULL);\r
- \r
- return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PcdUnRegisterCallBackOnSet (\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN UINTN ExTokenNumber,\r
- IN PCD_PPI_CALLBACK CallBackFunction\r
- )\r
-{\r
- if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- ASSERT (CallBackFunction != NULL);\r
- \r
- return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdGetNextToken (\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN OUT UINTN *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
- BOOLEAN PeiExMapTableEmpty;\r
-\r
- if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
-\r
- if (Guid == NULL) {\r
- if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
- return EFI_NOT_FOUND;\r
- }\r
- (*TokenNumber)++;\r
- if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
- *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- }\r
- return EFI_SUCCESS;\r
- } else {\r
- if (PeiExMapTableEmpty) {\r
- *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- return EFI_SUCCESS;\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 = 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
- //\r
- // Locate the GUID in ExMapTable first.\r
- //\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 ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
- if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
- i++;\r
- if (i == PEI_EXMAPPING_TABLE_SIZE) {\r
- //\r
- // Exceed the length of ExMap Table\r
- //\r
- *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- return EFI_SUCCESS;\r
- }\r
- if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
- *TokenNumber = ExMapTable[i].ExTokenNumber;\r
- return EFI_SUCCESS;\r
- } else {\r
- *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- }\r
- return EFI_NOT_FOUND;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiPcdGetNextTokenSpace (\r
- IN OUT 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
- BOOLEAN PeiExMapTableEmpty;\r
-\r
- if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- ASSERT (Guid != NULL);\r
-\r
- PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
-\r
- if (PeiExMapTableEmpty) {\r
- if (*Guid != NULL) {\r
- return EFI_NOT_FOUND;\r
- } else {\r
- return EFI_SUCCESS;\r
- }\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
- ExMapTable = PeiPcdDb->Init.ExMapTable;\r
-\r
- if (*Guid == NULL) {\r
- //\r
- // return the first Token Space Guid.\r
- //\r
- *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
- return EFI_SUCCESS;\r
- }\r
-\r
- MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
-\r
- if (MatchGuid == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\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
- i++;\r
- for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
- if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
- *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- *Guid = NULL;\r
- return EFI_SUCCESS;\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-\r
-}\r
-\r
-UINTN\r
-GetPtrTypeSize (\r
- IN UINTN LocalTokenNumberTableIdx,\r
- OUT UINTN *MaxSize,\r
- IN PEI_PCD_DATABASE *Database\r
- )\r
-{\r
- INTN SizeTableIdx;\r
- UINTN LocalTokenNumber;\r
- SKU_ID *SkuIdTable;\r
- SIZE_INFO *SizeTable;\r
- UINTN i;\r
-\r
- SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
-\r
- LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
-\r
- ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
- \r
- SizeTable = Database->Init.SizeTable;\r
-\r
- *MaxSize = SizeTable[SizeTableIdx];\r
- //\r
- // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
- // PCD entry.\r
- //\r
- if (LocalTokenNumber & PCD_TYPE_VPD) {\r
- //\r
- // We have only one entry for VPD enabled PCD entry:\r
- // 1) MAX Size.\r
- // We consider current size is equal to MAX size.\r
- //\r
- return *MaxSize;\r
- } else {\r
- if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
- //\r
- // We have only two entry for Non-Sku enabled PCD entry:\r
- // 1) MAX SIZE\r
- // 2) Current Size\r
- //\r
- return SizeTable[SizeTableIdx + 1];\r
- } else {\r
- //\r
- // We have these entry for SKU enabled PCD entry\r
- // 1) MAX SIZE\r
- // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
- //\r
- SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
- for (i = 0; i < SkuIdTable[0]; i++) {\r
- if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
- return SizeTable[SizeTableIdx + 1 + i];\r
- }\r
- }\r
- return SizeTable[SizeTableIdx + 1];\r
- }\r
- }\r
-}\r
-\r
-\r
-\r
-BOOLEAN\r
-SetPtrTypeSize (\r
- IN UINTN LocalTokenNumberTableIdx,\r
- IN OUT UINTN *CurrentSize,\r
- IN PEI_PCD_DATABASE *Database\r
- )\r
-{\r
- INTN SizeTableIdx;\r
- UINTN LocalTokenNumber;\r
- SKU_ID *SkuIdTable;\r
- SIZE_INFO *SizeTable;\r
- UINTN i;\r
- UINTN MaxSize;\r
- \r
- SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
-\r
- LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
-\r
- ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
- \r
- SizeTable = Database->Init.SizeTable;\r
-\r
- MaxSize = SizeTable[SizeTableIdx];\r
- //\r
- // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
- // PCD entry.\r
- //\r
- if (LocalTokenNumber & PCD_TYPE_VPD) {\r
- //\r
- // We shouldn't come here as we don't support SET for VPD\r
- //\r
- ASSERT (FALSE);\r
- return FALSE;\r
- } else {\r
- if ((*CurrentSize > MaxSize) ||\r
- (*CurrentSize == MAX_ADDRESS)) {\r
- *CurrentSize = MaxSize;\r
- return FALSE;\r
- } \r
- \r
- if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
- //\r
- // We have only two entry for Non-Sku enabled PCD entry:\r
- // 1) MAX SIZE\r
- // 2) Current Size\r
- //\r
- SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
- return TRUE;\r
- } else {\r
- //\r
- // We have these entry for SKU enabled PCD entry\r
- // 1) MAX SIZE\r
- // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
- //\r
- SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
- for (i = 0; i < SkuIdTable[0]; i++) {\r
- if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
- SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize;\r
- return TRUE;\r
- }\r
- }\r
- SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
- return TRUE;\r
- }\r
- }\r
-\r
-}\r