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