<MsaFile>
<Filename>Universal/Network/Snp32_64/Dxe/SNP.msa</Filename>
</MsaFile>
+ <MsaFile>\r
+ <Filename>Universal/PCD/Pei/Pcd.msa</Filename>\r
+ </MsaFile>\r
+ <MsaFile>\r
+ <Filename>Universal/PCD/Test/PeiPcdTest.msa</Filename>\r
+ </MsaFile>\r
+ <MsaFile>\r
+ <Filename>Universal/PCD/Dxe/Pcd.msa</Filename>\r
+ </MsaFile>\r
<MsaFile>
<Filename>Universal/Runtime/RuntimeDxe/Runtime.msa</Filename>
</MsaFile>
<IncludeHeader ModuleType="UEFI_DRIVER">Include/EdkDxe.h</IncludeHeader>
</PackageHeaders>
<GuidDeclarations>
+ <Entry Name="PcdDataBaseHob">\r
+ <C_Name>gPcdDataBaseHobGuid</C_Name>\r
+ <Guid>0xea296d92, 0xb69, 0x423c, 0x8c, 0x28, 0x33, 0xb4, 0xe0, 0xa9, 0x12, 0x68</Guid>\r
+ </Entry>\r
+ <Entry Name="PcdPeiCallbackFnTable">\r
+ <C_Name>gPcdPeiCallbackFnTableHobGuid</C_Name>\r
+ <Guid>0xc625f4b2, 0xea09, 0x4675, 0x82, 0xd7, 0xba, 0x36, 0x82, 0x15, 0x7a, 0x14</Guid>\r
+ </Entry>\r
<Entry Name="PeiPeCoffLoader">
<C_Name>gEfiPeiPeCoffLoaderGuid</C_Name>
<Guid>0xd8117cff, 0x94a6, 0x11d4, 0x9a, 0x3a, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d</Guid>
<DatumType>UINT8</DatumType>
<DefaultValue>0</DefaultValue>
</PcdEntry>
+ <PcdEntry ItemType="FIXED_AT_BUILD">\r
+ <C_Name>PcdMaxPcdCallBackNumber</C_Name>\r
+ <Token>0x0001000f</Token>\r
+ <DatumType>UINT32</DatumType>\r
+ <DefaultValue>0</DefaultValue>\r
+ </PcdEntry> \r
+ <PcdEntry ItemType="DYNAMIC">\r
+ <C_Name>PcdTestDynamicUint8</C_Name>\r
+ <Token>0x00011000</Token>\r
+ <DatumType>UINT8</DatumType>\r
+ <DefaultValue>0x01</DefaultValue>\r
+ </PcdEntry> \r
+ <PcdEntry ItemType="DYNAMIC">\r
+ <C_Name>PcdTestDynamicUint16</C_Name>\r
+ <Token>0x00011001</Token>\r
+ <DatumType>UINT16</DatumType>\r
+ <DefaultValue>0x1234</DefaultValue>\r
+ </PcdEntry> \r
+ <PcdEntry ItemType="DYNAMIC">\r
+ <C_Name>PcdTestDynamicUint32</C_Name>\r
+ <Token>0x00011002</Token>\r
+ <DatumType>UINT32</DatumType>\r
+ </PcdEntry> \r
+ <PcdEntry ItemType="DYNAMIC">\r
+ <C_Name>PcdTestDynamicUint64</C_Name>\r
+ <Token>0x00011003</Token>\r
+ <DatumType>UINT64</DatumType>\r
+ </PcdEntry> \r
+ <PcdEntry ItemType="DYNAMIC">\r
+ <C_Name>PcdTestDynamicBoolean</C_Name>\r
+ <Token>0x00011004</Token>\r
+ <DatumType>BOOLEAN</DatumType>\r
+ </PcdEntry> \r
</PcdDefinitions>
</PackageSurfaceArea>
\r
**/\r
\r
-#include "../Common/PcdCommon.h"\r
#include "Service.h"\r
\r
\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Make sure the Pcd Protocol is not already installed in the system\r
+ //\r
+ \r
+ ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gPcdProtocolGuid);\r
\r
- InitPcdDxeDataBase ();\r
+ BuildPcdDxeDataBase ();\r
+\r
+ //\r
+ // BugBug Check if PcdDatabase is already installed.\r
+ //\r
\r
Status = gBS->InstallProtocolInterface (\r
&NewHandle,\r
EFI_STATUS\r
EFIAPI\r
DxePcdSetSku (\r
- IN UINTN SkuId\r
+ IN UINTN SkuId\r
)\r
{\r
- return DxeSetSku(SkuId);\r
+ return gPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId;\r
}\r
\r
\r
UINT8\r
EFIAPI\r
DxePcdGet8 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return DxePcdGet8Ex (NULL, TokenNumber);\r
+ ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber));\r
+ \r
+ return *((UINT8 *) GetWorker (TokenNumber));\r
}\r
\r
\r
UINT16\r
EFIAPI\r
DxePcdGet16 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return DxePcdGet16Ex (NULL, TokenNumber);\r
+ ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber));\r
+ \r
+ return ReadUnaligned16 (GetWorker (TokenNumber));\r
}\r
\r
\r
UINT32\r
EFIAPI\r
DxePcdGet32 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return DxePcdGet32Ex (NULL, TokenNumber);\r
+ ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber));\r
+ \r
+ return ReadUnaligned32 (GetWorker (TokenNumber));\r
}\r
\r
\r
UINT64\r
EFIAPI\r
DxePcdGet64 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return DxePcdGet32Ex (NULL, TokenNumber);\r
+ ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber));\r
+ \r
+ return ReadUnaligned64(GetWorker (TokenNumber));\r
}\r
\r
\r
VOID *\r
EFIAPI\r
DxePcdGetPtr (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return DxePcdGetPtrEx (NULL, TokenNumber);\r
+ return GetWorker (TokenNumber);\r
}\r
\r
\r
BOOLEAN\r
EFIAPI\r
DxePcdGetBool (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return DxePcdGetBoolEx (NULL, TokenNumber);\r
+ ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber));\r
+ \r
+ return *((BOOLEAN *) GetWorker (TokenNumber));\r
}\r
\r
\r
UINTN\r
EFIAPI\r
DxePcdGetSize (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return DxePcdGetSizeEx (NULL, TokenNumber);\r
+ UINT16 * SizeTable;\r
+\r
+ SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? gPcdDatabase->PeiDb.Init.SizeTable :\r
+ gPcdDatabase->DxeDb.Init.SizeTable;\r
+\r
+\r
+ TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+ return SizeTable[TokenNumber];\r
}\r
\r
\r
UINT8\r
EFIAPI\r
DxePcdGet8Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT8 Data;\r
-\r
- DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Data);\r
-\r
- return Data;\r
+ return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGet16Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT16 Data;\r
-\r
- DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Data);\r
-\r
- return Data;\r
+ return *((UINT16 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGet32Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT32 Data;\r
-\r
- DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Data);\r
-\r
- return Data;\r
+ return *((UINT32 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGet64Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT64 Data;\r
-\r
- DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Data);\r
-\r
- return Data;\r
+ //\r
+ // BugBug: Must be changed to ReadUnaligned64\r
+ //\r
+ return *((UINT64 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGetPtrEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- VOID *Data;\r
-\r
- DxeGetPcdEntryWorker (TokenNumber, Guid, PcdPointer, &Data);\r
-\r
- return Data;\r
+ return ExGetWorker (Guid, ExTokenNumber, 0);\r
}\r
\r
\r
EFIAPI\r
DxePcdGetBoolEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- BOOLEAN Data;\r
- DxeGetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Data);\r
- return Data;\r
+ return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGetSizeEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- return DxeGetPcdEntrySizeWorker (TokenNumber, Guid);\r
+ EX_PCD_ENTRY_ATTRIBUTE Attr;\r
+ \r
+ GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
+\r
+ return Attr.Size;\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdSet8 (\r
- IN UINTN TokenNumber,\r
- IN UINT8 Value\r
+ IN UINTN TokenNumber,\r
+ IN UINT8 Value\r
)\r
{\r
- return DxePcdSet8Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdSet16 (\r
- IN UINTN TokenNumber,\r
+ IN UINTN TokenNumber,\r
IN UINT16 Value\r
)\r
{\r
- return DxePcdSet16Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdSet32 (\r
- IN UINTN TokenNumber,\r
+ IN UINTN TokenNumber,\r
IN UINT32 Value\r
)\r
{\r
- return DxePcdSet32Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdSet64 (\r
- IN UINTN TokenNumber,\r
- IN UINT64 Value\r
+ IN UINTN TokenNumber,\r
+ IN UINT64 Value\r
)\r
{\r
- return DxePcdSet64Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdSetPtr (\r
- IN UINTN TokenNumber,\r
- IN CONST VOID *Value\r
+ IN UINTN TokenNumber,\r
+ IN CONST VOID *Value\r
)\r
{\r
- return DxePcdSetPtrEx (NULL, TokenNumber, Value);\r
+ //\r
+ // BugBug, please change the Size to Input size when sync with spec\r
+ //\r
+ //ASSERT (sizeof (Value) == DxePcdGetSize (TokenNumber));\r
+\r
+ return SetWorker (TokenNumber, (VOID *)Value, DxePcdGetSize (TokenNumber), TRUE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdSetBool (\r
- IN UINTN TokenNumber,\r
- IN BOOLEAN Value\r
+ IN UINTN TokenNumber,\r
+ IN BOOLEAN Value\r
)\r
{\r
- return DxePcdSetBoolEx (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
EFIAPI\r
DxePcdSet8Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
- IN UINT8 Value\r
+ IN UINTN ExTokenNumber,\r
+ IN UINT8 Value\r
)\r
{\r
- return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
DxePcdSet16Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN UINT16 Value\r
)\r
{\r
- return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
DxePcdSet32Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN UINT32 Value\r
)\r
{\r
- return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
DxePcdSet64Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN UINT64 Value\r
)\r
{\r
- return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
DxePcdSetPtrEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN CONST VOID *Value\r
)\r
{\r
- return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdPointer, Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ (VOID *) Value, \r
+ sizeof (Value), \r
+ TRUE\r
+ );\r
}\r
\r
\r
EFIAPI\r
DxePcdSetBoolEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN BOOLEAN Value\r
)\r
{\r
- return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Value);\r
-\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ TRUE\r
+ );\r
}\r
\r
\r
Module Name: Service.c\r
\r
**/\r
-#include "../Common/PcdCommon.h"\r
#include "Service.h"\r
\r
-static PCD_DATABASE *PrivatePcdDxeDatabase;\r
-static LIST_ENTRY mPcdDatabaseListHead = INITIALIZE_LIST_HEAD_VARIABLE(mPcdDatabaseListHead);\r
\r
-LIST_ENTRY *\r
-GetPcdDatabaseListHead (\r
- VOID\r
- )\r
-{\r
- return &mPcdDatabaseListHead;\r
-}\r
-\r
-PCD_DATABASE *\r
-GetPcdDxeDataBaseInstance (\r
- VOID\r
-)\r
-{\r
- return PrivatePcdDxeDatabase;\r
-}\r
+//\r
+// Build Tool will generate DXE_PCD_DB_INIT_VALUE in Autogen.h\r
+// Compression Algorithm will take care of the size optimization.\r
+//\r
\r
-PCD_DATABASE *\r
-SetPcdDxeDataBaseInstance (\r
- PCD_DATABASE *PcdDatabase\r
-)\r
-{\r
- return PrivatePcdDxeDatabase = PcdDatabase;\r
-}\r
+/*\r
+DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {\r
+ DXE_PCD_DB_INIT_VALUE\r
+};\r
+*/\r
\r
+PCD_DATABASE * gPcdDatabase;\r
\r
-VOID\r
-DxeGetPcdEntryWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- OUT VOID *Data\r
- )\r
+VOID *\r
+GetWorkerByLocalTokenNumber (\r
+ UINT32 LocalTokenNumber,\r
+ BOOLEAN IsPeiDb,\r
+ UINTN Size\r
+ ) \r
{\r
- PCD_DATABASE *Database;\r
- Database = GetPcdDxeDataBaseInstance ();\r
+ UINT32 Offset;\r
+ EFI_GUID *GuidTable;\r
+ UINT16 *StringTable;\r
+ EFI_GUID *Guid;\r
+ UINT16 *Name;\r
+ VARIABLE_HEAD *VariableHead;\r
+ EFI_STATUS Status;\r
+ UINTN DataSize;\r
+ VOID *Data;\r
+ VPD_HEAD *VpdHead;\r
+ UINT8 *PcdDb;\r
+ UINT16 StringTableIdx; \r
+\r
+ if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+ LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
+ }\r
+\r
+ PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);\r
+ StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :\r
+ gPcdDatabase->DxeDb.Init.StringTable;\r
+ \r
+ Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+ \r
+ switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+ case PCD_TYPE_VPD:\r
+ VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
+ return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
+ \r
+ case PCD_TYPE_HII:\r
+ GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :\r
+ gPcdDatabase->DxeDb.Init.GuidTable;\r
+ \r
+ VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
+ \r
+ Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
+ Name = &(StringTable[VariableHead->StringIndex]);\r
\r
- GetPcdEntryWorker ( &Database->Info,\r
- TokenNumber,\r
- Guid,\r
- Type,\r
- Data\r
- );\r
+ Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+ ASSERT_EFI_ERROR (Status);\r
+ ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
\r
+ return (UINT8 *) Data + VariableHead->Offset;\r
\r
- return;\r
-}\r
+ case PCD_TYPE_STRING:\r
+ StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
+ return (VOID *) &StringTable[StringTableIdx];\r
\r
+ case PCD_TYPE_DATA:\r
+ return (VOID *) ((UINT8 *) PcdDb + Offset);\r
+ break;\r
\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
+ \r
+ }\r
\r
-EFI_STATUS\r
-DxeSetPcdEntryWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- IN CONST VOID *Data\r
+ ASSERT (FALSE);\r
+ \r
+ return NULL;\r
+}\r
+ \r
+VOID *\r
+GetWorker (\r
+ UINTN TokenNumber\r
)\r
{\r
- PCD_DATABASE *Database;\r
- PCD_INDEX *PcdIndex;\r
- EFI_STATUS Status;\r
-\r
- Database = GetPcdDxeDataBaseInstance ();\r
-\r
-\r
- ASSERT (Data != NULL);\r
-\r
- PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);\r
+ UINT32 *LocalTokenNumberTable;\r
+ UINT16 *SizeTable;\r
+ BOOLEAN IsPeiDb;\r
\r
- ASSERT (PcdIndex != NULL);\r
+ ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
+ \r
+ IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
\r
- ASSERT (PcdIndex->StateByte.DataType == Type);\r
+ LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
+ gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
\r
- //\r
- // Invoke the callback function.\r
- //\r
+ SizeTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SizeTable: \r
+ gPcdDatabase->DxeDb.Init.SizeTable;\r
\r
- Status = SetPcdData (PcdIndex, &Database->Info, Data);\r
+ TokenNumber = IsPeiDb ? TokenNumber :\r
+ TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
+ return GetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], IsPeiDb, SizeTable[TokenNumber]);\r
+}\r
\r
- return Status;\r
\r
\r
+EFI_STATUS\r
+DxeRegisterCallBackWorker (\r
+ IN UINTN TokenNumber,\r
+ IN CONST GUID *Guid, OPTIONAL\r
+ IN PCD_PROTOCOL_CALLBACK CallBackFunction,\r
+ IN BOOLEAN Register\r
+)\r
+{\r
+ \r
+ return EFI_SUCCESS;\r
}\r
\r
\r
-\r
-UINTN\r
-DxeGetPcdEntrySizeWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST GUID *Guid OPTIONAL\r
+EFI_STATUS\r
+DxeGetNextTokenWorker (\r
+ IN OUT UINTN *TokenNumber,\r
+ IN CONST GUID *Guid OPTIONAL\r
)\r
{\r
- PCD_DATABASE *Database;\r
- Database = GetPcdDxeDataBaseInstance ();\r
-\r
- return GetPcdEntrySizeWorker (&Database->Info,\r
- TokenNumber,\r
- Guid\r
- );\r
+ return EFI_SUCCESS;\r
}\r
\r
\r
\r
-LIST_ENTRY *\r
-InsertToGuidSpaceListI (\r
- IN LIST_ENTRY *GuidSpaceListHead,\r
- IN CONST EFI_GUID *Guid\r
- )\r
+VOID\r
+BuildPcdDxeDataBase (\r
+ VOID\r
+)\r
{\r
- PCD_GUID_SPACE *GuidSpaceEntry;\r
+ PEI_PCD_DATABASE *PeiDatabase;\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
\r
- GuidSpaceEntry = AllocatePool (sizeof (PCD_GUID_SPACE));\r
- ASSERT (GuidSpaceEntry != NULL);\r
+ gPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));\r
+ ASSERT (gPcdDatabase != NULL);\r
\r
- GuidSpaceEntry->GuidSpace= Guid;\r
- InitializeListHead (&GuidSpaceEntry->TokenSpaceHead);\r
- \r
- InsertTailList (GuidSpaceListHead, &GuidSpaceEntry->ListNode);\r
+ GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+ ASSERT (GuidHob != NULL);\r
\r
- return &GuidSpaceEntry->TokenSpaceHead;\r
+ PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+ //\r
+ // Copy PCD Entries refereneced in PEI phase to PCD DATABASE\r
+ //\r
+ CopyMem (&gPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));\r
+\r
+ //\r
+ // Copy PCD Entries with default value to PCD DATABASE\r
+ //\r
+ CopyMem (&gPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));\r
+ \r
+ return;\r
}\r
\r
\r
\r
-LIST_ENTRY *\r
-InsertToTokenSpaceListI (\r
- IN LIST_ENTRY *TokenSpaceListHead,\r
- IN UINTN TokenNumber\r
+EFI_STATUS\r
+GetHiiVariable (\r
+ IN EFI_GUID *VariableGuid,\r
+ IN UINT16 *VariableName,\r
+ OUT VOID ** VariableData,\r
+ OUT UINTN *VariableSize\r
)\r
{\r
- PCD_TOKEN_SPACE *TokenSpaceEntry;\r
+ UINTN Size;\r
+ EFI_STATUS Status;\r
+ VOID *Buffer;\r
\r
- TokenSpaceEntry = AllocatePool (sizeof (PCD_TOKEN_SPACE));\r
- ASSERT (TokenSpaceEntry != NULL);\r
+ Status = EfiGetVariable (\r
+ (UINT16 *)VariableName,\r
+ VariableGuid,\r
+ NULL,\r
+ &Size,\r
+ NULL\r
+ );\r
+ ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
\r
- TokenSpaceEntry->TokeNumber = TokenNumber;\r
- InitializeListHead (&TokenSpaceEntry->CallbackListHead);\r
- \r
- InsertTailList (TokenSpaceListHead, &TokenSpaceEntry->ListNode);\r
+ Buffer = AllocatePool (Size);\r
\r
- return &TokenSpaceEntry->CallbackListHead;\r
-}\r
+ ASSERT (Buffer != NULL);\r
\r
+ Status = EfiGetVariable (\r
+ VariableName,\r
+ VariableGuid,\r
+ NULL,\r
+ &Size,\r
+ Buffer\r
+ );\r
\r
+ return Status;\r
\r
-VOID\r
-InsertToCallbackListI (\r
- IN LIST_ENTRY *CallbackListHead,\r
- IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
- )\r
-{\r
- PCD_CALLBACK_ENTRY *CallbackEntry;\r
- \r
- CallbackEntry = AllocatePool (sizeof (PCD_CALLBACK_ENTRY));\r
- ASSERT (CallbackEntry != NULL);\r
- CallbackEntry->CallbackFunction = CallBackFunction;\r
- InsertTailList (CallbackListHead, &CallbackEntry->ListNode);\r
- \r
- return;\r
}\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
+ INTN i;\r
+ UINT8 *Value;\r
+ SKU_ID *PhaseSkuIdTable;\r
+ UINT8 *PcdDb;\r
\r
+ ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
\r
-VOID\r
-InsertToCallbackList (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid,\r
- IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
- )\r
-{\r
- LIST_ENTRY *GuidListNode;\r
- LIST_ENTRY *GuidListHead;\r
- LIST_ENTRY *TokenListNode;\r
- LIST_ENTRY *TokenListHead;\r
- LIST_ENTRY *CallbackListHead;\r
- PCD_GUID_SPACE *GuidSpaceEntry;\r
- PCD_TOKEN_SPACE *TokenSpaceEntry;\r
+ PcdDb = IsPeiDb ? (UINT8 *) &gPcdDatabase->PeiDb : (UINT8 *) &gPcdDatabase->DxeDb;\r
\r
- \r
- GuidListHead = GetPcdDatabaseListHead ();\r
-\r
- GuidListNode = GetFirstNode (GuidListHead);\r
- while (!IsNull (GuidListNode, GuidListHead)) {\r
- GuidSpaceEntry = PCD_GUID_SPACE_FROM_LISTNODE(GuidListNode);\r
-\r
- if (CompareGuid (GuidSpaceEntry->GuidSpace, Guid)) {\r
- TokenListHead = &GuidSpaceEntry->TokenSpaceHead;\r
- TokenListNode = GetFirstNode (TokenListHead);\r
- while (!IsNull (TokenListNode, TokenListHead)) {\r
- TokenSpaceEntry = PCD_TOKEN_SPACE_FROM_LISTNODE(TokenListNode);\r
- if (TokenSpaceEntry->TokeNumber == TokenNumber) {\r
- InsertToCallbackListI (&TokenSpaceEntry->CallbackListHead , CallBackFunction);\r
- }\r
- }\r
+ SkuHead = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
+ Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); \r
\r
- //\r
- // No TokenNumber match input found in this GuidSpace\r
- //\r
- CallbackListHead = InsertToTokenSpaceListI (TokenListHead, TokenNumber);\r
- InsertToCallbackListI (CallbackListHead , CallBackFunction);\r
+ PhaseSkuIdTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SkuIdTable :\r
+ gPcdDatabase->DxeDb.Init.SkuIdTable;\r
+ \r
+ SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];\r
+ \r
+ for (i = 0; i < SkuIdTable[0]; i++) {\r
+ if (gPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {\r
+ break;\r
}\r
- \r
- GuidListNode = GetNextNode (GuidListHead, GuidListNode);\r
}\r
+ ASSERT (i < SkuIdTable[0]);\r
\r
- //\r
- // No GuidSpace match the input Guid, so build the GuidSpace, TokenNumberSpace and Callback\r
- //\r
- TokenListHead = InsertToGuidSpaceListI (GuidListHead, Guid);\r
- CallbackListHead = InsertToTokenSpaceListI (TokenListHead, TokenNumber);\r
- InsertToCallbackListI (CallbackListHead , CallBackFunction);\r
+ switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+ case PCD_TYPE_VPD:\r
+ Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]);\r
+ return ((Value - PcdDb) | PCD_TYPE_VPD);\r
\r
- return;\r
+ case PCD_TYPE_HII:\r
+ Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]);\r
+ return ((Value - PcdDb) | PCD_TYPE_HII);\r
+ \r
+ case PCD_TYPE_DATA:\r
+ Value += Size * i;\r
+ return (Value - PcdDb);\r
+ \r
+ default:\r
+ ASSERT (FALSE);\r
+ }\r
+\r
+ ASSERT (FALSE);\r
+\r
+ return 0;\r
\r
}\r
\r
-EFI_STATUS\r
-RemoveFromCallbackListI (\r
- IN LIST_ENTRY *CallbackListHead,\r
- IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
- )\r
-{\r
- LIST_ENTRY *ListNode;\r
- PCD_CALLBACK_ENTRY *CallbackEntry;\r
\r
- ListNode = GetFirstNode (CallbackListHead);\r
\r
- while (!IsNull(CallbackListHead, ListNode)) {\r
- CallbackEntry = PCD_CALLBACK_ENTRY_FROM_LISTNODE(ListNode);\r
\r
- if (CallbackEntry->CallbackFunction == CallBackFunction) {\r
- RemoveEntryList (ListNode);\r
- FreePool (CallbackEntry);\r
- return EFI_SUCCESS;\r
- }\r
- ListNode = GetNextNode (CallbackListHead, ListNode);\r
- }\r
\r
- return EFI_NOT_FOUND;\r
+VOID\r
+InvokeCallbackOnSet (\r
+ UINT32 ExTokenNumber,\r
+ CONST EFI_GUID *Guid, OPTIONAL\r
+ UINTN TokenNumber,\r
+ VOID *Data,\r
+ UINTN Size\r
+ )\r
+{\r
+ return;\r
}\r
\r
\r
\r
+\r
EFI_STATUS\r
-RemoveFromCallbackList (\r
- IN UINTN TokenNumber,\r
- IN CONST GUID *Guid,\r
- IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
+SetWorker (\r
+ UINTN TokenNumber,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
)\r
{\r
- LIST_ENTRY *GuidListNode;\r
- LIST_ENTRY *GuidListHead;\r
- LIST_ENTRY *TokenListNode;\r
- LIST_ENTRY *TokenListHead;\r
- PCD_GUID_SPACE *GuidSpaceEntry;\r
- PCD_TOKEN_SPACE *TokenSpaceEntry;\r
+ UINT32 *LocalTokenNumberTable;\r
+ BOOLEAN IsPeiDb;\r
\r
- \r
- GuidListHead = GetPcdDatabaseListHead ();\r
\r
- GuidListNode = GetFirstNode (GuidListHead);\r
- while (!IsNull (GuidListNode, GuidListHead)) {\r
- \r
- GuidSpaceEntry = PCD_GUID_SPACE_FROM_LISTNODE(GuidListNode);\r
- if (CompareGuid (GuidSpaceEntry->GuidSpace, Guid)) {\r
- \r
- TokenListHead = &GuidSpaceEntry->TokenSpaceHead;\r
- TokenListNode = GetFirstNode (TokenListHead);\r
- while (!IsNull (TokenListNode, TokenListHead)) {\r
- \r
- TokenSpaceEntry = PCD_TOKEN_SPACE_FROM_LISTNODE(TokenListNode);\r
- if (TokenSpaceEntry->TokeNumber == TokenNumber) {\r
- return RemoveFromCallbackListI (&TokenSpaceEntry->CallbackListHead , CallBackFunction);\r
- }\r
- }\r
+ ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
\r
- //\r
- // No TokenNumber match input found in this GuidSpace\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- GuidListNode = GetNextNode (GuidListHead, GuidListNode);\r
+ if (PtrType) {\r
+ ASSERT (Size <= DxePcdGetSize (TokenNumber));\r
+ } else {\r
+ ASSERT (Size == DxePcdGetSize (TokenNumber));\r
}\r
-\r
-\r
- return EFI_NOT_FOUND;\r
\r
-}\r
-\r
+ IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
\r
+ LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
+ gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
\r
-EFI_STATUS\r
-DxeRegisterCallBackWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST GUID *Guid, OPTIONAL\r
- IN PCD_PROTOCOL_CALLBACK CallBackFunction,\r
- IN BOOLEAN Register\r
-)\r
-{\r
- PCD_DATABASE *Database;\r
- PCD_INDEX *PcdIndex;\r
+ TokenNumber = IsPeiDb ? TokenNumber\r
+ : TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
\r
- Database = GetPcdDxeDataBaseInstance ();\r
+ InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
\r
- PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);\r
+ return SetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], Data, Size, PtrType, IsPeiDb);\r
\r
- if (PcdIndex == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
+}\r
\r
- if (Register) {\r
- InsertToCallbackList (TokenNumber, Guid, CallBackFunction);\r
- return EFI_SUCCESS;\r
- } else {\r
- return RemoveFromCallbackList (TokenNumber, Guid, CallBackFunction); \r
- }\r
\r
- }\r
\r
\r
\r
-EFI_STATUS\r
-DxeSetSku (\r
- UINTN Id\r
-)\r
+VOID *\r
+ExGetWorker (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
+ IN UINTN GetSize\r
+ ) \r
{\r
- PCD_DATABASE * Database;\r
+ EX_PCD_ENTRY_ATTRIBUTE Attr;\r
\r
- Database = GetPcdDxeDataBaseInstance ();\r
+ GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
\r
- return Database->Info.SkuId = Id;\r
+ ASSERT ((GetSize == Attr.Size) || (GetSize == 0));\r
\r
+ return GetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias,\r
+ Attr.IsPeiDb,\r
+ Attr.Size\r
+ );\r
}\r
\r
\r
\r
+\r
+\r
EFI_STATUS\r
-DxeGetNextTokenWorker (\r
- IN OUT UINTN *TokenNumber,\r
- IN CONST GUID *Guid OPTIONAL\r
+ExSetWorker (\r
+ IN UINT32 ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ VOID *Data,\r
+ UINTN SetSize,\r
+ BOOLEAN PtrType\r
)\r
{\r
- PCD_DATABASE * Database;\r
+ EX_PCD_ENTRY_ATTRIBUTE Attr;\r
\r
- Database = GetPcdDxeDataBaseInstance ();\r
+ GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
\r
- return GetNextTokenWorker (&Database->Info,\r
- TokenNumber,\r
- Guid\r
- );\r
-}\r
+ ASSERT (!PtrType && (SetSize == Attr.Size));\r
\r
+ ASSERT (PtrType && (SetSize <= Attr.Size));\r
\r
+ InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Attr.Size);\r
\r
-VOID\r
-InitPcdDxeDataBase (\r
- VOID\r
-)\r
-{\r
- PCD_DATABASE *PeiDatabase;\r
- PCD_DATABASE *DxeDatabase;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
+ SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Attr.Size, PtrType, Attr.IsPeiDb);\r
\r
- GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
- ASSERT (GuidHob != NULL);\r
+ return EFI_SUCCESS;\r
+ \r
+}\r
\r
- PeiDatabase = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
\r
- DxeDatabase = AllocateCopyPool (PeiDatabase->Info.DatabaseLen, PeiDatabase);\r
\r
- ASSERT (DxeDatabase != NULL);\r
\r
- SetPcdDxeDataBaseInstance (DxeDatabase);\r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+ UINT32 LocalTokenNumber,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType,\r
+ BOOLEAN IsPeiDb\r
+ )\r
+{\r
+ EFI_GUID *GuidTable;\r
+ UINT16 *StringTable;\r
+ EFI_GUID *Guid;\r
+ UINT16 *Name;\r
+ VOID *InternalData;\r
+ VARIABLE_HEAD *VariableHead;\r
+ UINTN Offset;\r
+ UINT8 *PcdDb;\r
+\r
+\r
+ if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+ LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
+ }\r
\r
- return;\r
-}\r
+ Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
\r
+ PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);\r
\r
+ StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :\r
+ gPcdDatabase->DxeDb.Init.StringTable;\r
+ \r
+ InternalData = PcdDb + Offset;\r
\r
-EFI_STATUS\r
-GetHiiVariable (\r
- IN EFI_GUID *VariableGuid,\r
- IN UINT16 *VariableName,\r
- OUT VOID ** VariableData,\r
- OUT UINTN *VariableSize\r
- )\r
-{\r
- UINTN Size;\r
- EFI_STATUS Status;\r
- VOID *Buffer;\r
+ switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+ case PCD_TYPE_VPD:\r
+ ASSERT (FALSE);\r
+ return EFI_INVALID_PARAMETER;\r
+ \r
+ case PCD_TYPE_STRING:\r
+ CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, Size);\r
+ break;\r
\r
- Status = EfiGetVariable (\r
- (UINT16 *)VariableName,\r
- VariableGuid,\r
- NULL,\r
- &Size,\r
- NULL\r
- );\r
- ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+ case PCD_TYPE_HII:\r
+ //\r
+ // Bug Bug: Please implement this\r
+ //\r
+ GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :\r
+ gPcdDatabase->DxeDb.Init.GuidTable;\r
+ \r
+ VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
+ \r
+ Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
+ Name = &(StringTable[VariableHead->StringIndex]);\r
\r
- Buffer = AllocatePool (Size);\r
+ return EFI_SUCCESS;\r
\r
- ASSERT (Buffer != NULL);\r
+ case PCD_TYPE_DATA:\r
+ if (PtrType) {\r
+ CopyMem (InternalData, Data, Size);\r
+ return EFI_SUCCESS;\r
+ }\r
\r
- Status = EfiGetVariable (\r
- VariableName,\r
- VariableGuid,\r
- NULL,\r
- &Size,\r
- Buffer\r
- );\r
+ switch (Size) {\r
+ case sizeof(UINT8):\r
+ *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
+ return EFI_SUCCESS;\r
\r
- return Status;\r
+ case sizeof(UINT16):\r
+ *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
+ return EFI_SUCCESS;\r
+\r
+ case sizeof(UINT32):\r
+ *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
+ return EFI_SUCCESS;\r
+\r
+ case sizeof(UINT64):\r
+ *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
+ return EFI_SUCCESS;\r
\r
+ default:\r
+ ASSERT (FALSE);\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
+ }\r
+ \r
+ ASSERT (FALSE);\r
+ return EFI_NOT_FOUND;\r
}\r
\r
\r
IN UINTN Offset\r
)\r
{\r
- UINTN Size;\r
- VOID *Buffer;\r
- EFI_STATUS Status;\r
+ UINTN Size;\r
+ VOID *Buffer;\r
+ EFI_STATUS Status;\r
+ UINT32 Attribute;\r
\r
Size = 0;\r
\r
Status = EfiGetVariable (\r
(UINT16 *)VariableName,\r
VariableGuid,\r
- NULL,\r
+ &Attribute,\r
&Size,\r
NULL\r
);\r
Status = EfiGetVariable (\r
VariableName,\r
VariableGuid,\r
- NULL,\r
+ &Attribute,\r
&Size,\r
Buffer\r
);\r
return EfiSetVariable (\r
VariableName,\r
VariableGuid,\r
- 0,\r
+ Attribute,\r
Size,\r
Buffer\r
);\r
\r
}\r
\r
+\r
+\r
+\r
+\r
+VOID\r
+GetExPcdTokenAttributes (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINT32 ExTokenNumber,\r
+ OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr\r
+ )\r
+{\r
+ UINT32 i;\r
+ DYNAMICEX_MAPPING *ExMap;\r
+ EFI_GUID *GuidTable;\r
+ UINT16 *SizeTable;\r
+\r
+ ExMap = gPcdDatabase->PeiDb.Init.ExMapTable;\r
+ GuidTable = gPcdDatabase->PeiDb.Init.GuidTable;\r
+ SizeTable = gPcdDatabase->PeiDb.Init.SizeTable;\r
+ \r
+ for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+ if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&\r
+ CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])\r
+ ) {\r
+\r
+ ExAttr->IsPeiDb = TRUE;\r
+ ExAttr->Size = SizeTable[i + PEI_NEX_TOKEN_NUMBER];\r
+ ExAttr->TokenNumber = i + PEI_NEX_TOKEN_NUMBER;\r
+ ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
+ return;\r
+\r
+ }\r
+ }\r
+ \r
+ ExMap = gPcdDatabase->DxeDb.Init.ExMapTable;\r
+ GuidTable = gPcdDatabase->DxeDb.Init.GuidTable;\r
+ SizeTable = gPcdDatabase->DxeDb.Init.SizeTable;\r
+ \r
+ for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) {\r
+ if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&\r
+ CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])\r
+ ) {\r
+\r
+ ExAttr->IsPeiDb = FALSE;\r
+ ExAttr->Size = SizeTable[i + DXE_NEX_TOKEN_NUMBER];\r
+ ExAttr->TokenNumber = i + DXE_NEX_TOKEN_NUMBER;\r
+ ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
+ return;\r
+\r
+ }\r
+ }\r
+\r
+ ASSERT (FALSE);\r
+\r
+ return;\r
+}\r
+\r
#ifndef _SERVICE_H\r
#define _SERVICE_H\r
\r
-VOID \r
-DxeGetPcdEntryWorker (\r
- IN UINTN Token,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- OUT VOID *Data\r
- );\r
+#define USE_AUTOGEN\r
\r
-EFI_STATUS \r
-DxeSetPcdEntryWorker (\r
- IN UINTN Token,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- IN CONST VOID *Data\r
- );\r
+#ifndef USE_AUTOGEN\r
+//\r
+// The following definition will be generated by build tool \r
+//\r
+\r
+//\r
+// Common definitions\r
+//\r
+#define PCD_TYPE_SHIFT 24\r
+\r
+\r
+#define PCD_TYPE_DATA (0x00 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_HII (0x80 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_VPD (0x40 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_SKU_ENABLED (0x20 << PCD_TYPE_SHIFT)\r
+\r
+\r
+#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED))\r
+\r
+typedef struct {\r
+ UINT32 ExTokenNumber;\r
+ UINT32 LocalTokenNumber; // PCD Number of this particular platform build\r
+ UINT16 ExGuidIndex; // Index of GuidTable\r
+} DYNAMICEX_MAPPING;\r
+\r
+\r
+typedef struct {\r
+ UINT32 SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler\r
+ UINT32 SkuIdTableOffset; //Offset from the PCD_DB\r
+} SKU_HEAD;\r
+\r
+\r
+typedef struct {\r
+ UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.\r
+ UINT16 StringIndex; // Offset in String Table in units of UINT16.\r
+ UINT16 Offset; // Offset in Variable\r
+} VARIABLE_HEAD ;\r
+\r
+\r
+typedef struct {\r
+ UINT32 Offset;\r
+} VPD_HEAD;\r
+\r
+typedef struct {\r
+ UINT32 LocalTokenNumber;\r
+ UINT16 TokenNumber;\r
+ UINT16 Size;\r
+} SIZEINFO;\r
+\r
+#define offsetof(s,m) (UINT32)&(((s *)0)->m)\r
+\r
+\r
+\r
+//\r
+// C Structure generate for PEI PCD Database\r
+//\r
+#define PEI_EXMAPPING_TABLE_SIZE 1\r
+#define PEI_GUID_TABLE_SIZE 1\r
+#define PEI_LOCAL_TOKEN_NUMBER 1\r
+#define PEI_EXTOKEN_NUMBER 1\r
+#define PEI_STRING_TABLE_SIZE 2\r
+#define PEI_SKUID_TABLE_SIZE 3\r
+#define PEI_SIZE_TABLE_SIZE 1\r
+\r
+#define PEI_DATABASE_EMPTRY FALSE\r
+#define PEI_DYNAMICEX_MAPPING_EMPTY FALSE\r
+#define PEI_GUID_TABLE_EMPTY FALSE\r
+#define PEI_STRINGTABLE_EMPTY FALSE\r
+#define PEI_SIZETABLE_EMPTY FALSE\r
+#define PEI_SKUID_TABLE_EMPTY FALSE\r
+\r
+\r
+typedef struct {\r
+\r
+ DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_TABLE_SIZE];\r
+ EFI_GUID GuidTable[PEI_GUID_TABLE_SIZE];\r
+\r
+ UINT32 LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER];\r
+\r
+\r
+ UINT16 StringTable[PEI_STRING_TABLE_SIZE];\r
+ UINT16 SizeTable[PEI_LOCAL_TOKEN_NUMBER];\r
+ \r
+ SKU_ID SkuIdTable[PEI_SKUID_TABLE_SIZE];\r
+ \r
+ SKU_ID SystemSkuId;\r
+\r
+} PEI_PCD_DATABASE_INIT;\r
+\r
+typedef struct {\r
+ UINT8 Dummy;\r
+} PEI_PCD_DATABASE_UNINIT;\r
+\r
+//\r
+// Following code should be generated for PCD DXE driver\r
+//\r
+\r
+#define DXE_EXMAPPING_TABLE_SIZE 1\r
+#define DXE_GUID_TABLE_SIZE 1\r
+#define DXE_TOKEN_NUMBER 1\r
+#define DXE_EXTOKEN_NUMBER 1\r
+#define DXE_STRING_TABLE_SIZE 2\r
+#define DXE_SKUID_TABLE_SIZE 3\r
+#define DXE_SIZE_TABLE_SIZE 1\r
+\r
+#define DXE_DATABASE_EMPTRY FALSE\r
+#define DXE_DYNAMICEX_MAPPING_EMPTY FALSE\r
+#define DXE_GUID_TABLE_EMPTY FALSE\r
+#define DXE_STRINGTABLE_EMPTY FALSE\r
+#define DXE_SIZETABLE_EMPTY FALSE\r
+#define DXE_SKUID_TABLE_EMPTY FALSE\r
+\r
+typedef struct {\r
+ DYNAMICEX_MAPPING ExMapTable[DXE_EXMAPPING_TABLE_SIZE];\r
+ EFI_GUID GuidTable[DXE_GUID_TABLE_SIZE];\r
+\r
+ UINT32 LocalTokenNumberTable[DXE_TOKEN_NUMBER];\r
+\r
+\r
+ UINT16 StringTable[DXE_STRING_TABLE_SIZE];\r
+ UINT16 SizeTable[DXE_TOKEN_NUMBER];\r
+ \r
+ SKU_ID SkuIdTable[DXE_SKUID_TABLE_SIZE];\r
+ \r
+} DXE_PCD_DATABASE_INIT;\r
+\r
+typedef struct {\r
+ UINT8 Dummy;\r
+} DXE_PCD_DATABASE_UNINIT;\r
+\r
+\r
+#define DXE_PCD_DB_INIT_VALUE \\r
+ /* ExMapTable */ \\r
+ { \\r
+ { /* ExTokenNumber */ 0x00000001, /* LocalTokenNumberIndex */ 0, /* ExGuidIndex */ 0} \\r
+ }, \\r
+ \\r
+ /* GuidTable */ \\r
+ { \\r
+ { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD }} \\r
+ }, \\r
+ \\r
+ /* LocalTokenNumberTable */ \\r
+ { \\r
+ 0 \\r
+ }, \\r
+ \\r
+ /* StringTable */ \\r
+ { \\r
+ L"\0" \\r
+ }, \\r
+ \\r
+ /* SizeTable */ \\r
+ { \\r
+ 4 \\r
+ }, \\r
+ \\r
+ /* SkuIdTable */ \\r
+ { \\r
+ /*MaxSku*/ 2, /*SkuId*/ 100, /*SkuId*/200 \\r
+ },\\r
+ \\r
+\r
+//\r
+// End of Autogen Code\r
+//\r
+#endif\r
+\r
+/*\r
+typedef struct {\r
+ PEI_PCD_DATABASE_INIT Init;\r
+ PEI_PCD_DATABASE_UNINIT Uninit;\r
+} PEI_PCD_DATABASE;\r
\r
-UINTN\r
-DxeGetPcdEntrySizeWorker (\r
- IN UINTN Token,\r
- IN CONST EFI_GUID *Guid OPTIONAL\r
- );\r
+\r
+\r
+typedef struct {\r
+ DXE_PCD_DATABASE_INIT Init;\r
+ DXE_PCD_DATABASE_UNINIT Uninit;\r
+} DXE_PCD_DATABASE;\r
+\r
+\r
+typedef struct {\r
+ PEI_PCD_DATABASE PeiDb;\r
+ DXE_PCD_DATABASE DxeDb;\r
+} PCD_DATABASE;\r
+*/\r
+\r
+\r
+//\r
+// Internal Functions\r
+//\r
+\r
+EFI_STATUS\r
+SetWorker (\r
+ UINTN TokenNumber,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+ExSetWorker (\r
+ IN UINT32 ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
+ )\r
+;\r
+\r
+\r
+VOID *\r
+GetWorker (\r
+ UINTN TokenNumber\r
+ )\r
+;\r
+\r
+VOID *\r
+ExGetWorker (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
+ IN UINTN GetSize\r
+ ) \r
+;\r
+\r
+UINT32\r
+GetSkuEnabledTokenNumber (\r
+ UINT32 LocalTokenNumber,\r
+ UINTN Size,\r
+ BOOLEAN IsPeiDb\r
+ ) \r
+;\r
+\r
+EFI_STATUS\r
+GetHiiVariable (\r
+ IN EFI_GUID *VariableGuid,\r
+ IN UINT16 *VariableName,\r
+ OUT VOID ** VariableData,\r
+ OUT UINTN *VariableSize\r
+ )\r
+;\r
\r
EFI_STATUS\r
DxeRegisterCallBackWorker (\r
IN BOOLEAN Reigster\r
);\r
\r
-EFI_STATUS\r
-DxeSetSku (\r
- UINTN Id\r
-);\r
-\r
EFI_STATUS\r
DxeGetNextTokenWorker (\r
IN OUT UINTN *Token,\r
);\r
\r
VOID\r
-InitPcdDxeDataBase (\r
+BuildPcdDxeDataBase (\r
VOID\r
);\r
\r
+\r
+typedef struct {\r
+ UINTN TokenNumber;\r
+ UINTN Size;\r
+ UINT32 LocalTokenNumberAlias;\r
+ BOOLEAN IsPeiDb;\r
+} EX_PCD_ENTRY_ATTRIBUTE;\r
+\r
+VOID\r
+GetExPcdTokenAttributes (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINT32 ExTokenNumber,\r
+ OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr\r
+ )\r
+;\r
+\r
//\r
// Protocol Interface function declaration.\r
//\r
)\r
;\r
\r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+ UINT32 LocalTokenNumber,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType,\r
+ BOOLEAN IsPeiDb\r
+ )\r
+;\r
\r
-/*\r
- This DXE_PCD_DATABASE layout. The difference of DXE_PCD_DATABASE\r
- and PEI_PCD_DATABASE is as follows:\r
-\r
- 1) No PCD_CALL_BACK_TABLE; DXE_PCD_DATABASE maintain a LinkList for the\r
- callback function registered.\r
-\r
- ---------------------------\r
- | LIST_ENTRY GuidSpaceHead|\r
- ---------------------------\r
- | PCD_DATABASE_HEADER |\r
- ---------------------------\r
- | GUID_TABLE | Aligned on GUID (128 bits)\r
- ---------------------------\r
- | PCD_INDEX_TABLE | Aligned on PCD_INDEX (see PCD_INDEX's declaration)\r
- ---------------------------\r
- | IMAGE_STRING_TABLE | Aligned on 16 Bits\r
- ---------------------------\r
- | IMAGE_PCD_INDEX | Unaligned\r
- ---------------------------\r
- | Data Defaults | Unaligned\r
- ---------------------------\r
- | Data Buffer |\r
- | for entries without |\r
- | defaults |\r
- ---------------------------\r
-\r
-*/\r
-\r
-\r
-typedef struct {\r
- LIST_ENTRY ListNode;\r
- LIST_ENTRY TokenSpaceHead;\r
- CONST EFI_GUID *GuidSpace;\r
-} PCD_GUID_SPACE;\r
-\r
-typedef struct {\r
- LIST_ENTRY ListNode;\r
- LIST_ENTRY CallbackListHead;\r
- UINTN TokeNumber;\r
-} PCD_TOKEN_SPACE;\r
-\r
-typedef struct {\r
- LIST_ENTRY ListNode;\r
- PCD_PROTOCOL_CALLBACK CallbackFunction;\r
-} PCD_CALLBACK_ENTRY;\r
-\r
-#define PCD_GUID_SPACE_FROM_LISTNODE(a) \\r
- _CR(a, PCD_GUID_SPACE, ListNode)\r
+extern EFI_GUID gPcdDataBaseHobGuid;\r
\r
-#define PCD_TOKEN_SPACE_FROM_LISTNODE(a) \\r
- _CR(a, PCD_TOKEN_SPACE, ListNode)\r
+extern PCD_DATABASE * gPcdDatabase;\r
\r
-#define PCD_CALLBACK_ENTRY_FROM_LISTNODE(a) \\r
- _CR(a, PCD_CALLBACK_ENTRY, ListNode)\r
+extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;\r
\r
#endif\r
-/** @file\r
-PCD PEIM\r
+/** @file PCD PEIM\r
\r
Copyright (c) 2006, Intel Corporation \r
All rights reserved. This program and the accompanying materials \r
\r
**/\r
\r
-#include "../Common/PcdCommon.h"\r
+#include "PcdCommon.h"\r
#include "Service.h"\r
\r
\r
)\r
{\r
EFI_STATUS Status;\r
- UINT8 *PcdImage;\r
-\r
- PcdImage = (UINT8 *) LocatePcdImage ();\r
-\r
- BuildPcdDatabase (PcdImage);\r
\r
+ BuildPcdDatabase ();\r
+ \r
Status = PeiCoreInstallPpi (&mPpiPCD);\r
\r
ASSERT_EFI_ERROR (Status);\r
return EFI_SUCCESS;\r
}\r
\r
-\r
-\r
EFI_STATUS\r
EFIAPI\r
PeiPcdSetSku (\r
IN UINTN SkuId\r
)\r
{\r
- PCD_DATABASE *Database;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
\r
- GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
- ASSERT (GuidHob != NULL);\r
- \r
- Database = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
-\r
- Database->Info.SkuId = SkuId;\r
+ GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
\r
- return SkuId;\r
+ return EFI_SUCCESS;\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return PeiPcdGet8Ex (NULL, TokenNumber);\r
+ return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return PeiPcdGet16Ex (NULL, TokenNumber);\r
+ return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return PeiPcdGet32Ex (NULL, TokenNumber);\r
+ return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return PeiPcdGet64Ex (NULL, TokenNumber);\r
+ return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return PeiPcdGetPtrEx (NULL, TokenNumber);\r
+ return GetWorker (TokenNumber, 0);\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return PeiPcdGetBoolEx (NULL, TokenNumber);\r
+ return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return PeiPcdGetSizeEx (NULL, TokenNumber);\r
+ ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+ return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
}\r
\r
\r
EFIAPI\r
PeiPcdGet8Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT8 Data;\r
- \r
- PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Data);\r
- \r
- return Data;\r
+ return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
}\r
\r
\r
EFIAPI\r
PeiPcdGet16Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT16 Data;\r
- \r
- PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Data);\r
- \r
- return Data;\r
+ return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
}\r
\r
\r
EFIAPI\r
PeiPcdGet32Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT32 Data;\r
- \r
- PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Data);\r
- \r
- return Data;\r
+ return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
}\r
\r
\r
EFIAPI\r
PeiPcdGet64Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- UINT64 Data;\r
- \r
- PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Data);\r
- \r
- return Data;\r
+ return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
}\r
\r
\r
EFIAPI\r
PeiPcdGetPtrEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- VOID *Data;\r
- \r
- PeiGetPcdEntryWorker (TokenNumber, Guid, PcdPointer, &Data);\r
- \r
- return Data;\r
+ return ExGetWorker (Guid, ExTokenNumber, 0);\r
}\r
\r
\r
EFIAPI\r
PeiPcdGetBoolEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- BOOLEAN Data;\r
- \r
- PeiGetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Data);\r
- \r
- return Data;\r
+ return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
}\r
\r
\r
EFIAPI\r
PeiPcdGetSizeEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- return PeiGetPcdEntrySizeWorker (TokenNumber, Guid);\r
+ EX_PCD_ENTRY_ATTRIBUTE Attr;\r
+\r
+ GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
+ \r
+ return Attr.Size;\r
}\r
\r
\r
IN UINT8 Value\r
)\r
{\r
- return PeiPcdSet8Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
IN UINT16 Value\r
)\r
{\r
- return PeiPcdSet16Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
IN UINT32 Value\r
)\r
{\r
- return PeiPcdSet32Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
IN UINT64 Value\r
)\r
{\r
- return PeiPcdSet64Ex (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
IN CONST VOID *Value\r
)\r
{\r
- return PeiPcdSetPtrEx (NULL, TokenNumber, Value);\r
+ //\r
+ // BugBug, please change the Size to Input size when sync with spec\r
+ //\r
+ //ASSERT (sizeof (Value) == GetPcdDatabase()->Init.SizeTable[TokenNumber]);\r
+\r
+ return SetWorker (TokenNumber, (VOID *) Value, GetPcdDatabase()->Init.SizeTable[TokenNumber], TRUE);\r
}\r
\r
\r
IN BOOLEAN Value\r
)\r
{\r
- return PeiPcdSetBoolEx (NULL, TokenNumber, Value);\r
+ return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
}\r
\r
\r
EFIAPI\r
PeiPcdSet8Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN UINT8 Value\r
)\r
{\r
- return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
PeiPcdSet16Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN UINT16 Value\r
)\r
{\r
- return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
PeiPcdSet32Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN UINT32 Value\r
)\r
{\r
- return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
PeiPcdSet64Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN UINT64 Value\r
)\r
{\r
- return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFIAPI\r
PeiPcdSetPtrEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN CONST VOID *Value\r
)\r
{\r
- return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdPointer, (VOID *)Value);\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ (VOID *) Value, \r
+ sizeof (Value), \r
+ TRUE\r
+ );\r
}\r
\r
\r
EFIAPI\r
PeiPcdSetBoolEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN BOOLEAN Value\r
)\r
{\r
- return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Value);\r
-\r
+ return ExSetWorker(\r
+ ExTokenNumber, \r
+ Guid,\r
+ &Value, \r
+ sizeof (Value), \r
+ FALSE\r
+ );\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
PcdRegisterCallBackOnSet (\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN CONST EFI_GUID *Guid, OPTIONAL\r
IN PCD_PPI_CALLBACK CallBackFunction\r
)\r
{\r
- return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE);\r
+ return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
PcdUnRegisterCallBackOnSet (\r
- IN UINTN TokenNumber,\r
+ IN UINTN ExTokenNumber,\r
IN CONST EFI_GUID *Guid, OPTIONAL\r
IN PCD_PPI_CALLBACK CallBackFunction\r
)\r
{\r
- return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE);\r
+ return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
}\r
\r
\r
IN OUT UINTN *TokenNumber\r
)\r
{\r
- return PeiGetNextTokenWorker (TokenNumber, Guid);\r
+ if (Guid == NULL) {\r
+ *TokenNumber++;\r
+\r
+ if (*TokenNumber >= PEI_LOCAL_TOKEN_NUMBER) {\r
+ *TokenNumber = 0;\r
+ }\r
+ }\r
+\r
+ //\r
+ // BugBug: Haven't implemented the portion to get Next Token for GuidSpace is not Local GuidSpace.\r
+ //\r
+\r
+ return EFI_SUCCESS;\r
}\r
\r
\r
Module Name: Service.c\r
\r
**/\r
-#include "../Common/PcdCommon.h"\r
#include "Service.h"\r
\r
\r
+//\r
+// Build Tool will generate PEI_PCD_DB_INIT_VALUE in Autogen.h\r
+//\r
+/* PEI_PCD_DATABASE_INIT\r
+gPEIPcdDbInit = {\r
+ PEI_PCD_DB_INIT_VALUE\r
+};\r
+*/\r
\r
\r
-/**\r
- This function expand the StateByte\r
-\r
- @param[out] StateByte The output StateByte information.\r
- @param[in] Byte The StateByte.\r
-\r
- @retval VOID\r
---*/\r
-VOID\r
-PcdImageExpandStateByte (\r
- OUT PCD_STATEBYTE *StateByte,\r
- IN UINT8 Byte\r
-)\r
-{\r
- switch (Byte & PCD_STATEBYTE_DATUMTYPE) {\r
- case PCD_BYTE8:\r
- StateByte->DataType = PcdByte8;\r
- break;\r
- case PCD_BYTE16:\r
- StateByte->DataType = PcdByte16;\r
- break;\r
- case PCD_BYTE32:\r
- StateByte->DataType = PcdByte32;\r
- break;\r
- case PCD_BYTE64:\r
- StateByte->DataType = PcdByte64;\r
- break;\r
- case PCD_POINTER:\r
- StateByte->DataType = PcdPointer;\r
- break;\r
- case PCD_BOOLEAN:\r
- StateByte->DataType = PcdBoolean;\r
- break;\r
- default:\r
- ASSERT (FALSE);\r
- }\r
-\r
- StateByte->ExtendedGuidPresent = (BOOLEAN) ((Byte & PCD_STATEBYTE_EXTENDEDGUIDPRESENT) != 0);\r
- StateByte->HiiEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_HIIENABLE) != 0);\r
- StateByte->SkuDataArrayEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_SKUDATAARRAYENABLE) != 0);\r
- StateByte->SkuEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_SKUENABLE) != 0);\r
- StateByte->VpdEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_VPDENABLE) != 0);\r
-\r
-}\r
-\r
\r
\r
/**\r
- This function locates the <PCD_IMAGE> on the flash and \r
- return a pointer to the Section Data on flash.\r
+ The function registers the CallBackOnSet fucntion\r
+ according to TokenNumber and EFI_GUID space.\r
\r
- @param[in] VOID\r
+ @param[in] TokenNumber The token number.\r
+ @param[in] Guid The GUID space.\r
+ @param[in] CallBackFunction The Callback function to be registered.\r
\r
- @retval VOID\r
+ @retval EFI_SUCCESS If the Callback function is registered.\r
+ @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.\r
--*/\r
-UINT8 *\r
-LocatePcdImage (\r
- VOID\r
+EFI_STATUS\r
+PeiRegisterCallBackWorker (\r
+ IN UINTN ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid, OPTIONAL\r
+ IN PCD_PPI_CALLBACK CallBackFunction,\r
+ IN BOOLEAN Register\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_VOLUME_HEADER *FvHdr;\r
- EFI_FFS_FILE_HEADER *FfsHdr;\r
- VOID *SectionData;\r
-\r
- Status = PeiCoreFfsFindNextVolume (0, &FvHdr);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- do {\r
- FfsHdr = NULL;\r
- Status = PeiCoreFfsFindNextFile (EFI_FV_FILETYPE_FREEFORM, FvHdr, &FfsHdr);\r
- if (Status == EFI_SUCCESS) {\r
- if (CompareGuid (&gPcdImageFileGuid, &FfsHdr->Name)) {\r
-\r
- Status = PeiCoreFfsFindSectionData (EFI_SECTION_RAW, FfsHdr, &SectionData);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return (UINT8 *)SectionData;\r
- }\r
- }\r
- } while (Status == EFI_SUCCESS);\r
-\r
- ASSERT (FALSE);\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- The function retrieves the PCD data value according to\r
- TokenNumber and Guid space given.\r
-\r
- @param[in] TokenNumber The token number.\r
- @param[in] Guid The Guid space.\r
- @param[in] Type The storage type.\r
- @param[out] Data The output data.\r
-\r
-\r
- @retval EFI_SUCESS If data value is found according to SKU_ID.\r
- @retval EFI_NOT_FOUND If not such a value is found.\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
+ PCD_PPI_CALLBACK *CallbackTable;\r
+ PCD_PPI_CALLBACK Compare;\r
+ PCD_PPI_CALLBACK Assign;\r
+ UINT32 LocalTokenNumber;\r
+ UINTN TokenNumber;\r
+ UINTN Idx;\r
+ EX_PCD_ENTRY_ATTRIBUTE Attr;\r
\r
---*/\r
-VOID\r
-PeiGetPcdEntryWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- OUT VOID *Data\r
- )\r
-{\r
- PCD_DATABASE *Database;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
+ if (Guid == NULL) {\r
+ TokenNumber = ExTokenNumber;\r
+ ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+ LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
+ } else {\r
+ GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
+ TokenNumber = Attr.TokenNumber;\r
+ LocalTokenNumber = Attr.LocalTokenNumberAlias;\r
+ }\r
\r
- ASSERT (Data != NULL);\r
+ ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
+ ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
\r
- GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+ GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
ASSERT (GuidHob != NULL);\r
+ \r
+ CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
\r
- Database = GET_GUID_HOB_DATA (GuidHob);\r
+ Compare = Register? NULL: CallBackFunction;\r
+ Assign = Register? CallBackFunction: NULL;\r
\r
- GetPcdEntryWorker ( &Database->Info,\r
- TokenNumber,\r
- Guid,\r
- Type,\r
- Data\r
- );\r
+ for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
+ if (CallbackTable[Idx] == Compare) {\r
+ CallbackTable[Idx] = Assign;\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
\r
+ return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
\r
- return;\r
}\r
\r
\r
-/**\r
- The function set the PCD data value according to\r
- TokenNumber and Guid space given.\r
\r
- @param[in] Database The PCD Database Instance.\r
- @param[in] TokenNumber The token number.\r
- @param[in] Guid The Guid space.\r
- @param[in] Type The storage type.\r
- @param[in] Data The output data.\r
\r
+/**\r
+ The function builds the PCD database based on the\r
+ PCD_IMAGE on the flash.\r
\r
- @retval EFI_SUCESS If data value is found according to SKU_ID.\r
- @retval EFI_NOT_FOUND If not such a value is found.\r
+ @param[in] PcdImageOnFlash The PCD image on flash.\r
\r
+ @retval VOID\r
--*/\r
-EFI_STATUS\r
-SetPcdEntryWorker (\r
- IN CONST PCD_DATABASE *Database,\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- IN VOID *Data\r
+VOID\r
+BuildPcdDatabase (\r
+ VOID\r
)\r
{\r
- PCD_INDEX *PcdIndex;\r
- EFI_STATUS Status;\r
- PCD_PPI_CALLBACK *CallbackTable;\r
- UINTN Idx;\r
-\r
- ASSERT (Data != NULL);\r
-\r
- //\r
- // Find the PCD entry in list in memory first\r
- //\r
- PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, &Idx);\r
-\r
- ASSERT (PcdIndex != NULL);\r
+ PEI_PCD_DATABASE *Database;\r
+ VOID *CallbackFnTable;\r
+ UINTN SizeOfCallbackFnTable;\r
+ \r
+ Database = BuildGuidHob (&gPcdDataBaseHobGuid, sizeof (PEI_PCD_DATABASE));\r
\r
- ASSERT (PcdIndex->StateByte.DataType == Type);\r
+ ZeroMem (Database, sizeof (PEI_PCD_DATABASE));\r
\r
//\r
- // Invoke the callback function.\r
+ // gPEIPcdDbInit is smaller than PEI_PCD_DATABASE\r
//\r
- CallbackTable = (PCD_PPI_CALLBACK *)\r
- GetAbsoluteAddress (Idx * Database->Info.MaxCallbackNum * sizeof(PCD_PPI_CALLBACK),\r
- Database->Info.CallbackTableOffset,\r
- &Database->Info\r
- );\r
\r
- for (Idx = 0; Idx < Database->Info.MaxCallbackNum; Idx++) {\r
- if (CallbackTable[Idx] != NULL) {\r
- CallbackTable[Idx] (Guid,\r
- PcdIndex->TokenNumber,\r
- Data,\r
- PcdIndex->DatumSize\r
- );\r
- }\r
- }\r
+ CopyMem (&Database->Init, &gPEIPcdDbInit, sizeof (gPEIPcdDbInit));\r
\r
- Status = SetPcdData (PcdIndex, &Database->Info, Data);\r
+ SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
\r
- return Status;\r
+ CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
+ \r
+ ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
+ \r
+ return;\r
}\r
\r
\r
\r
/**\r
- (reviewed) The function set the PCD data value according to\r
- TokenNumber and Guid space given.\r
-\r
- @param[in] TokenNumber The token number.\r
- @param[in] Guid The Guid space.\r
- @param[in] Type The storage type.\r
- @param[in] Data The output data.\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_SUCESS If data value is found according to SKU_ID.\r
- @retval EFI_NOT_FOUND If not such a value is found.\r
+ @param[in] VariableGuid The Variable GUID.\r
+ @param[in] VariableName The Variable Name.\r
+ @param[out] VariableData The output data.\r
+ @param[out] VariableSize The size of the variable.\r
\r
+ @retval EFI_SUCCESS Operation successful.\r
+ @retval EFI_SUCCESS Variablel not found.\r
--*/\r
EFI_STATUS\r
-PeiSetPcdEntryWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- IN VOID *Data\r
+GetHiiVariable (\r
+ IN CONST EFI_GUID *VariableGuid,\r
+ IN UINT16 *VariableName,\r
+ OUT VOID **VariableData,\r
+ OUT UINTN *VariableSize\r
)\r
{\r
- PCD_DATABASE *Database;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
+ UINTN Size;\r
+ EFI_STATUS Status;\r
+ VOID *Buffer;\r
+ EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;\r
\r
- ASSERT (Data != NULL);\r
+ Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &VariablePpi);\r
+ ASSERT_EFI_ERROR (Status);\r
\r
- GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
- ASSERT (GuidHob != NULL);\r
- \r
- Database = GET_GUID_HOB_DATA (GuidHob);\r
+ Size = 0;\r
\r
- SetPcdEntryWorker (Database,\r
- TokenNumber,\r
- Guid,\r
- Type,\r
- Data\r
- );\r
+ Status = VariablePpi->PeiGetVariable (\r
+ GetPeiServicesTablePointer (),\r
+ VariableName,\r
+ (EFI_GUID *) VariableGuid,\r
+ NULL,\r
+ &Size,\r
+ NULL\r
+ );\r
+ ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+\r
+ Status = PeiCoreAllocatePool (Size, &Buffer);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ // declare a local for STP.\r
+ //\r
+ Status = VariablePpi->PeiGetVariable (\r
+ GetPeiServicesTablePointer (),\r
+ (UINT16 *) VariableName,\r
+ (EFI_GUID *) VariableGuid,\r
+ NULL,\r
+ &Size,\r
+ Buffer\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ *VariableSize = Size;\r
+ *VariableData = Buffer;\r
\r
return EFI_SUCCESS;\r
}\r
\r
\r
-\r
-UINTN\r
-PeiGetPcdEntrySizeWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid OPTIONAL\r
- )\r
+UINT32\r
+GetSkuEnabledTokenNumber (\r
+ UINT32 LocalTokenNumber,\r
+ UINTN Size\r
+ ) \r
{\r
- PCD_DATABASE *Database;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
-\r
- GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
- ASSERT (GuidHob != NULL);\r
+ PEI_PCD_DATABASE *PeiPcdDb;\r
+ SKU_HEAD *SkuHead;\r
+ SKU_ID *SkuIdTable;\r
+ INTN i;\r
+ UINT8 *Value;\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
+ for (i = 0; i < SkuIdTable[0]; i++) {\r
+ if (PeiPcdDb->Init.SystemSkuId == SkuIdTable[i + 1]) {\r
+ break;\r
+ }\r
+ }\r
\r
- Database = GET_GUID_HOB_DATA (GuidHob);\r
+ switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+ case PCD_TYPE_VPD:\r
+ Value += sizeof(VPD_HEAD) * i;\r
+ return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
+\r
+ case PCD_TYPE_HII:\r
+ Value += sizeof(VARIABLE_HEAD) * i;\r
+ return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
+ \r
+ case 0: //Change to a MACRO PCD_TYPE_DATA\r
+ Value += Size * i;\r
+ return (Value - (UINT8 *) PeiPcdDb);\r
+ \r
+ default:\r
+ ASSERT (FALSE);\r
+ }\r
\r
- return GetPcdEntrySizeWorker (&Database->Info,\r
- TokenNumber,\r
- Guid\r
- );\r
+ ASSERT (FALSE);\r
\r
+ return 0;\r
+ \r
}\r
\r
\r
\r
-/**\r
- The function registers the CallBackOnSet fucntion\r
- according to TokenNumber and EFI_GUID space.\r
-\r
- @param[in] TokenNumber The token number.\r
- @param[in] Guid The GUID space.\r
- @param[in] CallBackFunction The Callback function to be registered.\r
\r
- @retval EFI_SUCCESS If the Callback function is registered.\r
- @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.\r
---*/\r
-EFI_STATUS\r
-PeiRegisterCallBackWorker (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN PCD_PPI_CALLBACK CallBackFunction,\r
- IN BOOLEAN Register\r
-)\r
+VOID\r
+InvokeCallbackOnSet (\r
+ UINT32 ExTokenNumber,\r
+ CONST EFI_GUID *Guid, OPTIONAL\r
+ UINTN TokenNumber,\r
+ VOID *Data,\r
+ UINTN Size\r
+ )\r
{\r
- PCD_DATABASE *Database;\r
EFI_HOB_GUID_TYPE *GuidHob;\r
- PCD_INDEX *PcdIndex;\r
- UINTN Idx;\r
PCD_PPI_CALLBACK *CallbackTable;\r
- PCD_PPI_CALLBACK Compare;\r
- PCD_PPI_CALLBACK Assign;\r
+ UINTN Idx;\r
\r
- GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+ if (Guid == NULL)\r
+ ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+ GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
ASSERT (GuidHob != NULL);\r
\r
- Database = GET_GUID_HOB_DATA (GuidHob);\r
-\r
- PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);\r
-\r
- ASSERT (PcdIndex != NULL);\r
-\r
- if (PcdIndex->StateByte.VpdEnable) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
+ CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
\r
- Idx = ((UINTN) PcdIndex - Database->Info.CallbackTableOffset) / sizeof(PCD_INDEX);\r
+ CallbackTable += (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
\r
- CallbackTable = (PCD_PPI_CALLBACK *) GetAbsoluteAddress (\r
- sizeof (PCD_PPI_CALLBACK) * Idx * Database->Info.MaxCallbackNum,\r
- Database->Info.CallbackTableOffset,\r
- &Database->Info\r
- );\r
-\r
- Compare = Register? NULL: CallBackFunction;\r
- Assign = Register? CallBackFunction: NULL;\r
-\r
- for (Idx = 0; Idx < Database->Info.MaxCallbackNum; Idx++) {\r
- if (CallbackTable[Idx] == Compare) {\r
- CallbackTable[Idx] = Assign;\r
- return EFI_SUCCESS;\r
+ for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
+ if (CallbackTable[Idx] != NULL) {\r
+ CallbackTable[Idx] (Guid,\r
+ (Guid == NULL)? TokenNumber: ExTokenNumber,\r
+ Data,\r
+ Size\r
+ );\r
}\r
}\r
-\r
- return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
-\r
+ \r
}\r
\r
-\r
-\r
EFI_STATUS\r
-PeiGetNextTokenWorker (\r
- IN OUT UINTN *TokenNumber,\r
- IN CONST EFI_GUID *Guid OPTIONAL\r
+SetWorker (\r
+ UINTN TokenNumber,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
)\r
{\r
- PCD_DATABASE *Database;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
-\r
- GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
- ASSERT (GuidHob != NULL);\r
- \r
- Database = GET_GUID_HOB_DATA (GuidHob);\r
-\r
- return GetNextTokenWorker (&Database->Info,\r
- TokenNumber,\r
- Guid\r
- );\r
-\r
-}\r
+ UINT32 LocalTokenNumber;\r
+ PEI_PCD_DATABASE *PeiPcdDb;\r
\r
+ ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+ \r
+ PeiPcdDb = GetPcdDatabase ();\r
\r
+ LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
\r
-VOID\r
-GetPcdImageInfo (\r
- IN CONST UINT8 *PcdImageOnFlash,\r
- OUT PCD_IMAGE_RECORD *ImageInfo\r
-)\r
-{\r
- PCD_FFS_ENCODING *PcdFfsHdr;\r
-\r
- PcdFfsHdr = (PCD_FFS_ENCODING *) PcdImageOnFlash;\r
+ if (PtrType) {\r
+ ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] >= Size);\r
+ } else {\r
+ ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] == Size);\r
+ }\r
\r
- ZeroMem (ImageInfo, sizeof (*ImageInfo));\r
+ InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
\r
- ImageInfo->ImageStart = PcdImageOnFlash;\r
+ return SetWorkerByLocalTokenNumber (LocalTokenNumber, Data, Size, PtrType);\r
\r
- CopyMem (&ImageInfo->EntryCount, PcdFfsHdr->EntryCount, 3);\r
- \r
- CopyMem (&ImageInfo->GlobalDatumLength, PcdFfsHdr->GlobalDatumLength, 1);\r
- ASSERT (ImageInfo->GlobalDatumLength <= 3);\r
- \r
- CopyMem (&ImageInfo->GlobalOffsetLength, PcdFfsHdr->GlobalOffsetLength, 1);\r
- ASSERT (ImageInfo->GlobalOffsetLength <= 3);\r
- \r
- CopyMem (&ImageInfo->GlobalTokenLength, PcdFfsHdr->GlobalTokenLength, 1);\r
- ASSERT (ImageInfo->GlobalTokenLength <= 4);\r
-\r
- CopyMem (&ImageInfo->GlobalGuidTabIdxLength, PcdFfsHdr->GuidLength, 1);\r
- ASSERT (ImageInfo->GlobalGuidTabIdxLength <= 2);\r
-\r
- CopyMem (&ImageInfo->GlobalStrTabIdxLength, PcdFfsHdr->GlobalStrTabIdxLength, 1);\r
- ASSERT (ImageInfo->GlobalStrTabIdxLength <= 2);\r
-\r
- CopyMem (&ImageInfo->ImageLength, PcdFfsHdr->ImageLength, 3);\r
- CopyMem (&ImageInfo->IndexLength, PcdFfsHdr->PcdIndexLength, 3);\r
- CopyMem (&ImageInfo->WholeDataDefaultLength, PcdFfsHdr->WholeDataBufferLength, 3);\r
- CopyMem (&ImageInfo->DataDefaultLength, PcdFfsHdr->DataBufferLength, 3);\r
- CopyMem (&ImageInfo->GuidTableLength, PcdFfsHdr->GuidTableLength, 3);\r
-\r
- ImageInfo->StringTableLength = ImageInfo->ImageLength\r
- - sizeof (PCD_FFS_ENCODING)\r
- - ImageInfo->DataDefaultLength\r
- - ImageInfo->IndexLength\r
- - ImageInfo->GuidTableLength;\r
-\r
- ImageInfo->DataDefaultStart = PcdImageOnFlash + sizeof (PCD_FFS_ENCODING);\r
- ImageInfo->IndexStart = ImageInfo->DataDefaultStart + ImageInfo->DataDefaultLength;\r
- ImageInfo->GuidTableStart = (CONST EFI_GUID *)(ImageInfo->IndexStart + ImageInfo->IndexLength);\r
- ImageInfo->StringTableStart = (CONST UINT16 *) ((UINT8 *) ImageInfo->GuidTableStart + ImageInfo->GuidTableLength);\r
- \r
- return;\r
}\r
\r
\r
\r
-/**\r
- The function builds the PCD database based on the\r
- PCD_IMAGE on the flash.\r
-\r
- The layout of the PCD_DATABASE is as follows:\r
-\r
- ---------------------------\r
- | PCD_DATABASE_HEADER |\r
- ---------------------------\r
- | GUID_TABLE | Aligned on GUID (128 bits)\r
- ---------------------------\r
- | PCD_CALL_BACK_TABLE | Aligned on Pointer (32 bits or 64 bits)\r
- ---------------------------\r
- | PCD_INDEX_TABLE | Aligned on PCD_INDEX (see PCD_INDEX's declaration)\r
- ---------------------------\r
- | IMAGE_STRING_TABLE | Aligned on 16 Bits\r
- ---------------------------\r
- | IMAGE_PCD_INDEX | Unaligned\r
- ---------------------------\r
- | Data Defaults | Unaligned\r
- ---------------------------\r
- | Data Buffer |\r
- | for entries without |\r
- | defaults |\r
- ---------------------------\r
-\r
- @param[in] PcdImageOnFlash The PCD image on flash.\r
\r
- @retval VOID\r
---*/\r
-UINTN\r
-GetPcdDatabaseLen (\r
- IN CONST UINT8 *PcdImageOnFlash,\r
- OUT PCD_DATABASE_HEADER *Info,\r
- OUT PCD_IMAGE_RECORD *ImageInfo\r
+EFI_STATUS\r
+ExSetWorker (\r
+ IN UINT32 ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
)\r
{\r
- UINTN DatabaseLen;\r
- UINTN DatabaseHeaderLength;\r
- UINTN PcdIndexLength;\r
- UINTN CallbackBufferLength;\r
-\r
-\r
- GetPcdImageInfo (PcdImageOnFlash, ImageInfo);\r
-\r
- Info->MaxCallbackNum = FixedPcdGet32(PcdMaxPcdCallBackNumber) ;\r
+ PEI_PCD_DATABASE *PeiPcdDb;\r
+ EX_PCD_ENTRY_ATTRIBUTE Attr;\r
\r
- DatabaseHeaderLength = sizeof (PCD_DATABASE) - sizeof(UINT8);\r
\r
- PcdIndexLength = sizeof (PCD_INDEX) * ImageInfo->EntryCount;\r
- CallbackBufferLength = sizeof (PCD_PPI_CALLBACK) * Info->MaxCallbackNum * ImageInfo->EntryCount;\r
+ PeiPcdDb = GetPcdDatabase ();\r
\r
- Info->EntryCount = ImageInfo->EntryCount;\r
- Info->GuidTableOffset = DatabaseHeaderLength;\r
- Info->CallbackTableOffset = Info->GuidTableOffset + ImageInfo->GuidTableLength;\r
- Info->PcdIndexOffset = Info->PcdIndexOffset + PcdIndexLength;\r
- Info->ImageIndexOffset = Info->CallbackTableOffset + CallbackBufferLength;\r
- Info->DataBufferOffset = Info->ImageIndexOffset + ImageInfo->DataDefaultLength;\r
+ GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
\r
- Info->HiiGuidOffsetLength = ImageInfo->GlobalGuidTabIdxLength;\r
- Info->HiiVariableOffsetLength = ImageInfo->GlobalStrTabIdxLength;\r
- Info->ExtendedOffsetLength = ImageInfo->GlobalOffsetLength;\r
+ ASSERT (!PtrType && Attr.Size);\r
\r
- Info->SkuId = 0;\r
+ ASSERT (PtrType && Attr.Size >= Size);\r
\r
- DatabaseLen = DatabaseHeaderLength\r
- + ImageInfo->GuidTableLength\r
- + PcdIndexLength\r
- + CallbackBufferLength\r
- + ImageInfo->IndexLength\r
- + ImageInfo->WholeDataDefaultLength;\r
+ InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Size);\r
\r
- Info->DatabaseLen = DatabaseLen;\r
+ SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Size, PtrType);\r
\r
- return DatabaseLen;\r
+ return EFI_SUCCESS;\r
+ \r
}\r
\r
\r
-/**\r
- The function constructs a single PCD_INDEX according a index in\r
- <PCD_IMAGE>.\r
\r
- @param[in] ImageIndex The starting address of a PCD index defined in PCD spec 0.51.\r
- @param[in] Index The output PCD_INDEX. \r
- @param[in] ImageInfo The attributes of the PCD_IMAGE as this binary stream is highly\r
- optimized for size.\r
\r
- @retval UINTN The length of the current PCD index.\r
-**/\r
-UINTN\r
-BuildPcdIndex (\r
- IN CONST UINT8 *ImageIndex,\r
- OUT PCD_INDEX *Index,\r
- IN CONST PCD_IMAGE_RECORD *ImageInfo\r
-)\r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+ UINT32 LocalTokenNumber,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
+ )\r
{\r
- UINTN SkuCount;\r
- CONST UINT8 *ImageIndexBackUp;\r
-\r
- ImageIndexBackUp = ImageIndex;\r
+ PEI_PCD_DATABASE *PeiPcdDb;\r
+ UINT8 *PeiPcdDbRaw;\r
+ UINT16 StringTableIdx;\r
+ UINTN Offset;\r
+ VOID *InternalData;\r
+ \r
+\r
+ PeiPcdDb = GetPcdDatabase ();\r
+ PeiPcdDbRaw = (UINT8 *) PeiPcdDb;\r
\r
- //\r
- // Token Number\r
- //\r
- CopyMem (&Index->TokenNumber,\r
- ImageIndex,\r
- ImageInfo->GlobalTokenLength\r
- );\r
-\r
- ImageIndex += ImageInfo->GlobalTokenLength;\r
- \r
- //\r
- // State Byte\r
- //\r
- PcdImageExpandStateByte (&Index->StateByte,\r
- *ImageIndex\r
- );\r
+ if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+ LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
+ }\r
\r
- ImageIndex += 1;\r
+ Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+ InternalData = (VOID *) (PeiPcdDbRaw + Offset);\r
\r
- //\r
- // Dataum Size\r
- //\r
- CopyMem (&Index->DatumSize,\r
- ImageIndex,\r
- ImageInfo->GlobalDatumLength\r
- );\r
+ switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+ case PCD_TYPE_VPD:\r
+ case PCD_TYPE_HII:\r
+ {\r
+ ASSERT (FALSE);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
\r
- ImageIndex += ImageInfo->GlobalDatumLength;\r
+ case PCD_TYPE_STRING:\r
+ StringTableIdx = *((UINT16 *)InternalData);\r
+ CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, Size);\r
+ break;\r
\r
- //\r
- // SKU_DATA\r
- //\r
- if (Index->StateByte.SkuEnable) {\r
- Index->SkuCount = *ImageIndex;\r
- SkuCount = *ImageIndex;\r
- ImageIndex++;\r
- Index->SkuIdArray = (UINT32) ImageIndex - (UINT32) ImageInfo->IndexStart;\r
- ImageIndex += Index->SkuCount;\r
- } else {\r
- //\r
- // There is always a default SKU_ID of zero even \r
- // if SKU is not enabled for this PCD entry.\r
- // \r
- //\r
- SkuCount = 1;\r
- }\r
+ case PCD_TYPE_DATA:\r
+ {\r
+ \r
+ if (PtrType) {\r
+ CopyMem (InternalData, Data, Size);\r
+ return EFI_SUCCESS;\r
+ }\r
\r
- //\r
- // Extended Offset\r
- //\r
- CopyMem (&Index->ExtendedDataOffset,\r
- ImageIndex,\r
- ImageInfo->GlobalOffsetLength\r
- );\r
+ switch (Size) {\r
+ case sizeof(UINT8):\r
+ *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
+ return EFI_SUCCESS;\r
\r
- ImageIndex += ImageInfo->GlobalOffsetLength * SkuCount;\r
+ case sizeof(UINT16):\r
+ *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
+ return EFI_SUCCESS;\r
\r
- //\r
- // DynamicEX Guid Offset\r
- //\r
- if (Index->StateByte.ExtendedGuidPresent) {\r
- CopyMem (&Index->DynamicExGuid,\r
- ImageIndex,\r
- ImageInfo->GlobalGuidTabIdxLength\r
- );\r
+ case sizeof(UINT32):\r
+ *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
+ return EFI_SUCCESS;\r
\r
- ImageIndex += ImageInfo->GlobalGuidTabIdxLength;\r
- }\r
+ case sizeof(UINT64):\r
+ *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
+ return EFI_SUCCESS;\r
\r
- //\r
- // HII_DATA\r
- //\r
- if (Index->StateByte.HiiEnable) {\r
- Index->HiiData = (UINT32) ImageIndex - (UINT32) ImageInfo->IndexStart;\r
- ImageIndex += ((ImageInfo->GlobalStrTabIdxLength + ImageInfo->GlobalGuidTabIdxLength) * SkuCount);\r
+ default:\r
+ ASSERT (FALSE);\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+ \r
}\r
\r
- return (UINTN) (ImageIndex - ImageIndexBackUp);\r
+ ASSERT (FALSE);\r
+ return EFI_NOT_FOUND;\r
}\r
\r
\r
-\r
-\r
-/**\r
- The function builds the PCD database based on the\r
- PCD_IMAGE on the flash.\r
-\r
- @param[in] Database The database instance.\r
- @param[in] ImageIndex The starting address of a PCD index defined in PCD spec 0.51.\r
- @param[in] ImageInfo The attributes of the PCD_IMAGE as this binary stream is highly\r
- optimized for size.\r
-\r
- @retval VOID\r
-**/\r
-VOID\r
-BuildPcdDatabaseIndex (\r
- PCD_DATABASE *Database,\r
- UINT8 *ImageIndex,\r
- PCD_IMAGE_RECORD *ImageInfo\r
+VOID *\r
+GetWorkerByLocalTokenNumber (\r
+ PEI_PCD_DATABASE *PeiPcdDb,\r
+ UINT32 LocalTokenNumber,\r
+ UINTN Size\r
)\r
{\r
- UINTN Idx;\r
- UINTN Len;\r
- PCD_INDEX *IndexTable;\r
+ UINT32 Offset;\r
+ EFI_GUID *Guid;\r
+ UINT16 *Name;\r
+ VARIABLE_HEAD *VariableHead;\r
+ EFI_STATUS Status;\r
+ UINTN DataSize;\r
+ VOID *Data;\r
+ UINT16 *StringTable;\r
+ UINT16 StringTableIdx;\r
+ \r
+ PeiPcdDb = GetPcdDatabase ();\r
+\r
+ if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+ LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
+ }\r
\r
- IndexTable = (PCD_INDEX *) GetAbsoluteAddress (0, Database->Info.PcdIndexOffset, Database);\r
+ Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+ StringTable = PeiPcdDb->Init.StringTable;\r
+ \r
+ switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+ case PCD_TYPE_VPD:\r
+ {\r
+ VPD_HEAD *VpdHead;\r
+ VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
+ return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
+ }\r
+ \r
+ case PCD_TYPE_HII:\r
+ {\r
+ VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
+ \r
+ Guid = &(PeiPcdDb->Init.GuidTable[VariableHead->GuidTableIndex]);\r
+ Name = &StringTable[VariableHead->StringIndex];\r
+\r
+ Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+ ASSERT_EFI_ERROR (Status);\r
+ ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
+\r
+ return (VOID *) ((UINT8 *) Data + VariableHead->Offset);\r
+ }\r
\r
- for (Idx = 0; Idx < Database->Info.EntryCount; Idx++) {\r
- Len = BuildPcdIndex (ImageIndex, &IndexTable[Idx], ImageInfo);\r
- ImageIndex += Len;\r
- }\r
+ case PCD_TYPE_DATA:\r
+ return (VOID *) ((UINT8 *)PeiPcdDb + Offset);\r
+ break;\r
\r
- return;\r
-}\r
+ case PCD_TYPE_STRING:\r
+ StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
+ return (VOID *) (&StringTable[StringTableIdx]);\r
\r
+ default:\r
+ ASSERT (FALSE);\r
+ break;\r
+ \r
+ }\r
\r
-/**\r
- The function builds the PCD database based on the\r
- PCD_IMAGE on the flash.\r
+ ASSERT (FALSE);\r
+ \r
+ return NULL;\r
+ \r
+}\r
\r
- @param[in] PcdImageOnFlash The PCD image on flash.\r
\r
- @retval VOID\r
---*/\r
-VOID\r
-BuildPcdDatabase (\r
- UINT8 *PcdImageOnFlash\r
+VOID *\r
+ExGetWorker (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINT32 ExTokenNumber,\r
+ IN UINTN GetSize\r
)\r
{\r
- PCD_DATABASE *Database;\r
- UINTN Len;\r
- PCD_IMAGE_RECORD ImageInfo;\r
- UINT8 *ImageIndex;\r
- PCD_DATABASE_HEADER DatabaseHeader;\r
-\r
- Len = GetPcdDatabaseLen(PcdImageOnFlash, &DatabaseHeader, &ImageInfo);\r
-\r
- Database = BuildGuidHob (&gPcdDataBaseHobGuid, Len);\r
- ASSERT (Database != NULL);\r
+ EX_PCD_ENTRY_ATTRIBUTE Attr;\r
\r
- ZeroMem (Database, Len);\r
-\r
- //\r
- // Update Database header\r
- //\r
- CopyMem (&Database->Info, &DatabaseHeader, sizeof (DatabaseHeader));\r
-\r
- //\r
- // I need this to get the GuidTableOffset as we don't\r
- // know if Database field of PCD_DATABASE starts from an aligned\r
- // address. The compilor may add padding after PCD_DATABASE_HEADER field.\r
- //\r
- Database->Info.GuidTableOffset = ((UINTN) &Database->GuidTable) - (UINTN)Database;\r
+ GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
\r
- //\r
- // Copy Guid Table from Flash\r
- //\r
- CopyMem ((UINT8 *) Database + Database->Info.GuidTableOffset,\r
- ImageInfo.GuidTableStart,\r
- ImageInfo.GuidTableLength\r
- );\r
-\r
- //\r
- // Copy ImageIndex from Flash\r
- //\r
- CopyMem ((UINT8 *) Database + Database->Info.ImageIndexOffset,\r
- ImageInfo.IndexStart,\r
- ImageInfo.IndexLength\r
- );\r
+ ASSERT ((GetSize == Attr.Size) || (GetSize == 0));\r
\r
- //\r
- // Copy Default Value\r
- //\r
- CopyMem ((UINT8 *) Database + Database->Info.DataBufferOffset,\r
- ImageInfo.DataDefaultStart,\r
- ImageInfo.DataDefaultLength\r
- );\r
-\r
- //\r
- // Copy String Table\r
- //\r
- CopyMem ((UINT8 *) Database + Database->Info.StringTableOffset,\r
- ImageInfo.StringTableStart,\r
- ImageInfo.StringTableLength\r
- );\r
-\r
- ImageIndex = GetAbsoluteAddress (0, Database->Info.ImageIndexOffset, Database);\r
-\r
- BuildPcdDatabaseIndex (Database, ImageIndex, &ImageInfo);\r
-\r
- return;\r
+ return GetWorkerByLocalTokenNumber (GetPcdDatabase(),\r
+ Attr.LocalTokenNumberAlias,\r
+ Attr.Size\r
+ );\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
- @param[in] VariableGuid The Variable GUID.\r
- @param[in] VariableName The Variable Name.\r
- @param[out] VariableData The output data.\r
- @param[out] VariableSize The size of the variable.\r
-\r
- @retval EFI_SUCCESS Operation successful.\r
- @retval EFI_SUCCESS Variablel not found.\r
---*/\r
-EFI_STATUS\r
-GetHiiVariable (\r
- IN EFI_GUID *VariableGuid,\r
- IN UINT16 *VariableName,\r
- OUT VOID **VariableData,\r
- OUT UINTN *VariableSize\r
+VOID *\r
+GetWorker (\r
+ UINTN TokenNumber,\r
+ UINTN GetSize\r
)\r
{\r
- UINTN Size;\r
- EFI_STATUS Status;\r
- VOID *Buffer;\r
- EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;\r
-\r
- Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &VariablePpi);\r
- ASSERT_EFI_ERROR (Status);\r
+ PEI_PCD_DATABASE *PeiPcdDb;\r
\r
- Size = 0;\r
+ ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
\r
- Status = VariablePpi->PeiGetVariable (\r
- GetPeiServicesTablePointer (),\r
- VariableName,\r
- VariableGuid,\r
- NULL,\r
- &Size,\r
- NULL\r
- );\r
- ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+ ASSERT (GetSize == PeiPcdGetSize (TokenNumber) || GetSize == 0);\r
\r
- Status = PeiCoreAllocatePool (Size, &Buffer);\r
- ASSERT_EFI_ERROR (Status);\r
+ PeiPcdDb = GetPcdDatabase ();\r
+ \r
+ return GetWorkerByLocalTokenNumber (PeiPcdDb, PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber], GetSize);\r
+}\r
\r
- // declare a local for STP.\r
- //\r
- Status = VariablePpi->PeiGetVariable (\r
- GetPeiServicesTablePointer (),\r
- (UINT16 *) VariableName,\r
- VariableGuid,\r
- NULL,\r
- &Size,\r
- Buffer\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
\r
- *VariableSize = Size;\r
- *VariableData = Buffer;\r
+VOID\r
+GetExPcdTokenAttributes (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINT32 ExTokenNumber,\r
+ OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr\r
+ )\r
+{\r
+ UINT32 i;\r
+ DYNAMICEX_MAPPING *ExMap;\r
+ EFI_GUID *GuidTable;\r
+ PEI_PCD_DATABASE *PeiPcdDb;\r
\r
- return EFI_SUCCESS;\r
+ PeiPcdDb = GetPcdDatabase();\r
+ \r
+ ExMap = PeiPcdDb->Init.ExMapTable;\r
+ GuidTable = PeiPcdDb->Init.GuidTable;\r
+ \r
+ for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+ if ((ExTokenNumber == ExMap[i].ExTokenNumber) && \r
+ CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])) {\r
+ ExAttr->TokenNumber = i + PEI_NEX_TOKEN_NUMBER;\r
+ ExAttr->Size = PeiPcdDb->Init.SizeTable[i + PEI_NEX_TOKEN_NUMBER];\r
+ ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
+ }\r
+ }\r
+ \r
+ ASSERT (FALSE);\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
- @param[in] VariableGuid The Variable GUID.\r
- @param[in] VariableName The Variable Name.\r
- @param[in] Data The input data.\r
- @param[out] VariableSize The size of the variable.\r
- @param[in] Offset The offset of the variable data that a PCD entry will starts from.\r
-\r
- @retval EFI_SUCCESS Operation successful.\r
- @retval EFI_SUCCESS Variablel not found.\r
---*/\r
-EFI_STATUS\r
-SetHiiVariable (\r
- IN EFI_GUID *VariableGuid,\r
- IN UINT16 *VariableName,\r
- IN CONST VOID *Data,\r
- IN UINTN VariableSize,\r
- IN UINTN Offset\r
+PEI_PCD_DATABASE *\r
+GetPcdDatabase (\r
+ VOID\r
)\r
{\r
- ASSERT (FALSE);\r
- return EFI_INVALID_PARAMETER;\r
-}\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
\r
+ GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+ ASSERT (GuidHob != NULL);\r
+ \r
+ return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+}\r
\r
#ifndef _SERVICE_H\r
#define _SERVICE_H\r
\r
+#define USE_AUTOGEN\r
+\r
+#ifndef USE_AUTOGEN\r
+//\r
+// The following definition will be generated by build tool \r
//\r
-// Offset of StateByte\r
+\r
//\r
-#define PCD_STATEBYTE_HIIENABLE 0x01\r
-#define PCD_STATEBYTE_SKUENABLE 0x02\r
-#define PCD_STATEBYTE_VPDENABLE 0x04\r
-#define PCD_STATEBYTE_SKUDATAARRAYENABLE 0x08\r
-#define PCD_STATEBYTE_DATUMTYPE 0x70\r
-#define PCD_STATEBYTE_EXTENDEDGUIDPRESENT 0x80\r
+// Common definitions that is shared by PEI and DXE PCD database\r
+//\r
+#define PCD_TYPE_SHIFT 24\r
+\r
+\r
+#define PCD_TYPE_DATA (0x00 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_HII (0x80 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_VPD (0x40 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_SKU_ENABLED (0x20 << PCD_TYPE_SHIFT)\r
+\r
+\r
+#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED))\r
+\r
+typedef struct {\r
+ UINT32 ExTokenNumber;\r
+ UINT32 LocalTokenNumber; // PCD Number of this particular platform build\r
+ UINT16 ExGuidIndex; // Index of GuidTable\r
+} DYNAMICEX_MAPPING;\r
+\r
+\r
+typedef struct {\r
+ UINT32 SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler\r
+ UINT32 SkuIdTableOffset; //Offset from the PCD_DB\r
+} SKU_HEAD;\r
+\r
+\r
+typedef struct {\r
+ UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.\r
+ UINT16 StringIndex; // Offset in String Table in units of UINT16.\r
+ UINT16 Offset; // Offset in Variable\r
+} VARIABLE_HEAD ;\r
+\r
+\r
+typedef struct {\r
+ UINT32 Offset;\r
+} VPD_HEAD;\r
+\r
+typedef struct {\r
+ UINT32 LocalTokenNumber;\r
+ UINT16 TokenNumber;\r
+ UINT16 Size;\r
+} SIZEINFO;\r
+\r
+#define offsetof(s,m) (UINT32)&(((s *)0)->m)\r
\r
-#define PCD_DATUMTYPE_OFFSET 4\r
\r
+\r
+\r
+\r
+//\r
+// C Structure generate for PEI PCD Database\r
//\r
-// The definitions for interpreting DatumType\r
+#define PEI_EXMAPPING_TABLE_SIZE 1\r
+#define PEI_GUID_TABLE_SIZE 1\r
+#define PEI_LOCAL_TOKEN_NUMBER 1\r
+#define PEI_STRING_TABLE_SIZE 2\r
+#define PEI_SKUID_TABLE_SIZE 3\r
+\r
+\r
+#define PEI_DATABASE_EMPTRY FALSE\r
+#define PEI_EXMAP_TABLE_EMPTY FALSE\r
+#define PEI_GUID_TABLE_EMPTY FALSE\r
+#define PEI_STRINGTABLE_EMPTY FALSE\r
+#define PEI_SIZETABLE_EMPTY FALSE\r
+#define PEI_SKUID_TABLE_EMPTY FALSE\r
+\r
+\r
+typedef struct {\r
+\r
+ DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_TABLE_SIZE];\r
+ EFI_GUID GuidTable[PEI_GUID_TABLE_SIZE];\r
+\r
+ UINT32 LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER];\r
+\r
+\r
+ UINT16 StringTable[PEI_STRING_TABLE_SIZE];\r
+ UINT16 SizeTable[PEI_LOCAL_TOKEN_NUMBER];\r
+\r
+ UINT8 SkuIdTable[PEI_SKUID_TABLE_SIZE];\r
+ \r
+ SKU_ID SystemSkuId;\r
+\r
+} PEI_PCD_DATABASE_INIT;\r
+\r
+typedef struct {\r
+ UINT8 Dummy;\r
+} PEI_PCD_DATABASE_UNINIT;\r
+\r
+#define PEI_PCD_DB_INIT_VALUE \\r
+ /* ExMapTable */ \\r
+ { \\r
+ { /* ExTokenNumber */ 0x00000001, /* LocalTokenNumberIndex */ 0, /* ExGuidIndex */ 0} \\r
+ }, \\r
+ \\r
+ /* GuidTable */ \\r
+ { \\r
+ { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD }} \\r
+ }, \\r
+ \\r
+ /* LocalTokenNumberTable */ \\r
+ { \\r
+ 0 \\r
+ }, \\r
+ \\r
+ /* StringTable */ \\r
+ { \\r
+ L"\0" \\r
+ }, \\r
+ \\r
+ /* SizeTable */ \\r
+ { \\r
+ 4 \\r
+ }, \\r
+ \\r
+ /* SkuIdTable */ \\r
+ { \\r
+ /*MaxSku*/ 2, /*SkuId*/ 100, /*SkuId*/200 \\r
+ },\\r
+ \\r
+ /* SystemSkuId */ \\r
+ 0 \\r
+\r
+\r
//\r
-#define PCD_BYTE8 (0x00 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BYTE16 (0x01 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BYTE32 (0x02 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BYTE64 (0x03 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_POINTER (0x04 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BOOLEAN (0x05 << PCD_DATUMTYPE_OFFSET)\r
+// End of Autogen Code\r
+//\r
+#endif\r
\r
-extern GUID gEfiPcdImageHobGuid;\r
+/*\r
+typedef struct {\r
+ PEI_PCD_DATABASE_INIT Init;\r
+ PEI_PCD_DATABASE_UNINIT Uninit;\r
+} PEI_PCD_DATABASE;\r
+*/\r
\r
/* Internal Function definitions */\r
\r
-VOID\r
-PeiGetPcdEntryWorker (\r
- IN UINTN Token,\r
- IN CONST GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- OUT VOID *Data\r
- );\r
+PEI_PCD_DATABASE *\r
+GetPcdDatabase (\r
+ VOID\r
+ )\r
+;\r
\r
EFI_STATUS\r
-PeiSetPcdEntryWorker (\r
- IN UINTN Token,\r
- IN CONST GUID *Guid, OPTIONAL\r
- IN PCD_DATA_TYPE Type,\r
- IN VOID *Data\r
- );\r
+SetWorker (\r
+ IN UINTN TokenNumber,\r
+ IN VOID *Data,\r
+ IN UINTN Size,\r
+ IN BOOLEAN PtrType\r
+ )\r
+;\r
\r
-UINTN\r
-PeiGetPcdEntrySizeWorker (\r
- IN UINTN Token,\r
- IN CONST GUID *Guid OPTIONAL\r
- );\r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+ UINT32 LocalTokenNumber,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
+ )\r
+;\r
+\r
+EFI_STATUS\r
+ExSetWorker (\r
+ IN UINT32 ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ VOID *Data,\r
+ UINTN Size,\r
+ BOOLEAN PtrType\r
+ )\r
+;\r
+\r
+VOID *\r
+GetWorker (\r
+ UINTN TokenNumber,\r
+ UINTN GetSize\r
+ )\r
+;\r
+\r
+VOID *\r
+ExGetWorker (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINT32 ExTokenNumber,\r
+ IN UINTN GetSize\r
+ )\r
+;\r
+\r
+typedef struct {\r
+ UINTN TokenNumber;\r
+ UINTN Size;\r
+ UINT32 LocalTokenNumberAlias;\r
+} EX_PCD_ENTRY_ATTRIBUTE;\r
+\r
+VOID\r
+GetExPcdTokenAttributes (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINT32 ExTokenNumber,\r
+ OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr\r
+ )\r
+;\r
\r
EFI_STATUS\r
PeiRegisterCallBackWorker (\r
IN BOOLEAN Register\r
);\r
\r
-EFI_STATUS\r
-PeiSetSku (\r
- UINTN Id\r
-);\r
-\r
-EFI_STATUS\r
-PeiGetNextTokenWorker (\r
- IN OUT UINTN *Token,\r
- IN CONST GUID *Guid OPTIONAL\r
- );\r
-\r
-UINT8 *\r
-LocatePcdImage (\r
- VOID\r
-);\r
-\r
VOID\r
BuildPcdDatabase (\r
- UINT8 *PcdImageOnFlash\r
+ VOID\r
)\r
;\r
\r
IN OUT UINTN *TokenNumber\r
)\r
;\r
+\r
+extern EFI_GUID gPcdDataBaseHobGuid;\r
+\r
+extern EFI_GUID gPcdPeiCallbackFnTableHobGuid;\r
+\r
+extern PEI_PCD_DATABASE_INIT gPEIPcdDbInit;\r
+\r
#endif\r
VOID\r
)\r
{\r
- PCD_TOKEN_NUMBER tn;\r
- UINTN Size;\r
- VOID * Ptr;\r
- UINT32 Uint32;\r
- UINT32 Uint32a;\r
- UINT64 Uint64;\r
- UINT64 Uint64a;\r
- INTN i;\r
-\r
- tn = 0x00001000;\r
-\r
- Size = LibPcdGetSize (tn);\r
- Ptr = LibPcdGetPtr (tn); /* a:RW;2880;512!e:RW;262144;512 */\r
- \r
- tn = 0x00001001;\r
- Size = LibPcdGetSize (tn); /* FW;40960;512 */\r
- \r
- tn = 0x00001002;\r
- Size = LibPcdGetSize (tn); /* FW;40960;512 */\r
- Ptr = LibPcdGetPtr (tn);\r
- \r
- LibPcdSetSku (0x0a);\r
- tn = 0x2233;\r
- Uint64 = LibPcdGet64 (tn);\r
- \r
- LibPcdSetSku (0x0b);\r
- Uint64 = LibPcdGet64 (tn);\r
- \r
- LibPcdSetSku (0x0c);\r
- Uint64a = LibPcdGet64 (tn);\r
- \r
- LibPcdSetSku (0);\r
- tn = 0x2233;\r
- Uint64 = LibPcdGet64 (tn);\r
- \r
- \r
- tn = 0xfaceface;\r
- Size = LibPcdGetExSize (&Guid1, tn);\r
- Uint32 = LibPcdGetEx32 (&Guid1, tn);\r
- \r
- LibPcdCallBackOnSet (&Guid1, tn, OnsetCallback1);\r
- \r
- LibPcdCancelCallBackOnSet (&Guid1, tn, OnsetCallback1);\r
- \r
- for (i = 0; i < 2; i++) {\r
- Uint32a = LibPcdSetEx32 (&Guid1, tn, Uint32 + i);\r
- DebugPrint (0x80000000, "%x\n", Uint32a);\r
- }\r
- \r
- \r
- \r
- Uint32 = LibPcdGet32 (tn);\r
+ UINT8 u8;\r
+ UINT16 u16;\r
+ UINT32 u32;\r
+ UINT64 u64;\r
\r
+ u32 = 0xafafafaf;\r
+ PcdSet32(PcdTestDynamicUint32, u32);\r
+\r
+ u64 = 0xafafafaf00000000;\r
+ PcdSet64(PcdTestDynamicUint64, u64);\r
+\r
+ u8 = PcdGet8(PcdTestDynamicUint8);\r
+ u16 = PcdGet16(PcdTestDynamicUint16);\r
+\r
+\r
+ ASSERT (u8 == 0x01);\r
+ ASSERT (u16 == 0x1234);\r
+ ASSERT (u64 == PcdGet64(PcdTestDynamicUint64));\r
+ ASSERT (u32 == PcdGet32(PcdTestDynamicUint32));\r
\r
return;\r
}\r