]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Corrected a typo error.
[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
8a43e8dd 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
8a43e8dd 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
8a43e8dd 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
8a43e8dd 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
8a43e8dd 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
8a43e8dd 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
8a43e8dd 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
177 PeiPcdDb = GetPcdDatabase ();\r
58f1099f 178 //\r
179 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
180 // We have to decrement TokenNumber by 1 to make it usable\r
181 // as the array index.\r
182 //\r
183 TokenNumber--;\r
184\r
52e1905d 185 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
186\r
1de04b4f 187 Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
188\r
189 if (Size == 0) {\r
190 //\r
191 // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
192 //\r
193 return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
194 } else {\r
195 return Size;\r
196 }\r
197\r
878ddf1f 198}\r
199\r
200\r
201\r
202UINT8\r
203EFIAPI\r
204PeiPcdGet8Ex (\r
205 IN CONST EFI_GUID *Guid,\r
8a43e8dd 206 IN UINTN ExTokenNumber\r
878ddf1f 207 )\r
208{\r
52e1905d 209 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
878ddf1f 210}\r
211\r
212\r
213\r
214UINT16\r
215EFIAPI\r
216PeiPcdGet16Ex (\r
217 IN CONST EFI_GUID *Guid,\r
8a43e8dd 218 IN UINTN ExTokenNumber\r
878ddf1f 219 )\r
220{\r
52e1905d 221 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
878ddf1f 222}\r
223\r
224\r
225\r
226UINT32\r
227EFIAPI\r
228PeiPcdGet32Ex (\r
229 IN CONST EFI_GUID *Guid,\r
8a43e8dd 230 IN UINTN ExTokenNumber\r
878ddf1f 231 )\r
232{\r
52e1905d 233 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
878ddf1f 234}\r
235\r
236\r
237\r
238UINT64\r
239EFIAPI\r
240PeiPcdGet64Ex (\r
241 IN CONST EFI_GUID *Guid,\r
8a43e8dd 242 IN UINTN ExTokenNumber\r
878ddf1f 243 )\r
244{\r
52e1905d 245 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
878ddf1f 246}\r
247\r
248\r
249\r
250VOID *\r
251EFIAPI\r
252PeiPcdGetPtrEx (\r
253 IN CONST EFI_GUID *Guid,\r
8a43e8dd 254 IN UINTN ExTokenNumber\r
878ddf1f 255 )\r
256{\r
52e1905d 257 return ExGetWorker (Guid, ExTokenNumber, 0);\r
878ddf1f 258}\r
259\r
260\r
261\r
262BOOLEAN\r
263EFIAPI\r
264PeiPcdGetBoolEx (\r
265 IN CONST EFI_GUID *Guid,\r
8a43e8dd 266 IN UINTN ExTokenNumber\r
878ddf1f 267 )\r
268{\r
52e1905d 269 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 270}\r
271\r
272\r
273\r
274UINTN\r
275EFIAPI\r
276PeiPcdGetSizeEx (\r
277 IN CONST EFI_GUID *Guid,\r
8a43e8dd 278 IN UINTN ExTokenNumber\r
878ddf1f 279 )\r
280{\r
9d6d8b24 281 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
878ddf1f 282}\r
283\r
284\r
285\r
286EFI_STATUS\r
287EFIAPI\r
288PeiPcdSet8 (\r
8a43e8dd 289 IN UINTN TokenNumber,\r
1de04b4f 290 IN UINT8 Value\r
878ddf1f 291 )\r
292{\r
1de04b4f 293 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 294}\r
295\r
296\r
297\r
298EFI_STATUS\r
299EFIAPI\r
300PeiPcdSet16 (\r
1de04b4f 301 IN UINTN TokenNumber,\r
302 IN UINT16 Value\r
878ddf1f 303 )\r
304{\r
1de04b4f 305 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 306}\r
307\r
308\r
309\r
310EFI_STATUS\r
311EFIAPI\r
312PeiPcdSet32 (\r
1de04b4f 313 IN UINTN TokenNumber,\r
314 IN UINT32 Value\r
878ddf1f 315 )\r
316{\r
1de04b4f 317 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 318}\r
319\r
320\r
321\r
322EFI_STATUS\r
323EFIAPI\r
324PeiPcdSet64 (\r
1de04b4f 325 IN UINTN TokenNumber,\r
326 IN UINT64 Value\r
878ddf1f 327 )\r
328{\r
1de04b4f 329 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 330}\r
331\r
332\r
333EFI_STATUS\r
334EFIAPI\r
335PeiPcdSetPtr (\r
1de04b4f 336 IN UINTN TokenNumber,\r
337 IN OUT UINTN *SizeOfBuffer,\r
338 IN VOID *Buffer\r
878ddf1f 339 )\r
340{\r
00b7af13 341 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
878ddf1f 342}\r
343\r
344\r
345\r
346EFI_STATUS\r
347EFIAPI\r
348PeiPcdSetBool (\r
1de04b4f 349 IN UINTN TokenNumber,\r
350 IN BOOLEAN Value\r
878ddf1f 351 )\r
352{\r
1de04b4f 353 return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
878ddf1f 354}\r
355\r
356\r
357\r
358EFI_STATUS\r
359EFIAPI\r
360PeiPcdSet8Ex (\r
361 IN CONST EFI_GUID *Guid,\r
8a43e8dd 362 IN UINTN ExTokenNumber,\r
878ddf1f 363 IN UINT8 Value\r
364 )\r
365{\r
1de04b4f 366 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 367}\r
368\r
369\r
370\r
371EFI_STATUS\r
372EFIAPI\r
373PeiPcdSet16Ex (\r
374 IN CONST EFI_GUID *Guid,\r
8a43e8dd 375 IN UINTN ExTokenNumber,\r
878ddf1f 376 IN UINT16 Value\r
377 )\r
378{\r
1de04b4f 379 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 380}\r
381\r
382\r
383\r
384EFI_STATUS\r
385EFIAPI\r
386PeiPcdSet32Ex (\r
387 IN CONST EFI_GUID *Guid,\r
8a43e8dd 388 IN UINTN ExTokenNumber,\r
878ddf1f 389 IN UINT32 Value\r
390 )\r
391{\r
1de04b4f 392 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 393}\r
394\r
395\r
396\r
397EFI_STATUS\r
398EFIAPI\r
399PeiPcdSet64Ex (\r
400 IN CONST EFI_GUID *Guid,\r
8a43e8dd 401 IN UINTN ExTokenNumber,\r
878ddf1f 402 IN UINT64 Value\r
403 )\r
404{\r
1de04b4f 405 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 406}\r
407\r
408\r
409\r
410EFI_STATUS\r
411EFIAPI\r
412PeiPcdSetPtrEx (\r
413 IN CONST EFI_GUID *Guid,\r
8a43e8dd 414 IN UINTN ExTokenNumber,\r
1de04b4f 415 IN UINTN *SizeOfBuffer,\r
00b7af13 416 IN VOID *Value\r
878ddf1f 417 )\r
418{\r
1de04b4f 419 return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
878ddf1f 420}\r
421\r
422\r
423\r
424EFI_STATUS\r
425EFIAPI\r
426PeiPcdSetBoolEx (\r
427 IN CONST EFI_GUID *Guid,\r
8a43e8dd 428 IN UINTN ExTokenNumber,\r
878ddf1f 429 IN BOOLEAN Value\r
430 )\r
431{\r
1de04b4f 432 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
878ddf1f 433}\r
434\r
435\r
436\r
437\r
438EFI_STATUS\r
439EFIAPI\r
4c114006 440PeiRegisterCallBackOnSet (\r
8a43e8dd 441 IN UINTN ExTokenNumber,\r
878ddf1f 442 IN CONST EFI_GUID *Guid, OPTIONAL\r
443 IN PCD_PPI_CALLBACK CallBackFunction\r
444 )\r
445{\r
4c114006 446 ASSERT (CallBackFunction != NULL);\r
447 \r
52e1905d 448 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
878ddf1f 449}\r
450\r
451\r
452\r
453EFI_STATUS\r
454EFIAPI\r
455PcdUnRegisterCallBackOnSet (\r
8a43e8dd 456 IN UINTN ExTokenNumber,\r
878ddf1f 457 IN CONST EFI_GUID *Guid, OPTIONAL\r
458 IN PCD_PPI_CALLBACK CallBackFunction\r
459 )\r
460{\r
4c114006 461 ASSERT (CallBackFunction != NULL);\r
462 \r
52e1905d 463 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
878ddf1f 464}\r
465\r
466\r
467\r
468EFI_STATUS\r
469EFIAPI\r
470PeiPcdGetNextToken (\r
471 IN CONST EFI_GUID *Guid, OPTIONAL\r
8a43e8dd 472 IN OUT UINTN *TokenNumber\r
878ddf1f 473 )\r
474{\r
00b7af13 475 UINTN GuidTableIdx;\r
476 PEI_PCD_DATABASE *PeiPcdDb;\r
477 EFI_GUID *MatchGuid;\r
478 DYNAMICEX_MAPPING *ExMapTable;\r
479 UINTN i;\r
480 BOOLEAN Found;\r
481 \r
52e1905d 482 if (Guid == NULL) {\r
b560bb65 483 (*TokenNumber)++;\r
52e1905d 484\r
00b7af13 485 if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
0653eb89 486 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
52e1905d 487 }\r
00b7af13 488 \r
489 } else {\r
490\r
491 if (PEI_EXMAP_TABLE_EMPTY) {\r
0653eb89 492 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 493 return EFI_NOT_FOUND;\r
494 }\r
495 \r
496 //\r
497 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
498 // 1) ExGuid\r
499 // 2) ExTokenNumber\r
500 //\r
501 PeiPcdDb = GetPcdDatabase ();\r
502 \r
503 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
504\r
505 if (MatchGuid == NULL) {\r
506 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
507 return EFI_NOT_FOUND;\r
508 }\r
509\r
510 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
511\r
512 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
513\r
514 Found = FALSE;\r
515 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
516 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
517 Found = TRUE;\r
518 break;\r
519 }\r
520 }\r
521\r
522 if (Found) {\r
523 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
524 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
525 return EFI_SUCCESS;\r
526 }\r
527 \r
528 for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
529 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
530 i++;\r
531 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
532 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
533 return EFI_SUCCESS;\r
534 } else {\r
535 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
536 return EFI_SUCCESS;\r
537 }\r
538 }\r
539 }\r
540\r
541 return EFI_NOT_FOUND;\r
542 }\r
543 \r
544 }\r
545\r
546 return EFI_SUCCESS;\r
547}\r
548\r
1de04b4f 549\r
550\r
58f1099f 551EFI_STATUS\r
00b7af13 552EFIAPI\r
4276d5da 553PeiPcdGetNextTokenSpace (\r
58f1099f 554 IN OUT CONST EFI_GUID **Guid\r
00b7af13 555 )\r
556{\r
557 UINTN GuidTableIdx;\r
558 EFI_GUID *MatchGuid;\r
559 PEI_PCD_DATABASE *PeiPcdDb;\r
560 DYNAMICEX_MAPPING *ExMapTable;\r
561 UINTN i;\r
562 BOOLEAN Found;\r
563\r
4276d5da 564 ASSERT (Guid != NULL);\r
565\r
566 if (PEI_EXMAP_TABLE_EMPTY) {\r
567 if (*Guid != NULL) {\r
568 return EFI_NOT_FOUND;\r
58f1099f 569 } else {\r
58f1099f 570 return EFI_SUCCESS;\r
571 }\r
4276d5da 572 }\r
52e1905d 573\r
574 //\r
00b7af13 575 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
576 // 1) ExGuid\r
577 // 2) ExTokenNumber\r
52e1905d 578 //\r
00b7af13 579 PeiPcdDb = GetPcdDatabase ();\r
52e1905d 580\r
4276d5da 581 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
582\r
583 if (*Guid == NULL) {\r
584 //\r
585 // return the first Token Space Guid.\r
586 //\r
587 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
588 return EFI_SUCCESS;\r
589 }\r
590\r
58f1099f 591 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
00b7af13 592\r
593 if (MatchGuid == NULL) {\r
58f1099f 594 return EFI_NOT_FOUND;\r
00b7af13 595 }\r
596 \r
597 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
878ddf1f 598\r
00b7af13 599 Found = FALSE;\r
600 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
601 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
602 Found = TRUE;\r
603 break;\r
604 }\r
605 }\r
606\r
607 if (Found) {\r
4276d5da 608 i++;\r
00b7af13 609 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
610 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
58f1099f 611 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
612 return EFI_SUCCESS;\r
00b7af13 613 }\r
614 }\r
4276d5da 615 *Guid = NULL;\r
616 return EFI_SUCCESS;\r
00b7af13 617 }\r
618\r
58f1099f 619 return EFI_NOT_FOUND;\r
00b7af13 620\r
621}\r
878ddf1f 622\r