1 /** @file
2 Private functions used by PCD DXE driver.
3 
4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
5 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 #ifndef _PCD_DXE_SERVICE_H_
16 #define _PCD_DXE_SERVICE_H_
17 
18 #include <PiDxe.h>
19 #include <Guid/PcdDataBaseHobGuid.h>
20 #include <Guid/PcdDataBaseSignatureGuid.h>
21 #include <Protocol/Pcd.h>
22 #include <Protocol/PiPcd.h>
23 #include <Protocol/PcdInfo.h>
24 #include <Protocol/PiPcdInfo.h>
25 #include <Protocol/VarCheck.h>
26 #include <Protocol/VariableLock.h>
27 #include <Library/BaseLib.h>
28 #include <Library/DebugLib.h>
29 #include <Library/UefiLib.h>
30 #include <Library/UefiDriverEntryPoint.h>
31 #include <Library/PcdLib.h>
32 #include <Library/HobLib.h>
33 #include <Library/MemoryAllocationLib.h>
34 #include <Library/UefiBootServicesTableLib.h>
35 #include <Library/BaseMemoryLib.h>
36 #include <Library/UefiRuntimeServicesTableLib.h>
37 
38 //
39 // Please make sure the PCD Serivce DXE Version is consistent with
40 // the version of the generated DXE PCD Database by build tool.
41 //
42 #define PCD_SERVICE_DXE_VERSION      5
43 
44 //
45 // PCD_DXE_SERVICE_DRIVER_VERSION is defined in Autogen.h.
46 //
47 #if (PCD_SERVICE_DXE_VERSION != PCD_DXE_SERVICE_DRIVER_VERSION)
48   #error "Please make sure the version of PCD DXE Service and the generated PCD DXE Database match."
49 #endif
50 
51 /**
52   Retrieve additional information associated with a PCD token in the default token space.
53 
54   This includes information such as the type of value the TokenNumber is associated with as well as possible
55   human readable name that is associated with the token.
56 
57   @param[in]    TokenNumber The PCD token number.
58   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.
59                             The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.
60 
61   @retval  EFI_SUCCESS      The PCD information was returned successfully.
62   @retval  EFI_NOT_FOUND    The PCD service could not find the requested token number.
63 **/
64 EFI_STATUS
65 EFIAPI
66 DxeGetPcdInfoGetInfo (
67   IN        UINTN           TokenNumber,
68   OUT       EFI_PCD_INFO    *PcdInfo
69   );
70 
71 /**
72   Retrieve additional information associated with a PCD token.
73 
74   This includes information such as the type of value the TokenNumber is associated with as well as possible
75   human readable name that is associated with the token.
76 
77   @param[in]    Guid        The 128-bit unique value that designates the namespace from which to extract the value.
78   @param[in]    TokenNumber The PCD token number.
79   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.
80                             The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.
81 
82   @retval  EFI_SUCCESS      The PCD information was returned successfully.
83   @retval  EFI_NOT_FOUND    The PCD service could not find the requested token number.
84 **/
85 EFI_STATUS
86 EFIAPI
87 DxeGetPcdInfoGetInfoEx (
88   IN CONST  EFI_GUID        *Guid,
89   IN        UINTN           TokenNumber,
90   OUT       EFI_PCD_INFO    *PcdInfo
91   );
92 
93 /**
94   Retrieve the currently set SKU Id.
95 
96   @return   The currently set SKU Id. If the platform has not set at a SKU Id, then the
97             default SKU Id value of 0 is returned. If the platform has set a SKU Id, then the currently set SKU
98             Id is returned.
99 **/
100 UINTN
101 EFIAPI
102 DxeGetPcdInfoGetSku (
103   VOID
104   );
105 
106 //
107 // Protocol Interface function declaration.
108 //
109 /**
110   Sets the SKU value for subsequent calls to set or get PCD token values.
111 
112   SetSku() sets the SKU Id to be used for subsequent calls to set or get PCD values.
113   SetSku() is normally called only once by the system.
114 
115   For each item (token), the database can hold a single value that applies to all SKUs,
116   or multiple values, where each value is associated with a specific SKU Id. Items with multiple,
117   SKU-specific values are called SKU enabled.
118 
119   The SKU Id of zero is reserved as a default. The valid SkuId range is 1 to 255.
120   For tokens that are not SKU enabled, the system ignores any set SKU Id and works with the
121   single value for that token. For SKU-enabled tokens, the system will use the SKU Id set by the
122   last call to SetSku(). If no SKU Id is set or the currently set SKU Id isn't valid for the specified token,
123   the system uses the default SKU Id. If the system attempts to use the default SKU Id and no value has been
124   set for that Id, the results are unpredictable.
125 
126   @param[in]  SkuId The SKU value that will be used when the PCD service will retrieve and
127               set values associated with a PCD token.
128 
129 **/
130 VOID
131 EFIAPI
132 DxePcdSetSku (
133   IN  UINTN                  SkuId
134   );
135 
136 /**
137   Retrieves an 8-bit value for a given PCD token.
138 
139   Retrieves the current byte-sized value for a PCD token number.
140   If the TokenNumber is invalid, the results are unpredictable.
141 
142   @param[in]  TokenNumber The PCD token number.
143 
144   @return The UINT8 value.
145 
146 **/
147 UINT8
148 EFIAPI
149 DxePcdGet8 (
150   IN UINTN             TokenNumber
151   );
152 
153 /**
154   Retrieves an 16-bit value for a given PCD token.
155 
156   Retrieves the current 16-bits value for a PCD token number.
157   If the TokenNumber is invalid, the results are unpredictable.
158 
159   @param[in]  TokenNumber The PCD token number.
160 
161   @return The UINT16 value.
162 
163 **/
164 UINT16
165 EFIAPI
166 DxePcdGet16 (
167   IN UINTN             TokenNumber
168   );
169 
170 /**
171   Retrieves an 32-bit value for a given PCD token.
172 
173   Retrieves the current 32-bits value for a PCD token number.
174   If the TokenNumber is invalid, the results are unpredictable.
175 
176   @param[in]  TokenNumber The PCD token number.
177 
178   @return The UINT32 value.
179 
180 **/
181 UINT32
182 EFIAPI
183 DxePcdGet32 (
184   IN UINTN             TokenNumber
185   );
186 
187 /**
188   Retrieves an 64-bit value for a given PCD token.
189 
190   Retrieves the current 64-bits value for a PCD token number.
191   If the TokenNumber is invalid, the results are unpredictable.
192 
193   @param[in]  TokenNumber The PCD token number.
194 
195   @return The UINT64 value.
196 
197 **/
198 UINT64
199 EFIAPI
200 DxePcdGet64 (
201   IN UINTN             TokenNumber
202   );
203 
204 /**
205   Retrieves a pointer to a value for a given PCD token.
206 
207   Retrieves the current pointer to the buffer for a PCD token number.
208   Do not make any assumptions about the alignment of the pointer that
209   is returned by this function call.  If the TokenNumber is invalid,
210   the results are unpredictable.
211 
212   @param[in]  TokenNumber The PCD token number.
213 
214   @return The pointer to the buffer to be retrieved.
215 
216 **/
217 VOID *
218 EFIAPI
219 DxePcdGetPtr (
220   IN UINTN             TokenNumber
221   );
222 
223 /**
224   Retrieves a Boolean value for a given PCD token.
225 
226   Retrieves the current boolean value for a PCD token number.
227   Do not make any assumptions about the alignment of the pointer that
228   is returned by this function call.  If the TokenNumber is invalid,
229   the results are unpredictable.
230 
231   @param[in]  TokenNumber The PCD token number.
232 
233   @return The Boolean value.
234 
235 **/
236 BOOLEAN
237 EFIAPI
238 DxePcdGetBool (
239   IN UINTN             TokenNumber
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 DxePcdGetSize (
256   IN UINTN             TokenNumber
257   );
258 
259 /**
260   Retrieves an 8-bit value for a given PCD token.
261 
262   Retrieves the 8-bit value of a particular PCD token.
263   If the TokenNumber is invalid or the token space
264   specified by Guid does not exist, the results are
265   unpredictable.
266 
267   @param[in]  Guid The token space for the token number.
268   @param[in]  TokenNumber The PCD token number.
269 
270   @return The size 8-bit value for the PCD token.
271 
272 **/
273 UINT8
274 EFIAPI
275 DxePcdGet8Ex (
276   IN CONST EFI_GUID        *Guid,
277   IN UINTN             TokenNumber
278   );
279 
280 /**
281   Retrieves an 16-bit value for a given PCD token.
282 
283   Retrieves the 16-bit value of a particular PCD token.
284   If the TokenNumber is invalid or the token space
285   specified by Guid does not exist, the results are
286   unpredictable.
287 
288   @param[in]  Guid The token space for the token number.
289   @param[in]  TokenNumber The PCD token number.
290 
291   @return The size 16-bit value for the PCD token.
292 
293 **/
294 UINT16
295 EFIAPI
296 DxePcdGet16Ex (
297   IN CONST EFI_GUID        *Guid,
298   IN UINTN             TokenNumber
299   );
300 
301 /**
302   Retrieves an 32-bit value for a given PCD token.
303 
304   Retrieves the 32-bit value of a particular PCD token.
305   If the TokenNumber is invalid or the token space
306   specified by Guid does not exist, the results are
307   unpredictable.
308 
309   @param[in]  Guid The token space for the token number.
310   @param[in]  TokenNumber The PCD token number.
311 
312   @return The size 32-bit value for the PCD token.
313 
314 **/
315 UINT32
316 EFIAPI
317 DxePcdGet32Ex (
318   IN CONST EFI_GUID        *Guid,
319   IN UINTN             TokenNumber
320   );
321 
322 /**
323   Retrieves an 64-bit value for a given PCD token.
324 
325   Retrieves the 64-bit value of a particular PCD token.
326   If the TokenNumber is invalid or the token space
327   specified by Guid does not exist, the results are
328   unpredictable.
329 
330   @param[in]  Guid The token space for the token number.
331   @param[in]  TokenNumber The PCD token number.
332 
333   @return The size 64-bit value for the PCD token.
334 
335 **/
336 UINT64
337 EFIAPI
338 DxePcdGet64Ex (
339   IN CONST EFI_GUID        *Guid,
340   IN UINTN             TokenNumber
341   );
342 
343 /**
344   Retrieves a pointer to a value for a given PCD token.
345 
346   Retrieves the current pointer to the buffer for a PCD token number.
347   Do not make any assumptions about the alignment of the pointer that
348   is returned by this function call.  If the TokenNumber is invalid,
349   the results are unpredictable.
350 
351   @param[in]  Guid The token space for the token number.
352   @param[in]  TokenNumber The PCD token number.
353 
354   @return The pointer to the buffer to be retrieved.
355 
356 **/
357 VOID *
358 EFIAPI
359 DxePcdGetPtrEx (
360   IN CONST EFI_GUID        *Guid,
361   IN UINTN             TokenNumber
362   );
363 
364 /**
365   Retrieves an Boolean value for a given PCD token.
366 
367   Retrieves the Boolean value of a particular PCD token.
368   If the TokenNumber is invalid or the token space
369   specified by Guid does not exist, the results are
370   unpredictable.
371 
372   @param[in]  Guid The token space for the token number.
373   @param[in]  TokenNumber The PCD token number.
374 
375   @return The size Boolean value for the PCD token.
376 
377 **/
378 BOOLEAN
379 EFIAPI
380 DxePcdGetBoolEx (
381   IN CONST EFI_GUID        *Guid,
382   IN UINTN             TokenNumber
383   );
384 
385 /**
386   Retrieves the size of the value for a given PCD token.
387 
388   Retrieves the current size of a particular PCD token.
389   If the TokenNumber is invalid, the results are unpredictable.
390 
391   @param[in]  Guid The token space for the token number.
392   @param[in]  TokenNumber The PCD token number.
393 
394   @return The size of the value for the PCD token.
395 
396 **/
397 UINTN
398 EFIAPI
399 DxePcdGetSizeEx (
400   IN CONST EFI_GUID        *Guid,
401   IN UINTN             TokenNumber
402   );
403 
404 /**
405   Sets an 8-bit value for a given PCD token.
406 
407   When the PCD service sets a value, it will check to ensure that the
408   size of the value being set is compatible with the Token's existing definition.
409   If it is not, an error will be returned.
410 
411   @param[in]  TokenNumber The PCD token number.
412   @param[in]  Value The value to set for the PCD token.
413 
414   @retval EFI_SUCCESS  Procedure returned successfully.
415   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
416                                   being set was incompatible with a call to this function.
417                                   Use GetSize() to retrieve the size of the target data.
418   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
419 
420 **/
421 EFI_STATUS
422 EFIAPI
423 DxePcdSet8 (
424   IN UINTN             TokenNumber,
425   IN UINT8             Value
426   );
427 
428 /**
429   Sets an 16-bit value for a given PCD token.
430 
431   When the PCD service sets a value, it will check to ensure that the
432   size of the value being set is compatible with the Token's existing definition.
433   If it is not, an error will be returned.
434 
435   @param[in]  TokenNumber The PCD token number.
436   @param[in]  Value The value to set for the PCD token.
437 
438   @retval EFI_SUCCESS  Procedure returned successfully.
439   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
440                                   being set was incompatible with a call to this function.
441                                   Use GetSize() to retrieve the size of the target data.
442   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
443 
444 **/
445 EFI_STATUS
446 EFIAPI
447 DxePcdSet16 (
448   IN UINTN             TokenNumber,
449   IN UINT16             Value
450   );
451 
452 /**
453   Sets an 32-bit value for a given PCD token.
454 
455   When the PCD service sets a value, it will check to ensure that the
456   size of the value being set is compatible with the Token's existing definition.
457   If it is not, an error will be returned.
458 
459   @param[in]  TokenNumber The PCD token number.
460   @param[in]  Value The value to set for the PCD token.
461 
462   @retval EFI_SUCCESS  Procedure returned successfully.
463   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
464                                   being set was incompatible with a call to this function.
465                                   Use GetSize() to retrieve the size of the target data.
466   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
467 
468 **/
469 EFI_STATUS
470 EFIAPI
471 DxePcdSet32 (
472   IN UINTN             TokenNumber,
473   IN UINT32             Value
474   );
475 
476 /**
477   Sets an 64-bit value for a given PCD token.
478 
479   When the PCD service sets a value, it will check to ensure that the
480   size of the value being set is compatible with the Token's existing definition.
481   If it is not, an error will be returned.
482 
483   @param[in]  TokenNumber The PCD token number.
484   @param[in]  Value The value to set for the PCD token.
485 
486   @retval EFI_SUCCESS  Procedure returned successfully.
487   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
488                                   being set was incompatible with a call to this function.
489                                   Use GetSize() to retrieve the size of the target data.
490   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
491 
492 **/
493 EFI_STATUS
494 EFIAPI
495 DxePcdSet64 (
496   IN UINTN             TokenNumber,
497   IN UINT64            Value
498   );
499 
500 
501 /**
502   Sets a value of a specified size for a given PCD token.
503 
504   When the PCD service sets a value, it will check to ensure that the
505   size of the value being set is compatible with the Token's existing definition.
506   If it is not, an error will be returned.
507 
508   @param[in]  TokenNumber The PCD token number.
509   @param[in, out] SizeOfBuffer A pointer to the length of the value being set for the PCD token.
510                               On input, if the SizeOfValue is greater than the maximum size supported
511                               for this TokenNumber then the output value of SizeOfValue will reflect
512                               the maximum size supported for this TokenNumber.
513   @param[in]  Buffer The buffer to set for the PCD token.
514 
515   @retval EFI_SUCCESS  Procedure returned successfully.
516   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
517                                   being set was incompatible with a call to this function.
518                                   Use GetSize() to retrieve the size of the target data.
519   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
520 
521 **/
522 EFI_STATUS
523 EFIAPI
524 DxePcdSetPtr (
525   IN        UINTN             TokenNumber,
526   IN OUT    UINTN             *SizeOfBuffer,
527   IN        VOID              *Buffer
528   );
529 
530 /**
531   Sets an Boolean value for a given PCD token.
532 
533   When the PCD service sets a value, it will check to ensure that the
534   size of the value being set is compatible with the Token's existing definition.
535   If it is not, an error will be returned.
536 
537   @param[in]  TokenNumber The PCD token number.
538   @param[in]  Value The value to set for the PCD token.
539 
540   @retval EFI_SUCCESS  Procedure returned successfully.
541   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
542                                   being set was incompatible with a call to this function.
543                                   Use GetSize() to retrieve the size of the target data.
544   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
545 
546 **/
547 EFI_STATUS
548 EFIAPI
549 DxePcdSetBool (
550   IN UINTN             TokenNumber,
551   IN BOOLEAN           Value
552   );
553 
554 
555 /**
556   Sets an 8-bit value for a given PCD token.
557 
558   When the PCD service sets a value, it will check to ensure that the
559   size of the value being set is compatible with the Token's existing definition.
560   If it is not, an error will be returned.
561 
562   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
563   @param[in]  TokenNumber The PCD token number.
564   @param[in]  Value The value to set for the PCD token.
565 
566   @retval EFI_SUCCESS  Procedure returned successfully.
567   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
568                                   being set was incompatible with a call to this function.
569                                   Use GetSize() to retrieve the size of the target data.
570   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
571 
572 **/
573 EFI_STATUS
574 EFIAPI
575 DxePcdSet8Ex (
576   IN CONST EFI_GUID        *Guid,
577   IN UINTN             TokenNumber,
578   IN UINT8             Value
579   );
580 
581 /**
582   Sets an 16-bit value for a given PCD token.
583 
584   When the PCD service sets a value, it will check to ensure that the
585   size of the value being set is compatible with the Token's existing definition.
586   If it is not, an error will be returned.
587 
588   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
589   @param[in]  TokenNumber The PCD token number.
590   @param[in]  Value The value to set for the PCD token.
591 
592   @retval EFI_SUCCESS  Procedure returned successfully.
593   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
594                                   being set was incompatible with a call to this function.
595                                   Use GetSize() to retrieve the size of the target data.
596   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
597 
598 **/
599 EFI_STATUS
600 EFIAPI
601 DxePcdSet16Ex (
602   IN CONST EFI_GUID        *Guid,
603   IN UINTN             TokenNumber,
604   IN UINT16            Value
605   );
606 
607 /**
608   Sets an 32-bit value for a given PCD token.
609 
610   When the PCD service sets a value, it will check to ensure that the
611   size of the value being set is compatible with the Token's existing definition.
612   If it is not, an error will be returned.
613 
614   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
615   @param[in]  TokenNumber The PCD token number.
616   @param[in]  Value The value to set for the PCD token.
617 
618   @retval EFI_SUCCESS  Procedure returned successfully.
619   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
620                                   being set was incompatible with a call to this function.
621                                   Use GetSize() to retrieve the size of the target data.
622   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
623 
624 **/
625 EFI_STATUS
626 EFIAPI
627 DxePcdSet32Ex (
628   IN CONST EFI_GUID        *Guid,
629   IN UINTN             TokenNumber,
630   IN UINT32             Value
631   );
632 
633 /**
634   Sets an 64-bit value for a given PCD token.
635 
636   When the PCD service sets a value, it will check to ensure that the
637   size of the value being set is compatible with the Token's existing definition.
638   If it is not, an error will be returned.
639 
640   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
641   @param[in]  TokenNumber The PCD token number.
642   @param[in]  Value The value to set for the PCD token.
643 
644   @retval EFI_SUCCESS  Procedure returned successfully.
645   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
646                                   being set was incompatible with a call to this function.
647                                   Use GetSize() to retrieve the size of the target data.
648   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
649 
650 **/
651 EFI_STATUS
652 EFIAPI
653 DxePcdSet64Ex (
654   IN CONST EFI_GUID        *Guid,
655   IN UINTN             TokenNumber,
656   IN UINT64            Value
657   );
658 
659 /**
660   Sets a value of a specified size for a given PCD token.
661 
662   When the PCD service sets a value, it will check to ensure that the
663   size of the value being set is compatible with the Token's existing definition.
664   If it is not, an error will be returned.
665 
666   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
667   @param[in]  TokenNumber The PCD token number.
668   @param[in, out] SizeOfBuffer A pointer to the length of the value being set for the PCD token.
669                               On input, if the SizeOfValue is greater than the maximum size supported
670                               for this TokenNumber then the output value of SizeOfValue will reflect
671                               the maximum size supported for this TokenNumber.
672   @param[in]  Buffer The buffer to set for the PCD token.
673 
674   @retval EFI_SUCCESS  Procedure returned successfully.
675   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
676                                   being set was incompatible with a call to this function.
677                                   Use GetSize() to retrieve the size of the target data.
678   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
679 
680 **/
681 EFI_STATUS
682 EFIAPI
683 DxePcdSetPtrEx (
684   IN        CONST EFI_GUID    *Guid,
685   IN        UINTN             TokenNumber,
686   IN OUT    UINTN             *SizeOfBuffer,
687   IN        VOID              *Buffer
688   );
689 
690 /**
691   Sets an Boolean value for a given PCD token.
692 
693   When the PCD service sets a value, it will check to ensure that the
694   size of the value being set is compatible with the Token's existing definition.
695   If it is not, an error will be returned.
696 
697   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
698   @param[in]  TokenNumber The PCD token number.
699   @param[in]  Value The value to set for the PCD token.
700 
701   @retval EFI_SUCCESS  Procedure returned successfully.
702   @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
703                                   being set was incompatible with a call to this function.
704                                   Use GetSize() to retrieve the size of the target data.
705   @retval EFI_NOT_FOUND The PCD service could not find the requested token number.
706 
707 **/
708 EFI_STATUS
709 EFIAPI
710 DxePcdSetBoolEx (
711   IN CONST EFI_GUID    *Guid,
712   IN UINTN             TokenNumber,
713   IN BOOLEAN           Value
714   );
715 
716 /**
717   Specifies a function to be called anytime the value of a designated token is changed.
718 
719   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
720   @param[in]  TokenNumber The PCD token number.
721   @param[in]  CallBackFunction The function prototype called when the value associated with the CallBackToken is set.
722 
723   @retval EFI_SUCCESS  The PCD service has successfully established a call event
724                         for the CallBackToken requested.
725   @retval EFI_NOT_FOUND The PCD service could not find the referenced token number.
726 
727 **/
728 EFI_STATUS
729 EFIAPI
730 DxeRegisterCallBackOnSet (
731   IN  CONST EFI_GUID          *Guid, OPTIONAL
732   IN  UINTN                   TokenNumber,
733   IN  PCD_PROTOCOL_CALLBACK   CallBackFunction
734   );
735 
736 /**
737   Cancels a previously set callback function for a particular PCD token number.
738 
739   @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
740   @param[in]  TokenNumber The PCD token number.
741   @param[in]  CallBackFunction The function prototype called when the value associated with the CallBackToken is set.
742 
743   @retval EFI_SUCCESS  The PCD service has successfully established a call event
744                         for the CallBackToken requested.
745   @retval EFI_NOT_FOUND The PCD service could not find the referenced token number.
746 
747 **/
748 EFI_STATUS
749 EFIAPI
750 DxeUnRegisterCallBackOnSet (
751   IN  CONST EFI_GUID          *Guid, OPTIONAL
752   IN  UINTN                   TokenNumber,
753   IN  PCD_PROTOCOL_CALLBACK   CallBackFunction
754   );
755 
756 /**
757   Retrieves the next valid token number in a given namespace.
758 
759   This is useful since the PCD infrastructure contains a sparse list of token numbers,
760   and one cannot a priori know what token numbers are valid in the database.
761 
762   If TokenNumber is 0 and Guid is not NULL, then the first token from the token space specified by Guid is returned.
763   If TokenNumber is not 0 and Guid is not NULL, then the next token in the token space specified by Guid is returned.
764   If TokenNumber is 0 and Guid is NULL, then the first token in the default token space is returned.
765   If TokenNumber is not 0 and Guid is NULL, then the next token in the default token space is returned.
766   The token numbers in the default token space may not be related to token numbers in token spaces that are named by Guid.
767   If the next token number can be retrieved, then it is returned in TokenNumber, and EFI_SUCCESS is returned.
768   If TokenNumber represents the last token number in the token space specified by Guid, then EFI_NOT_FOUND is returned.
769   If TokenNumber is not present in the token space specified by Guid, then EFI_NOT_FOUND is returned.
770 
771 
772   @param[in]      Guid    The 128-bit unique value that designates the namespace from which to retrieve the next token.
773                           This is an optional parameter that may be NULL.  If this parameter is NULL, then a request is
774                           being made to retrieve tokens from the default token space.
775   @param[in, out] TokenNumber
776                           A pointer to the PCD token number to use to find the subsequent token number.
777 
778   @retval EFI_SUCCESS   The PCD service retrieved the next valid token number. Or the input token number
779                         is already the last valid token number in the PCD database.
780                         In the later case, *TokenNumber is updated with the value of 0.
781   @retval EFI_NOT_FOUND If this input token number and token namespace does not exist on the platform.
782 
783 **/
784 EFI_STATUS
785 EFIAPI
786 DxePcdGetNextToken (
787   IN CONST EFI_GUID               *Guid, OPTIONAL
788   IN OUT   UINTN                  *TokenNumber
789   );
790 
791 /**
792   Get next token space in PCD database according to given token space guid.
793 
794   @param Guid            Given token space guid. If NULL, then Guid will be set to
795                          the first PCD token space in PCD database, If not NULL, then
796                          Guid will be set to next PCD token space.
797 
798   @retval EFI_NOT_FOUND   If PCD database has no token space table or can not find given
799                           token space in PCD database.
800   @retval EFI_SUCCESS     Success to get next token space guid.
801 **/
802 EFI_STATUS
803 EFIAPI
804 DxePcdGetNextTokenSpace (
805   IN OUT CONST EFI_GUID               **Guid
806   );
807 
808 typedef struct {
809   LIST_ENTRY              Node;
810   PCD_PROTOCOL_CALLBACK   CallbackFn;
811 } CALLBACK_FN_ENTRY;
812 
813 #define CR_FNENTRY_FROM_LISTNODE(Record, Type, Field) BASE_CR(Record, Type, Field)
814 
815 //
816 // Internal Functions
817 //
818 
819 /**
820   Retrieve additional information associated with a PCD token.
821 
822   This includes information such as the type of value the TokenNumber is associated with as well as possible
823   human readable name that is associated with the token.
824 
825   @param[in]    Guid        The 128-bit unique value that designates the namespace from which to extract the value.
826   @param[in]    TokenNumber The PCD token number.
827   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.
828                             The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.
829 
830   @retval  EFI_SUCCESS      The PCD information was returned successfully
831   @retval  EFI_NOT_FOUND    The PCD service could not find the requested token number.
832 **/
833 EFI_STATUS
834 DxeGetPcdInfo (
835   IN CONST  EFI_GUID        *Guid,
836   IN        UINTN           TokenNumber,
837   OUT       EFI_PCD_INFO    *PcdInfo
838   );
839 
840 /**
841   Wrapper function for setting non-pointer type value for a PCD entry.
842 
843   @param TokenNumber     Pcd token number autogenerated by build tools.
844   @param Data            Value want to be set for PCD entry
845   @param Size            Size of value.
846 
847   @return status of SetWorker.
848 
849 **/
850 EFI_STATUS
851 SetValueWorker (
852   IN UINTN                   TokenNumber,
853   IN VOID                    *Data,
854   IN UINTN                   Size
855   );
856 
857 /**
858   Set value for an PCD entry
859 
860   @param TokenNumber     Pcd token number autogenerated by build tools.
861   @param Data            Value want to be set for PCD entry
862   @param Size            Size of value.
863   @param PtrType         If TRUE, the type of PCD entry's value is Pointer.
864                          If False, the type of PCD entry's value is not Pointer.
865 
866   @retval EFI_INVALID_PARAMETER  If this PCD type is VPD, VPD PCD can not be set.
867   @retval EFI_INVALID_PARAMETER  If Size can not be set to size table.
868   @retval EFI_INVALID_PARAMETER  If Size of non-Ptr type PCD does not match the size information in PCD database.
869   @retval EFI_NOT_FOUND          If value type of PCD entry is intergrate, but not in
870                                  range of UINT8, UINT16, UINT32, UINT64
871   @retval EFI_NOT_FOUND          Can not find the PCD type according to token number.
872 **/
873 EFI_STATUS
874 SetWorker (
875   IN          UINTN                     TokenNumber,
876   IN          VOID                      *Data,
877   IN OUT      UINTN                     *Size,
878   IN          BOOLEAN                   PtrType
879   );
880 
881 /**
882   Wrapper function for set PCD value for non-Pointer type dynamic-ex PCD.
883 
884   @param ExTokenNumber   Token number for dynamic-ex PCD.
885   @param Guid            Token space guid for dynamic-ex PCD.
886   @param Data            Value want to be set.
887   @param SetSize         The size of value.
888 
889   @return status of ExSetWorker().
890 
891 **/
892 EFI_STATUS
893 ExSetValueWorker (
894   IN          UINTN                ExTokenNumber,
895   IN          CONST EFI_GUID       *Guid,
896   IN          VOID                 *Data,
897   IN          UINTN                SetSize
898   );
899 
900 /**
901   Set value for a dynamic PCD entry.
902 
903   This routine find the local token number according to dynamic-ex PCD's token
904   space guid and token number firstly, and invoke callback function if this PCD
905   entry registered callback function. Finally, invoken general SetWorker to set
906   PCD value.
907 
908   @param ExTokenNumber   Dynamic-ex PCD token number.
909   @param Guid            Token space guid for dynamic-ex PCD.
910   @param Data            PCD value want to be set
911   @param SetSize         Size of value.
912   @param PtrType         If TRUE, this PCD entry is pointer type.
913                          If FALSE, this PCD entry is not pointer type.
914 
915   @return status of SetWorker().
916 
917 **/
918 EFI_STATUS
919 ExSetWorker (
920   IN      UINTN                ExTokenNumber,
921   IN      CONST EFI_GUID       *Guid,
922   IN      VOID                 *Data,
923   IN OUT  UINTN                *Size,
924   IN      BOOLEAN              PtrType
925   );
926 
927 /**
928   Get the PCD entry pointer in PCD database.
929 
930   This routine will visit PCD database to find the PCD entry according to given
931   token number. The given token number is autogened by build tools and it will be
932   translated to local token number. Local token number contains PCD's type and
933   offset of PCD entry in PCD database.
934 
935   @param TokenNumber     Token's number, it is autogened by build tools
936   @param GetSize         The size of token's value
937 
938   @return PCD entry pointer in PCD database
939 
940 **/
941 VOID *
942 GetWorker (
943   IN UINTN             TokenNumber,
944   IN UINTN             GetSize
945   );
946 
947 /**
948   Wrapper function for get PCD value for dynamic-ex PCD.
949 
950   @param Guid            Token space guid for dynamic-ex PCD.
951   @param ExTokenNumber   Token number for dynamic-ex PCD.
952   @param GetSize         The size of dynamic-ex PCD value.
953 
954   @return PCD entry in PCD database.
955 
956 **/
957 VOID *
958 ExGetWorker (
959   IN CONST EFI_GUID         *Guid,
960   IN UINTN                  ExTokenNumber,
961   IN UINTN                  GetSize
962   );
963 
964 /**
965   Find the local token number according to system SKU ID.
966 
967   @param LocalTokenNumber PCD token number
968   @param Size             The size of PCD entry.
969   @param IsPeiDb          If TRUE, the PCD entry is initialized in PEI phase.
970                           If False, the PCD entry is initialized in DXE phase.
971 
972   @return Token number according to system SKU ID.
973 
974 **/
975 UINT32
976 GetSkuEnabledTokenNumber (
977   UINT32 LocalTokenNumber,
978   UINTN  Size,
979   BOOLEAN IsPeiDb
980   );
981 
982 /**
983   Get Variable which contains HII type PCD entry.
984 
985   @param VariableGuid    Variable's guid
986   @param VariableName    Variable's unicode name string
987   @param VariableData    Variable's data pointer,
988   @param VariableSize    Variable's size.
989 
990   @return the status of gRT->GetVariable
991 **/
992 EFI_STATUS
993 GetHiiVariable (
994   IN  EFI_GUID      *VariableGuid,
995   IN  UINT16        *VariableName,
996   OUT UINT8          **VariableData,
997   OUT UINTN         *VariableSize
998   );
999 
1000 /**
1001   Set value for HII-type PCD.
1002 
1003   A HII-type PCD's value is stored in a variable. Setting/Getting the value of
1004   HII-type PCD is to visit this variable.
1005 
1006   @param VariableGuid    Guid of variable which stored value of a HII-type PCD.
1007   @param VariableName    Unicode name of variable which stored value of a HII-type PCD.
1008   @param SetAttributes   Attributes bitmask to set for the variable.
1009   @param Data            Value want to be set.
1010   @param DataSize        Size of value
1011   @param Offset          Value offset of HII-type PCD in variable.
1012 
1013   @return status of GetVariable()/SetVariable().
1014 
1015 **/
1016 EFI_STATUS
1017 SetHiiVariable (
1018   IN  EFI_GUID     *VariableGuid,
1019   IN  UINT16       *VariableName,
1020   IN  UINT32       SetAttributes,
1021   IN  CONST VOID   *Data,
1022   IN  UINTN        DataSize,
1023   IN  UINTN        Offset
1024   );
1025 
1026 /**
1027   Register the callback function for a PCD entry.
1028 
1029   This routine will register a callback function to a PCD entry by given token number
1030   and token space guid.
1031 
1032   @param TokenNumber        PCD token's number, it is autogened by build tools.
1033   @param Guid               PCD token space's guid,
1034                             if not NULL, this PCD is dynamicEx type PCD.
1035   @param CallBackFunction   Callback function pointer
1036 
1037   @return EFI_SUCCESS Always success for registering callback function.
1038 
1039 **/
1040 EFI_STATUS
1041 DxeRegisterCallBackWorker (
1042   IN  UINTN                   TokenNumber,
1043   IN  CONST EFI_GUID          *Guid, OPTIONAL
1044   IN  PCD_PROTOCOL_CALLBACK   CallBackFunction
1045   );
1046 
1047 /**
1048   UnRegister the callback function for a PCD entry.
1049 
1050   This routine will unregister a callback function to a PCD entry by given token number
1051   and token space guid.
1052 
1053   @param TokenNumber        PCD token's number, it is autogened by build tools.
1054   @param Guid               PCD token space's guid.
1055                             if not NULL, this PCD is dynamicEx type PCD.
1056   @param CallBackFunction   Callback function pointer
1057 
1058   @retval EFI_SUCCESS               Callback function is success to be unregister.
1059   @retval EFI_INVALID_PARAMETER     Can not find the PCD entry by given token number.
1060 **/
1061 EFI_STATUS
1062 DxeUnRegisterCallBackWorker (
1063   IN  UINTN                   TokenNumber,
1064   IN  CONST EFI_GUID          *Guid, OPTIONAL
1065   IN  PCD_PROTOCOL_CALLBACK   CallBackFunction
1066   );
1067 
1068 /**
1069   Initialize the PCD database in DXE phase.
1070 
1071   PCD database in DXE phase also contains PCD database in PEI phase which is copied
1072   from GUID Hob.
1073 
1074 **/
1075 VOID
1076 BuildPcdDxeDataBase (
1077   VOID
1078   );
1079 
1080 /**
1081   Get Token Number according to dynamic-ex PCD's {token space guid:token number}
1082 
1083   A dynamic-ex type PCD, developer must provide pair of token space guid: token number
1084   in DEC file. PCD database maintain a mapping table that translate pair of {token
1085   space guid: token number} to Token Number.
1086 
1087   @param Guid            Token space guid for dynamic-ex PCD entry.
1088   @param ExTokenNumber   Dynamic-ex PCD token number.
1089 
1090   @return Token Number for dynamic-ex PCD.
1091 
1092 **/
1093 UINTN
1094 GetExPcdTokenNumber (
1095   IN CONST EFI_GUID             *Guid,
1096   IN UINT32                     ExTokenNumber
1097   );
1098 
1099 /**
1100   Get next token number in given token space.
1101 
1102   This routine is used for dynamicEx type PCD. It will firstly scan token space
1103   table to get token space according to given token space guid. Then scan given
1104   token number in found token space, if found, then return next token number in
1105   this token space.
1106 
1107   @param Guid            Token space guid. Next token number will be scaned in
1108                          this token space.
1109   @param TokenNumber     Token number.
1110                          If PCD_INVALID_TOKEN_NUMBER, return first token number in
1111                          token space table.
1112                          If not PCD_INVALID_TOKEN_NUMBER, return next token number
1113                          in token space table.
1114   @param GuidTable       Token space guid table. It will be used for scan token space
1115                          by given token space guid.
1116   @param SizeOfGuidTable The size of guid table.
1117   @param ExMapTable      DynamicEx token number mapping table.
1118   @param SizeOfExMapTable The size of dynamicEx token number mapping table.
1119 
1120   @retval EFI_NOT_FOUND  Can not given token space or token number.
1121   @retval EFI_SUCCESS    Success to get next token number.
1122 
1123 **/
1124 EFI_STATUS
1125 ExGetNextTokeNumber (
1126   IN      CONST EFI_GUID    *Guid,
1127   IN OUT  UINTN             *TokenNumber,
1128   IN      EFI_GUID          *GuidTable,
1129   IN      UINTN             SizeOfGuidTable,
1130   IN      DYNAMICEX_MAPPING *ExMapTable,
1131   IN      UINTN             SizeOfExMapTable
1132   );
1133 
1134 /**
1135   Get size of POINTER type PCD value.
1136 
1137   @param LocalTokenNumberTableIdx Index of local token number in local token number table.
1138   @param MaxSize                  Maximum size of POINTER type PCD value.
1139 
1140   @return size of POINTER type PCD value.
1141 
1142 **/
1143 UINTN
1144 GetPtrTypeSize (
1145   IN    UINTN             LocalTokenNumberTableIdx,
1146   OUT   UINTN             *MaxSize
1147   );
1148 
1149 /**
1150   Set size of POINTER type PCD value. The size should not exceed the maximum size
1151   of this PCD value.
1152 
1153   @param LocalTokenNumberTableIdx Index of local token number in local token number table.
1154   @param CurrentSize              Size of POINTER type PCD value.
1155 
1156   @retval TRUE  Success to set size of PCD value.
1157   @retval FALSE Fail to set size of PCD value.
1158 **/
1159 BOOLEAN
1160 SetPtrTypeSize (
1161   IN          UINTN             LocalTokenNumberTableIdx,
1162   IN    OUT   UINTN             *CurrentSize
1163   );
1164 
1165 /**
1166   VariableLockProtocol callback
1167   to lock the variables referenced by DynamicHii PCDs with RO property set in *.dsc.
1168 
1169   @param[in] Event      Event whose notification function is being invoked.
1170   @param[in] Context    Pointer to the notification function's context.
1171 
1172 **/
1173 VOID
1174 EFIAPI
1175 VariableLockCallBack (
1176   IN EFI_EVENT          Event,
1177   IN VOID               *Context
1178   );
1179 
1180 extern  PCD_DATABASE   mPcdDatabase;
1181 
1182 extern  UINT32         mPcdTotalTokenCount;
1183 extern  UINT32         mPeiLocalTokenCount;
1184 extern  UINT32         mDxeLocalTokenCount;
1185 extern  UINT32         mPeiNexTokenCount;
1186 extern  UINT32         mDxeNexTokenCount;
1187 extern  UINT32         mPeiExMapppingTableSize;
1188 extern  UINT32         mDxeExMapppingTableSize;
1189 extern  UINT32         mPeiGuidTableSize;
1190 extern  UINT32         mDxeGuidTableSize;
1191 
1192 extern  BOOLEAN        mPeiExMapTableEmpty;
1193 extern  BOOLEAN        mDxeExMapTableEmpty;
1194 extern  BOOLEAN        mPeiDatabaseEmpty;
1195 
1196 extern  EFI_GUID     **TmpTokenSpaceBuffer;
1197 extern  UINTN          TmpTokenSpaceBufferCount;
1198 
1199 extern EFI_LOCK mPcdDatabaseLock;
1200 
1201 #endif
1202 
1203