summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Universal
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Universal')
-rw-r--r--MdeModulePkg/Universal/PCD/Dxe/Pcd.c16
-rw-r--r--MdeModulePkg/Universal/PCD/Dxe/Pcd.inf3
-rw-r--r--MdeModulePkg/Universal/PCD/Dxe/Service.c3
-rw-r--r--MdeModulePkg/Universal/PCD/Dxe/Service.h2
-rw-r--r--MdeModulePkg/Universal/PCD/Pei/Pcd.inf3
-rw-r--r--MdeModulePkg/Universal/PCD/Pei/Service.c15
6 files changed, 38 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/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.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/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
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: