]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Service.c
should return instead of break.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Service.c
CommitLineData
878ddf1f 1/** @file\r
2Private functions used by PCD PEIM.\r
3\r
4Copyright (c) 2006, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13\r
14Module Name: Service.c\r
15\r
16**/\r
878ddf1f 17#include "Service.h"\r
18\r
19\r
878ddf1f 20/**\r
52e1905d 21 The function registers the CallBackOnSet fucntion\r
22 according to TokenNumber and EFI_GUID space.\r
878ddf1f 23\r
52e1905d 24 @param[in] TokenNumber The token number.\r
25 @param[in] Guid The GUID space.\r
26 @param[in] CallBackFunction The Callback function to be registered.\r
878ddf1f 27\r
52e1905d 28 @retval EFI_SUCCESS If the Callback function is registered.\r
29 @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.\r
878ddf1f 30--*/\r
52e1905d 31EFI_STATUS\r
32PeiRegisterCallBackWorker (\r
8a43e8dd 33 IN UINTN ExTokenNumber,\r
52e1905d 34 IN CONST EFI_GUID *Guid, OPTIONAL\r
35 IN PCD_PPI_CALLBACK CallBackFunction,\r
36 IN BOOLEAN Register\r
878ddf1f 37)\r
38{\r
52e1905d 39 EFI_HOB_GUID_TYPE *GuidHob;\r
40 PCD_PPI_CALLBACK *CallbackTable;\r
41 PCD_PPI_CALLBACK Compare;\r
42 PCD_PPI_CALLBACK Assign;\r
43 UINT32 LocalTokenNumber;\r
8a43e8dd 44 UINTN TokenNumber;\r
52e1905d 45 UINTN Idx;\r
878ddf1f 46\r
52e1905d 47 if (Guid == NULL) {\r
48 TokenNumber = ExTokenNumber;\r
00b7af13 49 ASSERT (TokenNumber < PEI_NEX_TOKEN_NUMBER);\r
52e1905d 50 } else {\r
9d6d8b24 51 TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
52 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
52e1905d 53 }\r
878ddf1f 54\r
9d6d8b24 55 LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
56\r
52e1905d 57 ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
58 ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
878ddf1f 59\r
52e1905d 60 GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
878ddf1f 61 ASSERT (GuidHob != NULL);\r
52e1905d 62 \r
63 CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
0653eb89 64 CallbackTable = CallbackTable + (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
878ddf1f 65\r
52e1905d 66 Compare = Register? NULL: CallBackFunction;\r
67 Assign = Register? CallBackFunction: NULL;\r
878ddf1f 68\r
0653eb89 69\r
52e1905d 70 for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
71 if (CallbackTable[Idx] == Compare) {\r
72 CallbackTable[Idx] = Assign;\r
73 return EFI_SUCCESS;\r
74 }\r
75 }\r
878ddf1f 76\r
52e1905d 77 return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
878ddf1f 78\r
878ddf1f 79}\r
80\r
81\r
878ddf1f 82\r
878ddf1f 83\r
52e1905d 84/**\r
85 The function builds the PCD database based on the\r
86 PCD_IMAGE on the flash.\r
878ddf1f 87\r
52e1905d 88 @param[in] PcdImageOnFlash The PCD image on flash.\r
878ddf1f 89\r
52e1905d 90 @retval VOID\r
878ddf1f 91--*/\r
52e1905d 92VOID\r
93BuildPcdDatabase (\r
94 VOID\r
878ddf1f 95 )\r
96{\r
52e1905d 97 PEI_PCD_DATABASE *Database;\r
98 VOID *CallbackFnTable;\r
99 UINTN SizeOfCallbackFnTable;\r
100 \r
101 Database = BuildGuidHob (&gPcdDataBaseHobGuid, sizeof (PEI_PCD_DATABASE));\r
878ddf1f 102\r
52e1905d 103 ZeroMem (Database, sizeof (PEI_PCD_DATABASE));\r
878ddf1f 104\r
105 //\r
52e1905d 106 // gPEIPcdDbInit is smaller than PEI_PCD_DATABASE\r
878ddf1f 107 //\r
878ddf1f 108 \r
52e1905d 109 CopyMem (&Database->Init, &gPEIPcdDbInit, sizeof (gPEIPcdDbInit));\r
878ddf1f 110\r
52e1905d 111 SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
878ddf1f 112\r
52e1905d 113 CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
114 \r
115 ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
116 \r
117 return;\r
878ddf1f 118}\r
119\r
120\r
121\r
122/**\r
52e1905d 123 The function is provided by PCD PEIM and PCD DXE driver to\r
124 do the work of reading a HII variable from variable service.\r
878ddf1f 125\r
52e1905d 126 @param[in] VariableGuid The Variable GUID.\r
127 @param[in] VariableName The Variable Name.\r
128 @param[out] VariableData The output data.\r
129 @param[out] VariableSize The size of the variable.\r
878ddf1f 130\r
52e1905d 131 @retval EFI_SUCCESS Operation successful.\r
132 @retval EFI_SUCCESS Variablel not found.\r
878ddf1f 133--*/\r
134EFI_STATUS\r
52e1905d 135GetHiiVariable (\r
136 IN CONST EFI_GUID *VariableGuid,\r
137 IN UINT16 *VariableName,\r
138 OUT VOID **VariableData,\r
139 OUT UINTN *VariableSize\r
878ddf1f 140 )\r
141{\r
52e1905d 142 UINTN Size;\r
143 EFI_STATUS Status;\r
144 VOID *Buffer;\r
145 EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;\r
878ddf1f 146\r
84a99d48 147 Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, (VOID **) &VariablePpi);\r
52e1905d 148 ASSERT_EFI_ERROR (Status);\r
878ddf1f 149\r
52e1905d 150 Size = 0;\r
52e1905d 151 Status = VariablePpi->PeiGetVariable (\r
152 GetPeiServicesTablePointer (),\r
153 VariableName,\r
154 (EFI_GUID *) VariableGuid,\r
155 NULL,\r
156 &Size,\r
157 NULL\r
158 );\r
c0e96fed 159 if (Status == EFI_BUFFER_TOO_SMALL) {\r
52e1905d 160\r
52e1905d 161\r
c0e96fed 162 Status = PeiServicesAllocatePool (Size, &Buffer);\r
163 ASSERT_EFI_ERROR (Status);\r
52e1905d 164\r
c0e96fed 165 Status = VariablePpi->PeiGetVariable (\r
166 GetPeiServicesTablePointer (),\r
167 (UINT16 *) VariableName,\r
168 (EFI_GUID *) VariableGuid,\r
169 NULL,\r
170 &Size,\r
171 Buffer\r
172 );\r
173 ASSERT_EFI_ERROR (Status);\r
174\r
175 *VariableSize = Size;\r
176 *VariableData = Buffer;\r
177\r
178 return EFI_SUCCESS;\r
179 } else {\r
180 return EFI_NOT_FOUND;\r
181 }\r
878ddf1f 182\r
878ddf1f 183}\r
184\r
185\r
52e1905d 186UINT32\r
187GetSkuEnabledTokenNumber (\r
188 UINT32 LocalTokenNumber,\r
189 UINTN Size\r
190 ) \r
878ddf1f 191{\r
52e1905d 192 PEI_PCD_DATABASE *PeiPcdDb;\r
193 SKU_HEAD *SkuHead;\r
194 SKU_ID *SkuIdTable;\r
195 INTN i;\r
196 UINT8 *Value;\r
197\r
198 PeiPcdDb = GetPcdDatabase ();\r
199\r
200 ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
201\r
202 SkuHead = (SKU_HEAD *) ((UINT8 *)PeiPcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
203 Value = (UINT8 *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuDataStartOffset));\r
204 SkuIdTable = (SKU_ID *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuIdTableOffset));\r
205 \r
206 for (i = 0; i < SkuIdTable[0]; i++) {\r
207 if (PeiPcdDb->Init.SystemSkuId == SkuIdTable[i + 1]) {\r
208 break;\r
209 }\r
210 }\r
878ddf1f 211\r
52e1905d 212 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
213 case PCD_TYPE_VPD:\r
214 Value += sizeof(VPD_HEAD) * i;\r
215 return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
216\r
217 case PCD_TYPE_HII:\r
218 Value += sizeof(VARIABLE_HEAD) * i;\r
219 return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
220 \r
00b7af13 221 case PCD_TYPE_DATA:\r
52e1905d 222 Value += Size * i;\r
223 return (Value - (UINT8 *) PeiPcdDb);\r
224 \r
225 default:\r
226 ASSERT (FALSE);\r
227 }\r
878ddf1f 228\r
52e1905d 229 ASSERT (FALSE);\r
878ddf1f 230\r
52e1905d 231 return 0;\r
232 \r
878ddf1f 233}\r
234\r
235\r
236\r
878ddf1f 237\r
52e1905d 238VOID\r
239InvokeCallbackOnSet (\r
240 UINT32 ExTokenNumber,\r
241 CONST EFI_GUID *Guid, OPTIONAL\r
242 UINTN TokenNumber,\r
243 VOID *Data,\r
244 UINTN Size\r
245 )\r
878ddf1f 246{\r
878ddf1f 247 EFI_HOB_GUID_TYPE *GuidHob;\r
878ddf1f 248 PCD_PPI_CALLBACK *CallbackTable;\r
52e1905d 249 UINTN Idx;\r
878ddf1f 250\r
52e1905d 251 if (Guid == NULL)\r
252 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
253\r
254 GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
878ddf1f 255 ASSERT (GuidHob != NULL);\r
256 \r
52e1905d 257 CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
878ddf1f 258\r
52e1905d 259 CallbackTable += (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
878ddf1f 260\r
52e1905d 261 for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
262 if (CallbackTable[Idx] != NULL) {\r
263 CallbackTable[Idx] (Guid,\r
264 (Guid == NULL)? TokenNumber: ExTokenNumber,\r
265 Data,\r
266 Size\r
267 );\r
878ddf1f 268 }\r
269 }\r
52e1905d 270 \r
878ddf1f 271}\r
272\r
9d6d8b24 273\r
274\r
275\r
878ddf1f 276EFI_STATUS\r
52e1905d 277SetWorker (\r
8a43e8dd 278 UINTN TokenNumber,\r
9d6d8b24 279 VOID *Data,\r
280 UINTN Size,\r
281 BOOLEAN PtrType\r
878ddf1f 282 )\r
283{\r
52e1905d 284 UINT32 LocalTokenNumber;\r
285 PEI_PCD_DATABASE *PeiPcdDb;\r
9d6d8b24 286 UINT16 StringTableIdx;\r
287 UINTN Offset;\r
288 VOID *InternalData;\r
878ddf1f 289\r
52e1905d 290 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
291 \r
292 PeiPcdDb = GetPcdDatabase ();\r
878ddf1f 293\r
52e1905d 294 LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
878ddf1f 295\r
52e1905d 296 if (PtrType) {\r
297 ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] >= Size);\r
298 } else {\r
299 ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] == Size);\r
300 }\r
878ddf1f 301\r
9d6d8b24 302 //\r
303 // We only invoke the callback function for Dynamic Type PCD Entry.\r
304 // For Dynamic EX PCD entry, we have invoked the callback function for Dynamic EX\r
305 // type PCD entry in ExSetWorker.\r
306 //\r
307 if (TokenNumber < PEI_NEX_TOKEN_NUMBER) {\r
308 InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
309 }\r
878ddf1f 310\r
52e1905d 311 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
312 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
313 }\r
878ddf1f 314\r
52e1905d 315 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
9d6d8b24 316 InternalData = (VOID *) ((UINT8 *) PeiPcdDb + Offset);\r
878ddf1f 317 \r
52e1905d 318 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
319 case PCD_TYPE_VPD:\r
320 case PCD_TYPE_HII:\r
321 {\r
322 ASSERT (FALSE);\r
323 return EFI_INVALID_PARAMETER;\r
324 }\r
878ddf1f 325\r
52e1905d 326 case PCD_TYPE_STRING:\r
327 StringTableIdx = *((UINT16 *)InternalData);\r
328 CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, Size);\r
7c3e99c3 329 return EFI_SUCCESS;\r
878ddf1f 330\r
52e1905d 331 case PCD_TYPE_DATA:\r
332 {\r
333 \r
334 if (PtrType) {\r
335 CopyMem (InternalData, Data, Size);\r
336 return EFI_SUCCESS;\r
337 }\r
878ddf1f 338\r
52e1905d 339 switch (Size) {\r
340 case sizeof(UINT8):\r
341 *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
342 return EFI_SUCCESS;\r
878ddf1f 343\r
52e1905d 344 case sizeof(UINT16):\r
345 *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
346 return EFI_SUCCESS;\r
878ddf1f 347\r
52e1905d 348 case sizeof(UINT32):\r
349 *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
350 return EFI_SUCCESS;\r
878ddf1f 351\r
52e1905d 352 case sizeof(UINT64):\r
353 *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
354 return EFI_SUCCESS;\r
878ddf1f 355\r
52e1905d 356 default:\r
357 ASSERT (FALSE);\r
358 return EFI_NOT_FOUND;\r
359 }\r
360 }\r
361 \r
878ddf1f 362 }\r
363\r
52e1905d 364 ASSERT (FALSE);\r
365 return EFI_NOT_FOUND;\r
9d6d8b24 366\r
367}\r
368\r
369\r
370\r
371\r
372EFI_STATUS\r
373ExSetWorker (\r
8a43e8dd 374 IN UINTN ExTokenNumber,\r
9d6d8b24 375 IN CONST EFI_GUID *Guid,\r
376 VOID *Data,\r
377 UINTN Size,\r
378 BOOLEAN PtrType\r
379 )\r
380{\r
8a43e8dd 381 UINTN TokenNumber;\r
9d6d8b24 382\r
383 TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
384\r
385 InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, Size);\r
386\r
387 SetWorker (TokenNumber, Data, Size, PtrType);\r
388\r
389 return EFI_SUCCESS;\r
390 \r
391}\r
392\r
393\r
394\r
395\r
396VOID *\r
397ExGetWorker (\r
398 IN CONST EFI_GUID *Guid,\r
8a43e8dd 399 IN UINTN ExTokenNumber,\r
9d6d8b24 400 IN UINTN GetSize\r
401 )\r
402{\r
403 return GetWorker (GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize);\r
878ddf1f 404}\r
405\r
406\r
9d6d8b24 407\r
408\r
52e1905d 409VOID *\r
9d6d8b24 410GetWorker (\r
8a43e8dd 411 UINTN TokenNumber,\r
9d6d8b24 412 UINTN GetSize\r
878ddf1f 413 )\r
414{\r
52e1905d 415 UINT32 Offset;\r
416 EFI_GUID *Guid;\r
417 UINT16 *Name;\r
418 VARIABLE_HEAD *VariableHead;\r
419 EFI_STATUS Status;\r
420 UINTN DataSize;\r
421 VOID *Data;\r
422 UINT16 *StringTable;\r
423 UINT16 StringTableIdx;\r
9d6d8b24 424 PEI_PCD_DATABASE *PeiPcdDb;\r
425 UINT32 LocalTokenNumber;\r
426 UINTN Size;\r
427\r
428 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
429\r
430 Size = PeiPcdGetSize(TokenNumber);\r
431 \r
432 ASSERT (GetSize == Size || GetSize == 0);\r
433\r
52e1905d 434 PeiPcdDb = GetPcdDatabase ();\r
435\r
9d6d8b24 436 LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
437\r
52e1905d 438 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
439 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
440 }\r
878ddf1f 441\r
52e1905d 442 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
443 StringTable = PeiPcdDb->Init.StringTable;\r
444 \r
445 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
446 case PCD_TYPE_VPD:\r
447 {\r
448 VPD_HEAD *VpdHead;\r
449 VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
450 return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
451 }\r
452 \r
453 case PCD_TYPE_HII:\r
454 {\r
455 VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
456 \r
457 Guid = &(PeiPcdDb->Init.GuidTable[VariableHead->GuidTableIndex]);\r
458 Name = &StringTable[VariableHead->StringIndex];\r
459\r
460 Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
52e1905d 461\r
c0e96fed 462 if (Status == EFI_SUCCESS) {\r
463 ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
464 return (VOID *) ((UINT8 *) Data + VariableHead->Offset);\r
465 } else {\r
466 //\r
467 // BugBug: Need to support default value. The current implementation\r
468 // will return a memory buffer with ALL ZERO.\r
469 // \r
470 return AllocateZeroPool (Size);\r
471 }\r
52e1905d 472 }\r
878ddf1f 473\r
52e1905d 474 case PCD_TYPE_DATA:\r
475 return (VOID *) ((UINT8 *)PeiPcdDb + Offset);\r
476 break;\r
878ddf1f 477\r
52e1905d 478 case PCD_TYPE_STRING:\r
479 StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
480 return (VOID *) (&StringTable[StringTableIdx]);\r
878ddf1f 481\r
52e1905d 482 default:\r
483 ASSERT (FALSE);\r
484 break;\r
485 \r
486 }\r
878ddf1f 487\r
52e1905d 488 ASSERT (FALSE);\r
489 \r
490 return NULL;\r
491 \r
492}\r
878ddf1f 493\r
878ddf1f 494\r
8a43e8dd 495UINTN \r
9d6d8b24 496GetExPcdTokenNumber (\r
52e1905d 497 IN CONST EFI_GUID *Guid,\r
9d6d8b24 498 IN UINT32 ExTokenNumber\r
52e1905d 499 )\r
500{\r
501 UINT32 i;\r
502 DYNAMICEX_MAPPING *ExMap;\r
503 EFI_GUID *GuidTable;\r
9d6d8b24 504 EFI_GUID *MatchGuid;\r
505 UINTN MatchGuidIdx;\r
52e1905d 506 PEI_PCD_DATABASE *PeiPcdDb;\r
878ddf1f 507\r
52e1905d 508 PeiPcdDb = GetPcdDatabase();\r
509 \r
510 ExMap = PeiPcdDb->Init.ExMapTable;\r
511 GuidTable = PeiPcdDb->Init.GuidTable;\r
9d6d8b24 512\r
513 MatchGuid = ScanGuid (GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
514 ASSERT (MatchGuid != NULL);\r
515 \r
516 MatchGuidIdx = MatchGuid - GuidTable;\r
52e1905d 517 \r
518 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
519 if ((ExTokenNumber == ExMap[i].ExTokenNumber) && \r
9d6d8b24 520 (MatchGuidIdx == ExMap[i].ExGuidIndex)) {\r
521 return ExMap[i].LocalTokenNumber;\r
52e1905d 522 }\r
523 }\r
524 \r
525 ASSERT (FALSE);\r
526 \r
9d6d8b24 527 return 0;\r
878ddf1f 528}\r
529\r
530\r
531\r
52e1905d 532PEI_PCD_DATABASE *\r
533GetPcdDatabase (\r
534 VOID\r
878ddf1f 535 )\r
536{\r
52e1905d 537 EFI_HOB_GUID_TYPE *GuidHob;\r
878ddf1f 538\r
52e1905d 539 GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
540 ASSERT (GuidHob != NULL);\r
541 \r
542 return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
543}\r
878ddf1f 544\r