From: Liming Gao Date: Fri, 22 Dec 2017 04:42:00 +0000 (+0800) Subject: MdeModulePkg PCD: Enable Firmware to retrieve the default setting X-Git-Tag: edk2-stable201903~2747 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=219247e16462d72e3b22db4e21bfaec256cc5fbb MdeModulePkg PCD: Enable Firmware to retrieve the default setting https://bugzilla.tianocore.org/show_bug.cgi?id=611 Update PCD driver to retrieve the default setting and set the initial EFI variable when PcdSetNvStoreDefaultId is set. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Liming Gao Reviewed-by: Star Zeng --- diff --git a/MdeModulePkg/Universal/PCD/Pei/Pcd.c b/MdeModulePkg/Universal/PCD/Pei/Pcd.c index a3f7337cec..91eb9d6ccf 100644 --- a/MdeModulePkg/Universal/PCD/Pei/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Pei/Pcd.c @@ -129,6 +129,105 @@ EFI_PEI_PPI_DESCRIPTOR mPpiList2[] = { } }; +/** + Callback on SET PcdSetNvStoreDefaultId + + Once PcdSetNvStoreDefaultId is set, the default NV storage will be found from + PcdNvStoreDefaultValueBuffer, and built into VariableHob. + + @param[in] CallBackGuid The PCD token GUID being set. + @param[in] CallBackToken The PCD token number being set. + @param[in, out] TokenData A pointer to the token data being set. + @param[in] TokenDataSize The size, in bytes, of the data being set. + +**/ +VOID +EFIAPI +PcdSetNvStoreDefaultIdCallBack ( + IN CONST EFI_GUID *CallBackGuid, OPTIONAL + IN UINTN CallBackToken, + IN OUT VOID *TokenData, + IN UINTN TokenDataSize + ) +{ + EFI_STATUS Status; + UINT16 DefaultId; + SKU_ID SkuId; + UINTN FullSize; + UINTN Index; + UINT8 *DataBuffer; + UINT8 *VarStoreHobData; + UINT8 *BufferEnd; + BOOLEAN IsFound; + VARIABLE_STORE_HEADER *NvStoreBuffer; + PCD_DEFAULT_DATA *DataHeader; + PCD_DEFAULT_INFO *DefaultInfo; + PCD_DATA_DELTA *DeltaData; + + DefaultId = *(UINT16 *) TokenData; + SkuId = GetPcdDatabase()->SystemSkuId; + IsFound = FALSE; + + if (PeiPcdGetSizeEx (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdNvStoreDefaultValueBuffer)) > sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER)) { + DataBuffer = (UINT8 *) PeiPcdGetPtrEx (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdNvStoreDefaultValueBuffer)); + FullSize = ((PCD_NV_STORE_DEFAULT_BUFFER_HEADER *) DataBuffer)->Length; + DataHeader = (PCD_DEFAULT_DATA *) (DataBuffer + sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER)); + // + // The first section data includes NV storage default setting. + // + NvStoreBuffer = (VARIABLE_STORE_HEADER *) ((UINT8 *) DataHeader + sizeof (DataHeader->DataSize) + DataHeader->HeaderSize); + VarStoreHobData = (UINT8 *) BuildGuidHob (&NvStoreBuffer->Signature, NvStoreBuffer->Size); + ASSERT (VarStoreHobData != NULL); + CopyMem (VarStoreHobData, NvStoreBuffer, NvStoreBuffer->Size); + // + // Find the matched SkuId and DefaultId in the first section + // + DefaultInfo = &(DataHeader->DefaultInfo[0]); + BufferEnd = (UINT8 *) DataHeader + sizeof (DataHeader->DataSize) + DataHeader->HeaderSize; + while ((UINT8 *) DefaultInfo < BufferEnd) { + if (DefaultInfo->DefaultId == DefaultId && DefaultInfo->SkuId == SkuId) { + IsFound = TRUE; + break; + } + DefaultInfo ++; + } + // + // Find the matched SkuId and DefaultId in the remaining section + // + Index = sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER) + ((DataHeader->DataSize + 7) & (~7)); + DataHeader = (PCD_DEFAULT_DATA *) (DataBuffer + Index); + while (!IsFound && Index < FullSize && DataHeader->DataSize != 0xFFFFFFFF) { + DefaultInfo = &(DataHeader->DefaultInfo[0]); + BufferEnd = (UINT8 *) DataHeader + sizeof (DataHeader->DataSize) + DataHeader->HeaderSize; + while ((UINT8 *) DefaultInfo < BufferEnd) { + if (DefaultInfo->DefaultId == DefaultId && DefaultInfo->SkuId == SkuId) { + IsFound = TRUE; + break; + } + DefaultInfo ++; + } + if (IsFound) { + DeltaData = (PCD_DATA_DELTA *) BufferEnd; + BufferEnd = (UINT8 *) DataHeader + DataHeader->DataSize; + while ((UINT8 *) DeltaData < BufferEnd) { + *(VarStoreHobData + DeltaData->Offset) = (UINT8) DeltaData->Value; + DeltaData ++; + } + break; + } + Index = (Index + DataHeader->DataSize + 7) & (~7) ; + DataHeader = (PCD_DEFAULT_DATA *) (DataBuffer + Index); + } + } + + Status = PcdUnRegisterCallBackOnSet ( + &gEfiMdeModulePkgTokenSpaceGuid, + PcdToken(PcdSetNvStoreDefaultId), + PcdSetNvStoreDefaultIdCallBack + ); + ASSERT_EFI_ERROR (Status); +} + /** Main entry for PCD PEIM driver. @@ -163,6 +262,13 @@ PcdPeimInit ( Status = PeiServicesInstallPpi (&mPpiList2[0]); ASSERT_EFI_ERROR (Status); + Status = PeiRegisterCallBackOnSet ( + &gEfiMdeModulePkgTokenSpaceGuid, + PcdToken(PcdSetNvStoreDefaultId), + PcdSetNvStoreDefaultIdCallBack + ); + ASSERT_EFI_ERROR (Status); + return Status; } diff --git a/MdeModulePkg/Universal/PCD/Pei/Pcd.inf b/MdeModulePkg/Universal/PCD/Pei/Pcd.inf index 1d9c9242d9..8f778e1927 100644 --- a/MdeModulePkg/Universal/PCD/Pei/Pcd.inf +++ b/MdeModulePkg/Universal/PCD/Pei/Pcd.inf @@ -330,6 +330,7 @@ ## SOMETIMES_CONSUMES ## HOB gPcdDataBaseHobGuid gPcdDataBaseSignatureGuid ## CONSUMES ## GUID # PCD database signature GUID. + gEfiMdeModulePkgTokenSpaceGuid ## SOMETIMES_CONSUMES ## GUID [Ppis] gEfiPeiReadOnlyVariable2PpiGuid ## SOMETIMES_CONSUMES @@ -344,6 +345,8 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPcdCallBackNumberPerPcdEntry ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNvStoreDefaultId ## CONSUMES [Depex] TRUE diff --git a/MdeModulePkg/Universal/PCD/Pei/Service.h b/MdeModulePkg/Universal/PCD/Pei/Service.h index fa14abeaa3..e3b68aabc4 100644 --- a/MdeModulePkg/Universal/PCD/Pei/Service.h +++ b/MdeModulePkg/Universal/PCD/Pei/Service.h @@ -23,6 +23,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #include #include #include @@ -36,7 +37,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // Please make sure the PCD Serivce PEIM Version is consistent with // the version of the generated PEIM PCD Database by build tool. // -#define PCD_SERVICE_PEIM_VERSION 6 +#define PCD_SERVICE_PEIM_VERSION 7 // // PCD_PEI_SERVICE_DRIVER_VERSION is defined in Autogen.h.