diff options
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.c | 28 |
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); +} |