# @Prompt NV Storage Default Value Buffer\r
gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer|{0x0}|VOID*|0x00030005\r
\r
+ ## VPD type PCD allows a developer to point to an absolute physical address PcdVpdBaseAddress64\r
+ # to store PCD value. It will be DynamicExDefault only.\r
+ # It is used to set VPD region base address. So, it can't be DynamicExVpd PCD. Its value is\r
+ # required to be accessed in PcdDxe driver entry point. So, its value must be set in PEI phase.\r
+ # It can't depend on EFI variable service, and can't be DynamicExHii PCD.\r
+ # @Prompt 64bit VPD base address.\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64|0x0|UINT64|0x00030006\r
+\r
[UserExtensions.TianoCore."ExtraFiles"]\r
MdeModulePkgExtra.uni\r
#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdEdkiiFpdtStringRecordEnableOnly_HELP #language en-US "Control which FPDT record format will be used to store the performance entry.\n"\r
"On TRUE, the string FPDT record will be used to store every performance entry.\n"\r
"On FALSE, the different FPDT record will be used to store the different performance entries."\r
+\r
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdVpdBaseAddress_PROMPT #language en-US "64bit VPD base address"\r
+\r
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdVpdBaseAddress_HELP #language en-US "VPD type PCD allows a developer to point to an absolute physical address PcdVpdBaseAddress64"\r
+ "to store PCD value. It will be DynamicExDefault only."\r
+ "It is used to set VPD region base address. So, it can't be DynamicExVpd PCD. Its value is"\r
+ "required to be accessed in PcdDxe driver entry point. So, its value must be set in PEI phase."\r
+ "It can't depend on EFI variable service, and can't be DynamicExHii PCD."\r
};\r
\r
EFI_HANDLE mPcdHandle = NULL;\r
+UINTN mVpdBaseAddress = 0;\r
\r
/**\r
Main entry for PCD DXE driver.\r
&Registration\r
);\r
\r
+ //\r
+ // Cache VpdBaseAddress in entry point for the following usage.\r
+ //\r
+\r
+ //\r
+ // PcdVpdBaseAddress64 is DynamicEx PCD only. So, DxePcdGet64Ex() is used to get its value.\r
+ //\r
+ mVpdBaseAddress = (UINTN) DxePcdGet64Ex (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64));\r
+ if (mVpdBaseAddress == 0) {\r
+ //\r
+ // PcdVpdBaseAddress64 is not set, get value from PcdVpdBaseAddress.\r
+ //\r
+ mVpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress);\r
+ }\r
+\r
return Status;\r
}\r
\r
#\r
# c) OEM specificed storage area:\r
# - The PCD value is stored in OEM specified area which base address is\r
-# specified by a FixedAtBuild PCD setting - PcdVpdBaseAddress.\r
+# specified by PCD setting - PcdVpdBaseAddress64 or PcdVpdBaseAddress.\r
# - The area is read only for PEI and DXE phase.\r
# - [PcdsDynamicVpd] is used as section name for this type PCD in platform\r
# DSC file. [PcdsDynamicExVpd] is for dynamicex type PCD.\r
\r
[Pcd]\r
gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64 ## SOMETIMES_CONSUMES\r
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNvStoreDefaultId ## SOMETIMES_CONSUMES\r
\r
[Depex]\r
switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
case PCD_TYPE_VPD:\r
VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
- RetPtr = (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
+ ASSERT (mVpdBaseAddress != 0);\r
+ RetPtr = (VOID *) (mVpdBaseAddress + VpdHead->Offset);\r
\r
break;\r
\r
#error "Please make sure the version of PCD DXE Service and the generated PCD DXE Database match."\r
#endif\r
\r
+extern UINTN mVpdBaseAddress;\r
+\r
/**\r
Retrieve additional information associated with a PCD token in the default token space.\r
\r
#\r
# c) OEM specificed storage area:\r
# - The PCD value is stored in OEM specified area which base address is\r
-# specified by a FixedAtBuild PCD setting - PcdVpdBaseAddress.\r
+# specified by PCD setting - PcdVpdBaseAddress64 or PcdVpdBaseAddress.\r
# - The area is read only for PEI and DXE phase.\r
# - [PcdsDynamicVpd] is used as section name for this type PCD in platform\r
# DSC file. [PcdsDynamicExVpd] is for dynamicex type PCD.\r
\r
[Pcd]\r
gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress ## SOMETIMES_CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress64 ## SOMETIMES_CONSUMES\r
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPcdCallBackNumberPerPcdEntry ## SOMETIMES_CONSUMES\r
gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer ## SOMETIMES_CONSUMES\r
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNvStoreDefaultId ## CONSUMES\r
UINT32 LocalTokenNumber;\r
UINT32 LocalTokenCount;\r
UINT8 *VaraiableDefaultBuffer;\r
+ UINTN VpdBaseAddress;\r
\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
{\r
VPD_HEAD *VpdHead;\r
VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
- return (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
+\r
+ //\r
+ // PcdVpdBaseAddress64 is DynamicEx PCD only. So, PeiPcdGet64Ex() is used to get its value.\r
+ //\r
+ VpdBaseAddress = (UINTN) PeiPcdGet64Ex (&gEfiMdeModulePkgTokenSpaceGuid, PcdToken (PcdVpdBaseAddress64));\r
+ if (VpdBaseAddress == 0) {\r
+ //\r
+ // PcdVpdBaseAddress64 is not set, get value from PcdVpdBaseAddress.\r
+ //\r
+ VpdBaseAddress = (UINTN) PcdGet32 (PcdVpdBaseAddress);\r
+ }\r
+ ASSERT (VpdBaseAddress != 0);\r
+ return (VOID *)(VpdBaseAddress + VpdHead->Offset);\r
}\r
\r
case PCD_TYPE_HII|PCD_TYPE_STRING:\r