]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg PCD: Add DynamicEx PcdVpdBaseAddress64 for non SPI platform
authorLiming Gao <liming.gao@intel.com>
Thu, 22 Nov 2018 14:10:29 +0000 (22:10 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 27 Nov 2018 03:29:21 +0000 (11:29 +0800)
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 <liming.gao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Dandan Bi <dandan.bi@intel.com>
MdeModulePkg/MdeModulePkg.dec
MdeModulePkg/MdeModulePkg.uni
MdeModulePkg/Universal/PCD/Dxe/Pcd.c
MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
MdeModulePkg/Universal/PCD/Dxe/Service.c
MdeModulePkg/Universal/PCD/Dxe/Service.h
MdeModulePkg/Universal/PCD/Pei/Pcd.inf
MdeModulePkg/Universal/PCD/Pei/Service.c

index 0abacc1a901f348600328645d479753f68a53b82..41d2b043519741f4decc75d55c7242dea5b87ea0 100644 (file)
   # @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
index 038e8485054b02cb2dff9e63f3ebd0084c3524bd..9b1766b36a77e1beae1307aa66f275bdaf96333d 100644 (file)
 #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
index f977c7f18e194f20d06ab3fd972cd159137c171f..4e38a3844a8621921738d4b96b697665695dbaf2 100644 (file)
@@ -109,6 +109,7 @@ EFI_GET_PCD_INFO_PROTOCOL  mEfiGetPcdInfoInstance = {
 };\r
 \r
 EFI_HANDLE mPcdHandle = NULL;\r
+UINTN      mVpdBaseAddress = 0;\r
 \r
 /**\r
   Main entry for PCD DXE driver.\r
@@ -175,6 +176,21 @@ PcdDxeInit (
     &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
index 1f41a316bd89f14dd14bb4e99c5849cb54ece1df..4ba78e46a36d8ea6392ec065b20477f898c4fea2 100644 (file)
@@ -73,7 +73,7 @@
 #\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
index 05171523662b3af8f612181af537e1ee78a74bd1..4b44153e136ef2b05829763bcd89cabc8024a24d 100644 (file)
@@ -435,7 +435,8 @@ GetWorker (
   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
index ddd5fa471ecf3a7215e30ad9b79bd4ab9916121d..3055e30cd16b5bbb1b1fc0bb582820f85abc02c3 100644 (file)
@@ -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."\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
index 6e28fce8fa86c0bd75abc91f8ebb390cf073f410..63b125d48a80170ffecbbeefc982ce7d514958f5 100644 (file)
@@ -72,7 +72,7 @@
 #\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
index bb4b52baf374cd4e28c248d74177d5e4e6bc2cc7..e1613e8af87c9f9d69674345b6306d70747abdbf 100644 (file)
@@ -861,6 +861,7 @@ GetWorker (
   UINT32              LocalTokenNumber;\r
   UINT32              LocalTokenCount;\r
   UINT8               *VaraiableDefaultBuffer;\r
+  UINTN               VpdBaseAddress;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -889,7 +890,19 @@ GetWorker (
     {\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