]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Make EDK Module Package pass Intel IPF compiler with /Ox switch.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
CommitLineData
52e1905d 1/** @file PCD PEIM\r
878ddf1f 2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12\r
13Module Name: Pcd.c\r
14\r
15**/\r
16\r
878ddf1f 17#include "Service.h"\r
18\r
19\r
20PCD_PPI mPcdPpiInstance = {\r
21 PeiPcdSetSku,\r
22\r
23 PeiPcdGet8,\r
24 PeiPcdGet16, \r
25 PeiPcdGet32, \r
26 PeiPcdGet64, \r
27 PeiPcdGetPtr, \r
28 PeiPcdGetBool, \r
29 PeiPcdGetSize,\r
30\r
31 PeiPcdGet8Ex,\r
32 PeiPcdGet16Ex, \r
33 PeiPcdGet32Ex, \r
34 PeiPcdGet64Ex, \r
35 PeiPcdGetPtrEx, \r
36 PeiPcdGetBoolEx, \r
37 PeiPcdGetSizeEx,\r
38 \r
39 PeiPcdSet8,\r
40 PeiPcdSet16, \r
41 PeiPcdSet32, \r
42 PeiPcdSet64, \r
43 PeiPcdSetPtr, \r
44 PeiPcdSetBool, \r
45\r
46 PeiPcdSet8Ex,\r
47 PeiPcdSet16Ex, \r
48 PeiPcdSet32Ex, \r
49 PeiPcdSet64Ex, \r
50 PeiPcdSetPtrEx, \r
51 PeiPcdSetBoolEx,\r
52\r
4c114006 53 PeiRegisterCallBackOnSet,\r
878ddf1f 54 PcdUnRegisterCallBackOnSet,\r
4276d5da 55 PeiPcdGetNextToken,\r
56 PeiPcdGetNextTokenSpace\r
878ddf1f 57};\r
58\r
59\r
60\r
61STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {\r
62 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
63 &gPcdPpiGuid,\r
64 &mPcdPpiInstance\r
65};\r
66\r
67\r
68\r
69EFI_STATUS\r
70EFIAPI\r
71PcdPeimInit (\r
72 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
73 IN EFI_PEI_SERVICES **PeiServices\r
74 )\r
75{\r
76 EFI_STATUS Status;\r
878ddf1f 77\r
52e1905d 78 BuildPcdDatabase ();\r
79 \r
84a99d48 80 Status = PeiServicesInstallPpi (&mPpiPCD);\r
878ddf1f 81\r
82 ASSERT_EFI_ERROR (Status);\r
83 \r
84 return EFI_SUCCESS;\r
85}\r
86\r
00b7af13 87VOID\r
878ddf1f 88EFIAPI\r
89PeiPcdSetSku (\r
8a43e8dd 90 IN UINTN SkuId\r
878ddf1f 91 )\r
92{\r
878ddf1f 93\r
8a43e8dd 94 GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
878ddf1f 95\r
00b7af13 96 return;\r
878ddf1f 97}\r
98\r
99\r
100\r
101UINT8\r
102EFIAPI\r
103PeiPcdGet8 (\r
5f5f28c9 104 IN UINTN TokenNumber\r
878ddf1f 105 )\r
106{\r
52e1905d 107 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
878ddf1f 108}\r
109\r
110\r
111\r
112UINT16\r
113EFIAPI\r
114PeiPcdGet16 (\r
5f5f28c9 115 IN UINTN TokenNumber\r
878ddf1f 116 )\r
117{\r
52e1905d 118 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
878ddf1f 119}\r
120\r
121\r
122\r
123UINT32\r
124EFIAPI\r
125PeiPcdGet32 (\r
5f5f28c9 126 IN UINTN TokenNumber\r
878ddf1f 127 )\r
128{\r
52e1905d 129 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
878ddf1f 130}\r
131\r
132\r
133\r
134UINT64\r
135EFIAPI\r
136PeiPcdGet64 (\r
5f5f28c9 137 IN UINTN TokenNumber\r
878ddf1f 138 )\r
139{\r
52e1905d 140 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
878ddf1f 141}\r
142\r
143\r
144\r
145VOID *\r
146EFIAPI\r
147PeiPcdGetPtr (\r
5f5f28c9 148 IN UINTN TokenNumber\r
878ddf1f 149 )\r
150{\r
52e1905d 151 return GetWorker (TokenNumber, 0);\r
878ddf1f 152}\r
153\r
154\r
155\r
156BOOLEAN\r
157EFIAPI\r
158PeiPcdGetBool (\r
5f5f28c9 159 IN UINTN TokenNumber\r
878ddf1f 160 )\r
161{\r
52e1905d 162 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 163}\r
164\r
165\r
166\r
167UINTN\r
168EFIAPI\r
169PeiPcdGetSize (\r
5f5f28c9 170 IN UINTN TokenNumber\r
878ddf1f 171 )\r
172{\r
1de04b4f 173 PEI_PCD_DATABASE *PeiPcdDb;\r
174 UINTN Size;\r
175 UINTN MaxSize;\r
176\r
5f5f28c9 177 //\r
178 // If DebugAssertEnabled is TRUE, we still need to provide the GET size\r
179 // function as GetWorker and SetWoker need this function to do ASSERT.\r
180 //\r
181 if ((!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) &&\r
182 (!DebugAssertEnabled ())) {\r
183 return 0;\r
f89f5802 184 }\r
185\r
1de04b4f 186 PeiPcdDb = GetPcdDatabase ();\r
58f1099f 187 //\r
188 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
189 // We have to decrement TokenNumber by 1 to make it usable\r
190 // as the array index.\r
191 //\r
192 TokenNumber--;\r
193\r
4f914125 194 // EBC compiler is very choosy. It may report warning about comparison\r
195 // between UINTN and 0 . So we add 1 in each size of the \r
196 // comparison.\r
197 ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
52e1905d 198\r
1de04b4f 199 Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
200\r
201 if (Size == 0) {\r
202 //\r
203 // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
204 //\r
205 return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
206 } else {\r
207 return Size;\r
208 }\r
209\r
878ddf1f 210}\r
211\r
212\r
213\r
214UINT8\r
215EFIAPI\r
216PeiPcdGet8Ex (\r
5f5f28c9 217 IN CONST EFI_GUID *Guid,\r
218 IN UINTN ExTokenNumber\r
878ddf1f 219 )\r
220{\r
52e1905d 221 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
878ddf1f 222}\r
223\r
224\r
225\r
226UINT16\r
227EFIAPI\r
228PeiPcdGet16Ex (\r
5f5f28c9 229 IN CONST EFI_GUID *Guid,\r
230 IN UINTN ExTokenNumber\r
878ddf1f 231 )\r
232{\r
52e1905d 233 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
878ddf1f 234}\r
235\r
236\r
237\r
238UINT32\r
239EFIAPI\r
240PeiPcdGet32Ex (\r
5f5f28c9 241 IN CONST EFI_GUID *Guid,\r
242 IN UINTN ExTokenNumber\r
878ddf1f 243 )\r
244{\r
52e1905d 245 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
878ddf1f 246}\r
247\r
248\r
249\r
250UINT64\r
251EFIAPI\r
252PeiPcdGet64Ex (\r
5f5f28c9 253 IN CONST EFI_GUID *Guid,\r
254 IN UINTN ExTokenNumber\r
878ddf1f 255 )\r
256{\r
52e1905d 257 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
878ddf1f 258}\r
259\r
260\r
261\r
262VOID *\r
263EFIAPI\r
264PeiPcdGetPtrEx (\r
5f5f28c9 265 IN CONST EFI_GUID *Guid,\r
266 IN UINTN ExTokenNumber\r
878ddf1f 267 )\r
268{\r
52e1905d 269 return ExGetWorker (Guid, ExTokenNumber, 0);\r
878ddf1f 270}\r
271\r
272\r
273\r
274BOOLEAN\r
275EFIAPI\r
276PeiPcdGetBoolEx (\r
5f5f28c9 277 IN CONST EFI_GUID *Guid,\r
278 IN UINTN ExTokenNumber\r
878ddf1f 279 )\r
280{\r
52e1905d 281 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 282}\r
283\r
284\r
285\r
286UINTN\r
287EFIAPI\r
288PeiPcdGetSizeEx (\r
5f5f28c9 289 IN CONST EFI_GUID *Guid,\r
290 IN UINTN ExTokenNumber\r
878ddf1f 291 )\r
292{\r
f89f5802 293 if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) {\r
5f5f28c9 294 return 0;\r
f89f5802 295 }\r
296\r
9d6d8b24 297 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
878ddf1f 298}\r
299\r
300\r
301\r
302EFI_STATUS\r
303EFIAPI\r
304PeiPcdSet8 (\r
8a43e8dd 305 IN UINTN TokenNumber,\r
1de04b4f 306 IN UINT8 Value\r
878ddf1f 307 )\r
308{\r
1de04b4f 309 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 310}\r
311\r
312\r
313\r
314EFI_STATUS\r
315EFIAPI\r
316PeiPcdSet16 (\r
5f5f28c9 317 IN UINTN TokenNumber,\r
318 IN UINT16 Value\r
878ddf1f 319 )\r
320{\r
1de04b4f 321 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 322}\r
323\r
324\r
325\r
326EFI_STATUS\r
327EFIAPI\r
328PeiPcdSet32 (\r
5f5f28c9 329 IN UINTN TokenNumber,\r
330 IN UINT32 Value\r
878ddf1f 331 )\r
332{\r
1de04b4f 333 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 334}\r
335\r
336\r
337\r
338EFI_STATUS\r
339EFIAPI\r
340PeiPcdSet64 (\r
5f5f28c9 341 IN UINTN TokenNumber,\r
342 IN UINT64 Value\r
878ddf1f 343 )\r
344{\r
1de04b4f 345 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 346}\r
347\r
348\r
349EFI_STATUS\r
350EFIAPI\r
351PeiPcdSetPtr (\r
5f5f28c9 352 IN UINTN TokenNumber,\r
353 IN OUT UINTN *SizeOfBuffer,\r
354 IN VOID *Buffer\r
878ddf1f 355 )\r
356{\r
00b7af13 357 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
878ddf1f 358}\r
359\r
360\r
361\r
362EFI_STATUS\r
363EFIAPI\r
364PeiPcdSetBool (\r
5f5f28c9 365 IN UINTN TokenNumber,\r
366 IN BOOLEAN Value\r
878ddf1f 367 )\r
368{\r
1de04b4f 369 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 370}\r
371\r
372\r
373\r
374EFI_STATUS\r
375EFIAPI\r
376PeiPcdSet8Ex (\r
5f5f28c9 377 IN CONST EFI_GUID *Guid,\r
378 IN UINTN ExTokenNumber,\r
379 IN UINT8 Value\r
878ddf1f 380 )\r
381{\r
1de04b4f 382 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 383}\r
384\r
385\r
386\r
387EFI_STATUS\r
388EFIAPI\r
389PeiPcdSet16Ex (\r
5f5f28c9 390 IN CONST EFI_GUID *Guid,\r
391 IN UINTN ExTokenNumber,\r
392 IN UINT16 Value\r
878ddf1f 393 )\r
394{\r
1de04b4f 395 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 396}\r
397\r
398\r
399\r
400EFI_STATUS\r
401EFIAPI\r
402PeiPcdSet32Ex (\r
5f5f28c9 403 IN CONST EFI_GUID *Guid,\r
404 IN UINTN ExTokenNumber,\r
405 IN UINT32 Value\r
878ddf1f 406 )\r
407{\r
1de04b4f 408 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 409}\r
410\r
411\r
412\r
413EFI_STATUS\r
414EFIAPI\r
415PeiPcdSet64Ex (\r
5f5f28c9 416 IN CONST EFI_GUID *Guid,\r
417 IN UINTN ExTokenNumber,\r
418 IN UINT64 Value\r
878ddf1f 419 )\r
420{\r
1de04b4f 421 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 422}\r
423\r
424\r
425\r
426EFI_STATUS\r
427EFIAPI\r
428PeiPcdSetPtrEx (\r
5f5f28c9 429 IN CONST EFI_GUID *Guid,\r
430 IN UINTN ExTokenNumber,\r
431 IN UINTN *SizeOfBuffer,\r
432 IN VOID *Value\r
878ddf1f 433 )\r
434{\r
1de04b4f 435 return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
878ddf1f 436}\r
437\r
438\r
439\r
440EFI_STATUS\r
441EFIAPI\r
442PeiPcdSetBoolEx (\r
5f5f28c9 443 IN CONST EFI_GUID *Guid,\r
444 IN UINTN ExTokenNumber,\r
445 IN BOOLEAN Value\r
878ddf1f 446 )\r
447{\r
1de04b4f 448 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 449}\r
450\r
451\r
452\r
453\r
454EFI_STATUS\r
455EFIAPI\r
4c114006 456PeiRegisterCallBackOnSet (\r
878ddf1f 457 IN CONST EFI_GUID *Guid, OPTIONAL\r
2a870f53 458 IN UINTN ExTokenNumber,\r
878ddf1f 459 IN PCD_PPI_CALLBACK CallBackFunction\r
460 )\r
461{\r
f89f5802 462 if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
463 return EFI_UNSUPPORTED;\r
464 }\r
465\r
4c114006 466 ASSERT (CallBackFunction != NULL);\r
467 \r
52e1905d 468 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
878ddf1f 469}\r
470\r
471\r
472\r
473EFI_STATUS\r
474EFIAPI\r
475PcdUnRegisterCallBackOnSet (\r
878ddf1f 476 IN CONST EFI_GUID *Guid, OPTIONAL\r
2a870f53 477 IN UINTN ExTokenNumber,\r
878ddf1f 478 IN PCD_PPI_CALLBACK CallBackFunction\r
479 )\r
480{\r
f89f5802 481 if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
482 return EFI_UNSUPPORTED;\r
483 }\r
484\r
4c114006 485 ASSERT (CallBackFunction != NULL);\r
486 \r
52e1905d 487 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
878ddf1f 488}\r
489\r
490\r
491\r
492EFI_STATUS\r
493EFIAPI\r
494PeiPcdGetNextToken (\r
495 IN CONST EFI_GUID *Guid, OPTIONAL\r
8a43e8dd 496 IN OUT UINTN *TokenNumber\r
878ddf1f 497 )\r
498{\r
00b7af13 499 UINTN GuidTableIdx;\r
500 PEI_PCD_DATABASE *PeiPcdDb;\r
501 EFI_GUID *MatchGuid;\r
502 DYNAMICEX_MAPPING *ExMapTable;\r
503 UINTN i;\r
504 BOOLEAN Found;\r
1cc8ee78 505 BOOLEAN PeiExMapTableEmpty;\r
506\r
4f914125 507 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
508 return EFI_UNSUPPORTED;\r
509 }\r
1cc8ee78 510\r
511 PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
512\r
52e1905d 513 if (Guid == NULL) {\r
2b21a971 514 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
515 return EFI_NOT_FOUND;\r
516 }\r
b560bb65 517 (*TokenNumber)++;\r
c24ba2f6 518 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
0653eb89 519 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
52e1905d 520 }\r
c24ba2f6 521 return EFI_SUCCESS;\r
00b7af13 522 } else {\r
1cc8ee78 523 if (PeiExMapTableEmpty) {\r
0653eb89 524 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
c24ba2f6 525 return EFI_SUCCESS;\r
00b7af13 526 }\r
527 \r
528 //\r
529 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
530 // 1) ExGuid\r
531 // 2) ExTokenNumber\r
532 //\r
533 PeiPcdDb = GetPcdDatabase ();\r
534 \r
535 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
536\r
537 if (MatchGuid == NULL) {\r
c24ba2f6 538 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 539 return EFI_NOT_FOUND;\r
540 }\r
541\r
542 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
543\r
544 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
545\r
546 Found = FALSE;\r
c24ba2f6 547 //\r
548 // Locate the GUID in ExMapTable first.\r
549 //\r
00b7af13 550 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
551 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
552 Found = TRUE;\r
553 break;\r
554 }\r
555 }\r
556\r
557 if (Found) {\r
558 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
559 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
560 return EFI_SUCCESS;\r
561 }\r
c24ba2f6 562\r
563 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
00b7af13 564 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
565 i++;\r
c24ba2f6 566 if (i == PEI_EXMAPPING_TABLE_SIZE) {\r
567 //\r
568 // Exceed the length of ExMap Table\r
569 //\r
570 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
571 return EFI_SUCCESS;\r
572 }\r
00b7af13 573 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
574 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
575 return EFI_SUCCESS;\r
576 } else {\r
c24ba2f6 577 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 578 return EFI_SUCCESS;\r
579 }\r
580 }\r
581 }\r
00b7af13 582 return EFI_NOT_FOUND;\r
583 }\r
00b7af13 584 }\r
585\r
c24ba2f6 586 return EFI_NOT_FOUND;\r
00b7af13 587}\r
588\r
1de04b4f 589\r
590\r
58f1099f 591EFI_STATUS\r
00b7af13 592EFIAPI\r
4276d5da 593PeiPcdGetNextTokenSpace (\r
5f5f28c9 594 IN OUT CONST EFI_GUID **Guid\r
00b7af13 595 )\r
596{\r
597 UINTN GuidTableIdx;\r
598 EFI_GUID *MatchGuid;\r
599 PEI_PCD_DATABASE *PeiPcdDb;\r
600 DYNAMICEX_MAPPING *ExMapTable;\r
601 UINTN i;\r
602 BOOLEAN Found;\r
1cc8ee78 603 BOOLEAN PeiExMapTableEmpty;\r
00b7af13 604\r
4f914125 605 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
606 return EFI_UNSUPPORTED;\r
607 }\r
608\r
4276d5da 609 ASSERT (Guid != NULL);\r
610\r
1cc8ee78 611 PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
612\r
613 if (PeiExMapTableEmpty) {\r
4276d5da 614 if (*Guid != NULL) {\r
615 return EFI_NOT_FOUND;\r
58f1099f 616 } else {\r
58f1099f 617 return EFI_SUCCESS;\r
618 }\r
4276d5da 619 }\r
52e1905d 620\r
621 //\r
00b7af13 622 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
623 // 1) ExGuid\r
624 // 2) ExTokenNumber\r
52e1905d 625 //\r
00b7af13 626 PeiPcdDb = GetPcdDatabase ();\r
52e1905d 627\r
4276d5da 628 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
629\r
630 if (*Guid == NULL) {\r
631 //\r
632 // return the first Token Space Guid.\r
633 //\r
634 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
635 return EFI_SUCCESS;\r
636 }\r
637\r
58f1099f 638 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
00b7af13 639\r
640 if (MatchGuid == NULL) {\r
58f1099f 641 return EFI_NOT_FOUND;\r
00b7af13 642 }\r
643 \r
644 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
878ddf1f 645\r
00b7af13 646 Found = FALSE;\r
647 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
648 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
649 Found = TRUE;\r
650 break;\r
651 }\r
652 }\r
653\r
654 if (Found) {\r
4276d5da 655 i++;\r
00b7af13 656 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
657 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
58f1099f 658 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
659 return EFI_SUCCESS;\r
00b7af13 660 }\r
661 }\r
4276d5da 662 *Guid = NULL;\r
663 return EFI_SUCCESS;\r
00b7af13 664 }\r
665\r
58f1099f 666 return EFI_NOT_FOUND;\r
00b7af13 667\r
668}\r
878ddf1f 669\r
3401c092 670UINTN\r
671GetPtrTypeSize (\r
672 IN UINTN LocalTokenNumberTableIdx,\r
673 OUT UINTN *MaxSize,\r
674 IN PEI_PCD_DATABASE *Database\r
675 )\r
676{\r
677 INTN SizeTableIdx;\r
678 UINTN LocalTokenNumber;\r
679 SKU_ID *SkuIdTable;\r
680 SIZE_INFO *SizeTable;\r
681 UINTN i;\r
682\r
683 SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
684\r
685 LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
686\r
687 ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
688 \r
689 SizeTable = Database->Init.SizeTable;\r
690\r
691 *MaxSize = SizeTable[SizeTableIdx];\r
692 //\r
693 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
694 // PCD entry.\r
695 //\r
696 if (LocalTokenNumber & PCD_TYPE_VPD) {\r
697 //\r
698 // We have only one entry for VPD enabled PCD entry:\r
699 // 1) MAX Size.\r
700 // We consider current size is equal to MAX size.\r
701 //\r
702 return *MaxSize;\r
703 } else {\r
704 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
705 //\r
706 // We have only two entry for Non-Sku enabled PCD entry:\r
707 // 1) MAX SIZE\r
708 // 2) Current Size\r
709 //\r
710 return SizeTable[SizeTableIdx + 1];\r
711 } else {\r
712 //\r
713 // We have these entry for SKU enabled PCD entry\r
714 // 1) MAX SIZE\r
715 // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
716 //\r
717 SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
718 for (i = 0; i < SkuIdTable[0]; i++) {\r
719 if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
720 return SizeTable[SizeTableIdx + 1 + i];\r
721 }\r
722 }\r
723 return SizeTable[SizeTableIdx + 1];\r
724 }\r
725 }\r
726}\r
727\r
728\r
729\r
730BOOLEAN\r
731SetPtrTypeSize (\r
732 IN UINTN LocalTokenNumberTableIdx,\r
733 IN OUT UINTN *CurrentSize,\r
734 IN PEI_PCD_DATABASE *Database\r
735 )\r
736{\r
737 INTN SizeTableIdx;\r
738 UINTN LocalTokenNumber;\r
739 SKU_ID *SkuIdTable;\r
740 SIZE_INFO *SizeTable;\r
741 UINTN i;\r
742 UINTN MaxSize;\r
743 \r
744 SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
745\r
746 LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
747\r
748 ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
749 \r
750 SizeTable = Database->Init.SizeTable;\r
751\r
752 MaxSize = SizeTable[SizeTableIdx];\r
753 //\r
754 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
755 // PCD entry.\r
756 //\r
757 if (LocalTokenNumber & PCD_TYPE_VPD) {\r
758 //\r
759 // We shouldn't come here as we don't support SET for VPD\r
760 //\r
761 ASSERT (FALSE);\r
762 return FALSE;\r
763 } else {\r
764 if ((*CurrentSize > MaxSize) ||\r
765 (*CurrentSize == MAX_ADDRESS)) {\r
766 *CurrentSize = MaxSize;\r
767 return FALSE;\r
768 } \r
769 \r
770 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
771 //\r
772 // We have only two entry for Non-Sku enabled PCD entry:\r
773 // 1) MAX SIZE\r
774 // 2) Current Size\r
775 //\r
776 SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
777 return TRUE;\r
778 } else {\r
779 //\r
780 // We have these entry for SKU enabled PCD entry\r
781 // 1) MAX SIZE\r
782 // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
783 //\r
784 SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
785 for (i = 0; i < SkuIdTable[0]; i++) {\r
786 if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
787 SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize;\r
788 return TRUE;\r
789 }\r
790 }\r
791 SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
792 return TRUE;\r
793 }\r
794 }\r
795\r
796}\r