| /** @file | |
| All Pcd Ppi services are implemented here. | |
| Copyright (c) 2006 - 2008, Intel Corporation | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include "Service.h" | |
| PCD_PPI mPcdPpiInstance = { | |
| PeiPcdSetSku, | |
| PeiPcdGet8, | |
| PeiPcdGet16, | |
| PeiPcdGet32, | |
| PeiPcdGet64, | |
| PeiPcdGetPtr, | |
| PeiPcdGetBool, | |
| PeiPcdGetSize, | |
| PeiPcdGet8Ex, | |
| PeiPcdGet16Ex, | |
| PeiPcdGet32Ex, | |
| PeiPcdGet64Ex, | |
| PeiPcdGetPtrEx, | |
| PeiPcdGetBoolEx, | |
| PeiPcdGetSizeEx, | |
| PeiPcdSet8, | |
| PeiPcdSet16, | |
| PeiPcdSet32, | |
| PeiPcdSet64, | |
| PeiPcdSetPtr, | |
| PeiPcdSetBool, | |
| PeiPcdSet8Ex, | |
| PeiPcdSet16Ex, | |
| PeiPcdSet32Ex, | |
| PeiPcdSet64Ex, | |
| PeiPcdSetPtrEx, | |
| PeiPcdSetBoolEx, | |
| PeiRegisterCallBackOnSet, | |
| PcdUnRegisterCallBackOnSet, | |
| PeiPcdGetNextToken, | |
| PeiPcdGetNextTokenSpace | |
| }; | |
| EFI_PEI_PPI_DESCRIPTOR mPpiPCD = { | |
| (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), | |
| &gPcdPpiGuid, | |
| &mPcdPpiInstance | |
| }; | |
| /** | |
| Main entry for PCD PEIM driver. | |
| This routine initialize the PCD database for PEI phase and install PCD_PPI. | |
| @param FileHandle Handle of the file being invoked. | |
| @param PeiServices Describes the list of possible PEI Services. | |
| @return Status of install PCD_PPI | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PcdPeimInit ( | |
| IN EFI_PEI_FILE_HANDLE FileHandle, | |
| IN CONST EFI_PEI_SERVICES **PeiServices | |
| ) | |
| { | |
| BuildPcdDatabase (); | |
| return PeiServicesInstallPpi (&mPpiPCD); | |
| } | |
| /** | |
| Sets the SKU value for subsequent calls to set or get PCD token values. | |
| SetSku() sets the SKU Id to be used for subsequent calls to set or get PCD values. | |
| SetSku() is normally called only once by the system. | |
| For each item (token), the database can hold a single value that applies to all SKUs, | |
| or multiple values, where each value is associated with a specific SKU Id. Items with multiple, | |
| SKU-specific values are called SKU enabled. | |
| The SKU Id of zero is reserved as a default. The valid SkuId range is 1 to 255. | |
| For tokens that are not SKU enabled, the system ignores any set SKU Id and works with the | |
| single value for that token. For SKU-enabled tokens, the system will use the SKU Id set by the | |
| last call to SetSku(). If no SKU Id is set or the currently set SKU Id isn't valid for the specified token, | |
| the system uses the default SKU Id. If the system attempts to use the default SKU Id and no value has been | |
| set for that Id, the results are unpredictable. | |
| @param[in] SkuId The SKU value that will be used when the PCD service will retrieve and | |
| set values associated with a PCD token. | |
| **/ | |
| VOID | |
| EFIAPI | |
| PeiPcdSetSku ( | |
| IN UINTN SkuId | |
| ) | |
| { | |
| GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId; | |
| return; | |
| } | |
| /** | |
| Retrieves an 8-bit value for a given PCD token. | |
| Retrieves the current byte-sized value for a PCD token number. | |
| If the TokenNumber is invalid, the results are unpredictable. | |
| @param[in] TokenNumber The PCD token number. | |
| @return The UINT8 value. | |
| **/ | |
| UINT8 | |
| EFIAPI | |
| PeiPcdGet8 ( | |
| IN UINTN TokenNumber | |
| ) | |
| { | |
| return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8))); | |
| } | |
| /** | |
| Retrieves an 16-bit value for a given PCD token. | |
| Retrieves the current 16-bits value for a PCD token number. | |
| If the TokenNumber is invalid, the results are unpredictable. | |
| @param[in] TokenNumber The PCD token number. | |
| @return The UINT16 value. | |
| **/ | |
| UINT16 | |
| EFIAPI | |
| PeiPcdGet16 ( | |
| IN UINTN TokenNumber | |
| ) | |
| { | |
| return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16))); | |
| } | |
| /** | |
| Retrieves an 32-bit value for a given PCD token. | |
| Retrieves the current 32-bits value for a PCD token number. | |
| If the TokenNumber is invalid, the results are unpredictable. | |
| @param[in] TokenNumber The PCD token number. | |
| @return The UINT32 value. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| PeiPcdGet32 ( | |
| IN UINTN TokenNumber | |
| ) | |
| { | |
| return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32))); | |
| } | |
| /** | |
| Retrieves an 64-bit value for a given PCD token. | |
| Retrieves the current 64-bits value for a PCD token number. | |
| If the TokenNumber is invalid, the results are unpredictable. | |
| @param[in] TokenNumber The PCD token number. | |
| @return The UINT64 value. | |
| **/ | |
| UINT64 | |
| EFIAPI | |
| PeiPcdGet64 ( | |
| IN UINTN TokenNumber | |
| ) | |
| { | |
| return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64))); | |
| } | |
| /** | |
| Retrieves a pointer to a value for a given PCD token. | |
| Retrieves the current pointer to the buffer for a PCD token number. | |
| Do not make any assumptions about the alignment of the pointer that | |
| is returned by this function call. If the TokenNumber is invalid, | |
| the results are unpredictable. | |
| @param[in] TokenNumber The PCD token number. | |
| @return The pointer to the buffer to be retrieved. | |
| **/ | |
| VOID * | |
| EFIAPI | |
| PeiPcdGetPtr ( | |
| IN UINTN TokenNumber | |
| ) | |
| { | |
| return GetWorker (TokenNumber, 0); | |
| } | |
| /** | |
| Retrieves a Boolean value for a given PCD token. | |
| Retrieves the current boolean value for a PCD token number. | |
| Do not make any assumptions about the alignment of the pointer that | |
| is returned by this function call. If the TokenNumber is invalid, | |
| the results are unpredictable. | |
| @param[in] TokenNumber The PCD token number. | |
| @return The Boolean value. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| PeiPcdGetBool ( | |
| IN UINTN TokenNumber | |
| ) | |
| { | |
| return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN))); | |
| } | |
| /** | |
| Retrieves the size of the value for a given PCD token. | |
| Retrieves the current size of a particular PCD token. | |
| If the TokenNumber is invalid, the results are unpredictable. | |
| @param[in] TokenNumber The PCD token number. | |
| @return The size of the value for the PCD token. | |
| **/ | |
| UINTN | |
| EFIAPI | |
| PeiPcdGetSize ( | |
| IN UINTN TokenNumber | |
| ) | |
| { | |
| PEI_PCD_DATABASE *PeiPcdDb; | |
| UINTN Size; | |
| UINTN MaxSize; | |
| // | |
| // If DebugAssertEnabled is TRUE, we still need to provide the GET size | |
| // function as GetWorker and SetWoker need this function to do ASSERT. | |
| // | |
| if ((!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) && | |
| (!DebugAssertEnabled ())) { | |
| return 0; | |
| } | |
| PeiPcdDb = GetPcdDatabase (); | |
| // | |
| // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. | |
| // We have to decrement TokenNumber by 1 to make it usable | |
| // as the array index. | |
| // | |
| TokenNumber--; | |
| // EBC compiler is very choosy. It may report warning about comparison | |
| // between UINTN and 0 . So we add 1 in each size of the | |
| // comparison. | |
| ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1); | |
| Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT; | |
| if (Size == 0) { | |
| // | |
| // For pointer type, we need to scan the SIZE_TABLE to get the current size. | |
| // | |
| return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb); | |
| } else { | |
| return Size; | |
| } | |
| } | |
| /** | |
| Retrieves an 8-bit value for a given PCD token. | |
| Retrieves the 8-bit value of a particular PCD token. | |
| If the TokenNumber is invalid or the token space | |
| specified by Guid does not exist, the results are | |
| unpredictable. | |
| @param[in] Guid The token space for the token number. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @return The size 8-bit value for the PCD token. | |
| **/ | |
| UINT8 | |
| EFIAPI | |
| PeiPcdGet8Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber | |
| ) | |
| { | |
| return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8))); | |
| } | |
| /** | |
| Retrieves an 16-bit value for a given PCD token. | |
| Retrieves the 16-bit value of a particular PCD token. | |
| If the TokenNumber is invalid or the token space | |
| specified by Guid does not exist, the results are | |
| unpredictable. | |
| @param[in] Guid The token space for the token number. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @return The size 16-bit value for the PCD token. | |
| **/ | |
| UINT16 | |
| EFIAPI | |
| PeiPcdGet16Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber | |
| ) | |
| { | |
| return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16))); | |
| } | |
| /** | |
| Retrieves an 32-bit value for a given PCD token. | |
| Retrieves the 32-bit value of a particular PCD token. | |
| If the TokenNumber is invalid or the token space | |
| specified by Guid does not exist, the results are | |
| unpredictable. | |
| @param[in] Guid The token space for the token number. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @return The size 32-bit value for the PCD token. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| PeiPcdGet32Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber | |
| ) | |
| { | |
| return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32))); | |
| } | |
| /** | |
| Retrieves an 64-bit value for a given PCD token. | |
| Retrieves the 64-bit value of a particular PCD token. | |
| If the TokenNumber is invalid or the token space | |
| specified by Guid does not exist, the results are | |
| unpredictable. | |
| @param[in] Guid The token space for the token number. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @return The size 64-bit value for the PCD token. | |
| **/ | |
| UINT64 | |
| EFIAPI | |
| PeiPcdGet64Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber | |
| ) | |
| { | |
| return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64))); | |
| } | |
| /** | |
| Retrieves a pointer to a value for a given PCD token. | |
| Retrieves the current pointer to the buffer for a PCD token number. | |
| Do not make any assumptions about the alignment of the pointer that | |
| is returned by this function call. If the TokenNumber is invalid, | |
| the results are unpredictable. | |
| @param[in] Guid The token space for the token number. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @return The pointer to the buffer to be retrieved. | |
| **/ | |
| VOID * | |
| EFIAPI | |
| PeiPcdGetPtrEx ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber | |
| ) | |
| { | |
| return ExGetWorker (Guid, ExTokenNumber, 0); | |
| } | |
| /** | |
| Retrieves an Boolean value for a given PCD token. | |
| Retrieves the Boolean value of a particular PCD token. | |
| If the TokenNumber is invalid or the token space | |
| specified by Guid does not exist, the results are | |
| unpredictable. | |
| @param[in] Guid The token space for the token number. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @return The size Boolean value for the PCD token. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| PeiPcdGetBoolEx ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber | |
| ) | |
| { | |
| return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN))); | |
| } | |
| /** | |
| Retrieves the size of the value for a given PCD token. | |
| Retrieves the current size of a particular PCD token. | |
| If the TokenNumber is invalid, the results are unpredictable. | |
| @param[in] Guid The token space for the token number. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @return The size of the value for the PCD token. | |
| **/ | |
| UINTN | |
| EFIAPI | |
| PeiPcdGetSizeEx ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber | |
| ) | |
| { | |
| if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) { | |
| return 0; | |
| } | |
| return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber)); | |
| } | |
| /** | |
| Sets an 8-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] TokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet8 ( | |
| IN UINTN TokenNumber, | |
| IN UINT8 Value | |
| ) | |
| { | |
| return SetValueWorker (TokenNumber, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets an 16-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] TokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet16 ( | |
| IN UINTN TokenNumber, | |
| IN UINT16 Value | |
| ) | |
| { | |
| return SetValueWorker (TokenNumber, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets an 32-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] TokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet32 ( | |
| IN UINTN TokenNumber, | |
| IN UINT32 Value | |
| ) | |
| { | |
| return SetValueWorker (TokenNumber, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets an 64-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] TokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet64 ( | |
| IN UINTN TokenNumber, | |
| IN UINT64 Value | |
| ) | |
| { | |
| return SetValueWorker (TokenNumber, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets a value of a specified size for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] TokenNumber The PCD token number. | |
| @param[in, out] SizeOfBuffer A pointer to the length of the value being set for the PCD token. | |
| On input, if the SizeOfValue is greater than the maximum size supported | |
| for this TokenNumber then the output value of SizeOfValue will reflect | |
| the maximum size supported for this TokenNumber. | |
| @param[in] Buffer The buffer to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSetPtr ( | |
| IN UINTN TokenNumber, | |
| IN OUT UINTN *SizeOfBuffer, | |
| IN VOID *Buffer | |
| ) | |
| { | |
| return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE); | |
| } | |
| /** | |
| Sets an Boolean value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] TokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSetBool ( | |
| IN UINTN TokenNumber, | |
| IN BOOLEAN Value | |
| ) | |
| { | |
| return SetValueWorker (TokenNumber, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets an 8-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet8Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber, | |
| IN UINT8 Value | |
| ) | |
| { | |
| return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets an 16-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet16Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber, | |
| IN UINT16 Value | |
| ) | |
| { | |
| return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets an 32-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet32Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber, | |
| IN UINT32 Value | |
| ) | |
| { | |
| return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets an 64-bit value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @param[in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSet64Ex ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber, | |
| IN UINT64 Value | |
| ) | |
| { | |
| return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Sets a value of a specified size for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @param[in, out] SizeOfBuffer A pointer to the length of the value being set for the PCD token. | |
| On input, if the SizeOfValue is greater than the maximum size supported | |
| for this TokenNumber then the output value of SizeOfValue will reflect | |
| the maximum size supported for this TokenNumber. | |
| @param[in] Value The buffer to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSetPtrEx ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber, | |
| IN OUT UINTN *SizeOfBuffer, | |
| IN VOID *Value | |
| ) | |
| { | |
| return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE); | |
| } | |
| /** | |
| Sets an Boolean value for a given PCD token. | |
| When the PCD service sets a value, it will check to ensure that the | |
| size of the value being set is compatible with the Token's existing definition. | |
| If it is not, an error will be returned. | |
| @param [in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param [in] ExTokenNumber The PCD token number. | |
| @param [in] Value The value to set for the PCD token. | |
| @retval EFI_SUCCESS Procedure returned successfully. | |
| @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data | |
| being set was incompatible with a call to this function. | |
| Use GetSize() to retrieve the size of the target data. | |
| @retval EFI_NOT_FOUND The PCD service could not find the requested token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdSetBoolEx ( | |
| IN CONST EFI_GUID *Guid, | |
| IN UINTN ExTokenNumber, | |
| IN BOOLEAN Value | |
| ) | |
| { | |
| return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value)); | |
| } | |
| /** | |
| Specifies a function to be called anytime the value of a designated token is changed. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @param[in] CallBackFunction The function prototype called when the value associated with the CallBackToken is set. | |
| @retval EFI_SUCCESS The PCD service has successfully established a call event | |
| for the CallBackToken requested. | |
| @retval EFI_NOT_FOUND The PCD service could not find the referenced token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiRegisterCallBackOnSet ( | |
| IN CONST EFI_GUID *Guid, OPTIONAL | |
| IN UINTN ExTokenNumber, | |
| IN PCD_PPI_CALLBACK CallBackFunction | |
| ) | |
| { | |
| if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| ASSERT (CallBackFunction != NULL); | |
| return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE); | |
| } | |
| /** | |
| Cancels a previously set callback function for a particular PCD token number. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in] ExTokenNumber The PCD token number. | |
| @param[in] CallBackFunction The function prototype called when the value associated with the CallBackToken is set. | |
| @retval EFI_SUCCESS The PCD service has successfully established a call event | |
| for the CallBackToken requested. | |
| @retval EFI_NOT_FOUND The PCD service could not find the referenced token number. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PcdUnRegisterCallBackOnSet ( | |
| IN CONST EFI_GUID *Guid, OPTIONAL | |
| IN UINTN ExTokenNumber, | |
| IN PCD_PPI_CALLBACK CallBackFunction | |
| ) | |
| { | |
| if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| ASSERT (CallBackFunction != NULL); | |
| return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE); | |
| } | |
| /** | |
| Retrieves the next valid PCD token for a given namespace. | |
| @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. | |
| @param[in, out] TokenNumber A pointer to the PCD token number to use to find the subsequent token number. | |
| If the input token namespace or token number does not exist on the platform, | |
| an error is returned and the value of *TokenNumber is undefined. To retrieve the "first" token, | |
| have the pointer reference a TokenNumber value of 0. If the input token number is 0 and | |
| there is no valid token number for this token namespace, *TokenNumber will be assigned to | |
| 0 and the function return EFI_SUCCESS. If the token number is the last valid token number, | |
| *TokenNumber will be assigned to 0 and the function return EFI_SUCCESS. | |
| @retval EFI_SUCCESS The PCD service retrieved the next valid token number. Or the input token number | |
| is already the last valid token number in the PCD database. | |
| In the later case, *TokenNumber is updated with the value of 0. | |
| @retval EFI_NOT_FOUND If this input token number and token namespace does not exist on the platform. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdGetNextToken ( | |
| IN CONST EFI_GUID *Guid, OPTIONAL | |
| IN OUT UINTN *TokenNumber | |
| ) | |
| { | |
| UINTN GuidTableIdx; | |
| PEI_PCD_DATABASE *PeiPcdDb; | |
| EFI_GUID *MatchGuid; | |
| DYNAMICEX_MAPPING *ExMapTable; | |
| UINTN Index; | |
| BOOLEAN Found; | |
| BOOLEAN PeiExMapTableEmpty; | |
| if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY; | |
| if (Guid == NULL) { | |
| if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) { | |
| return EFI_NOT_FOUND; | |
| } | |
| (*TokenNumber)++; | |
| if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) { | |
| *TokenNumber = PCD_INVALID_TOKEN_NUMBER; | |
| } | |
| return EFI_SUCCESS; | |
| } else { | |
| if (PeiExMapTableEmpty) { | |
| *TokenNumber = PCD_INVALID_TOKEN_NUMBER; | |
| return EFI_SUCCESS; | |
| } | |
| // | |
| // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order | |
| // 1) ExGuid | |
| // 2) ExTokenNumber | |
| // | |
| PeiPcdDb = GetPcdDatabase (); | |
| MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid); | |
| if (MatchGuid == NULL) { | |
| *TokenNumber = PCD_INVALID_TOKEN_NUMBER; | |
| return EFI_NOT_FOUND; | |
| } | |
| GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; | |
| ExMapTable = PeiPcdDb->Init.ExMapTable; | |
| Found = FALSE; | |
| // | |
| // Locate the GUID in ExMapTable first. | |
| // | |
| for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) { | |
| if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) { | |
| Found = TRUE; | |
| break; | |
| } | |
| } | |
| if (Found) { | |
| if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) { | |
| *TokenNumber = ExMapTable[Index].ExTokenNumber; | |
| return EFI_SUCCESS; | |
| } | |
| for ( ; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) { | |
| if (ExMapTable[Index].ExTokenNumber == *TokenNumber) { | |
| Index++; | |
| if (Index == PEI_EXMAPPING_TABLE_SIZE) { | |
| // | |
| // Exceed the length of ExMap Table | |
| // | |
| *TokenNumber = PCD_INVALID_TOKEN_NUMBER; | |
| return EFI_SUCCESS; | |
| } | |
| if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) { | |
| *TokenNumber = ExMapTable[Index].ExTokenNumber; | |
| return EFI_SUCCESS; | |
| } else { | |
| *TokenNumber = PCD_INVALID_TOKEN_NUMBER; | |
| return EFI_SUCCESS; | |
| } | |
| } | |
| } | |
| return EFI_NOT_FOUND; | |
| } | |
| } | |
| return EFI_NOT_FOUND; | |
| } | |
| /** | |
| Retrieves the next valid PCD token namespace for a given namespace. | |
| @param[in, out] Guid An indirect pointer to EFI_GUID. On input it designates | |
| a known token namespace from which the search will start. On output, | |
| it designates the next valid token namespace on the platform. If the input | |
| token namespace does not exist on the platform, an error is returned and | |
| the value of *Guid is undefined. If *Guid is NULL, then the GUID of the | |
| first token space of the current platform is assigned to *Guid the function | |
| return EFI_SUCCESS. If *Guid is NULL and there is no namespace exist in | |
| the platform other than the default (NULL) tokennamespace, *Guid is unchanged | |
| and the function return EFI_SUCCESS. If this input token namespace is the last | |
| namespace on the platform, *Guid will be assigned to NULL and the function return | |
| EFI_SUCCESS. | |
| @retval EFI_SUCCESS The PCD service retrieved the next valid token space Guid. | |
| Or the input token space Guid is already the last valid token space Guid | |
| in the PCD database. In the later case, *Guid is updated with the value of NULL. | |
| @retval EFI_NOT_FOUND If the input token namespace does not exist on the platform. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| PeiPcdGetNextTokenSpace ( | |
| IN OUT CONST EFI_GUID **Guid | |
| ) | |
| { | |
| UINTN GuidTableIdx; | |
| EFI_GUID *MatchGuid; | |
| PEI_PCD_DATABASE *PeiPcdDb; | |
| DYNAMICEX_MAPPING *ExMapTable; | |
| UINTN Index; | |
| BOOLEAN Found; | |
| BOOLEAN PeiExMapTableEmpty; | |
| if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) { | |
| return EFI_UNSUPPORTED; | |
| } | |
| ASSERT (Guid != NULL); | |
| PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY; | |
| if (PeiExMapTableEmpty) { | |
| if (*Guid != NULL) { | |
| return EFI_NOT_FOUND; | |
| } else { | |
| return EFI_SUCCESS; | |
| } | |
| } | |
| // | |
| // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order | |
| // 1) ExGuid | |
| // 2) ExTokenNumber | |
| // | |
| PeiPcdDb = GetPcdDatabase (); | |
| ExMapTable = PeiPcdDb->Init.ExMapTable; | |
| if (*Guid == NULL) { | |
| // | |
| // return the first Token Space Guid. | |
| // | |
| *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex]; | |
| return EFI_SUCCESS; | |
| } | |
| MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid); | |
| if (MatchGuid == NULL) { | |
| return EFI_NOT_FOUND; | |
| } | |
| GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable; | |
| Found = FALSE; | |
| for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) { | |
| if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) { | |
| Found = TRUE; | |
| break; | |
| } | |
| } | |
| if (Found) { | |
| Index++; | |
| for ( ; Index < PEI_EXMAPPING_TABLE_SIZE; Index++ ) { | |
| if (ExMapTable[Index].ExGuidIndex != GuidTableIdx ) { | |
| *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[Index].ExGuidIndex]; | |
| return EFI_SUCCESS; | |
| } | |
| } | |
| *Guid = NULL; | |
| return EFI_SUCCESS; | |
| } | |
| return EFI_NOT_FOUND; | |
| } | |
| /** | |
| Get PCD value's size for POINTER type PCD. | |
| The POINTER type PCD's value will be stored into a buffer in specificed size. | |
| The max size of this PCD's value is described in PCD's definition in DEC file. | |
| @param LocalTokenNumberTableIdx Index of PCD token number in PCD token table | |
| @param MaxSize Maximum size of PCD's value | |
| @param Database Pcd database in PEI phase. | |
| @return PCD value's size for POINTER type PCD. | |
| **/ | |
| UINTN | |
| GetPtrTypeSize ( | |
| IN UINTN LocalTokenNumberTableIdx, | |
| OUT UINTN *MaxSize, | |
| IN PEI_PCD_DATABASE *Database | |
| ) | |
| { | |
| INTN SizeTableIdx; | |
| UINTN LocalTokenNumber; | |
| SKU_ID *SkuIdTable; | |
| SIZE_INFO *SizeTable; | |
| UINTN Index; | |
| SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database); | |
| LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx]; | |
| ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER); | |
| SizeTable = Database->Init.SizeTable; | |
| *MaxSize = SizeTable[SizeTableIdx]; | |
| // | |
| // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type | |
| // PCD entry. | |
| // | |
| if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) { | |
| // | |
| // We have only one entry for VPD enabled PCD entry: | |
| // 1) MAX Size. | |
| // We consider current size is equal to MAX size. | |
| // | |
| return *MaxSize; | |
| } else { | |
| if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) { | |
| // | |
| // We have only two entry for Non-Sku enabled PCD entry: | |
| // 1) MAX SIZE | |
| // 2) Current Size | |
| // | |
| return SizeTable[SizeTableIdx + 1]; | |
| } else { | |
| // | |
| // We have these entry for SKU enabled PCD entry | |
| // 1) MAX SIZE | |
| // 2) Current Size for each SKU_ID (It is equal to MaxSku). | |
| // | |
| SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database); | |
| for (Index = 0; Index < SkuIdTable[0]; Index++) { | |
| if (SkuIdTable[1 + Index] == Database->Init.SystemSkuId) { | |
| return SizeTable[SizeTableIdx + 1 + Index]; | |
| } | |
| } | |
| return SizeTable[SizeTableIdx + 1]; | |
| } | |
| } | |
| } | |
| /** | |
| Set PCD value's size for POINTER type PCD. | |
| The POINTER type PCD's value will be stored into a buffer in specificed size. | |
| The max size of this PCD's value is described in PCD's definition in DEC file. | |
| @param LocalTokenNumberTableIdx Index of PCD token number in PCD token table | |
| @param CurrentSize Maximum size of PCD's value | |
| @param Database Pcd database in PEI phase. | |
| @retval TRUE Success to set PCD's value size, which is not exceed maximum size | |
| @retval FALSE Fail to set PCD's value size, which maybe exceed maximum size | |
| **/ | |
| BOOLEAN | |
| SetPtrTypeSize ( | |
| IN UINTN LocalTokenNumberTableIdx, | |
| IN OUT UINTN *CurrentSize, | |
| IN PEI_PCD_DATABASE *Database | |
| ) | |
| { | |
| INTN SizeTableIdx; | |
| UINTN LocalTokenNumber; | |
| SKU_ID *SkuIdTable; | |
| SIZE_INFO *SizeTable; | |
| UINTN Index; | |
| UINTN MaxSize; | |
| SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database); | |
| LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx]; | |
| ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER); | |
| SizeTable = Database->Init.SizeTable; | |
| MaxSize = SizeTable[SizeTableIdx]; | |
| // | |
| // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type | |
| // PCD entry. | |
| // | |
| if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) { | |
| // | |
| // We shouldn't come here as we don't support SET for VPD | |
| // | |
| ASSERT (FALSE); | |
| return FALSE; | |
| } else { | |
| if ((*CurrentSize > MaxSize) || | |
| (*CurrentSize == MAX_ADDRESS)) { | |
| *CurrentSize = MaxSize; | |
| return FALSE; | |
| } | |
| if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) { | |
| // | |
| // We have only two entry for Non-Sku enabled PCD entry: | |
| // 1) MAX SIZE | |
| // 2) Current Size | |
| // | |
| SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize; | |
| return TRUE; | |
| } else { | |
| // | |
| // We have these entry for SKU enabled PCD entry | |
| // 1) MAX SIZE | |
| // 2) Current Size for each SKU_ID (It is equal to MaxSku). | |
| // | |
| SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database); | |
| for (Index = 0; Index < SkuIdTable[0]; Index++) { | |
| if (SkuIdTable[1 + Index] == Database->Init.SystemSkuId) { | |
| SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize; | |
| return TRUE; | |
| } | |
| } | |
| SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize; | |
| return TRUE; | |
| } | |
| } | |
| } |