)\r
{\r
UINT32 LocalTokenNumber;\r
- UINTN Size;\r
- UINTN MaxSize;\r
\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
\r
LocalTokenNumber = *((UINT32 *)((UINT8 *)Database + Database->LocalTokenNumberTableOffset) + TokenNumber);\r
\r
- Size = (LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
-\r
- if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
- if (Size == 0) {\r
- GetPtrTypeSize (TokenNumber, &MaxSize, Database);\r
- } else {\r
- MaxSize = Size;\r
- }\r
- LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize);\r
- }\r
-\r
return LocalTokenNumber;\r
}\r
\r
return EFI_NOT_FOUND;\r
}\r
\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
- UINTN Size\r
- ) \r
-{\r
- PEI_PCD_DATABASE *PeiPcdDb;\r
- SKU_HEAD *SkuHead;\r
- SKU_ID *SkuIdTable;\r
- UINTN Index;\r
- UINT8 *Value;\r
- BOOLEAN FoundSku;\r
-\r
- PeiPcdDb = GetPcdDatabase ();\r
-\r
- ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
-\r
- SkuHead = (SKU_HEAD *) ((UINT8 *)PeiPcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
- Value = (UINT8 *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuDataStartOffset));\r
- SkuIdTable = (SKU_ID *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuIdTableOffset));\r
-\r
- //\r
- // Find the current system's SKU ID entry in SKU ID table.\r
- //\r
- FoundSku = FALSE;\r
- for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
- if (PeiPcdDb->SystemSkuId == SkuIdTable[Index + 1]) {\r
- FoundSku = TRUE;\r
- break;\r
- }\r
- }\r
-\r
- //\r
- // Find the default SKU ID entry in SKU ID table.\r
- //\r
- if(!FoundSku) {\r
- for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
- if (0 == SkuIdTable[Index + 1]) {\r
- break;\r
- }\r
- }\r
- }\r
- ASSERT (Index < SkuIdTable[0]);\r
-\r
- switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
- case PCD_TYPE_VPD:\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)[Index]);\r
- return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
-\r
- case PCD_TYPE_HII|PCD_TYPE_STRING:\r
- Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
- return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII | PCD_TYPE_STRING);\r
-\r
- case PCD_TYPE_STRING:\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 * Index;\r
- return (UINT32) ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_DATA);\r
-\r
- default:\r
- ASSERT (FALSE);\r
- }\r
-\r
- ASSERT (FALSE);\r
-\r
- return 0;\r
-}\r
-\r
/**\r
Invoke the callback function when dynamic PCD entry was set, if this PCD entry \r
has registered callback function.\r
return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
}\r
\r
-/**\r
- Get SKU ID table 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
- IN PEI_PCD_DATABASE *Database\r
- )\r
-{\r
- SKU_HEAD *SkuHead;\r
- UINTN LocalTokenNumber;\r
-\r
- LocalTokenNumber = *((UINT32 *)((UINT8 *)Database + Database->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
-\r
- ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);\r
-\r
- SkuHead = (SKU_HEAD *) ((UINT8 *)Database + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
-\r
- return (SKU_ID *) ((UINT8 *)Database + SkuHead->SkuIdTableOffset);\r
- \r
-}\r
-\r
/**\r
Get index of PCD entry in size table.\r
\r
UINTN Index;\r
UINTN SizeTableIdx;\r
UINTN LocalTokenNumber;\r
- SKU_ID *SkuIdTable;\r
- \r
+\r
SizeTableIdx = 0;\r
\r
for (Index = 0; Index < LocalTokenNumberTableIdx; Index++) {\r
//\r
SizeTableIdx += 2;\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
SizeTableIdx += 2;\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 (Index, Database);\r
- SizeTableIdx += (UINTN)*SkuIdTable + 1;\r
- }\r
}\r
}\r
\r