Good catch. I will update the patch. Thanks Liming > -----Original Message----- > From: Zeng, Star > Sent: Monday, November 26, 2018 9:28 AM > To: Gao, Liming <[email protected]>; [email protected] > Cc: Bi, Dandan <[email protected]>; Zeng, Star <[email protected]> > Subject: Re: [edk2] [Patch] MdeModulePkg PCD: Add DynamicEx > PcdVpdBaseAddress64 for non SPI platform > > On 2018/11/22 22:32, Liming Gao wrote: > > https://bugzilla.tianocore.org/show_bug.cgi?id=1356 > > Current PcdVpdBaseAddress is 32bit static Pcd. NON SPI platform needs to > > configure it as Dynamic PCD. Emulator platform (such as NT32) may set its > > value to 64bit address. > > To meet with this usage, 64bit DynamicEx PcdVpdBaseAddress64 is introduced. > > If its value is not zero, it will be used. > > If its value is zero, static PcdVpdBaseAddress will be used. > > When NON SPI platform enables VPD PCD, they need to set PcdVpdBaseAddress64. > > > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Liming Gao <[email protected]> > > Cc: Star Zeng <[email protected]> > > Cc: Jian J Wang <[email protected]> > > Cc: Dandan Bi <[email protected]> > > Two minor comments at below, with them handled, Reviewed-by: Star Zeng > <[email protected]> > > > > --- > > MdeModulePkg/Universal/PCD/Dxe/Pcd.c | 16 ++++++++++++++++ > > MdeModulePkg/Universal/PCD/Dxe/Service.c | 3 ++- > > MdeModulePkg/Universal/PCD/Pei/Service.c | 15 ++++++++++++++- > > MdeModulePkg/MdeModulePkg.dec | 8 ++++++++ > > MdeModulePkg/Universal/PCD/Dxe/Pcd.inf | 3 ++- > > MdeModulePkg/Universal/PCD/Dxe/Service.h | 2 ++ > > MdeModulePkg/Universal/PCD/Pei/Pcd.inf | 3 ++- > > 7 files changed, 46 insertions(+), 4 deletions(-) > > > > diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c > > b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c > > index f977c7f18e..4e38a3844a 100644 > > --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.c > > +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.c > > @@ -109,6 +109,7 @@ EFI_GET_PCD_INFO_PROTOCOL mEfiGetPcdInfoInstance = { > > }; > > > > EFI_HANDLE mPcdHandle = NULL; > > +UINTN mVpdBaseAddress = 0; > > > > /** > > Main entry for PCD DXE driver. > > @@ -175,6 +176,21 @@ PcdDxeInit ( > > &Registration > > ); > > > > + // > > + // Cache VpdBaseAddress in entry point for the following usage. > > + // > > + > > + // > > + // PcdVpdBaseAddress64 is DynamicEx PCD only. So, DxePcdGet64Ex() is > > used to get its value. > > + // > > + mVpdBaseAddress = (UINTN) DxePcdGet64Ex > > (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64)); > > + if (mVpdBaseAddress == 0) { > > + // > > + // PcdVpdBaseAddress64 is not set, get value from PcdVpdBaseAddress. > > + // > > + mVpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress); > > + } > > + > > return Status; > > } > > > > diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.c > > b/MdeModulePkg/Universal/PCD/Dxe/Service.c > > index 0517152366..4b44153e13 100644 > > --- a/MdeModulePkg/Universal/PCD/Dxe/Service.c > > +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.c > > @@ -435,7 +435,8 @@ GetWorker ( > > switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { > > case PCD_TYPE_VPD: > > VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset); > > - RetPtr = (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + > > VpdHead->Offset); > > + ASSERT (mVpdBaseAddress != 0); > > + RetPtr = (VOID *) (mVpdBaseAddress + VpdHead->Offset); > > > > break; > > > > diff --git a/MdeModulePkg/Universal/PCD/Pei/Service.c > > b/MdeModulePkg/Universal/PCD/Pei/Service.c > > index bb4b52baf3..e1613e8af8 100644 > > --- a/MdeModulePkg/Universal/PCD/Pei/Service.c > > +++ b/MdeModulePkg/Universal/PCD/Pei/Service.c > > @@ -861,6 +861,7 @@ GetWorker ( > > UINT32 LocalTokenNumber; > > UINT32 LocalTokenCount; > > UINT8 *VaraiableDefaultBuffer; > > + UINTN VpdBaseAddress; > > > > // > > // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. > > @@ -889,7 +890,19 @@ GetWorker ( > > { > > VPD_HEAD *VpdHead; > > VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset); > > - return (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + > > VpdHead->Offset); > > + > > + // > > + // PcdVpdBaseAddress64 is DynamicEx PCD only. So, PeiPcdGet64Ex() is > > used to get its value. > > + // > > + VpdBaseAddress = (UINTN) PeiPcdGet64Ex > > (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64)); > > + if (VpdBaseAddress == 0) { > > + // > > + // PcdVpdBaseAddress64 is not set, get value from > > PcdVpdBaseAddress. > > + // > > + VpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress); > > + } > > + ASSERT (VpdBaseAddress != 0); > > + return (VOID *)(VpdBaseAddress + VpdHead->Offset); > > } > > > > case PCD_TYPE_HII|PCD_TYPE_STRING: > > diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec > > index 0abacc1a90..f46a4094ca 100644 > > --- a/MdeModulePkg/MdeModulePkg.dec > > +++ b/MdeModulePkg/MdeModulePkg.dec > > @@ -2022,5 +2022,13 @@ > > # @Prompt NV Storage Default Value Buffer > > > > gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer|{0x0}|VOID*|0x00030005 > > > > + ## VPD type PCD allows a developer to point to an absolute physical > > address PcdVpdBaseAddress > > 1. PcdVpdBaseAddress should be PcdVpdBaseAddress64, right? > > > + # to store PCD value. It will be DynamicExDefault only. > > + # It is used to set VPD region base address. So, it can't be > > DynamicExVpd PCD. Its value is > > + # required to be accessed in PcdDxe driver entry point. So, its value > > must be set in PEI phase. > > + # It can't depend on EFI variable service, and can't be DynamicExHii > > PCD. > > + # @Prompt 64bit VPD base address. > > + gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64|0x0|UINT64|0x00030006 > > Please update MdeModulePkg.uni accordingly for this new PCD also. > > > Thanks, > Star > > > + > > [UserExtensions.TianoCore."ExtraFiles"] > > MdeModulePkgExtra.uni > > diff --git a/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf > > b/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf > > index 1f41a316bd..4ba78e46a3 100644 > > --- a/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf > > +++ b/MdeModulePkg/Universal/PCD/Dxe/Pcd.inf > > @@ -73,7 +73,7 @@ > > # > > # c) OEM specificed storage area: > > # - The PCD value is stored in OEM specified area which base > > address is > > -# specified by a FixedAtBuild PCD setting - PcdVpdBaseAddress. > > +# specified by PCD setting - PcdVpdBaseAddress64 or > > PcdVpdBaseAddress. > > # - The area is read only for PEI and DXE phase. > > # - [PcdsDynamicVpd] is used as section name for this type PCD in > > platform > > # DSC file. [PcdsDynamicExVpd] is for dynamicex type PCD. > > @@ -344,6 +344,7 @@ > > > > [Pcd] > > gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress ## > > SOMETIMES_CONSUMES > > + gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64 ## > > SOMETIMES_CONSUMES > > gEfiMdeModulePkgTokenSpaceGuid.PcdSetNvStoreDefaultId ## > > SOMETIMES_CONSUMES > > > > [Depex] > > diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.h > > b/MdeModulePkg/Universal/PCD/Dxe/Service.h > > index ddd5fa471e..3055e30cd1 100644 > > --- a/MdeModulePkg/Universal/PCD/Dxe/Service.h > > +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.h > > @@ -48,6 +48,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > #error "Please make sure the version of PCD DXE Service and the > > generated PCD DXE Database match." > > #endif > > > > +extern UINTN mVpdBaseAddress; > > + > > /** > > Retrieve additional information associated with a PCD token in the > > default token space. > > > > diff --git a/MdeModulePkg/Universal/PCD/Pei/Pcd.inf > > b/MdeModulePkg/Universal/PCD/Pei/Pcd.inf > > index 6e28fce8fa..63b125d48a 100644 > > --- a/MdeModulePkg/Universal/PCD/Pei/Pcd.inf > > +++ b/MdeModulePkg/Universal/PCD/Pei/Pcd.inf > > @@ -72,7 +72,7 @@ > > # > > # c) OEM specificed storage area: > > # - The PCD value is stored in OEM specified area which base > > address is > > -# specified by a FixedAtBuild PCD setting - PcdVpdBaseAddress. > > +# specified by PCD setting - PcdVpdBaseAddress64 or > > PcdVpdBaseAddress. > > # - The area is read only for PEI and DXE phase. > > # - [PcdsDynamicVpd] is used as section name for this type PCD in > > platform > > # DSC file. [PcdsDynamicExVpd] is for dynamicex type PCD. > > @@ -344,6 +344,7 @@ > > > > [Pcd] > > gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress ## SOMETIMES_CONSUMES > > + gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64 ## SOMETIMES_CONSUMES > > gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPcdCallBackNumberPerPcdEntry ## > > SOMETIMES_CONSUMES > > gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer ## > > SOMETIMES_CONSUMES > > gEfiMdeModulePkgTokenSpaceGuid.PcdSetNvStoreDefaultId ## CONSUMES > >
_______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

