cpu/amd: Move locking SMM as part of SMM init
Locking SMM as part of the AP init avoids the need for CONFIG_PARALLEL_MP_AP_WORK to lock it down. Change-Id: Ibcdfc0f9ae211644cf0911790b0b0c5d1b0b7dc9 Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/c/coreboot/+/64871 Reviewed-by: Paul Menzel <paulepanter@mailbox.org> Reviewed-by: Felix Held <felix-coreboot@felixheld.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
e48dcb708c
commit
43ed5d2534
|
@ -10,30 +10,8 @@
|
||||||
#include <cpu/x86/msr.h>
|
#include <cpu/x86/msr.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
static void per_core_finalize(void *unused)
|
|
||||||
{
|
|
||||||
/* Finalize SMM settings */
|
|
||||||
if (is_smm_locked()) /* Skip if already locked, avoid GPF */
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (CONFIG(HAVE_SMI_HANDLER))
|
|
||||||
tseg_valid();
|
|
||||||
|
|
||||||
lock_smm();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void finalize_cores(void)
|
|
||||||
{
|
|
||||||
printk(BIOS_SPEW, "Lock SMM configuration\n");
|
|
||||||
|
|
||||||
if (mp_run_on_all_cpus(per_core_finalize, NULL) != CB_SUCCESS)
|
|
||||||
printk(BIOS_WARNING, "Failed to finalize all cores\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void soc_finalize(void *unused)
|
static void soc_finalize(void *unused)
|
||||||
{
|
{
|
||||||
finalize_cores();
|
|
||||||
|
|
||||||
if (!acpi_is_wakeup_s3()) {
|
if (!acpi_is_wakeup_s3()) {
|
||||||
acpi_clear_pm_gpe_status();
|
acpi_clear_pm_gpe_status();
|
||||||
|
|
||||||
|
|
|
@ -30,20 +30,6 @@ void clear_tvalid(void)
|
||||||
wrmsr(SMM_MASK_MSR, mask);
|
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)
|
void lock_smm(void)
|
||||||
{
|
{
|
||||||
msr_t hwcr = rdmsr(HWCR_MSR);
|
msr_t hwcr = rdmsr(HWCR_MSR);
|
||||||
|
|
|
@ -49,6 +49,14 @@ static void get_smm_info(uintptr_t *perm_smbase, size_t *perm_smsize,
|
||||||
*smm_save_state_size = sizeof(amd64_smm_state_save_area_t);
|
*smm_save_state_size = sizeof(amd64_smm_state_save_area_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tseg_valid(void)
|
||||||
|
{
|
||||||
|
msr_t mask = rdmsr(SMM_MASK_MSR);
|
||||||
|
mask.lo |= SMM_TSEG_VALID;
|
||||||
|
|
||||||
|
wrmsr(SMM_MASK_MSR, mask);
|
||||||
|
}
|
||||||
|
|
||||||
static void smm_relocation_handler(int cpu, uintptr_t curr_smbase, uintptr_t staggered_smbase)
|
static void smm_relocation_handler(int cpu, uintptr_t curr_smbase, uintptr_t staggered_smbase)
|
||||||
{
|
{
|
||||||
amd64_smm_state_save_area_t *smm_state;
|
amd64_smm_state_save_area_t *smm_state;
|
||||||
|
@ -70,6 +78,9 @@ static void smm_relocation_handler(int cpu, uintptr_t curr_smbase, uintptr_t sta
|
||||||
|
|
||||||
smm_state = (void *)(SMM_AMD64_SAVE_STATE_OFFSET + curr_smbase);
|
smm_state = (void *)(SMM_AMD64_SAVE_STATE_OFFSET + curr_smbase);
|
||||||
smm_state->smbase = staggered_smbase;
|
smm_state->smbase = staggered_smbase;
|
||||||
|
|
||||||
|
tseg_valid();
|
||||||
|
lock_smm();
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct mp_ops amd_mp_ops_with_smm = {
|
const struct mp_ops amd_mp_ops_with_smm = {
|
||||||
|
|
|
@ -10,8 +10,6 @@ void *get_smi_source_handler(int source);
|
||||||
void handle_smi_gsmi(void);
|
void handle_smi_gsmi(void);
|
||||||
void handle_smi_store(void);
|
void handle_smi_store(void);
|
||||||
void clear_tvalid(void);
|
void clear_tvalid(void);
|
||||||
void tseg_valid(void);
|
|
||||||
bool is_smm_locked(void);
|
|
||||||
void lock_smm(void);
|
void lock_smm(void);
|
||||||
/* See SMITYPE_* for list possible of events. GEVENTS are handled with mainboard_smi_gpi. */
|
/* See SMITYPE_* for list possible of events. GEVENTS are handled with mainboard_smi_gpi. */
|
||||||
void mainboard_handle_smi(int event);
|
void mainboard_handle_smi(int event);
|
||||||
|
|
Loading…
Reference in New Issue