]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/PCD/Pei/Pcd.c
1) remove some dead code from WinNtBusDriver.c
[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
55 PeiPcdGetNextToken\r
56};\r
57\r
58\r
59\r
60STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {\r
61 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
62 &gPcdPpiGuid,\r
63 &mPcdPpiInstance\r
64};\r
65\r
66\r
67\r
68EFI_STATUS\r
69EFIAPI\r
70PcdPeimInit (\r
71 IN EFI_FFS_FILE_HEADER *FfsHeader,\r
72 IN EFI_PEI_SERVICES **PeiServices\r
73 )\r
74{\r
75 EFI_STATUS Status;\r
878ddf1f 76\r
52e1905d 77 BuildPcdDatabase ();\r
78 \r
84a99d48 79 Status = PeiServicesInstallPpi (&mPpiPCD);\r
878ddf1f 80\r
81 ASSERT_EFI_ERROR (Status);\r
82 \r
83 return EFI_SUCCESS;\r
84}\r
85\r
00b7af13 86VOID\r
878ddf1f 87EFIAPI\r
88PeiPcdSetSku (\r
8a43e8dd 89 IN UINTN SkuId\r
878ddf1f 90 )\r
91{\r
878ddf1f 92\r
8a43e8dd 93 GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
878ddf1f 94\r
00b7af13 95 return;\r
878ddf1f 96}\r
97\r
98\r
99\r
100UINT8\r
101EFIAPI\r
102PeiPcdGet8 (\r
8a43e8dd 103 IN UINTN TokenNumber\r
878ddf1f 104 )\r
105{\r
52e1905d 106 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
878ddf1f 107}\r
108\r
109\r
110\r
111UINT16\r
112EFIAPI\r
113PeiPcdGet16 (\r
8a43e8dd 114 IN UINTN TokenNumber\r
878ddf1f 115 )\r
116{\r
52e1905d 117 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
878ddf1f 118}\r
119\r
120\r
121\r
122UINT32\r
123EFIAPI\r
124PeiPcdGet32 (\r
8a43e8dd 125 IN UINTN TokenNumber\r
878ddf1f 126 )\r
127{\r
52e1905d 128 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
878ddf1f 129}\r
130\r
131\r
132\r
133UINT64\r
134EFIAPI\r
135PeiPcdGet64 (\r
8a43e8dd 136 IN UINTN TokenNumber\r
878ddf1f 137 )\r
138{\r
52e1905d 139 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
878ddf1f 140}\r
141\r
142\r
143\r
144VOID *\r
145EFIAPI\r
146PeiPcdGetPtr (\r
8a43e8dd 147 IN UINTN TokenNumber\r
878ddf1f 148 )\r
149{\r
52e1905d 150 return GetWorker (TokenNumber, 0);\r
878ddf1f 151}\r
152\r
153\r
154\r
155BOOLEAN\r
156EFIAPI\r
157PeiPcdGetBool (\r
8a43e8dd 158 IN UINTN TokenNumber\r
878ddf1f 159 )\r
160{\r
52e1905d 161 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 162}\r
163\r
164\r
165\r
166UINTN\r
167EFIAPI\r
168PeiPcdGetSize (\r
8a43e8dd 169 IN UINTN TokenNumber\r
878ddf1f 170 )\r
171{\r
58f1099f 172 //\r
173 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
174 // We have to decrement TokenNumber by 1 to make it usable\r
175 // as the array index.\r
176 //\r
177 TokenNumber--;\r
178\r
52e1905d 179 ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
180\r
181 return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
878ddf1f 182}\r
183\r
184\r
185\r
186UINT8\r
187EFIAPI\r
188PeiPcdGet8Ex (\r
189 IN CONST EFI_GUID *Guid,\r
8a43e8dd 190 IN UINTN ExTokenNumber\r
878ddf1f 191 )\r
192{\r
52e1905d 193 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
878ddf1f 194}\r
195\r
196\r
197\r
198UINT16\r
199EFIAPI\r
200PeiPcdGet16Ex (\r
201 IN CONST EFI_GUID *Guid,\r
8a43e8dd 202 IN UINTN ExTokenNumber\r
878ddf1f 203 )\r
204{\r
52e1905d 205 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
878ddf1f 206}\r
207\r
208\r
209\r
210UINT32\r
211EFIAPI\r
212PeiPcdGet32Ex (\r
213 IN CONST EFI_GUID *Guid,\r
8a43e8dd 214 IN UINTN ExTokenNumber\r
878ddf1f 215 )\r
216{\r
52e1905d 217 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
878ddf1f 218}\r
219\r
220\r
221\r
222UINT64\r
223EFIAPI\r
224PeiPcdGet64Ex (\r
225 IN CONST EFI_GUID *Guid,\r
8a43e8dd 226 IN UINTN ExTokenNumber\r
878ddf1f 227 )\r
228{\r
52e1905d 229 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
878ddf1f 230}\r
231\r
232\r
233\r
234VOID *\r
235EFIAPI\r
236PeiPcdGetPtrEx (\r
237 IN CONST EFI_GUID *Guid,\r
8a43e8dd 238 IN UINTN ExTokenNumber\r
878ddf1f 239 )\r
240{\r
52e1905d 241 return ExGetWorker (Guid, ExTokenNumber, 0);\r
878ddf1f 242}\r
243\r
244\r
245\r
246BOOLEAN\r
247EFIAPI\r
248PeiPcdGetBoolEx (\r
249 IN CONST EFI_GUID *Guid,\r
8a43e8dd 250 IN UINTN ExTokenNumber\r
878ddf1f 251 )\r
252{\r
52e1905d 253 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
878ddf1f 254}\r
255\r
256\r
257\r
258UINTN\r
259EFIAPI\r
260PeiPcdGetSizeEx (\r
261 IN CONST EFI_GUID *Guid,\r
8a43e8dd 262 IN UINTN ExTokenNumber\r
878ddf1f 263 )\r
264{\r
9d6d8b24 265 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
878ddf1f 266}\r
267\r
268\r
269\r
270EFI_STATUS\r
271EFIAPI\r
272PeiPcdSet8 (\r
8a43e8dd 273 IN UINTN TokenNumber,\r
878ddf1f 274 IN UINT8 Value\r
275 )\r
276{\r
52e1905d 277 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 278}\r
279\r
280\r
281\r
282EFI_STATUS\r
283EFIAPI\r
284PeiPcdSet16 (\r
8a43e8dd 285 IN UINTN TokenNumber,\r
878ddf1f 286 IN UINT16 Value\r
287 )\r
288{\r
52e1905d 289 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 290}\r
291\r
292\r
293\r
294EFI_STATUS\r
295EFIAPI\r
296PeiPcdSet32 (\r
8a43e8dd 297 IN UINTN TokenNumber,\r
878ddf1f 298 IN UINT32 Value\r
299 )\r
300{\r
52e1905d 301 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 302}\r
303\r
304\r
305\r
306EFI_STATUS\r
307EFIAPI\r
308PeiPcdSet64 (\r
8a43e8dd 309 IN UINTN TokenNumber,\r
878ddf1f 310 IN UINT64 Value\r
311 )\r
312{\r
52e1905d 313 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 314}\r
315\r
316\r
317EFI_STATUS\r
318EFIAPI\r
319PeiPcdSetPtr (\r
8a43e8dd 320 IN UINTN TokenNumber,\r
00b7af13 321 IN UINTN SizeOfBuffer,\r
322 IN VOID *Buffer\r
878ddf1f 323 )\r
324{\r
00b7af13 325 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
878ddf1f 326}\r
327\r
328\r
329\r
330EFI_STATUS\r
331EFIAPI\r
332PeiPcdSetBool (\r
8a43e8dd 333 IN UINTN TokenNumber,\r
878ddf1f 334 IN BOOLEAN Value\r
335 )\r
336{\r
52e1905d 337 return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
878ddf1f 338}\r
339\r
340\r
341\r
342EFI_STATUS\r
343EFIAPI\r
344PeiPcdSet8Ex (\r
345 IN CONST EFI_GUID *Guid,\r
8a43e8dd 346 IN UINTN ExTokenNumber,\r
878ddf1f 347 IN UINT8 Value\r
348 )\r
349{\r
52e1905d 350 return ExSetWorker(\r
351 ExTokenNumber, \r
352 Guid,\r
353 &Value, \r
354 sizeof (Value), \r
355 FALSE\r
356 );\r
878ddf1f 357}\r
358\r
359\r
360\r
361EFI_STATUS\r
362EFIAPI\r
363PeiPcdSet16Ex (\r
364 IN CONST EFI_GUID *Guid,\r
8a43e8dd 365 IN UINTN ExTokenNumber,\r
878ddf1f 366 IN UINT16 Value\r
367 )\r
368{\r
52e1905d 369 return ExSetWorker(\r
370 ExTokenNumber, \r
371 Guid,\r
372 &Value, \r
373 sizeof (Value), \r
374 FALSE\r
375 );\r
878ddf1f 376}\r
377\r
378\r
379\r
380EFI_STATUS\r
381EFIAPI\r
382PeiPcdSet32Ex (\r
383 IN CONST EFI_GUID *Guid,\r
8a43e8dd 384 IN UINTN ExTokenNumber,\r
878ddf1f 385 IN UINT32 Value\r
386 )\r
387{\r
52e1905d 388 return ExSetWorker(\r
389 ExTokenNumber, \r
390 Guid,\r
391 &Value, \r
392 sizeof (Value), \r
393 FALSE\r
394 );\r
878ddf1f 395}\r
396\r
397\r
398\r
399EFI_STATUS\r
400EFIAPI\r
401PeiPcdSet64Ex (\r
402 IN CONST EFI_GUID *Guid,\r
8a43e8dd 403 IN UINTN ExTokenNumber,\r
878ddf1f 404 IN UINT64 Value\r
405 )\r
406{\r
52e1905d 407 return ExSetWorker(\r
408 ExTokenNumber, \r
409 Guid,\r
410 &Value, \r
411 sizeof (Value), \r
412 FALSE\r
413 );\r
878ddf1f 414}\r
415\r
416\r
417\r
418EFI_STATUS\r
419EFIAPI\r
420PeiPcdSetPtrEx (\r
421 IN CONST EFI_GUID *Guid,\r
8a43e8dd 422 IN UINTN ExTokenNumber,\r
00b7af13 423 IN UINTN SizeOfBuffer,\r
424 IN VOID *Value\r
878ddf1f 425 )\r
426{\r
52e1905d 427 return ExSetWorker(\r
428 ExTokenNumber, \r
429 Guid,\r
00b7af13 430 Value, \r
431 SizeOfBuffer, \r
52e1905d 432 TRUE\r
433 );\r
878ddf1f 434}\r
435\r
436\r
437\r
438EFI_STATUS\r
439EFIAPI\r
440PeiPcdSetBoolEx (\r
441 IN CONST EFI_GUID *Guid,\r
8a43e8dd 442 IN UINTN ExTokenNumber,\r
878ddf1f 443 IN BOOLEAN Value\r
444 )\r
445{\r
52e1905d 446 return ExSetWorker(\r
447 ExTokenNumber, \r
448 Guid,\r
449 &Value, \r
450 sizeof (Value), \r
451 FALSE\r
452 );\r
878ddf1f 453}\r
454\r
455\r
456\r
457\r
458EFI_STATUS\r
459EFIAPI\r
4c114006 460PeiRegisterCallBackOnSet (\r
8a43e8dd 461 IN UINTN ExTokenNumber,\r
878ddf1f 462 IN CONST EFI_GUID *Guid, OPTIONAL\r
463 IN PCD_PPI_CALLBACK CallBackFunction\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
8a43e8dd 476 IN UINTN ExTokenNumber,\r
878ddf1f 477 IN CONST EFI_GUID *Guid, OPTIONAL\r
478 IN PCD_PPI_CALLBACK CallBackFunction\r
479 )\r
480{\r
4c114006 481 ASSERT (CallBackFunction != NULL);\r
482 \r
52e1905d 483 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
878ddf1f 484}\r
485\r
486\r
487\r
488EFI_STATUS\r
489EFIAPI\r
490PeiPcdGetNextToken (\r
491 IN CONST EFI_GUID *Guid, OPTIONAL\r
8a43e8dd 492 IN OUT UINTN *TokenNumber\r
878ddf1f 493 )\r
494{\r
00b7af13 495 UINTN GuidTableIdx;\r
496 PEI_PCD_DATABASE *PeiPcdDb;\r
497 EFI_GUID *MatchGuid;\r
498 DYNAMICEX_MAPPING *ExMapTable;\r
499 UINTN i;\r
500 BOOLEAN Found;\r
501 \r
52e1905d 502 if (Guid == NULL) {\r
b560bb65 503 (*TokenNumber)++;\r
52e1905d 504\r
00b7af13 505 if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
0653eb89 506 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
52e1905d 507 }\r
00b7af13 508 \r
509 } else {\r
510\r
511 if (PEI_EXMAP_TABLE_EMPTY) {\r
0653eb89 512 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
00b7af13 513 return EFI_NOT_FOUND;\r
514 }\r
515 \r
516 //\r
517 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
518 // 1) ExGuid\r
519 // 2) ExTokenNumber\r
520 //\r
521 PeiPcdDb = GetPcdDatabase ();\r
522 \r
523 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
524\r
525 if (MatchGuid == NULL) {\r
526 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
527 return EFI_NOT_FOUND;\r
528 }\r
529\r
530 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
531\r
532 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
533\r
534 Found = FALSE;\r
535 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
536 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
537 Found = TRUE;\r
538 break;\r
539 }\r
540 }\r
541\r
542 if (Found) {\r
543 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
544 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
545 return EFI_SUCCESS;\r
546 }\r
547 \r
548 for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
549 if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
550 i++;\r
551 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
552 *TokenNumber = ExMapTable[i].ExTokenNumber;\r
553 return EFI_SUCCESS;\r
554 } else {\r
555 *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
556 return EFI_SUCCESS;\r
557 }\r
558 }\r
559 }\r
560\r
561 return EFI_NOT_FOUND;\r
562 }\r
563 \r
564 }\r
565\r
566 return EFI_SUCCESS;\r
567}\r
568\r
58f1099f 569EFI_STATUS\r
00b7af13 570EFIAPI\r
571PeiPcdGetNextTokenSpaceGuid (\r
58f1099f 572 IN OUT CONST EFI_GUID **Guid\r
00b7af13 573 )\r
574{\r
575 UINTN GuidTableIdx;\r
576 EFI_GUID *MatchGuid;\r
577 PEI_PCD_DATABASE *PeiPcdDb;\r
578 DYNAMICEX_MAPPING *ExMapTable;\r
579 UINTN i;\r
580 BOOLEAN Found;\r
581\r
58f1099f 582 if (*Guid == NULL) {\r
583 if (PEI_EXMAP_TABLE_EMPTY) {\r
584 return EFI_SUCCESS;\r
585 } else {\r
586 //\r
587 // return the first Token Space Guid.\r
588 //\r
589 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
590 return EFI_SUCCESS;\r
591 }\r
592 }\r
52e1905d 593\r
594 //\r
00b7af13 595 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
596 // 1) ExGuid\r
597 // 2) ExTokenNumber\r
52e1905d 598 //\r
00b7af13 599 PeiPcdDb = GetPcdDatabase ();\r
52e1905d 600\r
58f1099f 601 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
00b7af13 602\r
603 if (MatchGuid == NULL) {\r
58f1099f 604 return EFI_NOT_FOUND;\r
00b7af13 605 }\r
606 \r
607 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
878ddf1f 608\r
00b7af13 609 ExMapTable = PeiPcdDb->Init.ExMapTable;\r
610\r
611 Found = FALSE;\r
612 for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
613 if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
614 Found = TRUE;\r
615 break;\r
616 }\r
617 }\r
618\r
619 if (Found) {\r
620 for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
621 if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
58f1099f 622 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
623 return EFI_SUCCESS;\r
00b7af13 624 }\r
625 }\r
626 }\r
627\r
58f1099f 628 return EFI_NOT_FOUND;\r
00b7af13 629\r
630}\r
878ddf1f 631\r