From 2ab6330e7e3ec18b615bad61e35d077e88ec0849 Mon Sep 17 00:00:00 2001 From: klu2 Date: Thu, 10 Jul 2008 05:51:21 +0000 Subject: [PATCH] Add function header and pass ECC tools git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5443 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 470 +++++++++++++++- MdeModulePkg/Universal/PCD/Dxe/Service.c | 366 ++++++++++--- MdeModulePkg/Universal/PCD/Dxe/Service.h | 665 ++++++++++++++++++++++- 3 files changed, 1404 insertions(+), 97 deletions(-) diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c index 01a26bb0bf..af846c5302 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c @@ -1,5 +1,6 @@ /** @file -PCD DXE driver + PCD DXE driver manage all PCD entry initialized in PEI phase and DXE phase, and + produce the implementation of PCD protocol. Copyright (c) 2006 - 2007, Intel Corporation All rights reserved. This program and the accompanying materials @@ -17,6 +18,16 @@ Module Name: Pcd.c #include "Service.h" +// +// Just pre-allocate a memory buffer that is big enough to +// host all distinct TokenSpace guid in both +// PEI ExMap and DXE ExMap. +// +STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 }; + +/// +/// PCD database lock. +/// EFI_LOCK mPcdDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(TPL_CALLBACK); PCD_PROTOCOL mPcdInstance = { @@ -62,8 +73,19 @@ PCD_PROTOCOL mPcdInstance = { // // Static global to reduce the code size // -static EFI_HANDLE mNewHandle = NULL; +STATIC EFI_HANDLE mNewHandle = NULL; +/** + Main entry for PCD DXE driver. + + This routine initialize the PCD database and install PCD_PROTOCOL. + + @param ImageHandle Image handle for PCD DXE driver. + @param SystemTable Pointer to SystemTable. + + @return Status of gBS->InstallProtocolInterface() + +**/ EFI_STATUS EFIAPI PcdDxeInit ( @@ -94,7 +116,29 @@ PcdDxeInit ( } +/** + 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. + + @retval VOID +**/ VOID EFIAPI DxePcdSetSku ( @@ -106,8 +150,17 @@ DxePcdSetSku ( 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 DxePcdGet8 ( @@ -117,8 +170,17 @@ DxePcdGet8 ( 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 DxePcdGet16 ( @@ -128,8 +190,17 @@ DxePcdGet16 ( 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 DxePcdGet32 ( @@ -139,8 +210,17 @@ DxePcdGet32 ( 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 DxePcdGet64 ( @@ -150,8 +230,19 @@ DxePcdGet64 ( 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 retrived. + +**/ VOID * EFIAPI DxePcdGetPtr ( @@ -161,8 +252,19 @@ DxePcdGetPtr ( 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 DxePcdGetBool ( @@ -172,8 +274,17 @@ DxePcdGetBool ( 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 DxePcdGetSize ( @@ -226,20 +337,44 @@ DxePcdGetSize ( } +/** + 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 DxePcdGet8Ex ( IN CONST EFI_GUID *Guid, - IN UINTN ExTokenNumber + 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 DxePcdGet16Ex ( @@ -250,8 +385,20 @@ DxePcdGet16Ex ( 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 DxePcdGet32Ex ( @@ -262,8 +409,20 @@ DxePcdGet32Ex ( 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 DxePcdGet64Ex ( @@ -274,8 +433,20 @@ DxePcdGet64Ex ( 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 retrived. + +**/ VOID * EFIAPI DxePcdGetPtrEx ( @@ -286,8 +457,20 @@ DxePcdGetPtrEx ( 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 DxePcdGetBoolEx ( @@ -298,8 +481,18 @@ DxePcdGetBoolEx ( 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 DxePcdGetSizeEx ( @@ -310,8 +503,23 @@ DxePcdGetSizeEx ( return DxePcdGetSize(GetExPcdTokenNumber (Guid, (UINT32) 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 DxePcdSet8 ( @@ -322,8 +530,23 @@ DxePcdSet8 ( 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 DxePcdSet16 ( @@ -334,8 +557,23 @@ DxePcdSet16 ( 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 DxePcdSet32 ( @@ -346,8 +584,23 @@ DxePcdSet32 ( 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 DxePcdSet64 ( @@ -358,8 +611,27 @@ DxePcdSet64 ( 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 DxePcdSetPtr ( @@ -371,8 +643,23 @@ DxePcdSetPtr ( 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 DxePcdSetBool ( @@ -383,8 +670,24 @@ DxePcdSetBool ( 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 DxePcdSet8Ex ( @@ -396,8 +699,24 @@ DxePcdSet8Ex ( 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 DxePcdSet16Ex ( @@ -409,8 +728,24 @@ DxePcdSet16Ex ( 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 DxePcdSet32Ex ( @@ -422,8 +757,24 @@ DxePcdSet32Ex ( 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 DxePcdSet64Ex ( @@ -435,8 +786,28 @@ DxePcdSet64Ex ( 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] 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 DxePcdSetPtrEx ( @@ -449,8 +820,24 @@ DxePcdSetPtrEx ( return ExSetWorker(ExTokenNumber, Guid, 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] 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 DxePcdSetBoolEx ( @@ -462,9 +849,18 @@ DxePcdSetBoolEx ( 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] TokenNumber 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 DxeRegisterCallBackOnSet ( @@ -489,8 +885,18 @@ DxeRegisterCallBackOnSet ( return Status; } +/** + 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] TokenNumber 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 DxeUnRegisterCallBackOnSet ( @@ -515,8 +921,24 @@ DxeUnRegisterCallBackOnSet ( return Status; } +/** + 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 DxePcdGetNextToken ( @@ -596,7 +1018,16 @@ DxePcdGetNextToken ( return Status; } -STATIC +/** + Get all token space guid table which is different with given token space guid. + + @param ExMapTableSize The size of guid table + @param ExMapTable Token space guid table that want to be scaned. + @param GuidTable Guid table + + @return all token space guid table which is different with given token space guid. + +**/ EFI_GUID ** GetDistinctTokenSpace ( IN OUT UINTN *ExMapTableSize, @@ -633,13 +1064,21 @@ GetDistinctTokenSpace ( } -// -// Just pre-allocate a memory buffer that is big enough to -// host all distinct TokenSpace guid in both -// PEI ExMap and DXE ExMap. -// -STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 }; - +/** + Get next token space in PCD database according to given token space guid. + + This routine is enable only when feature flag PCD PcdDxePcdDatabaseTraverseEnabled + is TRUE. + + @param Guid Given token space guid. If NULL, then Guid will be set to + the first PCD token space in PCD database, If not NULL, then + Guid will be set to next PCD token space. + + @retval EFI_UNSUPPORTED If feature flag PCD PcdDxePcdDatabaseTraverseEnabled is FALSE. + @retval EFI_NOT_FOUND If PCD database has no token space table or can not find given + token space in PCD database. + @retval EFI_SUCCESS Success to get next token space guid. +**/ EFI_STATUS EFIAPI DxePcdGetNextTokenSpace ( @@ -726,7 +1165,6 @@ DxePcdGetNextTokenSpace ( } return EFI_NOT_FOUND; - } diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.c b/MdeModulePkg/Universal/PCD/Dxe/Service.c index 4403e6ea52..42177917d8 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Service.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.c @@ -1,5 +1,5 @@ /** @file -Private functions used by PCD DXE driver. + Help functions used by PCD DXE driver. Copyright (c) 2006 - 2007, Intel Corporation All rights reserved. This program and the accompanying materials @@ -10,22 +10,32 @@ 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. - -Module Name: Service.c - **/ #include "Service.h" - PCD_DATABASE * mPcdDatabase; LIST_ENTRY *mCallbackFnTable; +/** + Get the PCD entry pointer in PCD database. + + This routine will visit PCD database to find the PCD entry according to given + token number. The given token number is autogened by build tools and it will be + translated to local token number. Local token number contains PCD's type and + offset of PCD entry in PCD database. + + @param TokenNumber Token's number, it is autogened by build tools + @param GetSize The size of token's value + + @return PCD entry pointer in PCD database + +**/ VOID * GetWorker ( - UINTN TokenNumber, - UINTN GetSize + IN UINTN TokenNumber, + IN UINTN GetSize ) { UINT32 *LocalTokenNumberTable; @@ -163,12 +173,24 @@ GetWorker ( } +/** + Register the callback function for a PCD entry. + + This routine will register a callback function to a PCD entry by given token number + and token space guid. + + @param TokenNumber PCD token's number, it is autogened by build tools. + @param Guid PCD token space's guid, + if not NULL, this PCD is dynamicEx type PCD. + @param CallBackFunction Callback function pointer + @return EFI_SUCCESS Always success for registering callback function. +**/ EFI_STATUS DxeRegisterCallBackWorker ( IN UINTN TokenNumber, - IN CONST GUID *Guid, OPTIONAL + IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { @@ -212,13 +234,24 @@ DxeRegisterCallBackWorker ( return EFI_SUCCESS; } +/** + UnRegister the callback function for a PCD entry. + This routine will unregister a callback function to a PCD entry by given token number + and token space guid. + @param TokenNumber PCD token's number, it is autogened by build tools. + @param Guid PCD token space's guid. + if not NULL, this PCD is dynamicEx type PCD. + @param CallBackFunction Callback function pointer + @retval EFI_SUCCESS Callback function is success to be unregister. + @retval EFI_INVALID_PARAMETER Can not find the PCD entry by given token number. +**/ EFI_STATUS DxeUnRegisterCallBackWorker ( IN UINTN TokenNumber, - IN CONST GUID *Guid, OPTIONAL + IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction ) { @@ -260,8 +293,31 @@ DxeUnRegisterCallBackWorker ( return EFI_INVALID_PARAMETER; } +/** + Get next token number in given token space. + + This routine is used for dynamicEx type PCD. It will firstly scan token space + table to get token space according to given token space guid. Then scan given + token number in found token space, if found, then return next token number in + this token space. + + @param Guid Token space guid. Next token number will be scaned in + this token space. + @param TokenNumber Token number. + If PCD_INVALID_TOKEN_NUMBER, return first token number in + token space table. + If not PCD_INVALID_TOKEN_NUMBER, return next token number + in token space table. + @param GuidTable Token space guid table. It will be used for scan token space + by given token space guid. + @param SizeOfGuidTable The size of guid table. + @param ExMapTable DynamicEx token number mapping table. + @param SizeOfExMapTable The size of dynamicEx token number mapping table. + + @retval EFI_NOT_FOUND Can not given token space or token number. + @retval EFI_SUCCESS Success to get next token number. - +**/ EFI_STATUS ExGetNextTokeNumber ( IN CONST EFI_GUID *Guid, @@ -273,44 +329,54 @@ ExGetNextTokeNumber ( ) { EFI_GUID *MatchGuid; - UINTN Idx; + UINTN Index; UINTN GuidTableIdx; BOOLEAN Found; + // + // Scan token space guid + // MatchGuid = ScanGuid (GuidTable, SizeOfGuidTable, Guid); if (MatchGuid == NULL) { return EFI_NOT_FOUND; } + // + // Find the token space table in dynamicEx mapping table. + // Found = FALSE; GuidTableIdx = MatchGuid - GuidTable; - for (Idx = 0; Idx < SizeOfExMapTable; Idx++) { - if (ExMapTable[Idx].ExGuidIndex == GuidTableIdx) { + for (Index = 0; Index < SizeOfExMapTable; Index++) { + if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) { Found = TRUE; break; } } if (Found) { + // + // If given token number is PCD_INVALID_TOKEN_NUMBER, then return the first + // token number in found token space. + // if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) { - *TokenNumber = ExMapTable[Idx].ExTokenNumber; + *TokenNumber = ExMapTable[Index].ExTokenNumber; return EFI_SUCCESS; } - for ( ; Idx < SizeOfExMapTable; Idx++) { - if (ExMapTable[Idx].ExTokenNumber == *TokenNumber) { - Idx++; - if (Idx == SizeOfExMapTable) { + for ( ; Index < SizeOfExMapTable; Index++) { + if (ExMapTable[Index].ExTokenNumber == *TokenNumber) { + Index ++; + if (Index == SizeOfExMapTable) { // // Exceed the length of ExMap Table // *TokenNumber = PCD_INVALID_TOKEN_NUMBER; return EFI_SUCCESS; - } else if (ExMapTable[Idx].ExGuidIndex == GuidTableIdx) { + } else if (ExMapTable[Index].ExGuidIndex == GuidTableIdx) { // // Found the next match // - *TokenNumber = ExMapTable[Idx].ExTokenNumber; + *TokenNumber = ExMapTable[Index].ExTokenNumber; return EFI_SUCCESS; } else { // @@ -326,10 +392,15 @@ ExGetNextTokeNumber ( return EFI_NOT_FOUND; } - +/** + Initialize the PCD database in DXE phase. + + PCD database in DXE phase also contains PCD database in PEI phase which is copied + from GUID Hob. +**/ VOID BuildPcdDxeDataBase ( VOID @@ -337,7 +408,7 @@ BuildPcdDxeDataBase ( { PEI_PCD_DATABASE *PeiDatabase; EFI_HOB_GUID_TYPE *GuidHob; - UINTN Idx; + UINTN Index; mPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE)); ASSERT (mPcdDatabase != NULL); @@ -376,15 +447,21 @@ BuildPcdDxeDataBase ( // 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. - for (Idx = 0; Idx + 1 < PCD_TOTAL_TOKEN_NUMBER + 1; Idx++) { - InitializeListHead (&mCallbackFnTable[Idx]); + for (Index = 0; Index + 1 < PCD_TOTAL_TOKEN_NUMBER + 1; Index++) { + InitializeListHead (&mCallbackFnTable[Index]); } - - return; } +/** + Get Variable which contains HII type PCD entry. + @param VariableGuid Variable's guid + @param VariableName Variable's unicode name string + @param VariableData Variable's data pointer, + @param VariableSize Variable's size. + @return the status of gRT->GetVariable +**/ EFI_STATUS GetHiiVariable ( IN EFI_GUID *VariableGuid, @@ -400,6 +477,9 @@ GetHiiVariable ( Size = 0; Buffer = NULL; + // + // Firstly get the real size of HII variable + // Status = gRT->GetVariable ( (UINT16 *)VariableName, VariableGuid, @@ -408,6 +488,9 @@ GetHiiVariable ( Buffer ); + // + // Allocate buffer to hold whole variable data according to variable size. + // if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = (UINT8 *) AllocatePool (Size); @@ -429,7 +512,17 @@ GetHiiVariable ( return Status; } +/** + Find the local token number according to system SKU ID. + + @param LocalTokenNumber PCD token number + @param Size The size of PCD entry. + @param IsPeiDb If TRUE, the PCD entry is initialized in PEI phase. + If False, the PCD entry is initialized in DXE phase. + + @return Token number according to system SKU ID. +**/ UINT32 GetSkuEnabledTokenNumber ( UINT32 LocalTokenNumber, @@ -439,7 +532,7 @@ GetSkuEnabledTokenNumber ( { SKU_HEAD *SkuHead; SKU_ID *SkuIdTable; - INTN i; + INTN Index; UINT8 *Value; SKU_ID *PhaseSkuIdTable; UINT8 *PcdDb; @@ -456,28 +549,31 @@ GetSkuEnabledTokenNumber ( SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset]; - for (i = 0; i < SkuIdTable[0]; i++) { - if (mPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) { + // + // Find the current system's SKU ID entry in SKU ID table. + // + for (Index = 0; Index < SkuIdTable[0]; Index++) { + if (mPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[Index + 1]) { break; } } - ASSERT (i < SkuIdTable[0]); + ASSERT (Index < SkuIdTable[0]); switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { case PCD_TYPE_VPD: - Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]); + Value = (UINT8 *) &(((VPD_HEAD *) Value)[Index]); return (UINT32) ((Value - PcdDb) | PCD_TYPE_VPD); case PCD_TYPE_HII: - Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]); + Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]); return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII); case PCD_TYPE_STRING: - Value = (UINT8 *) &(((STRING_HEAD *) Value)[i]); + Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]); return (UINT32) ((Value - PcdDb) | PCD_TYPE_STRING); case PCD_TYPE_DATA: - Value += Size * i; + Value += Size * Index; return (UINT32) (Value - PcdDb); default: @@ -490,10 +586,19 @@ GetSkuEnabledTokenNumber ( } +/** + Invoke the callback function when dynamic PCD entry was set, if this PCD entry + has registered callback function. + @param ExTokenNumber DynamicEx PCD's token number, if this PCD entry is dyanmicEx + type PCD. + @param Guid DynamicEx PCD's guid, if this PCD entry is dynamicEx type + PCD. + @param TokenNumber PCD token number generated by build tools. + @param Data Value want to be set for this PCD entry + @param Size The size of value - -STATIC +**/ VOID InvokeCallbackOnSet ( UINT32 ExTokenNumber, @@ -532,6 +637,16 @@ InvokeCallbackOnSet ( } +/** + Wrapper function for setting non-pointer type value for a PCD entry. + + @param TokenNumber Pcd token number autogenerated by build tools. + @param Data Value want to be set for PCD entry + @param Size Size of value. + + @return status of SetWorker. + +**/ EFI_STATUS SetValueWorker ( IN UINTN TokenNumber, @@ -543,6 +658,21 @@ SetValueWorker ( } +/** + Set value for an PCD entry + + @param TokenNumber Pcd token number autogenerated by build tools. + @param Data Value want to be set for PCD entry + @param Size Size of value. + @param PtrType If TRUE, the type of PCD entry's value is Pointer. + If False, the type of PCD entry's value is not Pointer. + + @retval EFI_INVALID_PARAMETER If this PCD type is VPD, VPD PCD can not be set. + @retval EFI_INVALID_PARAMETER If Size can not be set to size table. + @retval EFI_NOT_FOUND If value type of PCD entry is intergrate, but not in + range of UINT8, UINT16, UINT32, UINT64 + @retval EFI_NOT_FOUND Can not find the PCD type according to token number. +**/ EFI_STATUS SetWorker ( IN UINTN TokenNumber, @@ -581,27 +711,32 @@ SetWorker ( TmpTokenNumber = 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 < PCD_TOTAL_TOKEN_NUMBER + 1); if (!PtrType) { ASSERT (*Size == DxePcdGetSize (TokenNumber + 1)); } + // // 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. + // IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1) ? TRUE : FALSE); LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; + // // 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. + // if ((TokenNumber + 1 < PEI_NEX_TOKEN_NUMBER + 1) || (TokenNumber + 1 >= PEI_LOCAL_TOKEN_NUMBER + 1 || TokenNumber + 1 < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1))) { InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size); @@ -717,10 +852,16 @@ SetWorker ( return Status; } +/** + Wrapper function for get PCD value for dynamic-ex PCD. + @param Guid Token space guid for dynamic-ex PCD. + @param ExTokenNumber Token number for dyanmic-ex PCD. + @param GetSize The size of dynamic-ex PCD value. + @return PCD entry in PCD database. - +**/ VOID * ExGetWorker ( IN CONST EFI_GUID *Guid, @@ -731,9 +872,17 @@ ExGetWorker ( return GetWorker(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber), GetSize); } +/** + Wrapper function for set PCD value for non-Pointer type dynamic-ex PCD. + @param ExTokenNumber Token number for dynamic-ex PCD. + @param Guid Token space guid for dynamic-ex PCD. + @param Data Value want to be set. + @param SetSize The size of value. + @return status of ExSetWorker(). +**/ EFI_STATUS ExSetValueWorker ( IN UINTN ExTokenNumber, @@ -745,7 +894,24 @@ ExSetValueWorker ( return ExSetWorker (ExTokenNumber, Guid, Data, &SetSize, FALSE); } +/** + Set value for a dynamic PCD entry. + + This routine find the local token number according to dynamic-ex PCD's token + space guid and token number firstly, and invoke callback function if this PCD + entry registered callback function. Finally, invoken general SetWorker to set + PCD value. + + @param ExTokenNumber Dynamic-ex PCD token number. + @param Guid Token space guid for dynamic-ex PCD. + @param Data PCD value want to be set + @param SetSize Size of value. + @param PtrType If TRUE, this PCD entry is pointer type. + If FALSE, this PCD entry is not pointer type. + + @return status of SetWorker(). +**/ EFI_STATUS ExSetWorker ( IN UINTN ExTokenNumber, @@ -765,9 +931,21 @@ ExSetWorker ( } +/** + Set value for HII-type PCD. + A HII-type PCD's value is stored in a variable. Setting/Getting the value of + HII-type PCD is to visit this variable. + + @param VariableGuid Guid of variable which stored value of a HII-type PCD. + @param VariableName Unicode name of variable which stored value of a HII-type PCD. + @param Data Value want to be set. + @param DataSize Size of value + @param Offset Value offset of HII-type PCD in variable. + @return status of GetVariable()/SetVariable(). +**/ EFI_STATUS SetHiiVariable ( IN EFI_GUID *VariableGuid, @@ -831,17 +1009,26 @@ SetHiiVariable ( return Status; } +/** + Get local token number according to dynamic-ex PCD's {token space guid:token number} + A dynamic-ex type PCD, developer must provide pair of token space guid: token number + in DEC file. PCD database maintain a mapping table that translate pair of {token + space guid: token number} to local token number. + + @param Guid Token space guid for dynamic-ex PCD entry. + @param ExTokenNumber EDES_TODO: Add parameter description + @return local token number for dynamic-ex PCD. - +**/ UINTN GetExPcdTokenNumber ( IN CONST EFI_GUID *Guid, IN UINT32 ExTokenNumber ) { - UINT32 i; + UINT32 Index; DYNAMICEX_MAPPING *ExMap; EFI_GUID *GuidTable; EFI_GUID *MatchGuid; @@ -857,10 +1044,10 @@ GetExPcdTokenNumber ( MatchGuidIdx = MatchGuid - GuidTable; - for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { - if ((ExTokenNumber == ExMap[i].ExTokenNumber) && - (MatchGuidIdx == ExMap[i].ExGuidIndex)) { - return ExMap[i].LocalTokenNumber; + for (Index = 0; Index < PEI_EXMAPPING_TABLE_SIZE; Index++) { + if ((ExTokenNumber == ExMap[Index].ExTokenNumber) && + (MatchGuidIdx == ExMap[Index].ExGuidIndex)) { + return ExMap[Index].LocalTokenNumber; } } @@ -879,10 +1066,10 @@ GetExPcdTokenNumber ( MatchGuidIdx = MatchGuid - GuidTable; - for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) { - if ((ExTokenNumber == ExMap[i].ExTokenNumber) && - (MatchGuidIdx == ExMap[i].ExGuidIndex)) { - return ExMap[i].LocalTokenNumber; + for (Index = 0; Index < DXE_EXMAPPING_TABLE_SIZE; Index++) { + if ((ExTokenNumber == ExMap[Index].ExTokenNumber) && + (MatchGuidIdx == ExMap[Index].ExGuidIndex)) { + return ExMap[Index].LocalTokenNumber; } } @@ -891,8 +1078,15 @@ GetExPcdTokenNumber ( return 0; } +/** + Get SKU ID tabble from PCD database. + + @param LocalTokenNumberTableIdx Index of local token number in token number table. + @param IsPeiPcd If TRUE, -STATIC + @return Pointer to SKU ID array table + +**/ SKU_ID * GetSkuIdArray ( IN UINTN LocalTokenNumberTableIdx, @@ -920,7 +1114,17 @@ GetSkuIdArray ( } -STATIC +/** + Get index of PCD entry in size table. + + @param LocalTokenNumberTableIdx Index of this PCD in local token number table. + @param LocalTokenNumberTable Pointer to local token number table in PCD database. + @param IsPeiDb If TRUE, the pcd entry is initialized in PEI phase, + If FALSE, the pcd entry is initialized in DXE phase. + + @return index of PCD entry in size table. + +**/ UINTN GetSizeTableIndexA ( IN UINTN LocalTokenNumberTableIdx, @@ -928,22 +1132,22 @@ GetSizeTableIndexA ( IN BOOLEAN IsPeiDb ) { - UINTN i; + UINTN Index; UINTN SizeTableIdx; UINTN LocalTokenNumber; SKU_ID *SkuIdTable; SizeTableIdx = 0; - for (i=0; iDxeDb.Init.LocalTokenNumberTable; } return GetSizeTableIndexA (LocalTokenNumberTableIdx, - LocalTokenNumberTable, - IsPeiDb); + LocalTokenNumberTable, + IsPeiDb); } +/** + Get size of POINTER type PCD value. + + @param LocalTokenNumberTableIdx Index of local token number in local token number table. + @param MaxSize Maxmium size of POINTER type PCD value. + @return size of POINTER type PCD value. +**/ UINTN GetPtrTypeSize ( IN UINTN LocalTokenNumberTableIdx, @@ -1008,7 +1227,7 @@ GetPtrTypeSize ( UINTN LocalTokenNumber; SKU_ID *SkuIdTable; SIZE_INFO *SizeTable; - UINTN i; + UINTN Index; BOOLEAN IsPeiDb; UINT32 *LocalTokenNumberTable; @@ -1038,7 +1257,7 @@ GetPtrTypeSize ( // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type // PCD entry. // - if (LocalTokenNumber & PCD_TYPE_VPD) { + if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) { // // We have only one entry for VPD enabled PCD entry: // 1) MAX Size. @@ -1060,9 +1279,9 @@ GetPtrTypeSize ( // 2) Current Size for each SKU_ID (It is equal to MaxSku). // SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb); - for (i = 0; i < SkuIdTable[0]; i++) { - if (SkuIdTable[1 + i] == mPcdDatabase->PeiDb.Init.SystemSkuId) { - return SizeTable[SizeTableIdx + 1 + i]; + for (Index = 0; Index < SkuIdTable[0]; Index++) { + if (SkuIdTable[1 + Index] == mPcdDatabase->PeiDb.Init.SystemSkuId) { + return SizeTable[SizeTableIdx + 1 + Index]; } } return SizeTable[SizeTableIdx + 1]; @@ -1070,8 +1289,16 @@ GetPtrTypeSize ( } } +/** + Set size of POINTER type PCD value. The size should not exceed the maxmium size + of this PCD value. + @param LocalTokenNumberTableIdx Index of local token number in local token number table. + @param CurrentSize Size of POINTER type PCD value. + @retval TRUE Success to set size of PCD value. + @retval FALSE Fail to set size of PCD value. +**/ BOOLEAN SetPtrTypeSize ( IN UINTN LocalTokenNumberTableIdx, @@ -1082,14 +1309,16 @@ SetPtrTypeSize ( UINTN LocalTokenNumber; SKU_ID *SkuIdTable; SIZE_INFO *SizeTable; - UINTN i; + UINTN Index; UINTN MaxSize; BOOLEAN IsPeiDb; UINT32 *LocalTokenNumberTable; + // // 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. + // IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < PEI_LOCAL_TOKEN_NUMBER + 1); if (IsPeiDb) { @@ -1112,7 +1341,7 @@ SetPtrTypeSize ( // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type // PCD entry. // - if (LocalTokenNumber & PCD_TYPE_VPD) { + if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) { // // We shouldn't come here as we don't support SET for VPD // @@ -1140,9 +1369,9 @@ SetPtrTypeSize ( // 2) Current Size for each SKU_ID (It is equal to MaxSku). // SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb); - for (i = 0; i < SkuIdTable[0]; i++) { - if (SkuIdTable[1 + i] == mPcdDatabase->PeiDb.Init.SystemSkuId) { - SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize; + for (Index = 0; Index < SkuIdTable[0]; Index++) { + if (SkuIdTable[1 + Index] == mPcdDatabase->PeiDb.Init.SystemSkuId) { + SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize; return TRUE; } } @@ -1151,4 +1380,3 @@ SetPtrTypeSize ( } } } - diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.h b/MdeModulePkg/Universal/PCD/Dxe/Service.h index 3d6e3ed034..4b56e43071 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Service.h +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.h @@ -15,8 +15,8 @@ Module Name: Service.h **/ -#ifndef _SERVICE_H -#define _SERVICE_H +#ifndef _PCD_DXE_SERVICE_H_ +#define _PCD_DXE_SERVICE_H_ #include #include @@ -48,6 +48,29 @@ Module Name: Service.h // // Protocol Interface function declaration. // +/** + 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. + + @retval VOID + +**/ VOID EFIAPI DxePcdSetSku ( @@ -55,7 +78,17 @@ DxePcdSetSku ( ) ; +/** + 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 DxePcdGet8 ( @@ -63,7 +96,17 @@ DxePcdGet8 ( ) ; +/** + 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 DxePcdGet16 ( @@ -71,7 +114,17 @@ DxePcdGet16 ( ) ; +/** + 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 DxePcdGet32 ( @@ -79,7 +132,17 @@ DxePcdGet32 ( ) ; +/** + 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 DxePcdGet64 ( @@ -87,7 +150,19 @@ DxePcdGet64 ( ) ; +/** + 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 retrived. + +**/ VOID * EFIAPI DxePcdGetPtr ( @@ -95,7 +170,19 @@ DxePcdGetPtr ( ) ; +/** + 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 DxePcdGetBool ( @@ -103,7 +190,17 @@ DxePcdGetBool ( ) ; +/** + 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 DxePcdGetSize ( @@ -111,7 +208,20 @@ DxePcdGetSize ( ) ; +/** + 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] TokenNumber The PCD token number. + + @return The size 8-bit value for the PCD token. + +**/ UINT8 EFIAPI DxePcdGet8Ex ( @@ -120,7 +230,20 @@ DxePcdGet8Ex ( ) ; +/** + 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] TokenNumber The PCD token number. + @return The size 16-bit value for the PCD token. + +**/ UINT16 EFIAPI DxePcdGet16Ex ( @@ -129,7 +252,20 @@ DxePcdGet16Ex ( ) ; +/** + 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] TokenNumber The PCD token number. + @return The size 32-bit value for the PCD token. + +**/ UINT32 EFIAPI DxePcdGet32Ex ( @@ -138,8 +274,20 @@ DxePcdGet32Ex ( ) ; +/** + 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] TokenNumber The PCD token number. + @return The size 64-bit value for the PCD token. + +**/ UINT64 EFIAPI DxePcdGet64Ex ( @@ -148,8 +296,20 @@ DxePcdGet64Ex ( ) ; +/** + 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] TokenNumber The PCD token number. + @return The pointer to the buffer to be retrived. + +**/ VOID * EFIAPI DxePcdGetPtrEx ( @@ -158,7 +318,20 @@ DxePcdGetPtrEx ( ) ; +/** + 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] TokenNumber The PCD token number. + + @return The size Boolean value for the PCD token. + +**/ BOOLEAN EFIAPI DxePcdGetBoolEx ( @@ -167,7 +340,18 @@ DxePcdGetBoolEx ( ) ; +/** + 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] TokenNumber The PCD token number. + + @return The size of the value for the PCD token. + +**/ UINTN EFIAPI DxePcdGetSizeEx ( @@ -176,7 +360,23 @@ DxePcdGetSizeEx ( ) ; +/** + 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 DxePcdSet8 ( @@ -185,7 +385,23 @@ DxePcdSet8 ( ) ; +/** + 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 DxePcdSet16 ( @@ -194,7 +410,23 @@ DxePcdSet16 ( ) ; +/** + 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 DxePcdSet32 ( @@ -203,7 +435,23 @@ DxePcdSet32 ( ) ; +/** + 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 DxePcdSet64 ( @@ -213,16 +461,53 @@ DxePcdSet64 ( ; +/** + 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 DxePcdSetPtr ( IN UINTN TokenNumber, - IN UINTN *SizeOfBuffer, + IN OUT UINTN *SizeOfBuffer, IN VOID *Buffer ) ; +/** + 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 DxePcdSetBool ( @@ -232,6 +517,24 @@ DxePcdSetBool ( ; +/** + 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] 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 DxePcdSet8Ex ( @@ -241,7 +544,24 @@ DxePcdSet8Ex ( ) ; +/** + 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] 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 DxePcdSet16Ex ( @@ -251,7 +571,24 @@ DxePcdSet16Ex ( ) ; +/** + 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] 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 DxePcdSet32Ex ( @@ -261,7 +598,24 @@ DxePcdSet32Ex ( ) ; +/** + 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] 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 DxePcdSet64Ex ( @@ -271,7 +625,28 @@ DxePcdSet64Ex ( ) ; - +/** + 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] 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 DxePcdSetPtrEx ( @@ -282,7 +657,24 @@ DxePcdSetPtrEx ( ) ; +/** + 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] 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 DxePcdSetBoolEx ( @@ -292,8 +684,18 @@ DxePcdSetBoolEx ( ) ; +/** + 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] TokenNumber 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 DxeRegisterCallBackOnSet ( @@ -303,7 +705,18 @@ DxeRegisterCallBackOnSet ( ) ; +/** + 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] TokenNumber 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 DxeUnRegisterCallBackOnSet ( @@ -313,7 +726,24 @@ DxeUnRegisterCallBackOnSet ( ) ; +/** + 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 DxePcdGetNextToken ( @@ -322,8 +752,21 @@ DxePcdGetNextToken ( ) ; - - +/** + Get next token space in PCD database according to given token space guid. + + This routine is enable only when feature flag PCD PcdDxePcdDatabaseTraverseEnabled + is TRUE. + + @param Guid Given token space guid. If NULL, then Guid will be set to + the first PCD token space in PCD database, If not NULL, then + Guid will be set to next PCD token space. + + @retval EFI_UNSUPPORTED If feature flag PCD PcdDxePcdDatabaseTraverseEnabled is FALSE. + @retval EFI_NOT_FOUND If PCD database has no token space table or can not find given + token space in PCD database. + @retval EFI_SUCCESS Success to get next token space guid. +**/ EFI_STATUS EFIAPI DxePcdGetNextTokenSpace ( @@ -331,7 +774,6 @@ DxePcdGetNextTokenSpace ( ) ; - typedef struct { LIST_ENTRY Node; PCD_PROTOCOL_CALLBACK CallbackFn; @@ -343,6 +785,16 @@ typedef struct { // Internal Functions // +/** + Wrapper function for setting non-pointer type value for a PCD entry. + + @param TokenNumber Pcd token number autogenerated by build tools. + @param Data Value want to be set for PCD entry + @param Size Size of value. + + @return status of SetWorker. + +**/ EFI_STATUS SetValueWorker ( IN UINTN TokenNumber, @@ -351,6 +803,21 @@ SetValueWorker ( ) ; +/** + Set value for an PCD entry + + @param TokenNumber Pcd token number autogenerated by build tools. + @param Data Value want to be set for PCD entry + @param Size Size of value. + @param PtrType If TRUE, the type of PCD entry's value is Pointer. + If False, the type of PCD entry's value is not Pointer. + + @retval EFI_INVALID_PARAMETER If this PCD type is VPD, VPD PCD can not be set. + @retval EFI_INVALID_PARAMETER If Size can not be set to size table. + @retval EFI_NOT_FOUND If value type of PCD entry is intergrate, but not in + range of UINT8, UINT16, UINT32, UINT64 + @retval EFI_NOT_FOUND Can not find the PCD type according to token number. +**/ EFI_STATUS SetWorker ( IN UINTN TokenNumber, @@ -360,7 +827,17 @@ SetWorker ( ) ; +/** + Wrapper function for set PCD value for non-Pointer type dynamic-ex PCD. + + @param ExTokenNumber Token number for dynamic-ex PCD. + @param Guid Token space guid for dynamic-ex PCD. + @param Data Value want to be set. + @param SetSize The size of value. + @return status of ExSetWorker(). + +**/ EFI_STATUS ExSetValueWorker ( IN UINTN ExTokenNumber, @@ -370,8 +847,24 @@ ExSetValueWorker ( ) ; +/** + Set value for a dynamic PCD entry. + + This routine find the local token number according to dynamic-ex PCD's token + space guid and token number firstly, and invoke callback function if this PCD + entry registered callback function. Finally, invoken general SetWorker to set + PCD value. + + @param ExTokenNumber Dynamic-ex PCD token number. + @param Guid Token space guid for dynamic-ex PCD. + @param Data PCD value want to be set + @param SetSize Size of value. + @param PtrType If TRUE, this PCD entry is pointer type. + If FALSE, this PCD entry is not pointer type. + + @return status of SetWorker(). - +**/ EFI_STATUS ExSetWorker ( IN UINTN ExTokenNumber, @@ -382,7 +875,20 @@ ExSetWorker ( ) ; +/** + Get the PCD entry pointer in PCD database. + + This routine will visit PCD database to find the PCD entry according to given + token number. The given token number is autogened by build tools and it will be + translated to local token number. Local token number contains PCD's type and + offset of PCD entry in PCD database. + + @param TokenNumber Token's number, it is autogened by build tools + @param GetSize The size of token's value + @return PCD entry pointer in PCD database + +**/ VOID * GetWorker ( IN UINTN TokenNumber, @@ -390,6 +896,16 @@ GetWorker ( ) ; +/** + Wrapper function for get PCD value for dynamic-ex PCD. + + @param Guid Token space guid for dynamic-ex PCD. + @param ExTokenNumber Token number for dyanmic-ex PCD. + @param GetSize The size of dynamic-ex PCD value. + + @return PCD entry in PCD database. + +**/ VOID * ExGetWorker ( IN CONST EFI_GUID *Guid, @@ -398,6 +914,17 @@ ExGetWorker ( ) ; +/** + Find the local token number according to system SKU ID. + + @param LocalTokenNumber PCD token number + @param Size The size of PCD entry. + @param IsPeiDb If TRUE, the PCD entry is initialized in PEI phase. + If False, the PCD entry is initialized in DXE phase. + + @return Token number according to system SKU ID. + +**/ UINT32 GetSkuEnabledTokenNumber ( UINT32 LocalTokenNumber, @@ -406,6 +933,16 @@ GetSkuEnabledTokenNumber ( ) ; +/** + Get Variable which contains HII type PCD entry. + + @param VariableGuid Variable's guid + @param VariableName Variable's unicode name string + @param VariableData Variable's data pointer, + @param VariableSize Variable's size. + + @return the status of gRT->GetVariable +**/ EFI_STATUS GetHiiVariable ( IN EFI_GUID *VariableGuid, @@ -415,6 +952,21 @@ GetHiiVariable ( ) ; +/** + Set value for HII-type PCD. + + A HII-type PCD's value is stored in a variable. Setting/Getting the value of + HII-type PCD is to visit this variable. + + @param VariableGuid Guid of variable which stored value of a HII-type PCD. + @param VariableName Unicode name of variable which stored value of a HII-type PCD. + @param Data Value want to be set. + @param DataSize Size of value + @param Offset Value offset of HII-type PCD in variable. + + @return status of GetVariable()/SetVariable(). + +**/ EFI_STATUS SetHiiVariable ( IN EFI_GUID *VariableGuid, @@ -425,26 +977,76 @@ SetHiiVariable ( ) ; +/** + Register the callback function for a PCD entry. + + This routine will register a callback function to a PCD entry by given token number + and token space guid. + + @param TokenNumber PCD token's number, it is autogened by build tools. + @param Guid PCD token space's guid, + if not NULL, this PCD is dynamicEx type PCD. + @param CallBackFunction Callback function pointer + + @return EFI_SUCCESS Always success for registering callback function. + +**/ EFI_STATUS DxeRegisterCallBackWorker ( IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction -); + ) +; + +/** + UnRegister the callback function for a PCD entry. + This routine will unregister a callback function to a PCD entry by given token number + and token space guid. + + @param TokenNumber PCD token's number, it is autogened by build tools. + @param Guid PCD token space's guid. + if not NULL, this PCD is dynamicEx type PCD. + @param CallBackFunction Callback function pointer + + @retval EFI_SUCCESS Callback function is success to be unregister. + @retval EFI_INVALID_PARAMETER Can not find the PCD entry by given token number. +**/ EFI_STATUS DxeUnRegisterCallBackWorker ( IN UINTN TokenNumber, IN CONST EFI_GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction -); + ) +; +/** + Initialize the PCD database in DXE phase. + + PCD database in DXE phase also contains PCD database in PEI phase which is copied + from GUID Hob. + +**/ VOID BuildPcdDxeDataBase ( VOID -); + ) +; +/** + Get local token number according to dynamic-ex PCD's {token space guid:token number} + A dynamic-ex type PCD, developer must provide pair of token space guid: token number + in DEC file. PCD database maintain a mapping table that translate pair of {token + space guid: token number} to local token number. + + @param Guid Token space guid for dynamic-ex PCD entry. + @param ExTokenNumber EDES_TODO: Add parameter description + + @return local token number for dynamic-ex PCD. + +**/ UINTN GetExPcdTokenNumber ( IN CONST EFI_GUID *Guid, @@ -452,8 +1054,31 @@ GetExPcdTokenNumber ( ) ; +/** + Get next token number in given token space. + + This routine is used for dynamicEx type PCD. It will firstly scan token space + table to get token space according to given token space guid. Then scan given + token number in found token space, if found, then return next token number in + this token space. + + @param Guid Token space guid. Next token number will be scaned in + this token space. + @param TokenNumber Token number. + If PCD_INVALID_TOKEN_NUMBER, return first token number in + token space table. + If not PCD_INVALID_TOKEN_NUMBER, return next token number + in token space table. + @param GuidTable Token space guid table. It will be used for scan token space + by given token space guid. + @param SizeOfGuidTable The size of guid table. + @param ExMapTable DynamicEx token number mapping table. + @param SizeOfExMapTable The size of dynamicEx token number mapping table. + + @retval EFI_NOT_FOUND Can not given token space or token number. + @retval EFI_SUCCESS Success to get next token number. - +**/ EFI_STATUS ExGetNextTokeNumber ( IN CONST EFI_GUID *Guid, @@ -465,7 +1090,15 @@ ExGetNextTokeNumber ( ) ; +/** + Get size of POINTER type PCD value. + @param LocalTokenNumberTableIdx Index of local token number in local token number table. + @param MaxSize Maxmium size of POINTER type PCD value. + + @return size of POINTER type PCD value. + +**/ UINTN GetPtrTypeSize ( IN UINTN LocalTokenNumberTableIdx, @@ -473,8 +1106,16 @@ GetPtrTypeSize ( ) ; +/** + Set size of POINTER type PCD value. The size should not exceed the maxmium size + of this PCD value. + @param LocalTokenNumberTableIdx Index of local token number in local token number table. + @param CurrentSize Size of POINTER type PCD value. + @retval TRUE Success to set size of PCD value. + @retval FALSE Fail to set size of PCD value. +**/ BOOLEAN SetPtrTypeSize ( IN UINTN LocalTokenNumberTableIdx, -- 2.39.2