-/**\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
- @param IsPeiDb If TRUE, the PCD entry is initialized in PEI phase.\r
- If False, the PCD entry is initialized in DXE phase.\r
-\r
- @return Token number according to system SKU ID.\r
-\r
-**/\r
-UINT32\r
-GetSkuEnabledTokenNumber (\r
- UINT32 LocalTokenNumber,\r
- UINTN Size,\r
- BOOLEAN IsPeiDb\r
- ) \r
-{\r
- SKU_HEAD *SkuHead;\r
- SKU_ID *SkuIdTable;\r
- UINTN Index;\r
- UINT8 *Value;\r
- UINT8 *PcdDb;\r
- BOOLEAN FoundSku;\r
-\r
- ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
-\r
- PcdDb = IsPeiDb ? (UINT8 *) mPcdDatabase.PeiDb : (UINT8 *) mPcdDatabase.DxeDb;\r
-\r
- SkuHead = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
- Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); \r
-\r
- SkuIdTable = (SKU_ID *)(PcdDb + SkuHead->SkuIdTableOffset);\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 (mPcdDatabase.DxeDb->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
- \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 - PcdDb) | PCD_TYPE_VPD);\r
-\r
- case PCD_TYPE_HII:\r
- Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
- return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII);\r
-\r
- case PCD_TYPE_HII|PCD_TYPE_STRING:\r
- Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
- return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII | PCD_TYPE_STRING);\r
-\r
- case PCD_TYPE_STRING:\r
- Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]);\r
- return (UINT32) ((Value - PcdDb) | PCD_TYPE_STRING);\r
- \r
- case PCD_TYPE_DATA:\r
- Value += Size * Index;\r
- return (UINT32) ((Value - PcdDb) | PCD_TYPE_DATA);\r
-\r
- default:\r
- ASSERT (FALSE);\r
- }\r
-\r
- ASSERT (FALSE);\r
-\r
- return 0;\r
- \r
-}\r
-\r