summaryrefslogtreecommitdiffstats
path: root/src/soc/amd/common/block/cpu/smm/smm_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/amd/common/block/cpu/smm/smm_helper.c')
-rw-r--r--src/soc/amd/common/block/cpu/smm/smm_helper.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/soc/amd/common/block/cpu/smm/smm_helper.c b/src/soc/amd/common/block/cpu/smm/smm_helper.c
index ce80f1613cee..e87d12c64167 100644
--- a/src/soc/amd/common/block/cpu/smm/smm_helper.c
+++ b/src/soc/amd/common/block/cpu/smm/smm_helper.c
@@ -1,9 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-#include <amdblocks/smm.h>
#include <console/console.h>
-#include <cpu/x86/msr.h>
+#include <cpu/amd/amd64_save_state.h>
#include <cpu/amd/msr.h>
+#include <amdblocks/smm.h>
+#include <cpu/cpu.h>
+#include <cpu/x86/msr.h>
+#include <stdint.h>
/*
* For data stored in TSEG, ensure TValid is clear so R/W access can reach
@@ -26,3 +29,24 @@ void clear_tvalid(void)
mask.lo &= ~SMM_TSEG_VALID;
wrmsr(SMM_MASK_MSR, mask);
}
+
+void tseg_valid(void)
+{
+ msr_t mask = rdmsr(SMM_MASK_MSR);
+ mask.lo |= SMM_TSEG_VALID;
+
+ wrmsr(SMM_MASK_MSR, mask);
+}
+
+bool is_smm_locked(void)
+{
+ msr_t hwcr = rdmsr(HWCR_MSR);
+ return hwcr.lo & SMM_LOCK ? true : false;
+}
+
+void lock_smm(void)
+{
+ msr_t hwcr = rdmsr(HWCR_MSR);
+ hwcr.lo |= SMM_LOCK;
+ wrmsr(HWCR_MSR, hwcr);
+}