]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/SmmAccess: prepare for PcdQ35TsegMbytes becoming dynamic
authorLaszlo Ersek <lersek@redhat.com>
Tue, 4 Jul 2017 11:16:39 +0000 (13:16 +0200)
committerLaszlo Ersek <lersek@redhat.com>
Wed, 5 Jul 2017 20:25:03 +0000 (22:25 +0200)
In one of the next patches we'll turn PcdQ35TsegMbytes into a dynamic PCD,
to be set by PlatformPei.

Jordan suggested to use gEfiPeiMemoryDiscoveredPpiGuid as SmmAccessPei's
DEPEX for making sure that PlatformPei sets the PCD before SmmAccessPei
consumes it. (PlatformPei installs the permanent PEI RAM.) Such a DEPEX is
supposed to mirror physical firmware, where anything related to SMRAM
cannot run before said platform's physical RAM is discovered (signaled by
the presence of gEfiPeiMemoryDiscoveredPpiGuid).

Introduce the InitQ35TsegMbytes() function and the "mQ35TsegMbytes" extern
variable to "SmramInternal.h" and "SmramInternal.c":

- Both SmmAccess modules (PEIM and DXE driver) are supposed to call
  InitQ35TsegMbytes() in their respective entry point functions, saving
  PcdQ35TsegMbytes into "mQ35TsegMbytes". This way dynamic PCD fetches can
  be kept out of PEI_SMM_ACCESS_PPI and EFI_SMM_ACCESS2_PROTOCOL member
  functions later (when we add support for extended TSEG size).

- We can thus replace the current PcdQ35TsegMbytes fetches in
  SmmAccessPei's entry point function as well, with reads from
  "mQ35TsegMbytes".

Cc: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
OvmfPkg/SmmAccess/SmmAccess2Dxe.c
OvmfPkg/SmmAccess/SmmAccess2Dxe.inf
OvmfPkg/SmmAccess/SmmAccessPei.c
OvmfPkg/SmmAccess/SmmAccessPei.inf
OvmfPkg/SmmAccess/SmramInternal.c
OvmfPkg/SmmAccess/SmramInternal.h

index d5130399b0308ddcb0f42acf8641ce2ebc86f1fe..0a99cc5e83cef5c966b787880c56b50e283c5410 100644 (file)
@@ -149,6 +149,7 @@ SmmAccess2DxeEntryPoint (
   //\r
   ASSERT (FeaturePcdGet (PcdSmmSmramRequire));\r
 \r
   //\r
   ASSERT (FeaturePcdGet (PcdSmmSmramRequire));\r
 \r
+  InitQ35TsegMbytes ();\r
   GetStates (&mAccess2.LockState, &mAccess2.OpenState);\r
   return gBS->InstallMultipleProtocolInterfaces (&ImageHandle,\r
                 &gEfiSmmAccess2ProtocolGuid, &mAccess2,\r
   GetStates (&mAccess2.LockState, &mAccess2.OpenState);\r
   return gBS->InstallMultipleProtocolInterfaces (&ImageHandle,\r
                 &gEfiSmmAccess2ProtocolGuid, &mAccess2,\r
index 31e4dfa02991e8542f964ae300ca61088d798209..1bc88fa050c7a463dd9f36f1418afbe31ec7e9e0 100644 (file)
@@ -54,5 +54,8 @@
 [FeaturePcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire\r
 \r
 [FeaturePcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire\r
 \r
+[Pcd]\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes\r
+\r
 [Depex]\r
   TRUE\r
 [Depex]\r
   TRUE\r
index 76790e330f65154ed654f442eae5ff88ba7da801..a3631a1b9d508d81dbdd7f0d3c3a8babd2ea8e6e 100644 (file)
@@ -318,8 +318,9 @@ SmmAccessPeiEntryPoint (
   //\r
   // Set TSEG Memory Base.\r
   //\r
   //\r
   // Set TSEG Memory Base.\r
   //\r
+  InitQ35TsegMbytes ();\r
   PciWrite32 (DRAMC_REGISTER_Q35 (MCH_TSEGMB),\r
   PciWrite32 (DRAMC_REGISTER_Q35 (MCH_TSEGMB),\r
-    (TopOfLowRamMb - FixedPcdGet16 (PcdQ35TsegMbytes)) << MCH_TSEGMB_MB_SHIFT);\r
+    (TopOfLowRamMb - mQ35TsegMbytes) << MCH_TSEGMB_MB_SHIFT);\r
 \r
   //\r
   // Set TSEG size, and disable TSEG visibility outside of SMM. Note that the\r
 \r
   //\r
   // Set TSEG size, and disable TSEG visibility outside of SMM. Note that the\r
@@ -327,8 +328,8 @@ SmmAccessPeiEntryPoint (
   // *restricted* to SMM.\r
   //\r
   EsmramcVal &= ~(UINT32)MCH_ESMRAMC_TSEG_MASK;\r
   // *restricted* to SMM.\r
   //\r
   EsmramcVal &= ~(UINT32)MCH_ESMRAMC_TSEG_MASK;\r
-  EsmramcVal |= FixedPcdGet16 (PcdQ35TsegMbytes) == 8 ? MCH_ESMRAMC_TSEG_8MB :\r
-                FixedPcdGet16 (PcdQ35TsegMbytes) == 2 ? MCH_ESMRAMC_TSEG_2MB :\r
+  EsmramcVal |= mQ35TsegMbytes == 8 ? MCH_ESMRAMC_TSEG_8MB :\r
+                mQ35TsegMbytes == 2 ? MCH_ESMRAMC_TSEG_2MB :\r
                 MCH_ESMRAMC_TSEG_1MB;\r
   EsmramcVal |= MCH_ESMRAMC_T_EN;\r
   PciWrite8 (DRAMC_REGISTER_Q35 (MCH_ESMRAMC), EsmramcVal);\r
                 MCH_ESMRAMC_TSEG_1MB;\r
   EsmramcVal |= MCH_ESMRAMC_T_EN;\r
   PciWrite8 (DRAMC_REGISTER_Q35 (MCH_ESMRAMC), EsmramcVal);\r
index 3908b085da3aff7eea03365aa26894fab993a34b..09f3b63446dfe2ebcc9dff67e76a95ddd4012d78 100644 (file)
 [FeaturePcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire\r
 \r
 [FeaturePcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire\r
 \r
-[FixedPcd]\r
+[Pcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes\r
 \r
 [Ppis]\r
   gPeiSmmAccessPpiGuid           ## PRODUCES\r
 \r
 [Depex]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes\r
 \r
 [Ppis]\r
   gPeiSmmAccessPpiGuid           ## PRODUCES\r
 \r
 [Depex]\r
-  TRUE\r
+  gEfiPeiMemoryDiscoveredPpiGuid\r
index c3267ca940315cf6e7607610783458a0d8518d66..9918a451482e4c1772ff8b40601b0210076103ab 100644 (file)
 #include <Guid/AcpiS3Context.h>\r
 #include <IndustryStandard/Q35MchIch9.h>\r
 #include <Library/DebugLib.h>\r
 #include <Guid/AcpiS3Context.h>\r
 #include <IndustryStandard/Q35MchIch9.h>\r
 #include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
 #include <Library/PciLib.h>\r
 \r
 #include "SmramInternal.h"\r
 \r
 #include <Library/PciLib.h>\r
 \r
 #include "SmramInternal.h"\r
 \r
+//\r
+// The value of PcdQ35TsegMbytes is saved into this variable at module startup.\r
+//\r
+UINT16 mQ35TsegMbytes;\r
+\r
+/**\r
+  Save PcdQ35TsegMbytes into mQ35TsegMbytes.\r
+**/\r
+VOID\r
+InitQ35TsegMbytes (\r
+  VOID\r
+  )\r
+{\r
+  mQ35TsegMbytes = PcdGet16 (PcdQ35TsegMbytes);\r
+}\r
+\r
 /**\r
   Read the MCH_SMRAM and ESMRAMC registers, and update the LockState and\r
   OpenState fields in the PEI_SMM_ACCESS_PPI / EFI_SMM_ACCESS2_PROTOCOL object,\r
 /**\r
   Read the MCH_SMRAM and ESMRAMC registers, and update the LockState and\r
   OpenState fields in the PEI_SMM_ACCESS_PPI / EFI_SMM_ACCESS2_PROTOCOL object,\r
index 4e9ac05fad1cc789754066ab91ff86a6eeee4c35..82b867cf884655ca8418603795a9ad5a28fdec8f 100644 (file)
@@ -31,6 +31,19 @@ typedef enum {
   DescIdxCount            = 2\r
 } DESCRIPTOR_INDEX;\r
 \r
   DescIdxCount            = 2\r
 } DESCRIPTOR_INDEX;\r
 \r
+//\r
+// The value of PcdQ35TsegMbytes is saved into this variable at module startup.\r
+//\r
+extern UINT16 mQ35TsegMbytes;\r
+\r
+/**\r
+  Save PcdQ35TsegMbytes into mQ35TsegMbytes.\r
+**/\r
+VOID\r
+InitQ35TsegMbytes (\r
+  VOID\r
+  );\r
+\r
 /**\r
   Read the MCH_SMRAM and ESMRAMC registers, and update the LockState and\r
   OpenState fields in the PEI_SMM_ACCESS_PPI / EFI_SMM_ACCESS2_PROTOCOL object,\r
 /**\r
   Read the MCH_SMRAM and ESMRAMC registers, and update the LockState and\r
   OpenState fields in the PEI_SMM_ACCESS_PPI / EFI_SMM_ACCESS2_PROTOCOL object,\r