]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/PCD/Pei/Pcd.c
Synchronize PCD_Infrastructure 0.55 with source code.
[mirror_edk2.git] / MdeModulePkg / Universal / PCD / Pei / Pcd.c
1 /** @file
2 All Pcd Ppi services are implemented here.
3
4 Copyright (c) 2006 - 2008, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "Service.h"
16
17 PCD_PPI mPcdPpiInstance = {
18 PeiPcdSetSku,
19
20 PeiPcdGet8,
21 PeiPcdGet16,
22 PeiPcdGet32,
23 PeiPcdGet64,
24 PeiPcdGetPtr,
25 PeiPcdGetBool,
26 PeiPcdGetSize,
27
28 PeiPcdGet8Ex,
29 PeiPcdGet16Ex,
30 PeiPcdGet32Ex,
31 PeiPcdGet64Ex,
32 PeiPcdGetPtrEx,
33 PeiPcdGetBoolEx,
34 PeiPcdGetSizeEx,
35
36 PeiPcdSet8,
37 PeiPcdSet16,
38 PeiPcdSet32,
39 PeiPcdSet64,
40 PeiPcdSetPtr,
41 PeiPcdSetBool,
42
43 PeiPcdSet8Ex,
44 PeiPcdSet16Ex,
45 PeiPcdSet32Ex,
46 PeiPcdSet64Ex,
47 PeiPcdSetPtrEx,
48 PeiPcdSetBoolEx,
49
50 PeiRegisterCallBackOnSet,
51 PcdUnRegisterCallBackOnSet,
52 PeiPcdGetNextToken,
53 PeiPcdGetNextTokenSpace
54 };
55
56 EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {
57 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
58 &gPcdPpiGuid,
59 &mPcdPpiInstance
60 };
61
62 /**
63 Main entry for PCD PEIM driver.
64
65 This routine initialize the PCD database for PEI phase and install PCD_PPI.
66
67 @param FileHandle Handle of the file being invoked.
68 @param PeiServices Describes the list of possible PEI Services.
69
70 @return Status of install PCD_PPI
71
72 **/
73 EFI_STATUS
74 EFIAPI
75 PcdPeimInit (
76 IN EFI_PEI_FILE_HANDLE FileHandle,
77 IN CONST EFI_PEI_SERVICES **PeiServices
78 )
79 {
80 BuildPcdDatabase ();
81
82 return PeiServicesInstallPpi (&mPpiPCD);
83 }
84
85 /**
86 Sets the SKU value for subsequent calls to set or get PCD token values.
87
88 SetSku() sets the SKU Id to be used for subsequent calls to set or get PCD values.
89 SetSku() is normally called only once by the system.
90
91 For each item (token), the database can hold a single value that applies to all SKUs,
92 or multiple values, where each value is associated with a specific SKU Id. Items with multiple,
93 SKU-specific values are called SKU enabled.
94
95 The SKU Id of zero is reserved as a default. The valid SkuId range is 1 to 255.
96 For tokens that are not SKU enabled, the system ignores any set SKU Id and works with the
97 single value for that token. For SKU-enabled tokens, the system will use the SKU Id set by the
98 last call to SetSku(). If no SKU Id is set or the currently set SKU Id isn't valid for the specified token,
99 the system uses the default SKU Id. If the system attempts to use the default SKU Id and no value has been
100 set for that Id, the results are unpredictable.
101
102 @param[in] SkuId The SKU value that will be used when the PCD service will retrieve and
103 set values associated with a PCD token.
104
105 **/
106 VOID
107 EFIAPI
108 PeiPcdSetSku (
109 IN UINTN SkuId
110 )
111 {
112
113 GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;
114
115 return;
116 }
117
118 /**
119 Retrieves an 8-bit value for a given PCD token.
120
121 Retrieves the current byte-sized value for a PCD token number.
122 If the TokenNumber is invalid, the results are unpredictable.
123
124 @param[in] TokenNumber The PCD token number.
125
126 @return The UINT8 value.
127
128 **/
129 UINT8
130 EFIAPI
131 PeiPcdGet8 (
132 IN UINTN TokenNumber
133 )
134 {
135 return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));
136 }
137
138 /**
139 Retrieves an 16-bit value for a given PCD token.
140
141 Retrieves the current 16-bits value for a PCD token number.
142 If the TokenNumber is invalid, the results are unpredictable.
143
144 @param[in] TokenNumber The PCD token number.
145
146 @return The UINT16 value.
147
148 **/
149 UINT16
150 EFIAPI
151 PeiPcdGet16 (
152 IN UINTN TokenNumber
153 )
154 {
155 return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));
156 }
157
158 /**
159 Retrieves an 32-bit value for a given PCD token.
160
161 Retrieves the current 32-bits value for a PCD token number.
162 If the TokenNumber is invalid, the results are unpredictable.
163
164 @param[in] TokenNumber The PCD token number.
165
166 @return The UINT32 value.
167
168 **/
169 UINT32
170 EFIAPI
171 PeiPcdGet32 (
172 IN UINTN TokenNumber
173 )
174 {
175 return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));
176 }
177
178 /**
179 Retrieves an 64-bit value for a given PCD token.
180
181 Retrieves the current 64-bits value for a PCD token number.
182 If the TokenNumber is invalid, the results are unpredictable.
183
184 @param[in] TokenNumber The PCD token number.
185
186 @return The UINT64 value.
187
188 **/
189 UINT64
190 EFIAPI
191 PeiPcdGet64 (
192 IN UINTN TokenNumber
193 )
194 {
195 return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));
196 }
197
198 /**
199 Retrieves a pointer to a value for a given PCD token.
200
201 Retrieves the current pointer to the buffer for a PCD token number.
202 Do not make any assumptions about the alignment of the pointer that
203 is returned by this function call. If the TokenNumber is invalid,
204 the results are unpredictable.
205
206 @param[in] TokenNumber The PCD token number.
207
208 @return The pointer to the buffer to be retrieved.
209
210 **/
211 VOID *
212 EFIAPI
213 PeiPcdGetPtr (
214 IN UINTN TokenNumber
215 )
216 {
217 return GetWorker (TokenNumber, 0);
218 }
219
220 /**
221 Retrieves a Boolean value for a given PCD token.
222
223 Retrieves the current boolean value for a PCD token number.
224 Do not make any assumptions about the alignment of the pointer that
225 is returned by this function call. If the TokenNumber is invalid,
226 the results are unpredictable.
227
228 @param[in] TokenNumber The PCD token number.
229
230 @return The Boolean value.
231
232 **/
233 BOOLEAN
234 EFIAPI
235 PeiPcdGetBool (
236 IN UINTN TokenNumber
237 )
238 {
239 return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));
240 }
241
242 /**
243 Retrieves the size of the value for a given PCD token.
244
245 Retrieves the current size of a particular PCD token.
246 If the TokenNumber is invalid, the results are unpredictable.
247
248 @param[in] TokenNumber The PCD token number.
249
250 @return The size of the value for the PCD token.
251
252 **/
253 UINTN
254 EFIAPI
255 PeiPcdGetSize (
256 IN UINTN TokenNumber
257 )
258 {
259 PEI_PCD_DATABASE *PeiPcdDb;
260 UINTN Size;
261 UINTN MaxSize;
262
263 PeiPcdDb = GetPcdDatabase ();
264 //
265 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
266 // We have to decrement TokenNumber by 1 to make it usable
267 // as the array index.
268 //
269 TokenNumber--;
270
271 // EBC compiler is very choosy. It may report warning about comparison
272 // between UINTN and 0 . So we add 1 in each size of the
273 // comparison.
274 ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);
275
276 Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;
277
278 if (Size == 0) {
279 //
280 // For pointer type, we need to scan the SIZE_TABLE to get the current size.
281 //
282 return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);
283 } else {
284 return Size;
285 }
286
287 }
288
289 /**
290 Retrieves an 8-bit value for a given PCD token.
291
292 Retrieves the 8-bit value of a particular PCD token.
293 If the TokenNumber is invalid or the token space
294 specified by Guid does not exist, the results are
295 unpredictable.
296
297 @param[in] Guid The token space for the token number.
298 @param[in] ExTokenNumber The PCD token number.
299
300 @return The size 8-bit value for the PCD token.
301
302 **/
303 UINT8
304 EFIAPI
305 PeiPcdGet8Ex (
306 IN CONST EFI_GUID *Guid,
307 IN UINTN ExTokenNumber
308 )
309 {
310 return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));
311 }
312
313 /**
314 Retrieves an 16-bit value for a given PCD token.
315
316 Retrieves the 16-bit value of a particular PCD token.
317 If the TokenNumber is invalid or the token space
318 specified by Guid does not exist, the results are
319 unpredictable.
320
321 @param[in] Guid The token space for the token number.
322 @param[in] ExTokenNumber The PCD token number.
323
324 @return The size 16-bit value for the PCD token.
325
326 **/
327 UINT16
328 EFIAPI
329 PeiPcdGet16Ex (
330 IN CONST EFI_GUID *Guid,
331 IN UINTN ExTokenNumber
332 )
333 {
334 return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));
335 }
336
337 /**
338 Retrieves an 32-bit value for a given PCD token.
339
340 Retrieves the 32-bit value of a particular PCD token.
341 If the TokenNumber is invalid or the token space
342 specified by Guid does not exist, the results are
343 unpredictable.
344
345 @param[in] Guid The token space for the token number.
346 @param[in] ExTokenNumber The PCD token number.
347
348 @return The size 32-bit value for the PCD token.
349
350 **/
351 UINT32
352 EFIAPI
353 PeiPcdGet32Ex (
354 IN CONST EFI_GUID *Guid,
355 IN UINTN ExTokenNumber
356 )
357 {
358 return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));
359 }
360
361 /**
362 Retrieves an 64-bit value for a given PCD token.
363
364 Retrieves the 64-bit value of a particular PCD token.
365 If the TokenNumber is invalid or the token space
366 specified by Guid does not exist, the results are
367 unpredictable.
368
369 @param[in] Guid The token space for the token number.
370 @param[in] ExTokenNumber The PCD token number.
371
372 @return The size 64-bit value for the PCD token.
373
374 **/
375 UINT64
376 EFIAPI
377 PeiPcdGet64Ex (
378 IN CONST EFI_GUID *Guid,
379 IN UINTN ExTokenNumber
380 )
381 {
382 return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));
383 }
384
385 /**
386 Retrieves a pointer to a value for a given PCD token.
387
388 Retrieves the current pointer to the buffer for a PCD token number.
389 Do not make any assumptions about the alignment of the pointer that
390 is returned by this function call. If the TokenNumber is invalid,
391 the results are unpredictable.
392
393 @param[in] Guid The token space for the token number.
394 @param[in] ExTokenNumber The PCD token number.
395
396 @return The pointer to the buffer to be retrieved.
397
398 **/
399 VOID *
400 EFIAPI
401 PeiPcdGetPtrEx (
402 IN CONST EFI_GUID *Guid,
403 IN UINTN ExTokenNumber
404 )
405 {
406 return ExGetWorker (Guid, ExTokenNumber, 0);
407 }
408
409 /**
410 Retrieves an Boolean value for a given PCD token.
411
412 Retrieves the Boolean value of a particular PCD token.
413 If the TokenNumber is invalid or the token space
414 specified by Guid does not exist, the results are
415 unpredictable.
416
417 @param[in] Guid The token space for the token number.
418 @param[in] ExTokenNumber The PCD token number.
419
420 @return The size Boolean value for the PCD token.
421
422 **/
423 BOOLEAN
424 EFIAPI
425 PeiPcdGetBoolEx (
426 IN CONST EFI_GUID *Guid,
427 IN UINTN ExTokenNumber
428 )
429 {
430 return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));
431 }
432
433 /**
434 Retrieves the size of the value for a given PCD token.
435
436 Retrieves the current size of a particular PCD token.
437 If the TokenNumber is invalid, the results are unpredictable.
438
439 @param[in] Guid The token space for the token number.
440 @param[in] ExTokenNumber The PCD token number.
441
442 @return The size of the value for the PCD token.
443
444 **/
445 UINTN
446 EFIAPI
447 PeiPcdGetSizeEx (
448 IN CONST EFI_GUID *Guid,
449 IN UINTN ExTokenNumber
450 )
451 {
452 return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));
453 }
454
455 /**
456 Sets an 8-bit value for a given PCD token.
457
458 When the PCD service sets a value, it will check to ensure that the
459 size of the value being set is compatible with the Token's existing definition.
460 If it is not, an error will be returned.
461
462 @param[in] TokenNumber The PCD token number.
463 @param[in] Value The value to set for the PCD token.
464
465 @retval EFI_SUCCESS Procedure returned successfully.
466 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
467 being set was incompatible with a call to this function.
468 Use GetSize() to retrieve the size of the target data.
469 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
470
471 **/
472 EFI_STATUS
473 EFIAPI
474 PeiPcdSet8 (
475 IN UINTN TokenNumber,
476 IN UINT8 Value
477 )
478 {
479 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
480 }
481
482 /**
483 Sets an 16-bit value for a given PCD token.
484
485 When the PCD service sets a value, it will check to ensure that the
486 size of the value being set is compatible with the Token's existing definition.
487 If it is not, an error will be returned.
488
489 @param[in] TokenNumber The PCD token number.
490 @param[in] Value The value to set for the PCD token.
491
492 @retval EFI_SUCCESS Procedure returned successfully.
493 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
494 being set was incompatible with a call to this function.
495 Use GetSize() to retrieve the size of the target data.
496 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
497
498 **/
499 EFI_STATUS
500 EFIAPI
501 PeiPcdSet16 (
502 IN UINTN TokenNumber,
503 IN UINT16 Value
504 )
505 {
506 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
507 }
508
509 /**
510 Sets an 32-bit value for a given PCD token.
511
512 When the PCD service sets a value, it will check to ensure that the
513 size of the value being set is compatible with the Token's existing definition.
514 If it is not, an error will be returned.
515
516 @param[in] TokenNumber The PCD token number.
517 @param[in] Value The value to set for the PCD token.
518
519 @retval EFI_SUCCESS Procedure returned successfully.
520 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
521 being set was incompatible with a call to this function.
522 Use GetSize() to retrieve the size of the target data.
523 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
524
525 **/
526 EFI_STATUS
527 EFIAPI
528 PeiPcdSet32 (
529 IN UINTN TokenNumber,
530 IN UINT32 Value
531 )
532 {
533 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
534 }
535
536 /**
537 Sets an 64-bit value for a given PCD token.
538
539 When the PCD service sets a value, it will check to ensure that the
540 size of the value being set is compatible with the Token's existing definition.
541 If it is not, an error will be returned.
542
543 @param[in] TokenNumber The PCD token number.
544 @param[in] Value The value to set for the PCD token.
545
546 @retval EFI_SUCCESS Procedure returned successfully.
547 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
548 being set was incompatible with a call to this function.
549 Use GetSize() to retrieve the size of the target data.
550 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
551
552 **/
553 EFI_STATUS
554 EFIAPI
555 PeiPcdSet64 (
556 IN UINTN TokenNumber,
557 IN UINT64 Value
558 )
559 {
560 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
561 }
562
563 /**
564 Sets a value of a specified size for a given PCD token.
565
566 When the PCD service sets a value, it will check to ensure that the
567 size of the value being set is compatible with the Token's existing definition.
568 If it is not, an error will be returned.
569
570 @param[in] TokenNumber The PCD token number.
571 @param[in, out] SizeOfBuffer A pointer to the length of the value being set for the PCD token.
572 On input, if the SizeOfValue is greater than the maximum size supported
573 for this TokenNumber then the output value of SizeOfValue will reflect
574 the maximum size supported for this TokenNumber.
575 @param[in] Buffer The buffer to set for the PCD token.
576
577 @retval EFI_SUCCESS Procedure returned successfully.
578 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
579 being set was incompatible with a call to this function.
580 Use GetSize() to retrieve the size of the target data.
581 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
582
583 **/
584 EFI_STATUS
585 EFIAPI
586 PeiPcdSetPtr (
587 IN UINTN TokenNumber,
588 IN OUT UINTN *SizeOfBuffer,
589 IN VOID *Buffer
590 )
591 {
592 return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);
593 }
594
595 /**
596 Sets an Boolean value for a given PCD token.
597
598 When the PCD service sets a value, it will check to ensure that the
599 size of the value being set is compatible with the Token's existing definition.
600 If it is not, an error will be returned.
601
602 @param[in] TokenNumber The PCD token number.
603 @param[in] Value The value to set for the PCD token.
604
605 @retval EFI_SUCCESS Procedure returned successfully.
606 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
607 being set was incompatible with a call to this function.
608 Use GetSize() to retrieve the size of the target data.
609 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
610
611 **/
612 EFI_STATUS
613 EFIAPI
614 PeiPcdSetBool (
615 IN UINTN TokenNumber,
616 IN BOOLEAN Value
617 )
618 {
619 return SetValueWorker (TokenNumber, &Value, sizeof (Value));
620 }
621
622 /**
623 Sets an 8-bit value for a given PCD token.
624
625 When the PCD service sets a value, it will check to ensure that the
626 size of the value being set is compatible with the Token's existing definition.
627 If it is not, an error will be returned.
628
629 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
630 @param[in] ExTokenNumber The PCD token number.
631 @param[in] Value The value to set for the PCD token.
632
633 @retval EFI_SUCCESS Procedure returned successfully.
634 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
635 being set was incompatible with a call to this function.
636 Use GetSize() to retrieve the size of the target data.
637 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
638
639 **/
640 EFI_STATUS
641 EFIAPI
642 PeiPcdSet8Ex (
643 IN CONST EFI_GUID *Guid,
644 IN UINTN ExTokenNumber,
645 IN UINT8 Value
646 )
647 {
648 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
649 }
650
651 /**
652 Sets an 16-bit value for a given PCD token.
653
654 When the PCD service sets a value, it will check to ensure that the
655 size of the value being set is compatible with the Token's existing definition.
656 If it is not, an error will be returned.
657
658 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
659 @param[in] ExTokenNumber The PCD token number.
660 @param[in] Value The value to set for the PCD token.
661
662 @retval EFI_SUCCESS Procedure returned successfully.
663 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
664 being set was incompatible with a call to this function.
665 Use GetSize() to retrieve the size of the target data.
666 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
667
668 **/
669 EFI_STATUS
670 EFIAPI
671 PeiPcdSet16Ex (
672 IN CONST EFI_GUID *Guid,
673 IN UINTN ExTokenNumber,
674 IN UINT16 Value
675 )
676 {
677 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
678 }
679
680 /**
681 Sets an 32-bit value for a given PCD token.
682
683 When the PCD service sets a value, it will check to ensure that the
684 size of the value being set is compatible with the Token's existing definition.
685 If it is not, an error will be returned.
686
687 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
688 @param[in] ExTokenNumber The PCD token number.
689 @param[in] Value The value to set for the PCD token.
690
691 @retval EFI_SUCCESS Procedure returned successfully.
692 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
693 being set was incompatible with a call to this function.
694 Use GetSize() to retrieve the size of the target data.
695 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
696
697 **/
698 EFI_STATUS
699 EFIAPI
700 PeiPcdSet32Ex (
701 IN CONST EFI_GUID *Guid,
702 IN UINTN ExTokenNumber,
703 IN UINT32 Value
704 )
705 {
706 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
707 }
708
709 /**
710 Sets an 64-bit value for a given PCD token.
711
712 When the PCD service sets a value, it will check to ensure that the
713 size of the value being set is compatible with the Token's existing definition.
714 If it is not, an error will be returned.
715
716 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
717 @param[in] ExTokenNumber The PCD token number.
718 @param[in] Value The value to set for the PCD token.
719
720 @retval EFI_SUCCESS Procedure returned successfully.
721 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
722 being set was incompatible with a call to this function.
723 Use GetSize() to retrieve the size of the target data.
724 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
725
726 **/
727 EFI_STATUS
728 EFIAPI
729 PeiPcdSet64Ex (
730 IN CONST EFI_GUID *Guid,
731 IN UINTN ExTokenNumber,
732 IN UINT64 Value
733 )
734 {
735 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
736 }
737
738 /**
739 Sets a value of a specified size for a given PCD token.
740
741 When the PCD service sets a value, it will check to ensure that the
742 size of the value being set is compatible with the Token's existing definition.
743 If it is not, an error will be returned.
744
745 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
746 @param[in] ExTokenNumber The PCD token number.
747 @param[in, out] SizeOfBuffer A pointer to the length of the value being set for the PCD token.
748 On input, if the SizeOfValue is greater than the maximum size supported
749 for this TokenNumber then the output value of SizeOfValue will reflect
750 the maximum size supported for this TokenNumber.
751 @param[in] Value The buffer to set for the PCD token.
752
753 @retval EFI_SUCCESS Procedure returned successfully.
754 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
755 being set was incompatible with a call to this function.
756 Use GetSize() to retrieve the size of the target data.
757 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
758
759 **/
760 EFI_STATUS
761 EFIAPI
762 PeiPcdSetPtrEx (
763 IN CONST EFI_GUID *Guid,
764 IN UINTN ExTokenNumber,
765 IN OUT UINTN *SizeOfBuffer,
766 IN VOID *Value
767 )
768 {
769 return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);
770 }
771
772 /**
773 Sets an Boolean value for a given PCD token.
774
775 When the PCD service sets a value, it will check to ensure that the
776 size of the value being set is compatible with the Token's existing definition.
777 If it is not, an error will be returned.
778
779 @param [in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
780 @param [in] ExTokenNumber The PCD token number.
781 @param [in] Value The value to set for the PCD token.
782
783 @retval EFI_SUCCESS Procedure returned successfully.
784 @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
785 being set was incompatible with a call to this function.
786 Use GetSize() to retrieve the size of the target data.
787 @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
788
789 **/
790 EFI_STATUS
791 EFIAPI
792 PeiPcdSetBoolEx (
793 IN CONST EFI_GUID *Guid,
794 IN UINTN ExTokenNumber,
795 IN BOOLEAN Value
796 )
797 {
798 return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));
799 }
800
801 /**
802 Specifies a function to be called anytime the value of a designated token is changed.
803
804 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
805 @param[in] ExTokenNumber The PCD token number.
806 @param[in] CallBackFunction The function prototype called when the value associated with the CallBackToken is set.
807
808 @retval EFI_SUCCESS The PCD service has successfully established a call event
809 for the CallBackToken requested.
810 @retval EFI_NOT_FOUND The PCD service could not find the referenced token number.
811
812 **/
813 EFI_STATUS
814 EFIAPI
815 PeiRegisterCallBackOnSet (
816 IN CONST EFI_GUID *Guid, OPTIONAL
817 IN UINTN ExTokenNumber,
818 IN PCD_PPI_CALLBACK CallBackFunction
819 )
820 {
821 if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) {
822 return EFI_UNSUPPORTED;
823 }
824
825 if (CallBackFunction == NULL) {
826 return EFI_INVALID_PARAMETER;
827 }
828
829 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);
830 }
831
832 /**
833 Cancels a previously set callback function for a particular PCD token number.
834
835 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
836 @param[in] ExTokenNumber The PCD token number.
837 @param[in] CallBackFunction The function prototype called when the value associated with the CallBackToken is set.
838
839 @retval EFI_SUCCESS The PCD service has successfully established a call event
840 for the CallBackToken requested.
841 @retval EFI_NOT_FOUND The PCD service could not find the referenced token number.
842
843 **/
844 EFI_STATUS
845 EFIAPI
846 PcdUnRegisterCallBackOnSet (
847 IN CONST EFI_GUID *Guid, OPTIONAL
848 IN UINTN ExTokenNumber,
849 IN PCD_PPI_CALLBACK CallBackFunction
850 )
851 {
852 if (!FeaturePcdGet(PcdPeiFullPcdDatabaseEnable)) {
853 return EFI_UNSUPPORTED;
854 }
855
856 if (CallBackFunction == NULL) {
857 return EFI_INVALID_PARAMETER;
858 }
859
860 return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);
861 }
862
863 /**
864 Retrieves the next valid token number in a given namespace.
865
866 This is useful since the PCD infrastructure contains a sparse list of token numbers,
867 and one cannot a priori know what token numbers are valid in the database.
868
869 If TokenNumber is 0 and Guid is not NULL, then the first token from the token space specified by Guid is returned.
870 If TokenNumber is not 0 and Guid is not NULL, then the next token in the token space specified by Guid is returned.
871 If TokenNumber is 0 and Guid is NULL, then the first token in the default token space is returned.
872 If TokenNumber is not 0 and Guid is NULL, then the next token in the default token space is returned.
873 The token numbers in the default token space may not be related to token numbers in token spaces that are named by Guid.
874 If the next token number can be retrieved, then it is returned in TokenNumber, and EFI_SUCCESS is returned.
875 If TokenNumber represents the last token number in the token space specified by Guid, then EFI_NOT_FOUND is returned.
876 If TokenNumber is not present in the token space specified by Guid, then EFI_NOT_FOUND is returned.
877
878
879 @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value.
880 This is an optional parameter that may be NULL. If this parameter is NULL, then a request
881 is being made to retrieve tokens from the default token space.
882 @param[in, out] TokenNumber A pointer to the PCD token number to use to find the subsequent token number.
883
884 @retval EFI_SUCCESS The PCD service has retrieved the next valid token number.
885 Or the input token number is already the last valid token number in the PCD database.
886 In the later case, *TokenNumber is updated with the value of 0.
887 @retval EFI_NOT_FOUND If this input token number and token namespace does not exist on the platform.
888
889 **/
890 EFI_STATUS
891 EFIAPI
892 PeiPcdGetNextToken (
893 IN CONST EFI_GUID *Guid, OPTIONAL
894 IN OUT UINTN *TokenNumber
895 )
896 {
897 UINTN GuidTableIdx;
898 PEI_PCD_DATABASE *PeiPcdDb;
899 EFI_GUID *MatchGuid;
900 DYNAMICEX_MAPPING *ExMapTable;
901 UINTN Index;
902 BOOLEAN Found;
903 BOOLEAN PeiExMapTableEmpty;
904
905 if (!FeaturePcdGet (PcdPeiFullPcdDatabaseEnable)) {
906 return EFI_UNSUPPORTED;
907 }
908
909 PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;
910
911 if (Guid == NULL) {
912 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {
913 return EFI_NOT_FOUND;
914 }
915 (*TokenNumber)++;
916 if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {
917 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;
918 }
919 return EFI_SUCCESS;
920 } else {
921 if (PeiExMapTableEmpty) {
922 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;
923 return EFI_SUCCESS;
924 }
925
926 //
927 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
928 // 1) ExGuid
929 // 2) ExTokenNumber
930 //
931 PeiPcdDb = GetPcdDatabase ();
932
933 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);
934
935 if (MatchGuid == NULL) {
936 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;
937 return EFI_NOT_FOUND;
938 }
939
940 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;
941
942 ExMapTable = PeiPcdDb->Init.ExMapTable;
943
944 Found = FALSE;
945 //
946 // Locate the GUID in ExMapTable first.
947 //
948 for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) {
949 if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {
950 Found = TRUE;
951 break;
952 }
953 }
954
955 if (Found) {
956 if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {
957 *TokenNumber = ExMapTable[Index].ExTokenNumber;
958 return EFI_SUCCESS;
959 }
960
961 for ( ; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) {
962 if (ExMapTable[Index].ExTokenNumber == *TokenNumber) {
963 Index++;
964 if (Index == PEI_EXMAPPING_TABLE_SIZE) {
965 //
966 // Exceed the length of ExMap Table
967 //
968 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;
969 return EFI_SUCCESS;
970 }
971 if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {
972 *TokenNumber = ExMapTable[Index].ExTokenNumber;
973 return EFI_SUCCESS;
974 } else {
975 *TokenNumber = PCD_INVALID_TOKEN_NUMBER;
976 return EFI_SUCCESS;
977 }
978 }
979 }
980 return EFI_NOT_FOUND;
981 }
982 }
983
984 return EFI_NOT_FOUND;
985 }
986
987 /**
988 Retrieves the next valid PCD token namespace for a given namespace.
989
990 @param[in, out] Guid An indirect pointer to EFI_GUID. On input it designates
991 a known token namespace from which the search will start. On output,
992 it designates the next valid token namespace on the platform. If the input
993 token namespace does not exist on the platform, an error is returned and
994 the value of *Guid is undefined. If *Guid is NULL, then the GUID of the
995 first token space of the current platform is assigned to *Guid the function
996 return EFI_SUCCESS. If *Guid is NULL and there is no namespace exist in
997 the platform other than the default (NULL) tokennamespace, *Guid is unchanged
998 and the function return EFI_SUCCESS. If this input token namespace is the last
999 namespace on the platform, *Guid will be assigned to NULL and the function return
1000 EFI_SUCCESS.
1001
1002 @retval EFI_SUCCESS The PCD service retrieved the next valid token space Guid.
1003 Or the input token space Guid is already the last valid token space Guid
1004 in the PCD database. In the later case, *Guid is updated with the value of NULL.
1005 @retval EFI_NOT_FOUND If the input token namespace does not exist on the platform.
1006
1007 **/
1008 EFI_STATUS
1009 EFIAPI
1010 PeiPcdGetNextTokenSpace (
1011 IN OUT CONST EFI_GUID **Guid
1012 )
1013 {
1014 UINTN GuidTableIdx;
1015 EFI_GUID *MatchGuid;
1016 PEI_PCD_DATABASE *PeiPcdDb;
1017 DYNAMICEX_MAPPING *ExMapTable;
1018 UINTN Index;
1019 BOOLEAN Found;
1020 BOOLEAN PeiExMapTableEmpty;
1021
1022 if (!FeaturePcdGet (PcdPeiFullPcdDatabaseEnable)) {
1023 return EFI_UNSUPPORTED;
1024 }
1025
1026 ASSERT (Guid != NULL);
1027
1028 PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;
1029
1030 if (PeiExMapTableEmpty) {
1031 if (*Guid != NULL) {
1032 return EFI_NOT_FOUND;
1033 } else {
1034 return EFI_SUCCESS;
1035 }
1036 }
1037
1038 //
1039 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
1040 // 1) ExGuid
1041 // 2) ExTokenNumber
1042 //
1043 PeiPcdDb = GetPcdDatabase ();
1044
1045 ExMapTable = PeiPcdDb->Init.ExMapTable;
1046
1047 if (*Guid == NULL) {
1048 //
1049 // return the first Token Space Guid.
1050 //
1051 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];
1052 return EFI_SUCCESS;
1053 }
1054
1055 MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);
1056
1057 if (MatchGuid == NULL) {
1058 return EFI_NOT_FOUND;
1059 }
1060
1061 GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;
1062
1063 Found = FALSE;
1064 for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) {
1065 if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) {
1066 Found = TRUE;
1067 break;
1068 }
1069 }
1070
1071 if (Found) {
1072 Index++;
1073 for ( ; Index < PEI_EXMAPPING_TABLE_SIZE; Index++ ) {
1074 if (ExMapTable[Index].ExGuidIndex != GuidTableIdx ) {
1075 *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[Index].ExGuidIndex];
1076 return EFI_SUCCESS;
1077 }
1078 }
1079 *Guid = NULL;
1080 return EFI_SUCCESS;
1081 }
1082
1083 return EFI_NOT_FOUND;
1084
1085 }
1086
1087 /**
1088 Get PCD value's size for POINTER type PCD.
1089
1090 The POINTER type PCD's value will be stored into a buffer in specificed size.
1091 The max size of this PCD's value is described in PCD's definition in DEC file.
1092
1093 @param LocalTokenNumberTableIdx Index of PCD token number in PCD token table
1094 @param MaxSize Maximum size of PCD's value
1095 @param Database Pcd database in PEI phase.
1096
1097 @return PCD value's size for POINTER type PCD.
1098
1099 **/
1100 UINTN
1101 GetPtrTypeSize (
1102 IN UINTN LocalTokenNumberTableIdx,
1103 OUT UINTN *MaxSize,
1104 IN PEI_PCD_DATABASE *Database
1105 )
1106 {
1107 INTN SizeTableIdx;
1108 UINTN LocalTokenNumber;
1109 SKU_ID *SkuIdTable;
1110 SIZE_INFO *SizeTable;
1111 UINTN Index;
1112
1113 SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);
1114
1115 LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];
1116
1117 ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);
1118
1119 SizeTable = Database->Init.SizeTable;
1120
1121 *MaxSize = SizeTable[SizeTableIdx];
1122 //
1123 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1124 // PCD entry.
1125 //
1126 if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {
1127 //
1128 // We have only one entry for VPD enabled PCD entry:
1129 // 1) MAX Size.
1130 // We consider current size is equal to MAX size.
1131 //
1132 return *MaxSize;
1133 } else {
1134 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {
1135 //
1136 // We have only two entry for Non-Sku enabled PCD entry:
1137 // 1) MAX SIZE
1138 // 2) Current Size
1139 //
1140 return SizeTable[SizeTableIdx + 1];
1141 } else {
1142 //
1143 // We have these entry for SKU enabled PCD entry
1144 // 1) MAX SIZE
1145 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1146 //
1147 SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);
1148 for (Index = 0; Index < SkuIdTable[0]; Index++) {
1149 if (SkuIdTable[1 + Index] == Database->Init.SystemSkuId) {
1150 return SizeTable[SizeTableIdx + 1 + Index];
1151 }
1152 }
1153 return SizeTable[SizeTableIdx + 1];
1154 }
1155 }
1156 }
1157
1158 /**
1159 Set PCD value's size for POINTER type PCD.
1160
1161 The POINTER type PCD's value will be stored into a buffer in specificed size.
1162 The max size of this PCD's value is described in PCD's definition in DEC file.
1163
1164 @param LocalTokenNumberTableIdx Index of PCD token number in PCD token table
1165 @param CurrentSize Maximum size of PCD's value
1166 @param Database Pcd database in PEI phase.
1167
1168 @retval TRUE Success to set PCD's value size, which is not exceed maximum size
1169 @retval FALSE Fail to set PCD's value size, which maybe exceed maximum size
1170
1171 **/
1172 BOOLEAN
1173 SetPtrTypeSize (
1174 IN UINTN LocalTokenNumberTableIdx,
1175 IN OUT UINTN *CurrentSize,
1176 IN PEI_PCD_DATABASE *Database
1177 )
1178 {
1179 INTN SizeTableIdx;
1180 UINTN LocalTokenNumber;
1181 SKU_ID *SkuIdTable;
1182 SIZE_INFO *SizeTable;
1183 UINTN Index;
1184 UINTN MaxSize;
1185
1186 SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);
1187
1188 LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];
1189
1190 ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);
1191
1192 SizeTable = Database->Init.SizeTable;
1193
1194 MaxSize = SizeTable[SizeTableIdx];
1195 //
1196 // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type
1197 // PCD entry.
1198 //
1199 if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {
1200 //
1201 // We shouldn't come here as we don't support SET for VPD
1202 //
1203 ASSERT (FALSE);
1204 return FALSE;
1205 } else {
1206 if ((*CurrentSize > MaxSize) ||
1207 (*CurrentSize == MAX_ADDRESS)) {
1208 *CurrentSize = MaxSize;
1209 return FALSE;
1210 }
1211
1212 if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {
1213 //
1214 // We have only two entry for Non-Sku enabled PCD entry:
1215 // 1) MAX SIZE
1216 // 2) Current Size
1217 //
1218 SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;
1219 return TRUE;
1220 } else {
1221 //
1222 // We have these entry for SKU enabled PCD entry
1223 // 1) MAX SIZE
1224 // 2) Current Size for each SKU_ID (It is equal to MaxSku).
1225 //
1226 SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);
1227 for (Index = 0; Index < SkuIdTable[0]; Index++) {
1228 if (SkuIdTable[1 + Index] == Database->Init.SystemSkuId) {
1229 SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize;
1230 return TRUE;
1231 }
1232 }
1233 SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;
1234 return TRUE;
1235 }
1236 }
1237
1238 }