coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
finalize.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpi.h>
4 #include <cpu/x86/mp.h>
5 #include <cpu/x86/msr.h>
6 #include <cpu/amd/msr.h>
7 #include <bootstate.h>
8 #include <console/console.h>
9 #include <amdblocks/acpi.h>
10 #include <types.h>
11 
12 static void per_core_finalize(void *unused)
13 {
14  msr_t hwcr, mask;
15 
16  /* Finalize SMM settings */
17  hwcr = rdmsr(HWCR_MSR);
18  if (hwcr.lo & SMM_LOCK) /* Skip if already locked, avoid GPF */
19  return;
20 
21  if (CONFIG(HAVE_SMI_HANDLER)) {
23  mask.lo |= SMM_TSEG_VALID;
25  }
26 
27  hwcr.lo |= SMM_LOCK;
28  wrmsr(HWCR_MSR, hwcr);
29 }
30 
31 static void finalize_cores(void)
32 {
33  printk(BIOS_SPEW, "Lock SMM configuration\n");
34 
36  printk(BIOS_WARNING, "Failed to finalize all cores\n");
37 }
38 
39 static void soc_finalize(void *unused)
40 {
42 
43  if (!acpi_is_wakeup_s3()) {
45 
46  if (CONFIG(HAVE_SMI_HANDLER))
48  else
50  }
51 
53 }
54 
static int acpi_is_wakeup_s3(void)
Definition: acpi.h:9
@ BS_PAYLOAD_LOAD
Definition: bootstate.h:88
@ BS_OS_RESUME
Definition: bootstate.h:86
@ BS_ON_ENTRY
Definition: bootstate.h:95
@ BS_ON_EXIT
Definition: bootstate.h:96
@ CB_SUCCESS
Call completed successfully.
Definition: cb_err.h:16
#define printk(level,...)
Definition: stdlib.h:16
enum cb_err mp_run_on_all_cpus(void(*func)(void *), void *arg)
Definition: mp_init.c:1002
@ CONFIG
Definition: dsi_common.h:201
#define SMM_LOCK
Definition: msr.h:18
#define SMM_MASK_MSR
Definition: msr.h:61
#define HWCR_MSR
Definition: msr.h:17
#define SMM_TSEG_VALID
Definition: msr.h:62
static __always_inline msr_t rdmsr(unsigned int index)
Definition: msr.h:146
static __always_inline void wrmsr(unsigned int index, msr_t msr)
Definition: msr.h:157
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition: loglevel.h:142
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
Definition: loglevel.h:86
#define post_code(value)
Definition: post_code.h:12
#define POST_OS_BOOT
Final code before OS boots.
Definition: post_codes.h:414
void acpi_enable_sci(void)
Definition: acpi.c:126
void acpi_clear_pm_gpe_status(void)
Definition: acpi.c:90
void acpi_disable_sci(void)
Definition: acpi.c:135
static void soc_finalize(void *unused)
Definition: finalize.c:39
static void per_core_finalize(void *unused)
Definition: finalize.c:12
static void finalize_cores(void)
Definition: finalize.c:31
BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, soc_finalize, NULL)
static const int mask[4]
Definition: gpio.c:308
#define NULL
Definition: stddef.h:19
unsigned int lo
Definition: msr.h:111