]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/SmmAccess/SmramInternal.c
OvmfPkg/SmmAccess: close and lock SMRAM at default SMBASE
[mirror_edk2.git] / OvmfPkg / SmmAccess / SmramInternal.c
index 09657d0f9b0fcae17f7deea1864379000e31174c..0b07dc667b3fd885f2bba999ea0c9cd7ebcf54c1 100644 (file)
 //\r
 UINT16 mQ35TsegMbytes;\r
 \r
+//\r
+// The value of PcdQ35SmramAtDefaultSmbase is saved into this variable at\r
+// module startup.\r
+//\r
+STATIC BOOLEAN mQ35SmramAtDefaultSmbase;\r
+\r
 /**\r
   Save PcdQ35TsegMbytes into mQ35TsegMbytes.\r
 **/\r
@@ -32,6 +38,17 @@ InitQ35TsegMbytes (
   mQ35TsegMbytes = PcdGet16 (PcdQ35TsegMbytes);\r
 }\r
 \r
+/**\r
+  Save PcdQ35SmramAtDefaultSmbase into mQ35SmramAtDefaultSmbase.\r
+**/\r
+VOID\r
+InitQ35SmramAtDefaultSmbase (\r
+  VOID\r
+  )\r
+{\r
+  mQ35SmramAtDefaultSmbase = PcdGetBool (PcdQ35SmramAtDefaultSmbase);\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
@@ -125,6 +142,14 @@ SmramAccessLock (
   PciOr8 (DRAMC_REGISTER_Q35 (MCH_ESMRAMC), MCH_ESMRAMC_T_EN);\r
   PciOr8 (DRAMC_REGISTER_Q35 (MCH_SMRAM),   MCH_SMRAM_D_LCK);\r
 \r
+  //\r
+  // Close & lock the SMRAM at the default SMBASE, if it exists.\r
+  //\r
+  if (mQ35SmramAtDefaultSmbase) {\r
+    PciWrite8 (DRAMC_REGISTER_Q35 (MCH_DEFAULT_SMBASE_CTL),\r
+      MCH_DEFAULT_SMBASE_LCK);\r
+  }\r
+\r
   GetStates (LockState, OpenState);\r
   if (*OpenState || !*LockState) {\r
     return EFI_DEVICE_ERROR;\r