1 /** @file
2   Provides library services to get and set Platform Configuration Database entries.
3 
4   PCD Library Class provides a PCD usage macro interface for all PCD types.
5   It should be included in any module that uses PCD. If a module uses dynamic/dynamicex
6   PCD, module should be linked to a PEIM/DXE library instance to access that PCD.
7   If a module uses PatchableInModule type PCD, it also needs the library instance to produce
8   LibPatchPcdSetPtr() interface. For FeatureFlag/Fixed PCD, the macro interface is
9   translated to a variable or macro that is auto-generated by build tool in
10   module's autogen.h/autogen.c.
11   The PcdGetXX(), PcdSetXX(), PcdToken(), and PcdGetNextTokenSpace() operations are
12   only available prior to ExitBootServices().  If access to PCD values are required
13   at runtime, then their values must be collected prior to ExitBootServices().
14   There are no restrictions on the use of FeaturePcd(), FixedPcdGetXX(),
15   PatchPcdGetXX(), and PatchPcdSetXX().
16 
17 Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
18 This program and the accompanying materials
19 are licensed and made available under the terms and conditions of the BSD License
20 which accompanies this distribution.  The full text of the license may be found at
21 http://opensource.org/licenses/bsd-license.php
22 
23 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
24 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
25 
26 **/
27 
28 #ifndef __PCD_LIB_H__
29 #define __PCD_LIB_H__
30 
31 
32 /**
33   Retrieves a token number based on a token name.
34 
35   Returns the token number associated with the PCD token specified by TokenName.
36   If TokenName is not a valid token in the token space, then the module will not build.
37 
38   @param   TokenName  The name of the PCD token to retrieve the token number for.
39 
40   @return  The token number associated with the PCD.
41 
42 **/
43 #define PcdToken(TokenName)                 _PCD_TOKEN_##TokenName
44 
45 
46 /**
47   Retrieves a Boolean PCD feature flag based on a token name.
48 
49   Returns the Boolean value for the PCD feature flag specified by TokenName.
50   If TokenName is not a valid token in the token space, then the module will not build.
51   If TokenName is not a feature flag PCD, then the module will not build.
52 
53   @param   TokenName  The name of the PCD token to retrieve a current value for.
54 
55   @return  Boolean value for the PCD feature flag.
56 
57 **/
58 #define FeaturePcdGet(TokenName)            _PCD_GET_MODE_BOOL_##TokenName
59 
60 
61 /**
62   Retrieves an 8-bit fixed PCD token value based on a token name.
63 
64   Returns the 8-bit value for the token specified by TokenName.
65   If TokenName is not a valid token in the token space, then the module will not build.
66   If TokenName is not a fixed at build PCD, then the module will not build.
67 
68   @param   TokenName  The name of the PCD token to retrieve a current value for.
69 
70   @return  8-bit value for the token specified by TokenName.
71 
72 **/
73 #define FixedPcdGet8(TokenName)             _PCD_VALUE_##TokenName
74 
75 
76 /**
77   Retrieves a 16-bit fixed PCD token value based on a token name.
78 
79   Returns the 16-bit value for the token specified by TokenName.
80   If TokenName is not a valid token in the token space, then the module will not build.
81   If TokenName is not a fixed at build PCD, then the module will not build.
82 
83   @param   TokenName  The name of the PCD token to retrieve a current value for.
84 
85   @return  16-bit value for the token specified by TokenName.
86 
87 **/
88 #define FixedPcdGet16(TokenName)            _PCD_VALUE_##TokenName
89 
90 
91 /**
92   Retrieves a 32-bit fixed PCD token value based on a token name.
93 
94   Returns the 32-bit value for the token specified by TokenName.
95   If TokenName is not a valid token in the token space, then the module will not build.
96   If TokenName is not a fixed at build PCD, then the module will not build.
97 
98   @param   TokenName  The name of the PCD token to retrieve a current value for.
99 
100   @return  32-bit value for the token specified by TokenName.
101 
102 **/
103 #define FixedPcdGet32(TokenName)            _PCD_VALUE_##TokenName
104 
105 
106 /**
107   Retrieves a 64-bit fixed PCD token value based on a token name.
108 
109   Returns the 64-bit value for the token specified by TokenName.
110   If TokenName is not a valid token in the token space, then the module will not build.
111   If TokenName is not a fixed at build PCD, then the module will not build.
112 
113   @param   TokenName  The name of the PCD token to retrieve a current value for.
114 
115   @return  64-bit value for the token specified by TokenName.
116 
117 **/
118 #define FixedPcdGet64(TokenName)            _PCD_VALUE_##TokenName
119 
120 
121 /**
122   Retrieves a Boolean fixed PCD token value based on a token name.
123 
124   Returns the Boolean value for the token specified by TokenName.
125   If TokenName is not a valid token in the token space, then the module will not build.
126   If TokenName is not a fixed at build PCD, then the module will not build.
127 
128   @param   TokenName  The name of the PCD token to retrieve a current value for.
129 
130   @return  The Boolean value for the token.
131 
132 **/
133 #define FixedPcdGetBool(TokenName)          _PCD_VALUE_##TokenName
134 
135 
136 /**
137   Retrieves a pointer to a fixed PCD token buffer based on a token name.
138 
139   Returns a pointer to the buffer for the token specified by TokenName.
140   If TokenName is not a valid token in the token space, then the module will not build.
141   If TokenName is not a fixed at build PCD, then the module will not build.
142 
143   @param   TokenName  The name of the PCD token to retrieve a current value for.
144 
145   @return  A pointer to the buffer.
146 
147 **/
148 #define FixedPcdGetPtr(TokenName)           ((VOID *)_PCD_VALUE_##TokenName)
149 
150 
151 /**
152   Retrieves an 8-bit binary patchable PCD token value based on a token name.
153 
154   Returns the 8-bit value for the token specified by TokenName.
155   If TokenName is not a valid token in the token space, then the module will not build.
156   If TokenName is not a patchable in module PCD, then the module will not build.
157 
158   @param   TokenName  The name of the PCD token to retrieve a current value for.
159 
160   @return  An 8-bit binary patchable PCD token value.
161 
162 **/
163 #define PatchPcdGet8(TokenName)             _gPcd_BinaryPatch_##TokenName
164 
165 /**
166   Retrieves a 16-bit binary patchable PCD token value based on a token name.
167 
168   Returns the 16-bit value for the token specified by TokenName.
169   If TokenName is not a valid token in the token space, then the module will not build.
170   If TokenName is not a patchable in module PCD, then the module will not build.
171 
172   @param   TokenName  The name of the PCD token to retrieve a current value for.
173 
174   @return  A 16-bit binary patchable PCD token value.
175 
176 **/
177 #define PatchPcdGet16(TokenName)            _gPcd_BinaryPatch_##TokenName
178 
179 
180 /**
181   Retrieves a 32-bit binary patchable PCD token value based on a token name.
182 
183   Returns the 32-bit value for the token specified by TokenName.
184   If TokenName is not a valid token in the token space, then the module will not build.
185   If TokenName is not a patchable in module PCD, then the module will not build.
186 
187   @param   TokenName  The name of the PCD token to retrieve a current value for.
188 
189   @return  A 32-bit binary patchable PCD token value.
190 
191 **/
192 #define PatchPcdGet32(TokenName)            _gPcd_BinaryPatch_##TokenName
193 
194 
195 /**
196   Retrieves a 64-bit binary patchable PCD token value based on a token name.
197 
198   Returns the 64-bit value for the token specified by TokenName.
199   If TokenName is not a valid token in the token space, then the module will not build.
200   If TokenName is not a patchable in module PCD, then the module will not build.
201 
202   @param   TokenName  The name of the PCD token to retrieve a current value for.
203 
204   @return  A 64-bit binary patchable PCD token value.
205 
206 **/
207 #define PatchPcdGet64(TokenName)            _gPcd_BinaryPatch_##TokenName
208 
209 
210 /**
211   Retrieves a Boolean binary patchable PCD token value based on a token name.
212 
213   Returns the Boolean value for the token specified by TokenName.
214   If TokenName is not a valid token in the token space, then the module will not build.
215   If TokenName is not a patchable in module PCD, then the module will not build.
216 
217   @param   TokenName  The name of the PCD token to retrieve a current value for.
218 
219   @return  The Boolean value for the token.
220 
221 **/
222 #define PatchPcdGetBool(TokenName)          _gPcd_BinaryPatch_##TokenName
223 
224 
225 /**
226   Retrieves a pointer to a binary patchable PCD token buffer based on a token name.
227 
228   Returns a pointer to the buffer for the token specified by TokenName.
229   If TokenName is not a valid token in the token space, then the module will not build.
230   If TokenName is not a patchable in module PCD, then the module will not build.
231 
232   @param   TokenName  The name of the PCD token to retrieve a current value for.
233 
234   @return  A pointer to the buffer for the token.
235 
236 **/
237 #define PatchPcdGetPtr(TokenName)           ((VOID *)_gPcd_BinaryPatch_##TokenName)
238 
239 
240 /**
241   Sets an 8-bit binary patchable PCD token value based on a token name.
242 
243   Sets the 8-bit value for the token specified by TokenName. Value is returned.
244   If TokenName is not a valid token in the token space, then the module will not build.
245   If TokenName is not a patchable in module PCD, then the module will not build.
246 
247   @param   TokenName  The name of the binary patchable PCD token to set the current value for.
248   @param   Value      The 8-bit value to set.
249 
250   @return Return the Value that was set.
251 
252 **/
253 #define PatchPcdSet8(TokenName, Value)      (_gPcd_BinaryPatch_##TokenName = (Value))
254 
255 
256 /**
257   Sets a 16-bit binary patchable PCD token value based on a token name.
258 
259   Sets the 16-bit value for the token specified by TokenName. Value is returned.
260   If TokenName is not a valid token in the token space, then the module will not build.
261   If TokenName is not a patchable in module PCD, then the module will not build.
262 
263   @param   TokenName  The name of the binary patchable PCD token to set the current value for.
264   @param   Value      The 16-bit value to set.
265 
266   @return Return the Value that was set.
267 
268 **/
269 #define PatchPcdSet16(TokenName, Value)     (_gPcd_BinaryPatch_##TokenName = (Value))
270 
271 
272 /**
273   Sets a 32-bit binary patchable PCD token value based on a token name.
274 
275   Sets the 32-bit value for the token specified by TokenName. Value is returned.
276   If TokenName is not a valid token in the token space, then the module will not build.
277   If TokenName is not a patchable in module PCD, then the module will not build.
278 
279   @param   TokenName  The name of the binary patchable PCD token to set the current value for.
280   @param   Value      The 32-bit value to set.
281 
282   @return Return the Value that was set.
283 
284 **/
285 #define PatchPcdSet32(TokenName, Value)     (_gPcd_BinaryPatch_##TokenName = (Value))
286 
287 
288 /**
289   Sets a 64-bit binary patchable PCD token value based on a token name.
290 
291   Sets the 64-bit value for the token specified by TokenName. Value is returned.
292   If TokenName is not a valid token in the token space, then the module will not build.
293   If TokenName is not a patchable in module PCD, then the module will not build.
294 
295   @param   TokenName  The name of the binary patchable PCD token to set the current value for.
296   @param   Value      The 64-bit value to set.
297 
298   @return Return the Value that was set.
299 
300 **/
301 #define PatchPcdSet64(TokenName, Value)     (_gPcd_BinaryPatch_##TokenName = (Value))
302 
303 
304 /**
305   Sets a Boolean binary patchable PCD token value based on a token name.
306 
307   Sets the Boolean value for the token specified by TokenName. Value is returned.
308   If TokenName is not a valid token in the token space, then the module will not build.
309   If TokenName is not a patchable in module PCD, then the module will not build.
310 
311   @param   TokenName  The name of the binary patchable PCD token to set the current value for.
312   @param   Value      The boolean value to set.
313 
314   @return Return the Value that was set.
315 
316 **/
317 #define PatchPcdSetBool(TokenName, Value)   (_gPcd_BinaryPatch_##TokenName = (Value))
318 
319 
320 /**
321   Sets a pointer to a binary patchable PCD token buffer based on a token name.
322 
323   Sets the buffer for the token specified by TokenName.  Buffer is returned.
324   If SizeOfBuffer is greater than the maximum size supported by TokenName, then set SizeOfBuffer
325   to the maximum size supported by TokenName and return NULL to indicate that the set operation
326   was not actually performed.  If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be
327   set to the maximum size supported by TokenName and NULL must be returned.
328   If TokenName is not a valid token in the token space, then the module will not build.
329   If TokenName is not a patchable in module PCD, then the module will not build.
330 
331   If SizeOfBuffer is NULL, then ASSERT().
332   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
333 
334   @param   TokenName      The name of the binary patchable PCD token to set the current value for.
335   @param   SizeOfBuffer   A pointer to the size, in bytes, of Buffer.
336   @param   Buffer         Pointer to the value to set.
337 
338   @return Return the pointer to the Buffer that was set.
339 
340 **/
341 #define PatchPcdSetPtr(TokenName, Size, Buffer) \
342                                             LibPatchPcdSetPtrAndSize (                 \
343                                               (VOID *)_gPcd_BinaryPatch_##TokenName,   \
344                                               &_gPcd_BinaryPatch_Size_##TokenName,     \
345                                               (UINTN)_PCD_PATCHABLE_##TokenName##_SIZE, \
346                                               (Size),                                  \
347                                               (Buffer)                                 \
348                                               )
349 /**
350   Retrieves an 8-bit PCD token value based on a token name.
351 
352   Returns the 8-bit value for the token specified by TokenName.
353   If TokenName is not a valid token in the token space, then the module will not build.
354 
355   @param   TokenName  The name of the PCD token to retrieve a current value for.
356 
357   @return  8-bit value for the token specified by TokenName.
358 
359 **/
360 #define PcdGet8(TokenName)                  _PCD_GET_MODE_8_##TokenName
361 
362 
363 /**
364   Retrieves a 16-bit PCD token value based on a token name.
365 
366   Returns the 16-bit value for the token specified by TokenName.
367   If TokenName is not a valid token in the token space, then the module will not build.
368 
369   @param   TokenName  The name of the PCD token to retrieve a current value for.
370 
371   @return  16-bit value for the token specified by TokenName.
372 
373 **/
374 #define PcdGet16(TokenName)                 _PCD_GET_MODE_16_##TokenName
375 
376 
377 /**
378   Retrieves a 32-bit PCD token value based on a token name.
379 
380   Returns the 32-bit value for the token specified by TokenName.
381   If TokenName is not a valid token in the token space, then the module will not build.
382 
383   @param   TokenName  The name of the PCD token to retrieve a current value for.
384 
385   @return  32-bit value for the token specified by TokenName.
386 
387 **/
388 #define PcdGet32(TokenName)                 _PCD_GET_MODE_32_##TokenName
389 
390 
391 /**
392   Retrieves a 64-bit PCD token value based on a token name.
393 
394   Returns the 64-bit value for the token specified by TokenName.
395   If TokenName is not a valid token in the token space, then the module will not build.
396 
397   @param   TokenName  The name of the PCD token to retrieve a current value for.
398 
399   @return  64-bit value for the token specified by TokenName.
400 
401 **/
402 #define PcdGet64(TokenName)                 _PCD_GET_MODE_64_##TokenName
403 
404 
405 /**
406   Retrieves a pointer to a PCD token buffer based on a token name.
407 
408   Returns a pointer to the buffer for the token specified by TokenName.
409   If TokenName is not a valid token in the token space, then the module will not build.
410 
411   @param   TokenName  The name of the PCD token to retrieve a current value for.
412 
413   @return  A pointer to the buffer.
414 
415 **/
416 #define PcdGetPtr(TokenName)                _PCD_GET_MODE_PTR_##TokenName
417 
418 
419 /**
420   Retrieves a Boolean PCD token value based on a token name.
421 
422   Returns the Boolean value for the token specified by TokenName.
423   If TokenName is not a valid token in the token space, then the module will not build.
424 
425   @param   TokenName  The name of the PCD token to retrieve a current value for.
426 
427   @return  A Boolean PCD token value.
428 
429 **/
430 #define PcdGetBool(TokenName)               _PCD_GET_MODE_BOOL_##TokenName
431 
432 
433 /**
434   Retrieves the size of a fixed PCD token based on a token name.
435 
436   Returns the size of the token specified by TokenName.
437   If TokenName is not a valid token in the token space, then the module will not build.
438 
439   @param[in]  TokenName  The name of the PCD token to retrieve a current value size for.
440 
441   @return     Return the size
442 
443 **/
444 #define FixedPcdGetSize(TokenName)    _PCD_SIZE_##TokenName
445 
446 
447 /**
448   Retrieves the size of a binary patchable PCD token based on a token name.
449 
450   Returns the size of the token specified by TokenName.
451   If TokenName is not a valid token in the token space, then the module will not build.
452 
453   @param[in]  TokenName  The name of the PCD token to retrieve a current value size for.
454 
455   @return     Return the size
456 
457 **/
458 #define PatchPcdGetSize(TokenName)    _gPcd_BinaryPatch_Size_##TokenName
459 
460 
461 /**
462   Retrieves the size of the PCD token based on a token name.
463 
464   Returns the size of the token specified by TokenName.
465   If TokenName is not a valid token in the token space, then the module will not build.
466 
467   @param[in]   TokenName  The name of the PCD token to retrieve a current value size for.
468 
469   @return      Return the size
470 
471 **/
472 #define PcdGetSize(TokenName)         _PCD_GET_MODE_SIZE_##TokenName
473 
474 
475 /**
476   Retrieve the size of a given PCD token.
477 
478   Returns the size of the token specified by TokenNumber and Guid.
479   If Guid is NULL, then ASSERT().
480 
481   @param[in]  Guid          Pointer to a 128-bit unique value that designates
482                             which namespace to retrieve a value from.
483   @param[in]  TokenNumber   The PCD token number to retrieve a current value size for.
484 
485   @return     Return the size.
486 
487 **/
488 #define PcdGetExSize(Guid, TokenName) LibPcdGetExSize ((Guid), PcdTokenEx(Guid,TokenName))
489 
490 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
491 /**
492   Sets an 8-bit PCD token value based on a token name.
493 
494   Sets the 8-bit value for the token specified by TokenName. Value is returned.
495   If TokenName is not a valid token in the token space, then the module will not build.
496 
497   @param   TokenName  The name of the PCD token to retrieve a current value for.
498   @param   Value      The 8-bit value to set.
499 
500   @return Return the Value that was set.
501 
502 **/
503 #define PcdSet8(TokenName, Value)           _PCD_SET_MODE_8_##TokenName     ((Value))
504 
505 
506 /**
507   Sets a 16-bit PCD token value based on a token name.
508 
509   Sets the 16-bit value for the token specified by TokenName. Value is returned.
510   If TokenName is not a valid token in the token space, then the module will not build.
511 
512   @param   TokenName  The name of the PCD token to retrieve a current value for.
513   @param   Value      The 16-bit value to set.
514 
515   @return Return the Value that was set.
516 
517 **/
518 #define PcdSet16(TokenName, Value)          _PCD_SET_MODE_16_##TokenName    ((Value))
519 
520 
521 /**
522   Sets a 32-bit PCD token value based on a token name.
523 
524   Sets the 32-bit value for the token specified by TokenName. Value is returned.
525   If TokenName is not a valid token in the token space, then the module will not build.
526 
527   @param   TokenName  The name of the PCD token to retrieve a current value for.
528   @param   Value      The 32-bit value to set.
529 
530   @return Return the Value that was set.
531 
532 **/
533 #define PcdSet32(TokenName, Value)          _PCD_SET_MODE_32_##TokenName    ((Value))
534 
535 
536 /**
537   Sets a 64-bit PCD token value based on a token name.
538 
539   Sets the 64-bit value for the token specified by TokenName. Value is returned.
540   If TokenName is not a valid token in the token space, then the module will not build.
541 
542   @param   TokenName  The name of the PCD token to retrieve a current value for.
543   @param   Value      The 64-bit value to set.
544 
545   @return Return the Value that was set.
546 
547 **/
548 #define PcdSet64(TokenName, Value)          _PCD_SET_MODE_64_##TokenName    ((Value))
549 
550 
551 /**
552   Sets a pointer to a PCD token buffer based on a token name.
553 
554   Sets the buffer for the token specified by TokenName. Buffer is returned.
555   If SizeOfBuffer is greater than the maximum size supported by TokenName,
556   then set SizeOfBuffer to the maximum size supported by TokenName and return NULL
557   to indicate that the set operation was not actually performed.  If SizeOfBuffer
558   is set to MAX_ADDRESS, then SizeOfBuffer must be set to the maximum size supported
559   by TokenName and NULL must be returned.
560   If TokenName is not a valid token in the token space, then the module will not build.
561 
562   If SizeOfBuffer is NULL, then ASSERT().
563   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
564 
565   @param   TokenName      The name of the PCD token to set the current value for.
566   @param   SizeOfBuffer   A pointer to the size, in bytes, of Buffer.
567   @param   Buffer         A pointer to the buffer to set.
568 
569   @return Return the pointer to the Buffer that was set.
570 
571 **/
572 #define PcdSetPtr(TokenName, SizeOfBuffer, Buffer) \
573                                             _PCD_SET_MODE_PTR_##TokenName   ((SizeOfBuffer), (Buffer))
574 
575 /**
576   Sets a Boolean PCD token value based on a token name.
577 
578   Sets the Boolean value for the token specified by TokenName. Value is returned.
579   If TokenName is not a valid token in the token space, then the module will not build.
580 
581   @param   TokenName      The name of the PCD token to set the current value for.
582   @param   Buffer         The Boolean value to set.
583 
584   @return Return the Value that was set.
585 
586 **/
587 #define PcdSetBool(TokenName, Value)        _PCD_SET_MODE_BOOL_##TokenName  ((Value))
588 #endif
589 
590 /**
591   Sets a 8-bit PCD token value based on a token name.
592 
593   Sets the 8-bit value for the token specified by TokenName.
594   If TokenName is not a valid token in the token space, then the module will not build.
595 
596   @param TokenName  The name of the PCD token to retrieve a current value for.
597   @param Value      The 8-bit value to set.
598 
599   @return The status of the set operation.
600 
601 **/
602 #define PcdSet8S(TokenName, Value)          _PCD_SET_MODE_8_S_##TokenName    ((Value))
603 
604 /**
605   Sets a 16-bit PCD token value based on a token name.
606 
607   Sets the 16-bit value for the token specified by TokenName.
608   If TokenName is not a valid token in the token space, then the module will not build.
609 
610   @param TokenName  The name of the PCD token to retrieve a current value for.
611   @param Value      The 16-bit value to set.
612 
613   @return The status of the set operation.
614 
615 **/
616 #define PcdSet16S(TokenName, Value)         _PCD_SET_MODE_16_S_##TokenName    ((Value))
617 
618 /**
619   Sets a 32-bit PCD token value based on a token name.
620 
621   Sets the 32-bit value for the token specified by TokenName.
622   If TokenName is not a valid token in the token space, then the module will not build.
623 
624   @param TokenName  The name of the PCD token to retrieve a current value for.
625   @param Value      The 32-bit value to set.
626 
627   @return The status of the set operation.
628 
629 **/
630 #define PcdSet32S(TokenName, Value)         _PCD_SET_MODE_32_S_##TokenName    ((Value))
631 
632 /**
633   Sets a 64-bit PCD token value based on a token name.
634 
635   Sets the 64-bit value for the token specified by TokenName.
636   If TokenName is not a valid token in the token space, then the module will not build.
637 
638   @param TokenName  The name of the PCD token to retrieve a current value for.
639   @param Value      The 64-bit value to set.
640 
641   @return The status of the set operation.
642 
643 **/
644 #define PcdSet64S(TokenName, Value)         _PCD_SET_MODE_64_S_##TokenName    ((Value))
645 
646 /**
647   Sets a pointer to a PCD token buffer based on a token name.
648 
649   Sets the buffer for the token specified by TokenName.
650   If SizeOfBuffer is greater than the maximum size supported by TokenName,
651   then set SizeOfBuffer to the maximum size supported by TokenName and return
652   RETURN_INVALID_PARAMETER to indicate that the set operation was not actually performed.
653   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the maximum size
654   supported by TokenName and RETURN_INVALID_PARAMETER must be returned.
655   If TokenName is not a valid token in the token space, then the module will not build.
656 
657   If SizeOfBuffer is NULL, then ASSERT().
658   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
659 
660   @param TokenName      The name of the PCD token to set the current value for.
661   @param SizeOfBuffer   A pointer to the size, in bytes, of Buffer.
662   @param Buffer         A pointer to the buffer to set.
663 
664   @return The status of the set operation.
665 
666 **/
667 #define PcdSetPtrS(TokenName, SizeOfBuffer, Buffer) \
668                                             _PCD_SET_MODE_PTR_S_##TokenName   ((SizeOfBuffer), (Buffer))
669 
670 
671 
672 /**
673   Sets a boolean PCD token value based on a token name.
674 
675   Sets the boolean value for the token specified by TokenName.
676   If TokenName is not a valid token in the token space, then the module will not build.
677 
678   @param TokenName  The name of the PCD token to retrieve a current value for.
679   @param Value      The boolean value to set.
680 
681   @return The status of the set operation.
682 
683 **/
684 #define PcdSetBoolS(TokenName, Value)       _PCD_SET_MODE_BOOL_S_##TokenName    ((Value))
685 
686 /**
687   Retrieves a token number based on a GUID and a token name.
688 
689   Returns the token number for the token specified by Guid and TokenName.
690   If TokenName is not a valid token in the token space, then the module will not build.
691 
692   @param   Guid        Pointer to a 128-bit unique value that designates
693                        which namespace to retrieve a value from.
694   @param   TokenName   The name of the PCD token to retrieve a current value for.
695 
696   @return  Return the token number.
697 
698 **/
699 #define PcdTokenEx(Guid,TokenName)  _PCD_TOKEN_EX_##TokenName(Guid)
700 
701 /**
702   Retrieves an 8-bit PCD token value based on a GUID and a token name.
703 
704   Returns the 8-bit value for the token specified by Guid and TokenName.
705   If TokenName is not a valid token in the token space specified by Guid,
706   then the module will not build.
707 
708   If Guid is NULL, then ASSERT().
709 
710   @param   Guid        Pointer to a 128-bit unique value that designates
711                        which namespace to retrieve a value from.
712   @param   TokenName   The name of the PCD token to retrieve a current value for.
713 
714   @return  An 8-bit PCD token value.
715 
716 **/
717 #define PcdGetEx8(Guid, TokenName)          LibPcdGetEx8 ((Guid), PcdTokenEx(Guid,TokenName))
718 
719 /**
720   Retrieves a 16-bit PCD token value based on a GUID and a token name.
721 
722   Returns the 16-bit value for the token specified by Guid and TokenName.
723   If TokenName is not a valid token in the token space specified by Guid,
724   then the module will not build.
725 
726   If Guid is NULL, then ASSERT().
727 
728   @param   Guid        Pointer to a 128-bit unique value that designates
729                        which namespace to retrieve a value from.
730   @param   TokenName   The name of the PCD token to retrieve a current value for.
731 
732   @return  A 16-bit PCD token value.
733 
734 **/
735 #define PcdGetEx16(Guid, TokenName)         LibPcdGetEx16 ((Guid), PcdTokenEx(Guid,TokenName))
736 
737 
738 /**
739   Retrieves a 32-bit PCD token value based on a GUID and a token name.
740 
741   Returns the 32-bit value for the token specified by Guid and TokenName.
742   If TokenName is not a valid token in the token space specified by Guid,
743   then the module will not build.
744 
745   If Guid is NULL, then ASSERT().
746 
747   @param   Guid        Pointer to a 128-bit unique value that designates
748                        which namespace to retrieve a value from.
749   @param   TokenName   The name of the PCD token to retrieve a current value for.
750 
751   @return  A 32-bit PCD token value.
752 
753 **/
754 #define PcdGetEx32(Guid, TokenName)         LibPcdGetEx32 ((Guid), PcdTokenEx(Guid,TokenName))
755 
756 
757 /**
758   Retrieves a 64-bit PCD token value based on a GUID and a token name.
759 
760   Returns the 64-bit value for the token specified by Guid and TokenName.
761   If TokenName is not a valid token in the token space specified by Guid,
762   then the module will not build.
763 
764   If Guid is NULL, then ASSERT().
765 
766   @param   Guid        Pointer to a 128-bit unique value that designates
767                        which namespace to retrieve a value from.
768   @param   TokenName   The name of the PCD token to retrieve a current value for.
769 
770   @return  A 64-bit PCD token value.
771 
772 **/
773 #define PcdGetEx64(Guid, TokenName)         LibPcdGetEx64 ((Guid), PcdTokenEx(Guid,TokenName))
774 
775 
776 /**
777   Retrieves a pointer to a PCD token buffer based on a GUID and a token name.
778 
779   Returns a pointer to the buffer for the token specified by Guid and TokenName.
780   If TokenName is not a valid token in the token space specified by Guid,
781   then the module will not build.
782 
783   If Guid is NULL, then ASSERT().
784 
785   @param   Guid        Pointer to a 128-bit unique value that designates
786                        which namespace to retrieve a value from.
787   @param   TokenName   The name of the PCD token to retrieve a current value for.
788 
789   @return  A pointer to a PCD token buffer.
790 
791 **/
792 #define PcdGetExPtr(Guid, TokenName)        LibPcdGetExPtr ((Guid), PcdTokenEx(Guid,TokenName))
793 
794 
795 /**
796   Retrieves a Boolean PCD token value based on a GUID and a token name.
797 
798   Returns the Boolean value for the token specified by Guid and TokenName.
799   If TokenName is not a valid token in the token space specified by Guid,
800   then the module will not build.
801 
802   If Guid is NULL, then ASSERT().
803 
804   @param   Guid        Pointer to a 128-bit unique value that designates
805                        which namespace to retrieve a value from.
806   @param   TokenName   The name of the PCD token to retrieve a current value for.
807 
808   @return  A Boolean PCD token value.
809 
810 **/
811 #define PcdGetExBool(Guid, TokenName)       LibPcdGetExBool  ((Guid), PcdTokenEx(Guid,TokenName))
812 
813 
814 
815 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
816 /**
817   Sets an 8-bit PCD token value based on a GUID and a token name.
818 
819   Sets the 8-bit value for the token specified by Guid and TokenName. Value is returned.
820   If TokenName is not a valid token in the token space specified by Guid,
821   then the module will not build.
822 
823   If Guid is NULL, then ASSERT().
824 
825   @param   Guid        Pointer to a 128-bit unique value that designates
826                        which namespace to retrieve a value from.
827   @param   TokenName   The name of the PCD token to set the current value for.
828   @param   Value       The 8-bit value to set.
829 
830   @return Return the Value that was set.
831 
832 **/
833 #define PcdSetEx8(Guid, TokenName, Value)   LibPcdSetEx8   ((Guid), PcdTokenEx(Guid,TokenName), (Value))
834 
835 
836 /**
837   Sets a 16-bit PCD token value based on a GUID and a token name.
838 
839   Sets the 16-bit value for the token specified by Guid and TokenName. Value is returned.
840   If TokenName is not a valid token in the token space specified by Guid,
841   then the module will not build.
842 
843   If Guid is NULL, then ASSERT().
844 
845   @param   Guid        Pointer to a 128-bit unique value that designates
846                        which namespace to retrieve a value from.
847   @param   TokenName   The name of the PCD token to set the current value for.
848   @param   Value       The 16-bit value to set.
849 
850   @return Return the Value that was set.
851 
852 **/
853 #define PcdSetEx16(Guid, TokenName, Value)  LibPcdSetEx16  ((Guid), PcdTokenEx(Guid,TokenName), (Value))
854 
855 
856 /**
857   Sets a 32-bit PCD token value based on a GUID and a token name.
858 
859   Sets the 32-bit value for the token specified by Guid and TokenName. Value is returned.
860   If TokenName is not a valid token in the token space specified by Guid,
861   then the module will not build.
862 
863   If Guid is NULL, then ASSERT().
864 
865   @param   Guid        Pointer to a 128-bit unique value that designates
866                        which namespace to retrieve a value from.
867   @param   TokenName   The name of the PCD token to set the current value for.
868   @param   Value       The 32-bit value to set.
869 
870   @return Return the Value that was set.
871 
872 **/
873 #define PcdSetEx32(Guid, TokenName, Value)  LibPcdSetEx32  ((Guid), PcdTokenEx(Guid,TokenName), (Value))
874 
875 
876 /**
877   Sets a 64-bit PCD token value based on a GUID and a token name.
878 
879   Sets the 64-bit value for the token specified by Guid and TokenName. Value is returned.
880   If TokenName is not a valid token in the token space specified by Guid,
881   then the module will not build.
882 
883   If Guid is NULL, then ASSERT().
884 
885   @param   Guid        Pointer to a 128-bit unique value that designates
886   which namespace to retrieve a value from.
887   @param   TokenName   The name of the PCD token to set the current value for.
888   @param   Value       The 64-bit value to set.
889 
890   @return Return the Value that was set.
891 
892 **/
893 #define PcdSetEx64(Guid, TokenName, Value)  LibPcdSetEx64  ((Guid), PcdTokenEx(Guid,TokenName), (Value))
894 
895 
896 /**
897   Sets a pointer to a PCD token buffer based on a GUID and a token name.
898 
899   Sets the buffer for the token specified by Guid and TokenName. Buffer is returned.
900   If SizeOfBuffer is greater than the maximum size supported by Guid and TokenName,
901   then set SizeOfBuffer to the maximum size supported by Guid and TokenName and return
902   NULL to indicate that the set operation was not actually performed. If SizeOfBuffer
903   is set to MAX_ADDRESS, then SizeOfBuffer must be set to the maximum size supported by
904   Guid and TokenName and NULL must be returned.
905   If TokenName is not a valid token in the token space specified by Guid,
906   then the module will not build.
907 
908   If Guid is NULL, then ASSERT().
909   If SizeOfBuffer is NULL, then ASSERT().
910   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
911 
912   @param   Guid           Pointer to a 128-bit unique value that designates
913                           which namespace to retrieve a value from.
914   @param   TokenName      The name of the PCD token to set the current value for.
915   @param   SizeOfBuffer   A pointer to the size, in bytes, of Buffer.
916   @param   Buffer         Pointer to the buffer to set.
917 
918   @return Return the pointer to the Buffer that was set.
919 
920 **/
921 #define PcdSetExPtr(Guid, TokenName, SizeOfBuffer, Buffer) \
922                                             LibPcdSetExPtr ((Guid), PcdTokenEx(Guid,TokenName), (SizeOfBuffer), (Buffer))
923 
924 
925 /**
926   Sets a Boolean PCD token value based on a GUID and a token name.
927 
928   Sets the Boolean value for the token specified by Guid and TokenName. Value is returned.
929   If TokenName is not a valid token in the token space specified by Guid,
930   then the module will not build.
931 
932   If Guid is NULL, then ASSERT().
933 
934   @param   Guid           Pointer to a 128-bit unique value that designates
935                           which namespace to retrieve a value from.
936   @param   TokenName      The name of the PCD token to set the current value for.
937   @param   Value          The Boolean value to set.
938 
939   @return Return the Value that was set.
940 
941 **/
942 #define PcdSetExBool(Guid, TokenName, Value) \
943                                             LibPcdSetExBool((Guid), PcdTokenEx(Guid,TokenName), (Value))
944 #endif
945 
946 /**
947   Sets an 8-bit PCD token value based on a GUID and a token name.
948 
949   Sets the 8-bit value for the token specified by Guid and TokenName.
950   If TokenName is not a valid token in the token space specified by Guid,
951   then the module will not build.
952 
953   If Guid is NULL, then ASSERT().
954 
955   @param Guid       Pointer to a 128-bit unique value that designates
956                     which namespace to retrieve a value from.
957   @param TokenName  The name of the PCD token to set the current value for.
958   @param Value      The 8-bit value to set.
959 
960   @return The status of the set operation.
961 
962 **/
963 #define PcdSetEx8S(Guid, TokenName, Value)     LibPcdSetEx8S ((Guid), PcdTokenEx(Guid,TokenName), (Value))
964 
965 /**
966   Sets an 16-bit PCD token value based on a GUID and a token name.
967 
968   Sets the 16-bit value for the token specified by Guid and TokenName.
969   If TokenName is not a valid token in the token space specified by Guid,
970   then the module will not build.
971 
972   If Guid is NULL, then ASSERT().
973 
974   @param Guid       Pointer to a 128-bit unique value that designates
975                     which namespace to retrieve a value from.
976   @param TokenName  The name of the PCD token to set the current value for.
977   @param Value      The 16-bit value to set.
978 
979   @return The status of the set operation.
980 
981 **/
982 #define PcdSetEx16S(Guid, TokenName, Value)    LibPcdSetEx16S ((Guid), PcdTokenEx(Guid,TokenName), (Value))
983 
984 /**
985   Sets an 32-bit PCD token value based on a GUID and a token name.
986 
987   Sets the 32-bit value for the token specified by Guid and TokenName.
988   If TokenName is not a valid token in the token space specified by Guid,
989   then the module will not build.
990 
991   If Guid is NULL, then ASSERT().
992 
993   @param Guid       Pointer to a 128-bit unique value that designates
994                     which namespace to retrieve a value from.
995   @param TokenName  The name of the PCD token to set the current value for.
996   @param Value      The 32-bit value to set.
997 
998   @return The status of the set operation.
999 
1000 **/
1001 #define PcdSetEx32S(Guid, TokenName, Value)    LibPcdSetEx32S ((Guid), PcdTokenEx(Guid,TokenName), (Value))
1002 
1003 /**
1004   Sets an 64-bit PCD token value based on a GUID and a token name.
1005 
1006   Sets the 64-bit value for the token specified by Guid and TokenName.
1007   If TokenName is not a valid token in the token space specified by Guid,
1008   then the module will not build.
1009 
1010   If Guid is NULL, then ASSERT().
1011 
1012   @param Guid       Pointer to a 128-bit unique value that designates
1013                     which namespace to retrieve a value from.
1014   @param TokenName  The name of the PCD token to set the current value for.
1015   @param Value      The 64-bit value to set.
1016 
1017   @return The status of the set operation.
1018 
1019 **/
1020 #define PcdSetEx64S(Guid, TokenName, Value)    LibPcdSetEx64S ((Guid), PcdTokenEx(Guid,TokenName), (Value))
1021 
1022 /**
1023   Sets a pointer to a PCD token buffer based on a GUID and a token name.
1024 
1025   Sets the buffer for the token specified by Guid and TokenName.
1026   If SizeOfBuffer is greater than the maximum size supported by Guid and TokenName,
1027   then set SizeOfBuffer to the maximum size supported by Guid and TokenName and return
1028   RETURN_INVALID_PARAMETER to indicate that the set operation was not actually performed.
1029   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the maximum size
1030   supported by Guid and TokenName and RETURN_INVALID_PARAMETER must be returned.
1031   If TokenName is not a valid token in the token space specified by Guid,
1032   then the module will not build.
1033 
1034   If Guid is NULL, then ASSERT().
1035   If SizeOfBuffer is NULL, then ASSERT().
1036   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1037 
1038   @param Guid           Pointer to a 128-bit unique value that designates
1039                         which namespace to retrieve a value from.
1040   @param TokenName      The name of the PCD token to set the current value for.
1041   @param SizeOfBuffer   A pointer to the size, in bytes, of Buffer.
1042   @param Buffer         Pointer to the buffer to set.
1043 
1044   @return The status of the set operation.
1045 
1046 **/
1047 #define PcdSetExPtrS(Guid, TokenName, SizeOfBuffer, Buffer) \
1048                                             LibPcdSetExPtrS ((Guid), PcdTokenEx(Guid,TokenName), (SizeOfBuffer), (Buffer))
1049 
1050 
1051 /**
1052   Sets an boolean PCD token value based on a GUID and a token name.
1053 
1054   Sets the boolean value for the token specified by Guid and TokenName.
1055   If TokenName is not a valid token in the token space specified by Guid,
1056   then the module will not build.
1057 
1058   If Guid is NULL, then ASSERT().
1059 
1060   @param Guid       Pointer to a 128-bit unique value that designates
1061                     which namespace to retrieve a value from.
1062   @param TokenName  The name of the PCD token to set the current value for.
1063   @param Value      The boolean value to set.
1064 
1065   @return The status of the set operation.
1066 
1067 **/
1068 #define PcdSetExBoolS(Guid, TokenName, Value) \
1069                                             LibPcdSetExBoolS ((Guid), PcdTokenEx(Guid,TokenName), (Value))
1070 
1071 /**
1072   This function provides a means by which SKU support can be established in the PCD infrastructure.
1073 
1074   Sets the current SKU in the PCD database to the value specified by SkuId.  SkuId is returned.
1075 
1076   @param  SkuId   The SKU value that will be used when the PCD service retrieves and sets values
1077                   associated with a PCD token.
1078 
1079   @return  Return the SKU ID that was set.
1080 
1081 **/
1082 UINTN
1083 EFIAPI
1084 LibPcdSetSku (
1085   IN UINTN   SkuId
1086   );
1087 
1088 
1089 /**
1090   This function provides a means by which to retrieve a value for a given PCD token.
1091 
1092   Returns the 8-bit value for the token specified by TokenNumber.
1093 
1094   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
1095 
1096   @return Returns the 8-bit value for the token specified by TokenNumber.
1097 
1098 **/
1099 UINT8
1100 EFIAPI
1101 LibPcdGet8 (
1102   IN UINTN             TokenNumber
1103   );
1104 
1105 
1106 /**
1107   This function provides a means by which to retrieve a value for a given PCD token.
1108 
1109   Returns the 16-bit value for the token specified by TokenNumber.
1110 
1111   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
1112 
1113   @return Returns the 16-bit value for the token specified by TokenNumber.
1114 
1115 **/
1116 UINT16
1117 EFIAPI
1118 LibPcdGet16 (
1119   IN UINTN             TokenNumber
1120   );
1121 
1122 
1123 /**
1124   This function provides a means by which to retrieve a value for a given PCD token.
1125 
1126   Returns the 32-bit value for the token specified by TokenNumber.
1127 
1128   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
1129 
1130   @return Returns the 32-bit value for the token specified by TokenNumber.
1131 
1132 **/
1133 UINT32
1134 EFIAPI
1135 LibPcdGet32 (
1136   IN UINTN             TokenNumber
1137   );
1138 
1139 
1140 /**
1141   This function provides a means by which to retrieve a value for a given PCD token.
1142 
1143   Returns the 64-bit value for the token specified by TokenNumber.
1144 
1145   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
1146 
1147   @return Returns the 64-bit value for the token specified by TokenNumber.
1148 
1149 **/
1150 UINT64
1151 EFIAPI
1152 LibPcdGet64 (
1153   IN UINTN             TokenNumber
1154   );
1155 
1156 
1157 /**
1158   This function provides a means by which to retrieve a value for a given PCD token.
1159 
1160   Returns the pointer to the buffer of the token specified by TokenNumber.
1161 
1162   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
1163 
1164   @return Returns the pointer to the token specified by TokenNumber.
1165 
1166 **/
1167 VOID *
1168 EFIAPI
1169 LibPcdGetPtr (
1170   IN UINTN             TokenNumber
1171   );
1172 
1173 
1174 /**
1175   This function provides a means by which to retrieve a value for a given PCD token.
1176 
1177   Returns the Boolean value of the token specified by TokenNumber.
1178 
1179   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
1180 
1181   @return Returns the Boolean value of the token specified by TokenNumber.
1182 
1183 **/
1184 BOOLEAN
1185 EFIAPI
1186 LibPcdGetBool (
1187   IN UINTN             TokenNumber
1188   );
1189 
1190 
1191 /**
1192   This function provides a means by which to retrieve the size of a given PCD token.
1193 
1194   @param[in]  TokenNumber The PCD token number to retrieve a current value for.
1195 
1196   @return Returns the size of the token specified by TokenNumber.
1197 
1198 **/
1199 UINTN
1200 EFIAPI
1201 LibPcdGetSize (
1202   IN UINTN             TokenNumber
1203   );
1204 
1205 
1206 /**
1207   This function provides a means by which to retrieve a value for a given PCD token.
1208 
1209   Returns the 8-bit value for the token specified by TokenNumber and Guid.
1210 
1211   If Guid is NULL, then ASSERT().
1212 
1213   @param[in]  Guid         Pointer to a 128-bit unique value that designates
1214                            which namespace to retrieve a value from.
1215   @param[in]  TokenNumber  The PCD token number to retrieve a current value for.
1216 
1217   @return Return the UINT8.
1218 
1219 **/
1220 UINT8
1221 EFIAPI
1222 LibPcdGetEx8 (
1223   IN CONST GUID        *Guid,
1224   IN UINTN             TokenNumber
1225   );
1226 
1227 
1228 /**
1229   This function provides a means by which to retrieve a value for a given PCD token.
1230 
1231   Returns the 16-bit value for the token specified by TokenNumber and Guid.
1232 
1233   If Guid is NULL, then ASSERT().
1234 
1235   @param[in]  Guid         Pointer to a 128-bit unique value that designates
1236                            which namespace to retrieve a value from.
1237   @param[in]  TokenNumber  The PCD token number to retrieve a current value for.
1238 
1239   @return Return the UINT16.
1240 
1241 **/
1242 UINT16
1243 EFIAPI
1244 LibPcdGetEx16 (
1245   IN CONST GUID        *Guid,
1246   IN UINTN             TokenNumber
1247   );
1248 
1249 
1250 /**
1251   Returns the 32-bit value for the token specified by TokenNumber and Guid.
1252   If Guid is NULL, then ASSERT().
1253 
1254   @param[in]  Guid         Pointer to a 128-bit unique value that designates
1255                            which namespace to retrieve a value from.
1256   @param[in]  TokenNumber  The PCD token number to retrieve a current value for.
1257 
1258   @return Return the UINT32.
1259 
1260 **/
1261 UINT32
1262 EFIAPI
1263 LibPcdGetEx32 (
1264   IN CONST GUID        *Guid,
1265   IN UINTN             TokenNumber
1266   );
1267 
1268 
1269 /**
1270   This function provides a means by which to retrieve a value for a given PCD token.
1271 
1272   Returns the 64-bit value for the token specified by TokenNumber and Guid.
1273 
1274   If Guid is NULL, then ASSERT().
1275 
1276   @param[in]  Guid          Pointer to a 128-bit unique value that designates
1277                             which namespace to retrieve a value from.
1278   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
1279 
1280   @return Return the UINT64.
1281 
1282 **/
1283 UINT64
1284 EFIAPI
1285 LibPcdGetEx64 (
1286   IN CONST GUID        *Guid,
1287   IN UINTN             TokenNumber
1288   );
1289 
1290 
1291 /**
1292   This function provides a means by which to retrieve a value for a given PCD token.
1293 
1294   Returns the pointer to the buffer of token specified by TokenNumber and Guid.
1295 
1296   If Guid is NULL, then ASSERT().
1297 
1298   @param[in]  Guid          Pointer to a 128-bit unique value that designates
1299                             which namespace to retrieve a value from.
1300   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
1301 
1302   @return Return the VOID* pointer.
1303 
1304 **/
1305 VOID *
1306 EFIAPI
1307 LibPcdGetExPtr (
1308   IN CONST GUID        *Guid,
1309   IN UINTN             TokenNumber
1310   );
1311 
1312 
1313 /**
1314   This function provides a means by which to retrieve a value for a given PCD token.
1315 
1316   Returns the Boolean value of the token specified by TokenNumber and Guid.
1317 
1318   If Guid is NULL, then ASSERT().
1319 
1320   @param[in]  Guid          Pointer to a 128-bit unique value that designates
1321                             which namespace to retrieve a value from.
1322   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
1323 
1324   @return Return the BOOLEAN.
1325 
1326 **/
1327 BOOLEAN
1328 EFIAPI
1329 LibPcdGetExBool (
1330   IN CONST GUID        *Guid,
1331   IN UINTN             TokenNumber
1332   );
1333 
1334 
1335 /**
1336   This function provides a means by which to retrieve the size of a given PCD token.
1337 
1338   Returns the size of the token specified by TokenNumber and Guid.
1339 
1340   If Guid is NULL, then ASSERT().
1341 
1342   @param[in]  Guid          Pointer to a 128-bit unique value that designates
1343                             which namespace to retrieve a value from.
1344   @param[in]  TokenNumber   The PCD token number to retrieve a current value for.
1345 
1346   @return Return the size.
1347 
1348 **/
1349 UINTN
1350 EFIAPI
1351 LibPcdGetExSize (
1352   IN CONST GUID        *Guid,
1353   IN UINTN             TokenNumber
1354   );
1355 
1356 
1357 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
1358 /**
1359   This function provides a means by which to set a value for a given PCD token.
1360 
1361   Sets the 8-bit value for the token specified by TokenNumber
1362   to the value specified by Value.  Value is returned.
1363 
1364   @param[in]  TokenNumber   The PCD token number to set a current value for.
1365   @param[in]  Value         The 8-bit value to set.
1366 
1367   @return Return the Value that was set.
1368 
1369 **/
1370 UINT8
1371 EFIAPI
1372 LibPcdSet8 (
1373   IN UINTN             TokenNumber,
1374   IN UINT8             Value
1375   );
1376 
1377 
1378 /**
1379   This function provides a means by which to set a value for a given PCD token.
1380 
1381   Sets the 16-bit value for the token specified by TokenNumber
1382   to the value specified by Value.  Value is returned.
1383 
1384   @param[in]  TokenNumber   The PCD token number to set a current value for.
1385   @param[in]  Value         The 16-bit value to set.
1386 
1387   @return Return the Value that was set.
1388 
1389 **/
1390 UINT16
1391 EFIAPI
1392 LibPcdSet16 (
1393   IN UINTN             TokenNumber,
1394   IN UINT16            Value
1395   );
1396 
1397 
1398 /**
1399   This function provides a means by which to set a value for a given PCD token.
1400 
1401   Sets the 32-bit value for the token specified by TokenNumber
1402   to the value specified by Value.  Value is returned.
1403 
1404   @param[in]  TokenNumber   The PCD token number to set a current value for.
1405   @param[in]  Value         The 32-bit value to set.
1406 
1407   @return Return the Value that was set.
1408 
1409 **/
1410 UINT32
1411 EFIAPI
1412 LibPcdSet32 (
1413   IN UINTN             TokenNumber,
1414   IN UINT32            Value
1415   );
1416 
1417 
1418 /**
1419   This function provides a means by which to set a value for a given PCD token.
1420 
1421   Sets the 64-bit value for the token specified by TokenNumber
1422   to the value specified by Value.  Value is returned.
1423 
1424   @param[in]  TokenNumber   The PCD token number to set a current value for.
1425   @param[in]  Value         The 64-bit value to set.
1426 
1427   @return Return the Value that was set.
1428 
1429 **/
1430 UINT64
1431 EFIAPI
1432 LibPcdSet64 (
1433   IN UINTN             TokenNumber,
1434   IN UINT64            Value
1435   );
1436 
1437 
1438 /**
1439   This function provides a means by which to set a value for a given PCD token.
1440 
1441   Sets a buffer for the token specified by TokenNumber to the value
1442   specified by Buffer and SizeOfBuffer.  Buffer is returned.
1443   If SizeOfBuffer is greater than the maximum size support by TokenNumber,
1444   then set SizeOfBuffer to the maximum size supported by TokenNumber and
1445   return NULL to indicate that the set operation was not actually performed.
1446 
1447   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the
1448   maximum size supported by TokenName and NULL must be returned.
1449 
1450   If SizeOfBuffer is NULL, then ASSERT().
1451   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1452 
1453   @param[in]      TokenNumber   The PCD token number to set a current value for.
1454   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
1455   @param[in]      Buffer        A pointer to the buffer to set.
1456 
1457   @return Return the pointer for the Buffer that was set.
1458 
1459 **/
1460 VOID *
1461 EFIAPI
1462 LibPcdSetPtr (
1463   IN        UINTN             TokenNumber,
1464   IN OUT    UINTN             *SizeOfBuffer,
1465   IN CONST  VOID              *Buffer
1466   );
1467 
1468 
1469 /**
1470   This function provides a means by which to set a value for a given PCD token.
1471 
1472   Sets the Boolean value for the token specified by TokenNumber
1473   to the value specified by Value.  Value is returned.
1474 
1475   @param[in]  TokenNumber   The PCD token number to set a current value for.
1476   @param[in]  Value         The boolean value to set.
1477 
1478   @return Return the Value that was set.
1479 
1480 **/
1481 BOOLEAN
1482 EFIAPI
1483 LibPcdSetBool (
1484   IN UINTN             TokenNumber,
1485   IN BOOLEAN           Value
1486   );
1487 
1488 
1489 /**
1490   This function provides a means by which to set a value for a given PCD token.
1491 
1492   Sets the 8-bit value for the token specified by TokenNumber and
1493   Guid to the value specified by Value. Value is returned.
1494 
1495   If Guid is NULL, then ASSERT().
1496 
1497   @param[in]  Guid          Pointer to a 128-bit unique value that
1498                             designates which namespace to set a value from.
1499   @param[in]  TokenNumber   The PCD token number to set a current value for.
1500   @param[in]  Value         The 8-bit value to set.
1501 
1502   @return Return the Value that was set.
1503 
1504 **/
1505 UINT8
1506 EFIAPI
1507 LibPcdSetEx8 (
1508   IN CONST GUID        *Guid,
1509   IN UINTN             TokenNumber,
1510   IN UINT8             Value
1511   );
1512 
1513 
1514 /**
1515   This function provides a means by which to set a value for a given PCD token.
1516 
1517   Sets the 16-bit value for the token specified by TokenNumber and
1518   Guid to the value specified by Value. Value is returned.
1519 
1520   If Guid is NULL, then ASSERT().
1521 
1522   @param[in]  Guid          Pointer to a 128-bit unique value that
1523                             designates which namespace to set a value from.
1524   @param[in]  TokenNumber   The PCD token number to set a current value for.
1525   @param[in]  Value         The 16-bit value to set.
1526 
1527   @return Return the Value that was set.
1528 
1529 **/
1530 UINT16
1531 EFIAPI
1532 LibPcdSetEx16 (
1533   IN CONST GUID        *Guid,
1534   IN UINTN             TokenNumber,
1535   IN UINT16            Value
1536   );
1537 
1538 
1539 /**
1540   This function provides a means by which to set a value for a given PCD token.
1541 
1542   Sets the 32-bit value for the token specified by TokenNumber and
1543   Guid to the value specified by Value. Value is returned.
1544 
1545   If Guid is NULL, then ASSERT().
1546 
1547   @param[in]  Guid          Pointer to a 128-bit unique value that
1548                             designates which namespace to set a value from.
1549   @param[in]  TokenNumber   The PCD token number to set a current value for.
1550   @param[in]  Value         The 32-bit value to set.
1551 
1552   @return Return the Value that was set.
1553 
1554 **/
1555 UINT32
1556 EFIAPI
1557 LibPcdSetEx32 (
1558   IN CONST GUID        *Guid,
1559   IN UINTN             TokenNumber,
1560   IN UINT32            Value
1561   );
1562 
1563 
1564 /**
1565   This function provides a means by which to set a value for a given PCD token.
1566 
1567   Sets the 64-bit value for the token specified by TokenNumber and
1568   Guid to the value specified by Value. Value is returned.
1569 
1570   If Guid is NULL, then ASSERT().
1571 
1572   @param[in]  Guid          Pointer to a 128-bit unique value that
1573                             designates which namespace to set a value from.
1574   @param[in]  TokenNumber   The PCD token number to set a current value for.
1575   @param[in]  Value         The 64-bit value to set.
1576 
1577   @return Return the Value that was set.
1578 
1579 **/
1580 UINT64
1581 EFIAPI
1582 LibPcdSetEx64 (
1583   IN CONST GUID        *Guid,
1584   IN UINTN             TokenNumber,
1585   IN UINT64            Value
1586   );
1587 
1588 
1589 /**
1590   This function provides a means by which to set a value for a given PCD token.
1591 
1592   Sets a buffer for the token specified by TokenNumber to the value specified by
1593   Buffer and SizeOfBuffer.  Buffer is returned.  If SizeOfBuffer is greater than
1594   the maximum size support by TokenNumber, then set SizeOfBuffer to the maximum size
1595   supported by TokenNumber and return NULL to indicate that the set operation
1596   was not actually performed.
1597 
1598   If Guid is NULL, then ASSERT().
1599   If SizeOfBuffer is NULL, then ASSERT().
1600   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1601 
1602   @param[in]  Guid              Pointer to a 128-bit unique value that
1603                                 designates which namespace to set a value from.
1604   @param[in]  TokenNumber       The PCD token number to set a current value for.
1605   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
1606   @param[in]  Buffer            A pointer to the buffer to set.
1607 
1608   @return Return the pointer to the Buffer that was set.
1609 
1610 **/
1611 VOID *
1612 EFIAPI
1613 LibPcdSetExPtr (
1614   IN      CONST GUID        *Guid,
1615   IN      UINTN             TokenNumber,
1616   IN OUT  UINTN             *SizeOfBuffer,
1617   IN      VOID              *Buffer
1618   );
1619 
1620 
1621 /**
1622   This function provides a means by which to set a value for a given PCD token.
1623 
1624   Sets the Boolean value for the token specified by TokenNumber and
1625   Guid to the value specified by Value. Value is returned.
1626 
1627   If Guid is NULL, then ASSERT().
1628 
1629   @param[in]  Guid          Pointer to a 128-bit unique value that
1630                             designates which namespace to set a value from.
1631   @param[in]  TokenNumber   The PCD token number to set a current value for.
1632   @param[in]  Value         The Boolean value to set.
1633 
1634   @return Return the Value that was set.
1635 
1636 **/
1637 BOOLEAN
1638 EFIAPI
1639 LibPcdSetExBool (
1640   IN CONST GUID        *Guid,
1641   IN UINTN             TokenNumber,
1642   IN BOOLEAN           Value
1643   );
1644 #endif
1645 
1646 /**
1647   This function provides a means by which to set a value for a given PCD token.
1648 
1649   Sets the 8-bit value for the token specified by TokenNumber
1650   to the value specified by Value.
1651 
1652   @param[in] TokenNumber    The PCD token number to set a current value for.
1653   @param[in] Value          The 8-bit value to set.
1654 
1655   @return The status of the set operation.
1656 
1657 **/
1658 RETURN_STATUS
1659 EFIAPI
1660 LibPcdSet8S (
1661   IN UINTN          TokenNumber,
1662   IN UINT8          Value
1663   );
1664 
1665 /**
1666   This function provides a means by which to set a value for a given PCD token.
1667 
1668   Sets the 16-bit value for the token specified by TokenNumber
1669   to the value specified by Value.
1670 
1671   @param[in] TokenNumber    The PCD token number to set a current value for.
1672   @param[in] Value          The 16-bit value to set.
1673 
1674   @return The status of the set operation.
1675 
1676 **/
1677 RETURN_STATUS
1678 EFIAPI
1679 LibPcdSet16S (
1680   IN UINTN          TokenNumber,
1681   IN UINT16         Value
1682   );
1683 
1684 /**
1685   This function provides a means by which to set a value for a given PCD token.
1686 
1687   Sets the 32-bit value for the token specified by TokenNumber
1688   to the value specified by Value.
1689 
1690   @param[in] TokenNumber    The PCD token number to set a current value for.
1691   @param[in] Value          The 32-bit value to set.
1692 
1693   @return The status of the set operation.
1694 
1695 **/
1696 RETURN_STATUS
1697 EFIAPI
1698 LibPcdSet32S (
1699   IN UINTN          TokenNumber,
1700   IN UINT32         Value
1701   );
1702 
1703 /**
1704   This function provides a means by which to set a value for a given PCD token.
1705 
1706   Sets the 64-bit value for the token specified by TokenNumber
1707   to the value specified by Value.
1708 
1709   @param[in] TokenNumber    The PCD token number to set a current value for.
1710   @param[in] Value          The 64-bit value to set.
1711 
1712   @return The status of the set operation.
1713 
1714 **/
1715 RETURN_STATUS
1716 EFIAPI
1717 LibPcdSet64S (
1718   IN UINTN          TokenNumber,
1719   IN UINT64         Value
1720   );
1721 
1722 /**
1723   This function provides a means by which to set a value for a given PCD token.
1724 
1725   Sets a buffer for the token specified by TokenNumber to the value specified
1726   by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than the maximum size
1727   support by TokenNumber, then set SizeOfBuffer to the maximum size supported by
1728   TokenNumber and return RETURN_INVALID_PARAMETER to indicate that the set operation
1729   was not actually performed.
1730 
1731   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the
1732   maximum size supported by TokenName and RETURN_INVALID_PARAMETER must be returned.
1733 
1734   If SizeOfBuffer is NULL, then ASSERT().
1735   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1736 
1737   @param[in]      TokenNumber   The PCD token number to set a current value for.
1738   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
1739   @param[in]      Buffer        A pointer to the buffer to set.
1740 
1741   @return The status of the set operation.
1742 
1743 **/
1744 RETURN_STATUS
1745 EFIAPI
1746 LibPcdSetPtrS (
1747   IN       UINTN    TokenNumber,
1748   IN OUT   UINTN    *SizeOfBuffer,
1749   IN CONST VOID     *Buffer
1750   );
1751 
1752 /**
1753   This function provides a means by which to set a value for a given PCD token.
1754 
1755   Sets the boolean value for the token specified by TokenNumber
1756   to the value specified by Value.
1757 
1758   @param[in] TokenNumber    The PCD token number to set a current value for.
1759   @param[in] Value          The boolean value to set.
1760 
1761   @return The status of the set operation.
1762 
1763 **/
1764 RETURN_STATUS
1765 EFIAPI
1766 LibPcdSetBoolS (
1767   IN UINTN          TokenNumber,
1768   IN BOOLEAN        Value
1769   );
1770 
1771 /**
1772   This function provides a means by which to set a value for a given PCD token.
1773 
1774   Sets the 8-bit value for the token specified by TokenNumber
1775   to the value specified by Value.
1776 
1777   If Guid is NULL, then ASSERT().
1778 
1779   @param[in] Guid           The pointer to a 128-bit unique value that
1780                             designates which namespace to set a value from.
1781   @param[in] TokenNumber    The PCD token number to set a current value for.
1782   @param[in] Value          The 8-bit value to set.
1783 
1784   @return The status of the set operation.
1785 
1786 **/
1787 RETURN_STATUS
1788 EFIAPI
1789 LibPcdSetEx8S (
1790   IN CONST GUID     *Guid,
1791   IN UINTN          TokenNumber,
1792   IN UINT8          Value
1793   );
1794 
1795 /**
1796   This function provides a means by which to set a value for a given PCD token.
1797 
1798   Sets the 16-bit value for the token specified by TokenNumber
1799   to the value specified by Value.
1800 
1801   If Guid is NULL, then ASSERT().
1802 
1803   @param[in] Guid           The pointer to a 128-bit unique value that
1804                             designates which namespace to set a value from.
1805   @param[in] TokenNumber    The PCD token number to set a current value for.
1806   @param[in] Value          The 16-bit value to set.
1807 
1808   @return The status of the set operation.
1809 
1810 **/
1811 RETURN_STATUS
1812 EFIAPI
1813 LibPcdSetEx16S (
1814   IN CONST GUID     *Guid,
1815   IN UINTN          TokenNumber,
1816   IN UINT16         Value
1817   );
1818 
1819 /**
1820   This function provides a means by which to set a value for a given PCD token.
1821 
1822   Sets the 32-bit value for the token specified by TokenNumber
1823   to the value specified by Value.
1824 
1825   If Guid is NULL, then ASSERT().
1826 
1827   @param[in] Guid           The pointer to a 128-bit unique value that
1828                             designates which namespace to set a value from.
1829   @param[in] TokenNumber    The PCD token number to set a current value for.
1830   @param[in] Value          The 32-bit value to set.
1831 
1832   @return The status of the set operation.
1833 
1834 **/
1835 RETURN_STATUS
1836 EFIAPI
1837 LibPcdSetEx32S (
1838   IN CONST GUID     *Guid,
1839   IN UINTN          TokenNumber,
1840   IN UINT32         Value
1841   );
1842 
1843 /**
1844   This function provides a means by which to set a value for a given PCD token.
1845 
1846   Sets the 64-bit value for the token specified by TokenNumber
1847   to the value specified by Value.
1848 
1849   If Guid is NULL, then ASSERT().
1850 
1851   @param[in] Guid           The pointer to a 128-bit unique value that
1852                             designates which namespace to set a value from.
1853   @param[in] TokenNumber    The PCD token number to set a current value for.
1854   @param[in] Value          The 64-bit value to set.
1855 
1856   @return The status of the set operation.
1857 
1858 **/
1859 RETURN_STATUS
1860 EFIAPI
1861 LibPcdSetEx64S (
1862   IN CONST GUID     *Guid,
1863   IN UINTN          TokenNumber,
1864   IN UINT64         Value
1865   );
1866 
1867 /**
1868   This function provides a means by which to set a value for a given PCD token.
1869 
1870   Sets a buffer for the token specified by TokenNumber to the value specified by
1871   Buffer and SizeOfBuffer. If SizeOfBuffer is greater than the maximum size
1872   support by TokenNumber, then set SizeOfBuffer to the maximum size supported by
1873   TokenNumber and return RETURN_INVALID_PARAMETER to indicate that the set operation
1874   was not actually performed.
1875 
1876   If Guid is NULL, then ASSERT().
1877   If SizeOfBuffer is NULL, then ASSERT().
1878   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
1879 
1880   @param[in]      Guid          Pointer to a 128-bit unique value that
1881                                 designates which namespace to set a value from.
1882   @param[in]      TokenNumber   The PCD token number to set a current value for.
1883   @param[in, out] SizeOfBuffer  The size, in bytes, of Buffer.
1884   @param[in]      Buffer        A pointer to the buffer to set.
1885 
1886   @return The status of the set operation.
1887 
1888 **/
1889 RETURN_STATUS
1890 EFIAPI
1891 LibPcdSetExPtrS (
1892   IN CONST GUID     *Guid,
1893   IN       UINTN    TokenNumber,
1894   IN OUT   UINTN    *SizeOfBuffer,
1895   IN       VOID     *Buffer
1896   );
1897 
1898 /**
1899   This function provides a means by which to set a value for a given PCD token.
1900 
1901   Sets the boolean value for the token specified by TokenNumber
1902   to the value specified by Value.
1903 
1904   If Guid is NULL, then ASSERT().
1905 
1906   @param[in] Guid           The pointer to a 128-bit unique value that
1907                             designates which namespace to set a value from.
1908   @param[in] TokenNumber    The PCD token number to set a current value for.
1909   @param[in] Value          The boolean value to set.
1910 
1911   @return The status of the set operation.
1912 
1913 **/
1914 RETURN_STATUS
1915 EFIAPI
1916 LibPcdSetExBoolS (
1917   IN CONST GUID     *Guid,
1918   IN UINTN          TokenNumber,
1919   IN BOOLEAN        Value
1920   );
1921 
1922 /**
1923   This notification function serves two purposes.
1924 
1925   Firstly, it notifies the module that did the registration that the value of this
1926   PCD token has been set.
1927   Secondly, it provides a mechanism for the module that did the registration to intercept
1928   the set operation and override the value been set if necessary. After the invocation of
1929   the callback function, TokenData will be used by PCD service PEIM or driver to modify th
1930   internal data in PCD database.
1931 
1932   @param[in]      CallBackGuid    The PCD token GUID being set.
1933   @param[in]      CallBackToken   The PCD token number being set.
1934   @param[in, out] TokenData       A pointer to the token data being set.
1935   @param[in]      TokenDataSize   The size, in bytes, of the data being set.
1936 
1937 **/
1938 typedef
1939 VOID
1940 (EFIAPI *PCD_CALLBACK)(
1941   IN        CONST GUID        *CallBackGuid, OPTIONAL
1942   IN        UINTN             CallBackToken,
1943   IN  OUT   VOID              *TokenData,
1944   IN        UINTN             TokenDataSize
1945   );
1946 
1947 
1948 /**
1949   Set up a notification function that is called when a specified token is set.
1950 
1951   When the token specified by TokenNumber and Guid is set,
1952   then notification function specified by NotificationFunction is called.
1953   If Guid is NULL, then the default token space is used.
1954   If NotificationFunction is NULL, then ASSERT().
1955 
1956   @param[in]  Guid                  Pointer to a 128-bit unique value that designates which
1957                                     namespace to set a value from.  If NULL, then the default
1958                                     token space is used.
1959   @param[in]  TokenNumber           The PCD token number to monitor.
1960   @param[in]  NotificationFunction  The function to call when the token
1961                                     specified by Guid and TokenNumber is set.
1962 
1963 **/
1964 VOID
1965 EFIAPI
1966 LibPcdCallbackOnSet (
1967   IN CONST GUID               *Guid,       OPTIONAL
1968   IN UINTN                    TokenNumber,
1969   IN PCD_CALLBACK             NotificationFunction
1970   );
1971 
1972 
1973 /**
1974   Disable a notification function that was established with LibPcdCallbackonSet().
1975 
1976   Disable a notification function that was previously established with LibPcdCallbackOnSet().
1977   If NotificationFunction is NULL, then ASSERT().
1978   If LibPcdCallbackOnSet() was not previously called with Guid, TokenNumber,
1979   and NotificationFunction, then ASSERT().
1980 
1981   @param[in]  Guid                 Specify the GUID token space.
1982   @param[in]  TokenNumber          Specify the token number.
1983   @param[in]  NotificationFunction The callback function to be unregistered.
1984 
1985 **/
1986 VOID
1987 EFIAPI
1988 LibPcdCancelCallback (
1989   IN CONST GUID               *Guid,       OPTIONAL
1990   IN UINTN                    TokenNumber,
1991   IN PCD_CALLBACK             NotificationFunction
1992   );
1993 
1994 
1995 /**
1996   Retrieves the next token in a token space.
1997 
1998   Retrieves the next PCD token number from the token space specified by Guid.
1999   If Guid is NULL, then the default token space is used.  If TokenNumber is 0,
2000   then the first token number is returned.  Otherwise, the token number that
2001   follows TokenNumber in the token space is returned.  If TokenNumber is the last
2002   token number in the token space, then 0 is returned.
2003 
2004   If TokenNumber is not 0 and is not in the token space specified by Guid, then ASSERT().
2005 
2006   @param[in]  Guid        Pointer to a 128-bit unique value that designates which namespace
2007                           to set a value from.  If NULL, then the default token space is used.
2008   @param[in]  TokenNumber The previous PCD token number.  If 0, then retrieves the first PCD
2009                           token number.
2010 
2011   @return The next valid token number.
2012 
2013 **/
2014 UINTN
2015 EFIAPI
2016 LibPcdGetNextToken (
2017   IN CONST GUID               *Guid,       OPTIONAL
2018   IN UINTN                    TokenNumber
2019   );
2020 
2021 
2022 
2023 /**
2024   Used to retrieve the list of available PCD token space GUIDs.
2025 
2026   Returns the PCD token space GUID that follows TokenSpaceGuid in the list of token spaces
2027   in the platform.
2028   If TokenSpaceGuid is NULL, then a pointer to the first PCD token spaces returned.
2029   If TokenSpaceGuid is the last PCD token space GUID in the list, then NULL is returned.
2030 
2031   @param  TokenSpaceGuid  Pointer to the a PCD token space GUID
2032 
2033   @return The next valid token namespace.
2034 
2035 **/
2036 GUID *
2037 EFIAPI
2038 LibPcdGetNextTokenSpace (
2039   IN CONST GUID  *TokenSpaceGuid
2040   );
2041 
2042 
2043 /**
2044   Sets a value of a patchable PCD entry that is type pointer.
2045 
2046   Sets the PCD entry specified by PatchVariable to the value specified by Buffer
2047   and SizeOfBuffer.  Buffer is returned.  If SizeOfBuffer is greater than
2048   MaximumDatumSize, then set SizeOfBuffer to MaximumDatumSize and return
2049   NULL to indicate that the set operation was not actually performed.
2050   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
2051   MaximumDatumSize and NULL must be returned.
2052 
2053   If PatchVariable is NULL, then ASSERT().
2054   If SizeOfBuffer is NULL, then ASSERT().
2055   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
2056 
2057   @param[out] PatchVariable     A pointer to the global variable in a module that is
2058                                 the target of the set operation.
2059   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
2060   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
2061   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
2062 
2063   @return Return the pointer to the Buffer that was set.
2064 
2065 **/
2066 VOID *
2067 EFIAPI
2068 LibPatchPcdSetPtr (
2069   OUT        VOID       *PatchVariable,
2070   IN        UINTN       MaximumDatumSize,
2071   IN OUT    UINTN       *SizeOfBuffer,
2072   IN CONST  VOID        *Buffer
2073   );
2074 
2075 /**
2076   Sets a value of a patchable PCD entry that is type pointer.
2077 
2078   Sets the PCD entry specified by PatchVariable to the value specified
2079   by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than MaximumDatumSize,
2080   then set SizeOfBuffer to MaximumDatumSize and return RETURN_INVALID_PARAMETER
2081   to indicate that the set operation was not actually performed.
2082   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
2083   MaximumDatumSize and RETURN_INVALID_PARAMETER must be returned.
2084 
2085   If PatchVariable is NULL, then ASSERT().
2086   If SizeOfBuffer is NULL, then ASSERT().
2087   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
2088 
2089   @param[out] PatchVariable     A pointer to the global variable in a module that is
2090                                 the target of the set operation.
2091   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
2092   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
2093   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
2094 
2095   @return The status of the set operation.
2096 
2097 **/
2098 RETURN_STATUS
2099 EFIAPI
2100 LibPatchPcdSetPtrS (
2101   OUT      VOID     *PatchVariable,
2102   IN       UINTN    MaximumDatumSize,
2103   IN OUT   UINTN    *SizeOfBuffer,
2104   IN CONST VOID     *Buffer
2105   );
2106 
2107 /**
2108   Sets a value and size of a patchable PCD entry that is type pointer.
2109 
2110   Sets the PCD entry specified by PatchVariable to the value specified by Buffer
2111   and SizeOfBuffer. Buffer is returned.  If SizeOfBuffer is greater than
2112   MaximumDatumSize, then set SizeOfBuffer to MaximumDatumSize and return
2113   NULL to indicate that the set operation was not actually performed.
2114   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
2115   MaximumDatumSize and NULL must be returned.
2116 
2117   If PatchVariable is NULL, then ASSERT().
2118   If SizeOfPatchVariable is NULL, then ASSERT().
2119   If SizeOfBuffer is NULL, then ASSERT().
2120   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
2121 
2122   @param[out] PatchVariable     A pointer to the global variable in a module that is
2123                                 the target of the set operation.
2124   @param[out] SizeOfPatchVariable A pointer to the size, in bytes, of PatchVariable.
2125   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
2126   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
2127   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
2128 
2129   @return Return the pointer to the Buffer that was set.
2130 
2131 **/
2132 VOID *
2133 EFIAPI
2134 LibPatchPcdSetPtrAndSize (
2135   OUT       VOID        *PatchVariable,
2136   OUT       UINTN       *SizeOfPatchVariable,
2137   IN        UINTN       MaximumDatumSize,
2138   IN OUT    UINTN       *SizeOfBuffer,
2139   IN CONST  VOID        *Buffer
2140   );
2141 
2142 /**
2143   Sets a value and size of a patchable PCD entry that is type pointer.
2144 
2145   Sets the PCD entry specified by PatchVariable to the value specified
2146   by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than MaximumDatumSize,
2147   then set SizeOfBuffer to MaximumDatumSize and return RETURN_INVALID_PARAMETER
2148   to indicate that the set operation was not actually performed.
2149   If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to
2150   MaximumDatumSize and RETURN_INVALID_PARAMETER must be returned.
2151 
2152   If PatchVariable is NULL, then ASSERT().
2153   If SizeOfPatchVariable is NULL, then ASSERT().
2154   If SizeOfBuffer is NULL, then ASSERT().
2155   If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().
2156 
2157   @param[out] PatchVariable     A pointer to the global variable in a module that is
2158                                 the target of the set operation.
2159   @param[out] SizeOfPatchVariable A pointer to the size, in bytes, of PatchVariable.
2160   @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.
2161   @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.
2162   @param[in] Buffer             A pointer to the buffer to used to set the target variable.
2163 
2164   @return The status of the set operation.
2165 
2166 **/
2167 RETURN_STATUS
2168 EFIAPI
2169 LibPatchPcdSetPtrAndSizeS (
2170   OUT      VOID     *PatchVariable,
2171   OUT      UINTN    *SizeOfPatchVariable,
2172   IN       UINTN    MaximumDatumSize,
2173   IN OUT   UINTN    *SizeOfBuffer,
2174   IN CONST VOID     *Buffer
2175   );
2176 
2177 typedef enum {
2178   PCD_TYPE_8,
2179   PCD_TYPE_16,
2180   PCD_TYPE_32,
2181   PCD_TYPE_64,
2182   PCD_TYPE_BOOL,
2183   PCD_TYPE_PTR
2184 } PCD_TYPE;
2185 
2186 typedef struct {
2187   ///
2188   /// The returned information associated with the requested TokenNumber. If
2189   /// TokenNumber is 0, then PcdType is set to PCD_TYPE_8.
2190   ///
2191   PCD_TYPE          PcdType;
2192   ///
2193   /// The size of the data in bytes associated with the TokenNumber specified. If
2194   /// TokenNumber is 0, then PcdSize is set 0.
2195   ///
2196   UINTN             PcdSize;
2197   ///
2198   /// The null-terminated ASCII string associated with a given token. If the
2199   /// TokenNumber specified was 0, then this field corresponds to the null-terminated
2200   /// ASCII string associated with the token's namespace Guid. If NULL, there is no
2201   /// name associated with this request.
2202   ///
2203   CHAR8             *PcdName;
2204 } PCD_INFO;
2205 
2206 
2207 /**
2208   Retrieve additional information associated with a PCD token.
2209 
2210   This includes information such as the type of value the TokenNumber is associated with as well as possible
2211   human readable name that is associated with the token.
2212 
2213   If TokenNumber is not in the default token space specified, then ASSERT().
2214 
2215   @param[in]    TokenNumber The PCD token number.
2216   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.
2217                             The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.
2218 **/
2219 VOID
2220 EFIAPI
2221 LibPcdGetInfo (
2222   IN        UINTN           TokenNumber,
2223   OUT       PCD_INFO        *PcdInfo
2224   );
2225 
2226 /**
2227   Retrieve additional information associated with a PCD token.
2228 
2229   This includes information such as the type of value the TokenNumber is associated with as well as possible
2230   human readable name that is associated with the token.
2231 
2232   If TokenNumber is not in the token space specified by Guid, then ASSERT().
2233 
2234   @param[in]    Guid        The 128-bit unique value that designates the namespace from which to extract the value.
2235   @param[in]    TokenNumber The PCD token number.
2236   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.
2237                             The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.
2238 **/
2239 VOID
2240 EFIAPI
2241 LibPcdGetInfoEx (
2242   IN CONST  GUID            *Guid,
2243   IN        UINTN           TokenNumber,
2244   OUT       PCD_INFO        *PcdInfo
2245   );
2246 
2247 /**
2248   Retrieve the currently set SKU Id.
2249 
2250   @return   The currently set SKU Id. If the platform has not set at a SKU Id, then the
2251             default SKU Id value of 0 is returned. If the platform has set a SKU Id, then the currently set SKU
2252             Id is returned.
2253 **/
2254 UINTN
2255 EFIAPI
2256 LibPcdGetSku (
2257   VOID
2258   );
2259 
2260 #endif
2261