]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Added Wordpad recommendation for editor, change ACTIVE_PLATFORM from REQUIRED to...
[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
2b21a971 483 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
484 return EFI_NOT_FOUND;\r
485 }\r
b560bb65 486 (*TokenNumber)++;\r
c24ba2f6 487 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
0653eb89 488 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
52e1905d 489 }\r
c24ba2f6 490 return EFI_SUCCESS;\r
00b7af13 491 } else {\r
00b7af13 492 if (PEI_EXMAP_TABLE_EMPTY) {\r
0653eb89 493 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
c24ba2f6 494 return EFI_SUCCESS;\r
00b7af13 495 }\r
496 \r
497 //\r
498 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
499 // 1) ExGuid\r
500 // 2) ExTokenNumber\r
501 //\r
502 PeiPcdDb = GetPcdDatabase ();\r
503 \r
504 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
505\r
506 if (MatchGuid == NULL) {\r
c24ba2f6 507 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 508 return EFI_NOT_FOUND;\r
509 }\r
510\r
511 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
512\r
513 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
514\r
515 Found = FALSE;\r
c24ba2f6 516 //\r
517 // Locate the GUID in ExMapTable first.\r
518 //\r
00b7af13 519 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
520 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
521 Found = TRUE;\r
522 break;\r
523 }\r
524 }\r
525\r
526 if (Found) {\r
527 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
528 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
529 return EFI_SUCCESS;\r
530 }\r
c24ba2f6 531\r
532 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
00b7af13 533 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
534 i++;\r
c24ba2f6 535 if (i == PEI_EXMAPPING_TABLE_SIZE) {\r
536 //\r
537 // Exceed the length of ExMap Table\r
538 //\r
539 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
540 return EFI_SUCCESS;\r
541 }\r
00b7af13 542 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
543 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
544 return EFI_SUCCESS;\r
545 } else {\r
c24ba2f6 546 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 547 return EFI_SUCCESS;\r
548 }\r
549 }\r
550 }\r
00b7af13 551 return EFI_NOT_FOUND;\r
552 }\r
00b7af13 553 }\r
554\r
c24ba2f6 555 return EFI_NOT_FOUND;\r
00b7af13 556}\r
557\r
1de04b4f 558\r
559\r
58f1099f 560EFI_STATUS\r
00b7af13 561EFIAPI\r
4276d5da 562PeiPcdGetNextTokenSpace (\r
58f1099f 563 IN OUT CONST EFI_GUID **Guid\r
00b7af13 564 )\r
565{\r
566 UINTN GuidTableIdx;\r
567 EFI_GUID *MatchGuid;\r
568 PEI_PCD_DATABASE *PeiPcdDb;\r
569 DYNAMICEX_MAPPING *ExMapTable;\r
570 UINTN i;\r
571 BOOLEAN Found;\r
572\r
4276d5da 573 ASSERT (Guid != NULL);\r
574\r
575 if (PEI_EXMAP_TABLE_EMPTY) {\r
576 if (*Guid != NULL) {\r
577 return EFI_NOT_FOUND;\r
58f1099f 578 } else {\r
58f1099f 579 return EFI_SUCCESS;\r
580 }\r
4276d5da 581 }\r
52e1905d 582\r
583 //\r
00b7af13 584 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
585 // 1) ExGuid\r
586 // 2) ExTokenNumber\r
52e1905d 587 //\r
00b7af13 588 PeiPcdDb = GetPcdDatabase ();\r
52e1905d 589\r
4276d5da 590 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
591\r
592 if (*Guid == NULL) {\r
593 //\r
594 // return the first Token Space Guid.\r
595 //\r
596 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
597 return EFI_SUCCESS;\r
598 }\r
599\r
58f1099f 600 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
00b7af13 601\r
602 if (MatchGuid == NULL) {\r
58f1099f 603 return EFI_NOT_FOUND;\r
00b7af13 604 }\r
605 \r
606 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
878ddf1f 607\r
00b7af13 608 Found = FALSE;\r
609 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
610 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
611 Found = TRUE;\r
612 break;\r
613 }\r
614 }\r
615\r
616 if (Found) {\r
4276d5da 617 i++;\r
00b7af13 618 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
619 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
58f1099f 620 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
621 return EFI_SUCCESS;\r
00b7af13 622 }\r
623 }\r
4276d5da 624 *Guid = NULL;\r
625 return EFI_SUCCESS;\r
00b7af13 626 }\r
627\r
58f1099f 628 return EFI_NOT_FOUND;\r
00b7af13 629\r
630}\r
878ddf1f 631\r