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)) {
22
mask
=
rdmsr
(
SMM_MASK_MSR
);
23
mask
.lo |=
SMM_TSEG_VALID
;
24
wrmsr
(
SMM_MASK_MSR
,
mask
);
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
35
if
(
mp_run_on_all_cpus
(
per_core_finalize
,
NULL
) !=
CB_SUCCESS
)
36
printk
(
BIOS_WARNING
,
"Failed to finalize all cores\n"
);
37
}
38
39
static
void
soc_finalize
(
void
*unused)
40
{
41
finalize_cores
();
42
43
if
(!
acpi_is_wakeup_s3
()) {
44
acpi_clear_pm_gpe_status
();
45
46
if
(
CONFIG
(HAVE_SMI_HANDLER))
47
acpi_disable_sci
();
48
else
49
acpi_enable_sci
();
50
}
51
52
post_code
(
POST_OS_BOOT
);
53
}
54
55
BOOT_STATE_INIT_ENTRY
(
BS_OS_RESUME
,
BS_ON_ENTRY
,
soc_finalize
,
NULL
);
56
BOOT_STATE_INIT_ENTRY
(
BS_PAYLOAD_LOAD
,
BS_ON_EXIT
,
soc_finalize
,
NULL
);
acpi_is_wakeup_s3
static int acpi_is_wakeup_s3(void)
Definition:
acpi.h:9
bootstate.h
BS_PAYLOAD_LOAD
@ BS_PAYLOAD_LOAD
Definition:
bootstate.h:88
BS_OS_RESUME
@ BS_OS_RESUME
Definition:
bootstate.h:86
BS_ON_ENTRY
@ BS_ON_ENTRY
Definition:
bootstate.h:95
BS_ON_EXIT
@ BS_ON_EXIT
Definition:
bootstate.h:96
CB_SUCCESS
@ CB_SUCCESS
Call completed successfully.
Definition:
cb_err.h:16
printk
#define printk(level,...)
Definition:
stdlib.h:16
console.h
mp_run_on_all_cpus
enum cb_err mp_run_on_all_cpus(void(*func)(void *), void *arg)
Definition:
mp_init.c:1002
CONFIG
@ CONFIG
Definition:
dsi_common.h:201
acpi.h
msr.h
SMM_LOCK
#define SMM_LOCK
Definition:
msr.h:18
SMM_MASK_MSR
#define SMM_MASK_MSR
Definition:
msr.h:61
HWCR_MSR
#define HWCR_MSR
Definition:
msr.h:17
SMM_TSEG_VALID
#define SMM_TSEG_VALID
Definition:
msr.h:62
msr.h
rdmsr
static __always_inline msr_t rdmsr(unsigned int index)
Definition:
msr.h:146
wrmsr
static __always_inline void wrmsr(unsigned int index, msr_t msr)
Definition:
msr.h:157
BIOS_SPEW
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition:
loglevel.h:142
BIOS_WARNING
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
Definition:
loglevel.h:86
mp.h
post_code
#define post_code(value)
Definition:
post_code.h:12
POST_OS_BOOT
#define POST_OS_BOOT
Final code before OS boots.
Definition:
post_codes.h:414
acpi_enable_sci
void acpi_enable_sci(void)
Definition:
acpi.c:126
acpi_clear_pm_gpe_status
void acpi_clear_pm_gpe_status(void)
Definition:
acpi.c:90
acpi_disable_sci
void acpi_disable_sci(void)
Definition:
acpi.c:135
soc_finalize
static void soc_finalize(void *unused)
Definition:
finalize.c:39
per_core_finalize
static void per_core_finalize(void *unused)
Definition:
finalize.c:12
finalize_cores
static void finalize_cores(void)
Definition:
finalize.c:31
BOOT_STATE_INIT_ENTRY
BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, soc_finalize, NULL)
acpi.h
mask
static const int mask[4]
Definition:
gpio.c:308
NULL
#define NULL
Definition:
stddef.h:19
msr_struct
Definition:
msr.h:110
msr_struct::lo
unsigned int lo
Definition:
msr.h:111
src
soc
amd
common
block
cpu
smm
finalize.c
Generated by
1.9.1