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 - 2017, 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
-\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
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
CHAR8 *Name;\r
\r
//\r
- // Return NULL when PCD name table is absent. \r
+ // Return NULL when PCD name table is absent.\r
//\r
if (Database->PcdNameTableOffset == 0) {\r
return NULL;\r
//\r
AsciiStrCatS (Name, NameSize, TokenSpaceName);\r
Name[AsciiStrSize (TokenSpaceName) - sizeof (CHAR8)] = '.';\r
- AsciiStrCatS (Name, NameSize, PcdName); \r
+ AsciiStrCatS (Name, NameSize, PcdName);\r
}\r
\r
return Name;\r
@param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.\r
@param[in] TokenNumber The PCD token number.\r
@param[out] PcdInfo The returned information associated with the requested TokenNumber.\r
- The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName. \r
+ The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.\r
\r
@retval EFI_SUCCESS The PCD information was returned successfully\r
@retval EFI_NOT_FOUND The PCD service could not find the requested token number.\r
PcdInfo->PcdSize = 0;\r
//\r
// Here use one representative in the token space to get the TokenSpaceCName.\r
- // \r
+ //\r
PcdInfo->PcdName = GetPcdName (TRUE, Database, ExMapTable[Index].TokenNumber);\r
return EFI_SUCCESS;\r
} else if (ExMapTable[Index].ExTokenNumber == TokenNumber) {\r
//\r
TokenNumber--;\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
+ // between UINTN and 0 . So we add 1 in each size of the\r
// comparison.\r
ASSERT ((TokenNumber + 1) < (LocalTokenCount + 1));\r
}\r
\r
GuidHob = GetFirstGuidHob (&gEfiCallerIdGuid);\r
ASSERT (GuidHob != NULL);\r
- \r
+\r
CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
CallbackTable = CallbackTable + (TokenNumber * PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
\r
\r
\r
/**\r
- Find the Pcd database. \r
+ Find the Pcd database.\r
\r
@param FileHandle Handle of the file the external PCD database binary located.\r
\r
SizeOfCallbackFnTable = Database->LocalTokenCount * sizeof (PCD_PPI_CALLBACK) * PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
\r
CallbackFnTable = BuildGuidHob (&gEfiCallerIdGuid, SizeOfCallbackFnTable);\r
- \r
+\r
ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
\r
return Database;\r
}\r
\r
/**\r
- Invoke the callback function when dynamic PCD entry was set, if this PCD entry \r
+ Invoke the callback function when dynamic PCD entry was set, if this PCD entry\r
has registered callback function.\r
\r
@param ExTokenNumber DynamicEx PCD's token number, if this PCD entry is dyanmicEx\r
\r
if (Guid == NULL) {\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
+ // between UINTN and 0 . So we add 1 in each size of the\r
// comparison.\r
ASSERT (TokenNumber + 1 < (LocalTokenCount + 1));\r
}\r
\r
GuidHob = GetFirstGuidHob (&gEfiCallerIdGuid);\r
ASSERT (GuidHob != NULL);\r
- \r
+\r
CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
\r
CallbackTable += (TokenNumber * PcdGet32 (PcdMaxPeiPcdCallBackNumberPerPcdEntry));\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
+ @retval EFI_NOT_FOUND Can not find the PCD type according to token number.\r
**/\r
EFI_STATUS\r
SetWorker (\r
if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) {\r
return EFI_UNSUPPORTED;\r
}\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
LocalTokenCount = PeiPcdDb->LocalTokenCount;\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
+ // between UINTN and 0 . So we add 1 in each size of the\r
// comparison.\r
ASSERT (TokenNumber + 1 < (LocalTokenCount + 1));\r
\r
\r
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
InternalData = (VOID *) ((UINT8 *) PeiPcdDb + Offset);\r
- \r
+\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
case PCD_TYPE_HII:\r
return EFI_NOT_FOUND;\r
}\r
}\r
- \r
+\r
}\r
\r
ASSERT (FALSE);\r
\r
/**\r
Set value for a dynamic-ex PCD entry.\r
- \r
- This routine find the local token number according to dynamic-ex PCD's token \r
+\r
+ This routine find the local token number according to dynamic-ex PCD's token\r
space guid and token number firstly, and invoke callback function if this PCD\r
entry registered callback function. Finally, invoken general SetWorker to set\r
PCD value.\r
- \r
+\r
@param ExTokenNumber Dynamic-ex PCD token number.\r
@param Guid Token space guid for dynamic-ex PCD.\r
@param Data PCD value want to be set\r
if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
return EFI_NOT_FOUND;\r
}\r
- \r
+\r
InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, *Size);\r
\r
return SetWorker (TokenNumber, Data, Size, PtrType);\r
IN UINTN ExTokenNumber,\r
IN UINTN GetSize\r
)\r
-{ \r
+{\r
return GetWorker (GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize);\r
}\r
\r
/**\r
Get the PCD entry pointer in PCD database.\r
- \r
+\r
This routine will visit PCD database to find the PCD entry according to given\r
- token number. The given token number is autogened by build tools and it will be \r
- translated to local token number. Local token number contains PCD's type and \r
+ token number. The given token number is autogened by build tools and it will be\r
+ translated to local token number. Local token number contains PCD's type and\r
offset of PCD entry in PCD database.\r
\r
@param TokenNumber Token's number, it is autogened by build tools\r
UINT32 LocalTokenNumber;\r
UINT32 LocalTokenCount;\r
UINT8 *VaraiableDefaultBuffer;\r
+ UINTN VpdBaseAddress;\r
\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
LocalTokenCount = PeiPcdDb->LocalTokenCount;\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
+ // between UINTN and 0 . So we add 1 in each size of the\r
// comparison.\r
ASSERT (TokenNumber + 1 < (LocalTokenCount + 1));\r
\r
{\r
VPD_HEAD *VpdHead;\r
VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
- return (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
+\r
+ //\r
+ // PcdVpdBaseAddress64 is DynamicEx PCD only. So, PeiPcdGet64Ex() is used to get its value.\r
+ //\r
+ VpdBaseAddress = (UINTN) PeiPcdGet64Ex (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64));\r
+ if (VpdBaseAddress == 0) {\r
+ //\r
+ // PcdVpdBaseAddress64 is not set, get value from PcdVpdBaseAddress.\r
+ //\r
+ VpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress);\r
+ }\r
+ ASSERT (VpdBaseAddress != 0);\r
+ return (VOID *)(VpdBaseAddress + VpdHead->Offset);\r
}\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
+\r
Guid = (EFI_GUID *) ((UINT8 *)PeiPcdDb + PeiPcdDb->GuidTableOffset) + VariableHead->GuidTableIndex;\r
Name = (UINT16*)&StringTable[VariableHead->StringIndex];\r
\r
if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
//\r
- // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of \r
+ // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of\r
// string array in string table.\r
//\r
- VaraiableDefaultBuffer = (UINT8 *) &StringTable[*(STRING_HEAD*)((UINT8*) PeiPcdDb + VariableHead->DefaultValueOffset)]; \r
+ VaraiableDefaultBuffer = (UINT8 *) &StringTable[*(STRING_HEAD*)((UINT8*) PeiPcdDb + VariableHead->DefaultValueOffset)];\r
} else {\r
VaraiableDefaultBuffer = (UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset;\r
}\r
default:\r
ASSERT (FALSE);\r
break;\r
- \r
+\r
}\r
\r
ASSERT (FALSE);\r
- \r
+\r
return NULL;\r
- \r
+\r
}\r
\r
/**\r
A dynamic-ex type PCD, developer must provide pair of token space guid: token number\r
in DEC file. PCD database maintain a mapping table that translate pair of {token\r
space guid: token number} to Token Number.\r
- \r
+\r
@param Guid Token space guid for dynamic-ex PCD entry.\r
@param ExTokenNumber Dynamic-ex PCD token number.\r
\r
@return Token Number for dynamic-ex PCD.\r
\r
**/\r
-UINTN \r
+UINTN\r
GetExPcdTokenNumber (\r
IN CONST EFI_GUID *Guid,\r
IN UINTN ExTokenNumber\r
// error in the BUILD system.\r
//\r
ASSERT (MatchGuid != NULL);\r
- \r
+\r
MatchGuidIdx = MatchGuid - GuidTable;\r
- \r
+\r
for (Index = 0; Index < PeiPcdDb->ExTokenCount; Index++) {\r
- if ((ExTokenNumber == ExMap[Index].ExTokenNumber) && \r
+ if ((ExTokenNumber == ExMap[Index].ExTokenNumber) &&\r
(MatchGuidIdx == ExMap[Index].ExGuidIndex)) {\r
return ExMap[Index].TokenNumber;\r
}\r
}\r
- \r
+\r
return PCD_INVALID_TOKEN_NUMBER;\r
}\r
\r
\r
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
ASSERT (GuidHob != NULL);\r
- \r
+\r
return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
}\r
\r
\r
if ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER) {\r
//\r
- // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+ // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type\r
// PCD entry.\r
//\r
if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {\r