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