From 8a541f0a71b6686c947d259d3c518663ee877840 Mon Sep 17 00:00:00 2001 From: klu2 Date: Mon, 23 Nov 2009 07:52:09 +0000 Subject: [PATCH] 1, Correct the PCD PEIM to produce gEfiPcdPpi and gPcdPpi at same time; 2, Combine two action of InstallProtocolInstance for gEfiPcdProtocol and gPcdProtocol into InstallMultipleProtocolInstances. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9468 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 42 +++++++++++++++------------- MdeModulePkg/Universal/PCD/Pei/Pcd.c | 27 ++++++++++++++++-- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c index 0bb44ff81c..c8dab145af 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c @@ -1,6 +1,7 @@ /** @file PCD DXE driver manage all PCD entry initialized in PEI phase and DXE phase, and - produce the implementation of PCD protocol. + produce the implementation of native PCD protocol and EFI_PCD_PROTOCOL defined in + PI 1.2 Vol3. Copyright (c) 2006 - 2009, Intel Corporation All rights reserved. This program and the accompanying materials @@ -27,6 +28,10 @@ EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZ /// EFI_LOCK mPcdDatabaseLock = EFI_INITIALIZE_LOCK_VARIABLE(TPL_NOTIFY); +// +// PCD_PROTOCOL the native implementation provided by MdePkg which support dynamic +// type and dynamicEx type PCD. +// PCD_PROTOCOL mPcdInstance = { DxePcdSetSku, @@ -66,6 +71,10 @@ PCD_PROTOCOL mPcdInstance = { DxePcdGetNextTokenSpace }; +// +// EFI_PCD_PROTOCOL is defined in PI 1.2 Vol 3 which only support dynamicEx type +// PCD. +// EFI_PCD_PROTOCOL mEfiPcdInstance = { DxePcdSetSku, DxePcdGet8Ex, @@ -87,10 +96,8 @@ EFI_PCD_PROTOCOL mEfiPcdInstance = { DxePcdGetNextTokenSpace }; -// -// Static global to reduce the code size -// -EFI_HANDLE mNewHandle = NULL; + + /** Main entry for PCD DXE driver. @@ -110,8 +117,9 @@ PcdDxeInit ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - + EFI_STATUS Status; + EFI_HANDLE mNewHandle; + // // Make sure the Pcd Protocol is not already installed in the system // @@ -120,26 +128,20 @@ PcdDxeInit ( BuildPcdDxeDataBase (); - Status = gBS->InstallProtocolInterface ( - &mNewHandle, - &gPcdProtocolGuid, - EFI_NATIVE_INTERFACE, - &mPcdInstance - ); - + mNewHandle = NULL; // - // Also install gEfiPcdProtocolGuid which is only support dynamic-ex type - // PCD. + // Install PCD_PROTOCOL to handle dynamic type PCD + // Install EFI_PCD_PROTOCOL to handle dynamicEx type PCD // - mNewHandle = NULL; - Status = gBS->InstallProtocolInterface ( + Status = gBS->InstallMultipleProtocolInterfaces ( &mNewHandle, + &gPcdProtocolGuid, + &mPcdInstance, &gEfiPcdProtocolGuid, - EFI_NATIVE_INTERFACE, &mEfiPcdInstance ); - + ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; diff --git a/MdeModulePkg/Universal/PCD/Pei/Pcd.c b/MdeModulePkg/Universal/PCD/Pei/Pcd.c index 08a18c111e..783dd2d7a7 100644 --- a/MdeModulePkg/Universal/PCD/Pei/Pcd.c +++ b/MdeModulePkg/Universal/PCD/Pei/Pcd.c @@ -14,6 +14,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "Service.h" +// +// Instance of PCD_PPI protocol is native implementation by MdePkg. +// This protocol instance support dynamic and dynamicEx type PCDs. +// PCD_PPI mPcdPpiInstance = { PeiPcdSetSku, @@ -53,6 +57,10 @@ PCD_PPI mPcdPpiInstance = { PeiPcdGetNextTokenSpace }; +// +// Instance of EFI_PEI_PCD_PPI which is defined in PI 1.2 Vol 3. +// This PPI instance only support dyanmicEx type PCD. +// EFI_PEI_PCD_PPI mEfiPcdPpiInstance = { PeiPcdSetSku, @@ -90,7 +98,7 @@ EFI_PEI_PPI_DESCRIPTOR mEfiPpiPCD = { /** Main entry for PCD PEIM driver. - This routine initialize the PCD database for PEI phase and install PCD_PPI. + This routine initialize the PCD database for PEI phase and install PCD_PPI/EFI_PEI_PCD_PPI. @param FileHandle Handle of the file being invoked. @param PeiServices Describes the list of possible PEI Services. @@ -105,9 +113,24 @@ PcdPeimInit ( IN CONST EFI_PEI_SERVICES **PeiServices ) { + EFI_STATUS Status; + BuildPcdDatabase (); - return PeiServicesInstallPpi (&mPpiPCD); + // + // Install PCD_PPI which produce support for dynamic and dynamicEx PCD + // + Status = PeiServicesInstallPpi (&mPpiPCD); + ASSERT_EFI_ERROR (Status); + + // + // Install EFI_PCD_PPI which produce support for dynamicEx PCD which is defined + // in PI 1.2 Vol 3 specification. + // + Status = PeiServicesInstallPpi (&mEfiPpiPCD); + ASSERT_EFI_ERROR (Status); + + return Status; } /** -- 2.39.2