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