The function registers the CallBackOnSet fucntion\r
according to TokenNumber and EFI_GUID space.\r
\r
- @param TokenNumber The token number.\r
+ @param ExTokenNumber The token number.\r
@param Guid The GUID space.\r
@param CallBackFunction The Callback function to be registered.\r
@param Register To register or unregister the callback function.\r
@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
---*/\r
+**/\r
EFI_STATUS\r
PeiRegisterCallBackWorker (\r
IN UINTN ExTokenNumber,\r
\r
}\r
\r
-\r
-\r
-\r
/**\r
The function builds the PCD database.\r
-\r
- @param VOID\r
-\r
- @retval VOID\r
---*/\r
+**/\r
VOID\r
BuildPcdDatabase (\r
VOID\r
CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
\r
ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
- \r
- return;\r
}\r
\r
-\r
-\r
/**\r
The function is provided by PCD PEIM and PCD DXE driver to\r
do the work of reading a HII variable from variable service.\r
\r
@retval EFI_SUCCESS Operation successful.\r
@retval EFI_NOT_FOUND Variablel not found.\r
---*/\r
-STATIC\r
+**/\r
EFI_STATUS\r
GetHiiVariable (\r
IN CONST EFI_GUID *VariableGuid,\r
*VariableData = Buffer;\r
\r
return EFI_SUCCESS;\r
- } else {\r
- return EFI_NOT_FOUND;\r
- }\r
+ } \r
\r
+ return EFI_NOT_FOUND;\r
}\r
\r
-STATIC\r
+/**\r
+ Find the local token number according to system SKU ID.\r
+\r
+ @param LocalTokenNumber PCD token number\r
+ @param Size The size of PCD entry.\r
+\r
+ @return Token number according to system SKU ID.\r
+\r
+**/\r
UINT32\r
GetSkuEnabledTokenNumber (\r
UINT32 LocalTokenNumber,\r
PEI_PCD_DATABASE *PeiPcdDb;\r
SKU_HEAD *SkuHead;\r
SKU_ID *SkuIdTable;\r
- INTN i;\r
+ INTN Index;\r
UINT8 *Value;\r
\r
PeiPcdDb = GetPcdDatabase ();\r
Value = (UINT8 *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuDataStartOffset));\r
SkuIdTable = (SKU_ID *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuIdTableOffset));\r
\r
- for (i = 0; i < SkuIdTable[0]; i++) {\r
- if (PeiPcdDb->Init.SystemSkuId == SkuIdTable[i + 1]) {\r
+ for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
+ if (PeiPcdDb->Init.SystemSkuId == SkuIdTable[Index + 1]) {\r
break;\r
}\r
}\r
\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
- Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]);\r
+ Value = (UINT8 *) &(((VPD_HEAD *) Value)[Index]);\r
return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
\r
case PCD_TYPE_HII:\r
- Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]);\r
+ Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
\r
case PCD_TYPE_STRING:\r
- Value = (UINT8 *) &(((STRING_HEAD *) Value)[i]);\r
+ Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]);\r
return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_STRING);\r
\r
case PCD_TYPE_DATA:\r
- Value += Size * i;\r
+ Value += Size * Index;\r
return (UINT32) (Value - (UINT8 *) PeiPcdDb);\r
\r
default:\r
ASSERT (FALSE);\r
\r
return 0;\r
- \r
}\r
\r
+/**\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
+ type PCD.\r
+ @param Guid DynamicEx PCD's guid, if this PCD entry is dynamicEx type\r
+ PCD.\r
+ @param TokenNumber PCD token number generated by build tools.\r
+ @param Data Value want to be set for this PCD entry\r
+ @param Size The size of value\r
\r
-STATIC\r
+**/\r
VOID\r
InvokeCallbackOnSet (\r
UINTN ExTokenNumber,\r
);\r
}\r
}\r
- \r
}\r
\r
+/**\r
+ Wrapper function for setting non-pointer type value for a PCD entry.\r
+\r
+ @param TokenNumber Pcd token number autogenerated by build tools.\r
+ @param Data Value want to be set for PCD entry\r
+ @param Size Size of value.\r
\r
+ @return status of SetWorker.\r
\r
+**/\r
EFI_STATUS\r
SetValueWorker (\r
IN UINTN TokenNumber,\r
return SetWorker (TokenNumber, Data, &Size, FALSE);\r
}\r
\r
-\r
-\r
+/**\r
+ Set value for an PCD entry\r
+\r
+ @param TokenNumber Pcd token number autogenerated by build tools.\r
+ @param Data Value want to be set for PCD entry\r
+ @param Size Size of value.\r
+ @param PtrType If TRUE, the type of PCD entry's value is Pointer.\r
+ If False, the type of PCD entry's value is not Pointer.\r
+\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_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
+**/\r
EFI_STATUS\r
SetWorker (\r
IN UINTN TokenNumber,\r
- IN OUT VOID *Data,\r
+ IN VOID *Data,\r
IN OUT UINTN *Size,\r
IN BOOLEAN PtrType\r
)\r
\r
}\r
\r
+/**\r
+ Wrapper function for set PCD value for non-Pointer type dynamic-ex PCD.\r
\r
+ @param ExTokenNumber Token number for dynamic-ex PCD.\r
+ @param Guid Token space guid for dynamic-ex PCD.\r
+ @param Data Value want to be set.\r
+ @param SetSize The size of value.\r
\r
+ @return status of ExSetWorker().\r
+\r
+**/\r
EFI_STATUS\r
ExSetValueWorker (\r
IN UINTN ExTokenNumber,\r
return ExSetWorker (ExTokenNumber, Guid, Data, &Size, FALSE);\r
}\r
\r
+/**\r
+ Set value for a dynamic PCD entry.\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
+ @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
+ @param SetSize Size of value.\r
+ @param PtrType If TRUE, this PCD entry is pointer type.\r
+ If FALSE, this PCD entry is not pointer type.\r
\r
+ @return status of SetWorker().\r
\r
+**/\r
EFI_STATUS\r
ExSetWorker (\r
IN UINTN ExTokenNumber,\r
\r
}\r
\r
+/**\r
+ Wrapper function for get PCD value for dynamic-ex PCD.\r
\r
+ @param Guid Token space guid for dynamic-ex PCD.\r
+ @param ExTokenNumber Token number for dyanmic-ex PCD.\r
+ @param GetSize The size of dynamic-ex PCD value.\r
\r
+ @return PCD entry in PCD database.\r
\r
+**/\r
VOID *\r
ExGetWorker (\r
IN CONST EFI_GUID *Guid,\r
return GetWorker (GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize);\r
}\r
\r
+/**\r
+ Get the PCD entry pointer in PCD database.\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
+ offset of PCD entry in PCD database.\r
\r
+ @param TokenNumber Token's number, it is autogened by build tools\r
+ @param GetSize The size of token's value\r
\r
+ @return PCD entry pointer in PCD database\r
\r
+**/\r
VOID *\r
GetWorker (\r
- UINTN TokenNumber,\r
- UINTN GetSize\r
+ IN UINTN TokenNumber,\r
+ IN UINTN GetSize\r
)\r
{\r
UINT32 Offset;\r
\r
}\r
\r
+/**\r
+ Get local token number according to dynamic-ex PCD's {token space guid:token number}\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 local token number.\r
+ \r
+ @param Guid Token space guid for dynamic-ex PCD entry.\r
+ @param ExTokenNumber EDES_TODO: Add parameter description\r
\r
+ @return local token number for dynamic-ex PCD.\r
\r
+**/\r
UINTN \r
GetExPcdTokenNumber (\r
IN CONST EFI_GUID *Guid,\r
IN UINTN ExTokenNumber\r
)\r
{\r
- UINT32 i;\r
+ UINT32 Index;\r
DYNAMICEX_MAPPING *ExMap;\r
EFI_GUID *GuidTable;\r
EFI_GUID *MatchGuid;\r
\r
MatchGuidIdx = MatchGuid - GuidTable;\r
\r
- for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
- if ((ExTokenNumber == ExMap[i].ExTokenNumber) && \r
- (MatchGuidIdx == ExMap[i].ExGuidIndex)) {\r
- return ExMap[i].LocalTokenNumber;\r
+ for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) {\r
+ if ((ExTokenNumber == ExMap[Index].ExTokenNumber) && \r
+ (MatchGuidIdx == ExMap[Index].ExGuidIndex)) {\r
+ return ExMap[Index].LocalTokenNumber;\r
}\r
}\r
\r
return 0;\r
}\r
\r
+/**\r
+ Get PCD database from GUID HOB in PEI phase.\r
\r
+ @return Pointer to PCD database.\r
\r
+**/\r
PEI_PCD_DATABASE *\r
GetPcdDatabase (\r
VOID\r
return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
}\r
\r
+/**\r
+ Get SKU ID tabble from PCD database.\r
+\r
+ @param LocalTokenNumberTableIdx Index of local token number in token number table.\r
+ @param Database PCD database.\r
\r
+ @return Pointer to SKU ID array table\r
\r
+**/\r
SKU_ID *\r
GetSkuIdArray (\r
IN UINTN LocalTokenNumberTableIdx,\r
\r
}\r
\r
+/**\r
+ Get index of PCD entry in size table.\r
+\r
+ @param LocalTokenNumberTableIdx Index of this PCD in local token number table.\r
+ @param Database Pointer to PCD database in PEI phase.\r
\r
+ @return index of PCD entry in size table.\r
\r
+**/\r
UINTN\r
GetSizeTableIndex (\r
IN UINTN LocalTokenNumberTableIdx,\r
IN PEI_PCD_DATABASE *Database\r
)\r
{\r
- UINTN i;\r
+ UINTN Index;\r
UINTN SizeTableIdx;\r
UINTN LocalTokenNumber;\r
SKU_ID *SkuIdTable;\r
\r
SizeTableIdx = 0;\r
\r
- for (i=0; i<LocalTokenNumberTableIdx; i++) {\r
- LocalTokenNumber = Database->Init.LocalTokenNumberTable[i];\r
+ for (Index=0; Index<LocalTokenNumberTableIdx; Index++) {\r
+ LocalTokenNumber = Database->Init.LocalTokenNumberTable[Index];\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
// PCD entry.\r
//\r
- if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+ if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {\r
//\r
// We have only one entry for VPD enabled PCD entry:\r
// 1) MAX Size.\r
// 1) MAX SIZE\r
// 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
//\r
- SkuIdTable = GetSkuIdArray (i, Database);\r
+ SkuIdTable = GetSkuIdArray (Index, Database);\r
SizeTableIdx += (UINTN)*SkuIdTable + 1;\r
}\r
}\r