]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Service.c
1) remove some dead code from WinNtBusDriver.c
[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
58f1099f 49\r
50 //\r
51 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
52 // We have to decrement TokenNumber by 1 to make it usable\r
53 // as the array index.\r
54 //\r
55 TokenNumber--;\r
00b7af13 56 ASSERT (TokenNumber < PEI_NEX_TOKEN_NUMBER);\r
52e1905d 57 } else {\r
9d6d8b24 58 TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
58f1099f 59\r
60 //\r
61 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
62 // We have to decrement TokenNumber by 1 to make it usable\r
63 // as the array index.\r
64 //\r
65 TokenNumber--;\r
9d6d8b24 66 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
52e1905d 67 }\r
878ddf1f 68\r
58f1099f 69\r
9d6d8b24 70 LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
71\r
52e1905d 72 ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
73 ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
878ddf1f 74\r
52e1905d 75 GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
878ddf1f 76 ASSERT (GuidHob != NULL);\r
52e1905d 77 \r
78 CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
0653eb89 79 CallbackTable = CallbackTable + (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
878ddf1f 80\r
52e1905d 81 Compare = Register? NULL: CallBackFunction;\r
82 Assign = Register? CallBackFunction: NULL;\r
878ddf1f 83\r
0653eb89 84\r
52e1905d 85 for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
86 if (CallbackTable[Idx] == Compare) {\r
87 CallbackTable[Idx] = Assign;\r
88 return EFI_SUCCESS;\r
89 }\r
90 }\r
878ddf1f 91\r
52e1905d 92 return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
878ddf1f 93\r
878ddf1f 94}\r
95\r
96\r
878ddf1f 97\r
878ddf1f 98\r
52e1905d 99/**\r
100 The function builds the PCD database based on the\r
101 PCD_IMAGE on the flash.\r
878ddf1f 102\r
52e1905d 103 @param[in] PcdImageOnFlash The PCD image on flash.\r
878ddf1f 104\r
52e1905d 105 @retval VOID\r
878ddf1f 106--*/\r
52e1905d 107VOID\r
108BuildPcdDatabase (\r
109 VOID\r
878ddf1f 110 )\r
111{\r
52e1905d 112 PEI_PCD_DATABASE *Database;\r
113 VOID *CallbackFnTable;\r
114 UINTN SizeOfCallbackFnTable;\r
115 \r
116 Database = BuildGuidHob (&gPcdDataBaseHobGuid, sizeof (PEI_PCD_DATABASE));\r
878ddf1f 117\r
52e1905d 118 ZeroMem (Database, sizeof (PEI_PCD_DATABASE));\r
878ddf1f 119\r
120 //\r
52e1905d 121 // gPEIPcdDbInit is smaller than PEI_PCD_DATABASE\r
878ddf1f 122 //\r
878ddf1f 123 \r
52e1905d 124 CopyMem (&Database->Init, &gPEIPcdDbInit, sizeof (gPEIPcdDbInit));\r
878ddf1f 125\r
52e1905d 126 SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
878ddf1f 127\r
52e1905d 128 CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
129 \r
130 ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
131 \r
132 return;\r
878ddf1f 133}\r
134\r
135\r
136\r
137/**\r
52e1905d 138 The function is provided by PCD PEIM and PCD DXE driver to\r
139 do the work of reading a HII variable from variable service.\r
878ddf1f 140\r
52e1905d 141 @param[in] VariableGuid The Variable GUID.\r
142 @param[in] VariableName The Variable Name.\r
143 @param[out] VariableData The output data.\r
144 @param[out] VariableSize The size of the variable.\r
878ddf1f 145\r
52e1905d 146 @retval EFI_SUCCESS Operation successful.\r
147 @retval EFI_SUCCESS Variablel not found.\r
878ddf1f 148--*/\r
149EFI_STATUS\r
52e1905d 150GetHiiVariable (\r
151 IN CONST EFI_GUID *VariableGuid,\r
152 IN UINT16 *VariableName,\r
153 OUT VOID **VariableData,\r
154 OUT UINTN *VariableSize\r
878ddf1f 155 )\r
156{\r
52e1905d 157 UINTN Size;\r
158 EFI_STATUS Status;\r
159 VOID *Buffer;\r
160 EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;\r
878ddf1f 161\r
84a99d48 162 Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, (VOID **) &VariablePpi);\r
52e1905d 163 ASSERT_EFI_ERROR (Status);\r
878ddf1f 164\r
52e1905d 165 Size = 0;\r
52e1905d 166 Status = VariablePpi->PeiGetVariable (\r
167 GetPeiServicesTablePointer (),\r
168 VariableName,\r
169 (EFI_GUID *) VariableGuid,\r
170 NULL,\r
171 &Size,\r
172 NULL\r
173 );\r
c0e96fed 174 if (Status == EFI_BUFFER_TOO_SMALL) {\r
52e1905d 175\r
52e1905d 176\r
c0e96fed 177 Status = PeiServicesAllocatePool (Size, &Buffer);\r
178 ASSERT_EFI_ERROR (Status);\r
52e1905d 179\r
c0e96fed 180 Status = VariablePpi->PeiGetVariable (\r
181 GetPeiServicesTablePointer (),\r
182 (UINT16 *) VariableName,\r
183 (EFI_GUID *) VariableGuid,\r
184 NULL,\r
185 &Size,\r
186 Buffer\r
187 );\r
188 ASSERT_EFI_ERROR (Status);\r
189\r
190 *VariableSize = Size;\r
191 *VariableData = Buffer;\r
192\r
193 return EFI_SUCCESS;\r
194 } else {\r
195 return EFI_NOT_FOUND;\r
196 }\r
878ddf1f 197\r
878ddf1f 198}\r
199\r
200\r
52e1905d 201UINT32\r
202GetSkuEnabledTokenNumber (\r
203 UINT32 LocalTokenNumber,\r
204 UINTN Size\r
205 ) \r
878ddf1f 206{\r
52e1905d 207 PEI_PCD_DATABASE *PeiPcdDb;\r
208 SKU_HEAD *SkuHead;\r
209 SKU_ID *SkuIdTable;\r
210 INTN i;\r
211 UINT8 *Value;\r
212\r
213 PeiPcdDb = GetPcdDatabase ();\r
214\r
215 ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
216\r
217 SkuHead = (SKU_HEAD *) ((UINT8 *)PeiPcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
218 Value = (UINT8 *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuDataStartOffset));\r
219 SkuIdTable = (SKU_ID *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuIdTableOffset));\r
220 \r
221 for (i = 0; i < SkuIdTable[0]; i++) {\r
222 if (PeiPcdDb->Init.SystemSkuId == SkuIdTable[i + 1]) {\r
223 break;\r
224 }\r
225 }\r
878ddf1f 226\r
52e1905d 227 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
228 case PCD_TYPE_VPD:\r
229 Value += sizeof(VPD_HEAD) * i;\r
230 return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
231\r
232 case PCD_TYPE_HII:\r
233 Value += sizeof(VARIABLE_HEAD) * i;\r
234 return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
235 \r
00b7af13 236 case PCD_TYPE_DATA:\r
52e1905d 237 Value += Size * i;\r
238 return (Value - (UINT8 *) PeiPcdDb);\r
239 \r
240 default:\r
241 ASSERT (FALSE);\r
242 }\r
878ddf1f 243\r
52e1905d 244 ASSERT (FALSE);\r
878ddf1f 245\r
52e1905d 246 return 0;\r
247 \r
878ddf1f 248}\r
249\r
250\r
251\r
878ddf1f 252\r
52e1905d 253VOID\r
254InvokeCallbackOnSet (\r
255 UINT32 ExTokenNumber,\r
256 CONST EFI_GUID *Guid, OPTIONAL\r
257 UINTN TokenNumber,\r
258 VOID *Data,\r
259 UINTN Size\r
260 )\r
878ddf1f 261{\r
878ddf1f 262 EFI_HOB_GUID_TYPE *GuidHob;\r
878ddf1f 263 PCD_PPI_CALLBACK *CallbackTable;\r
52e1905d 264 UINTN Idx;\r
878ddf1f 265\r
58f1099f 266 //\r
267 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
268 // We have to decrement TokenNumber by 1 to make it usable\r
269 // as the array index.\r
270 //\r
271 TokenNumber--;\r
272 \r
52e1905d 273 if (Guid == NULL)\r
274 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
275\r
276 GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
878ddf1f 277 ASSERT (GuidHob != NULL);\r
278 \r
52e1905d 279 CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
878ddf1f 280\r
52e1905d 281 CallbackTable += (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
878ddf1f 282\r
52e1905d 283 for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
284 if (CallbackTable[Idx] != NULL) {\r
285 CallbackTable[Idx] (Guid,\r
286 (Guid == NULL)? TokenNumber: ExTokenNumber,\r
287 Data,\r
288 Size\r
289 );\r
878ddf1f 290 }\r
291 }\r
52e1905d 292 \r
878ddf1f 293}\r
294\r
9d6d8b24 295\r
296\r
297\r
878ddf1f 298EFI_STATUS\r
52e1905d 299SetWorker (\r
8a43e8dd 300 UINTN TokenNumber,\r
9d6d8b24 301 VOID *Data,\r
302 UINTN Size,\r
303 BOOLEAN PtrType\r
878ddf1f 304 )\r
305{\r
52e1905d 306 UINT32 LocalTokenNumber;\r
307 PEI_PCD_DATABASE *PeiPcdDb;\r
9d6d8b24 308 UINT16 StringTableIdx;\r
309 UINTN Offset;\r
310 VOID *InternalData;\r
878ddf1f 311\r
58f1099f 312 //\r
313 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
314 // We have to decrement TokenNumber by 1 to make it usable\r
315 // as the array index.\r
316 //\r
317 TokenNumber--;\r
318\r
52e1905d 319 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
320 \r
321 PeiPcdDb = GetPcdDatabase ();\r
878ddf1f 322\r
52e1905d 323 LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
878ddf1f 324\r
52e1905d 325 if (PtrType) {\r
326 ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] >= Size);\r
327 } else {\r
328 ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] == Size);\r
329 }\r
878ddf1f 330\r
9d6d8b24 331 //\r
332 // We only invoke the callback function for Dynamic Type PCD Entry.\r
333 // For Dynamic EX PCD entry, we have invoked the callback function for Dynamic EX\r
334 // type PCD entry in ExSetWorker.\r
335 //\r
336 if (TokenNumber < PEI_NEX_TOKEN_NUMBER) {\r
58f1099f 337 InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size);\r
9d6d8b24 338 }\r
878ddf1f 339\r
52e1905d 340 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
341 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
342 }\r
878ddf1f 343\r
52e1905d 344 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
9d6d8b24 345 InternalData = (VOID *) ((UINT8 *) PeiPcdDb + Offset);\r
878ddf1f 346 \r
52e1905d 347 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
348 case PCD_TYPE_VPD:\r
349 case PCD_TYPE_HII:\r
350 {\r
351 ASSERT (FALSE);\r
352 return EFI_INVALID_PARAMETER;\r
353 }\r
878ddf1f 354\r
52e1905d 355 case PCD_TYPE_STRING:\r
356 StringTableIdx = *((UINT16 *)InternalData);\r
357 CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, Size);\r
7c3e99c3 358 return EFI_SUCCESS;\r
878ddf1f 359\r
52e1905d 360 case PCD_TYPE_DATA:\r
361 {\r
362 \r
363 if (PtrType) {\r
364 CopyMem (InternalData, Data, Size);\r
365 return EFI_SUCCESS;\r
366 }\r
878ddf1f 367\r
52e1905d 368 switch (Size) {\r
369 case sizeof(UINT8):\r
370 *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
371 return EFI_SUCCESS;\r
878ddf1f 372\r
52e1905d 373 case sizeof(UINT16):\r
374 *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
375 return EFI_SUCCESS;\r
878ddf1f 376\r
52e1905d 377 case sizeof(UINT32):\r
378 *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
379 return EFI_SUCCESS;\r
878ddf1f 380\r
52e1905d 381 case sizeof(UINT64):\r
382 *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
383 return EFI_SUCCESS;\r
878ddf1f 384\r
52e1905d 385 default:\r
386 ASSERT (FALSE);\r
387 return EFI_NOT_FOUND;\r
388 }\r
389 }\r
390 \r
878ddf1f 391 }\r
392\r
52e1905d 393 ASSERT (FALSE);\r
394 return EFI_NOT_FOUND;\r
9d6d8b24 395\r
396}\r
397\r
398\r
399\r
400\r
401EFI_STATUS\r
402ExSetWorker (\r
8a43e8dd 403 IN UINTN ExTokenNumber,\r
9d6d8b24 404 IN CONST EFI_GUID *Guid,\r
405 VOID *Data,\r
406 UINTN Size,\r
407 BOOLEAN PtrType\r
408 )\r
409{\r
8a43e8dd 410 UINTN TokenNumber;\r
9d6d8b24 411\r
412 TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
413\r
414 InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, Size);\r
415\r
416 SetWorker (TokenNumber, Data, Size, PtrType);\r
417\r
418 return EFI_SUCCESS;\r
419 \r
420}\r
421\r
422\r
423\r
424\r
425VOID *\r
426ExGetWorker (\r
427 IN CONST EFI_GUID *Guid,\r
8a43e8dd 428 IN UINTN ExTokenNumber,\r
9d6d8b24 429 IN UINTN GetSize\r
430 )\r
431{\r
432 return GetWorker (GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize);\r
878ddf1f 433}\r
434\r
435\r
9d6d8b24 436\r
437\r
52e1905d 438VOID *\r
9d6d8b24 439GetWorker (\r
8a43e8dd 440 UINTN TokenNumber,\r
9d6d8b24 441 UINTN GetSize\r
878ddf1f 442 )\r
443{\r
52e1905d 444 UINT32 Offset;\r
445 EFI_GUID *Guid;\r
446 UINT16 *Name;\r
447 VARIABLE_HEAD *VariableHead;\r
448 EFI_STATUS Status;\r
449 UINTN DataSize;\r
450 VOID *Data;\r
451 UINT16 *StringTable;\r
452 UINT16 StringTableIdx;\r
9d6d8b24 453 PEI_PCD_DATABASE *PeiPcdDb;\r
454 UINT32 LocalTokenNumber;\r
455 UINTN Size;\r
456\r
58f1099f 457 //\r
458 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
459 // We have to decrement TokenNumber by 1 to make it usable\r
460 // as the array index.\r
461 //\r
462 TokenNumber--;\r
463\r
9d6d8b24 464 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
465\r
58f1099f 466 Size = PeiPcdGetSize(TokenNumber + 1);\r
9d6d8b24 467 \r
468 ASSERT (GetSize == Size || GetSize == 0);\r
469\r
52e1905d 470 PeiPcdDb = GetPcdDatabase ();\r
471\r
9d6d8b24 472 LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
473\r
52e1905d 474 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
475 LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
476 }\r
878ddf1f 477\r
52e1905d 478 Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
479 StringTable = PeiPcdDb->Init.StringTable;\r
480 \r
481 switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
482 case PCD_TYPE_VPD:\r
483 {\r
484 VPD_HEAD *VpdHead;\r
485 VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
486 return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
487 }\r
488 \r
489 case PCD_TYPE_HII:\r
490 {\r
491 VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
492 \r
493 Guid = &(PeiPcdDb->Init.GuidTable[VariableHead->GuidTableIndex]);\r
494 Name = &StringTable[VariableHead->StringIndex];\r
495\r
496 Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
52e1905d 497\r
c0e96fed 498 if (Status == EFI_SUCCESS) {\r
499 ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
500 return (VOID *) ((UINT8 *) Data + VariableHead->Offset);\r
501 } else {\r
502 //\r
58f1099f 503 // Return the default value specified by Platform Integrator \r
504 //\r
505 return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset);\r
c0e96fed 506 }\r
52e1905d 507 }\r
878ddf1f 508\r
52e1905d 509 case PCD_TYPE_DATA:\r
510 return (VOID *) ((UINT8 *)PeiPcdDb + Offset);\r
878ddf1f 511\r
52e1905d 512 case PCD_TYPE_STRING:\r
513 StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
514 return (VOID *) (&StringTable[StringTableIdx]);\r
878ddf1f 515\r
52e1905d 516 default:\r
517 ASSERT (FALSE);\r
518 break;\r
519 \r
520 }\r
878ddf1f 521\r
52e1905d 522 ASSERT (FALSE);\r
523 \r
524 return NULL;\r
525 \r
526}\r
878ddf1f 527\r
878ddf1f 528\r
8a43e8dd 529UINTN \r
9d6d8b24 530GetExPcdTokenNumber (\r
52e1905d 531 IN CONST EFI_GUID *Guid,\r
9d6d8b24 532 IN UINT32 ExTokenNumber\r
52e1905d 533 )\r
534{\r
535 UINT32 i;\r
536 DYNAMICEX_MAPPING *ExMap;\r
537 EFI_GUID *GuidTable;\r
9d6d8b24 538 EFI_GUID *MatchGuid;\r
539 UINTN MatchGuidIdx;\r
52e1905d 540 PEI_PCD_DATABASE *PeiPcdDb;\r
878ddf1f 541\r
52e1905d 542 PeiPcdDb = GetPcdDatabase();\r
543 \r
544 ExMap = PeiPcdDb->Init.ExMapTable;\r
545 GuidTable = PeiPcdDb->Init.GuidTable;\r
9d6d8b24 546\r
547 MatchGuid = ScanGuid (GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
548 ASSERT (MatchGuid != NULL);\r
549 \r
550 MatchGuidIdx = MatchGuid - GuidTable;\r
52e1905d 551 \r
552 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
553 if ((ExTokenNumber == ExMap[i].ExTokenNumber) && \r
9d6d8b24 554 (MatchGuidIdx == ExMap[i].ExGuidIndex)) {\r
555 return ExMap[i].LocalTokenNumber;\r
52e1905d 556 }\r
557 }\r
558 \r
559 ASSERT (FALSE);\r
560 \r
9d6d8b24 561 return 0;\r
878ddf1f 562}\r
563\r
564\r
565\r
52e1905d 566PEI_PCD_DATABASE *\r
567GetPcdDatabase (\r
568 VOID\r
878ddf1f 569 )\r
570{\r
52e1905d 571 EFI_HOB_GUID_TYPE *GuidHob;\r
878ddf1f 572\r
52e1905d 573 GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
574 ASSERT (GuidHob != NULL);\r
575 \r
576 return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
577}\r
878ddf1f 578\r