|
@@ -21,6 +21,12 @@
|
|
|
//
|
|
|
UINT16 mQ35TsegMbytes;
|
|
|
|
|
|
+//
|
|
|
+// The value of PcdQ35SmramAtDefaultSmbase is saved into this variable at
|
|
|
+// module startup.
|
|
|
+//
|
|
|
+STATIC BOOLEAN mQ35SmramAtDefaultSmbase;
|
|
|
+
|
|
|
/**
|
|
|
Save PcdQ35TsegMbytes into mQ35TsegMbytes.
|
|
|
**/
|
|
@@ -32,6 +38,17 @@ InitQ35TsegMbytes (
|
|
|
mQ35TsegMbytes = PcdGet16 (PcdQ35TsegMbytes);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ Save PcdQ35SmramAtDefaultSmbase into mQ35SmramAtDefaultSmbase.
|
|
|
+**/
|
|
|
+VOID
|
|
|
+InitQ35SmramAtDefaultSmbase (
|
|
|
+ VOID
|
|
|
+ )
|
|
|
+{
|
|
|
+ mQ35SmramAtDefaultSmbase = PcdGetBool (PcdQ35SmramAtDefaultSmbase);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
Read the MCH_SMRAM and ESMRAMC registers, and update the LockState and
|
|
|
OpenState fields in the PEI_SMM_ACCESS_PPI / EFI_SMM_ACCESS2_PROTOCOL object,
|
|
@@ -125,6 +142,14 @@ SmramAccessLock (
|
|
|
PciOr8 (DRAMC_REGISTER_Q35 (MCH_ESMRAMC), MCH_ESMRAMC_T_EN);
|
|
|
PciOr8 (DRAMC_REGISTER_Q35 (MCH_SMRAM), MCH_SMRAM_D_LCK);
|
|
|
|
|
|
+ //
|
|
|
+ // Close & lock the SMRAM at the default SMBASE, if it exists.
|
|
|
+ //
|
|
|
+ if (mQ35SmramAtDefaultSmbase) {
|
|
|
+ PciWrite8 (DRAMC_REGISTER_Q35 (MCH_DEFAULT_SMBASE_CTL),
|
|
|
+ MCH_DEFAULT_SMBASE_LCK);
|
|
|
+ }
|
|
|
+
|
|
|
GetStates (LockState, OpenState);
|
|
|
if (*OpenState || !*LockState) {
|
|
|
return EFI_DEVICE_ERROR;
|