coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
smihandler.c
Go to the documentation of this file.
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
3
#include <
acpi/acpi.h
>
4
#include <
console/console.h
>
5
#include <
cpu/x86/smm.h
>
6
#include <soc/nvs.h>
7
#include <
southbridge/intel/bd82x6x/pch.h
>
8
#include <
southbridge/intel/bd82x6x/me.h
>
9
#include <
southbridge/intel/common/pmbase.h
>
10
#include <
northbridge/intel/sandybridge/sandybridge.h
>
11
#include <elog.h>
12
13
/* Include EC functions */
14
#include <
ec/google/chromeec/ec.h
>
15
#include "
ec.h
"
16
17
static
u8
mainboard_smi_ec
(
void
)
18
{
19
u8
cmd =
google_chromeec_get_event
();
20
21
/* Log this event */
22
if
(cmd)
23
elog_gsmi_add_event_byte
(
ELOG_TYPE_EC_EVENT
, cmd);
24
25
switch
(cmd) {
26
case
EC_HOST_EVENT_LID_CLOSED
:
27
printk
(
BIOS_DEBUG
,
"LID CLOSED, SHUTDOWN\n"
);
28
29
/* Go to S5 */
30
write_pmbase32
(
PM1_CNT
,
read_pmbase32
(
PM1_CNT
) | (0xf << 10));
31
break
;
32
}
33
34
return
cmd;
35
}
36
37
void
mainboard_smi_gpi
(
u32
gpi_sts)
38
{
39
if
(gpi_sts & (1 <<
EC_SMI_GPI
)) {
40
/* Process all pending events */
41
while
(
mainboard_smi_ec
() != 0);
42
}
43
}
44
45
void
mainboard_smi_sleep
(
u8
slp_typ)
46
{
47
/* Disable USB charging if required */
48
switch
(slp_typ) {
49
case
ACPI_S3
:
50
if
(
gnvs
->
s3u0
== 0)
51
google_chromeec_set_usb_charge_mode
(
52
0,
USB_CHARGE_MODE_DISABLED
);
53
if
(
gnvs
->
s3u1
== 0)
54
google_chromeec_set_usb_charge_mode
(
55
1,
USB_CHARGE_MODE_DISABLED
);
56
break
;
57
case
ACPI_S5
:
58
if
(
gnvs
->
s5u0
== 0)
59
google_chromeec_set_usb_charge_mode
(
60
0,
USB_CHARGE_MODE_DISABLED
);
61
if
(
gnvs
->
s5u1
== 0)
62
google_chromeec_set_usb_charge_mode
(
63
1,
USB_CHARGE_MODE_DISABLED
);
64
break
;
65
}
66
67
/* Disable SCI and SMI events */
68
google_chromeec_set_smi_mask
(0);
69
google_chromeec_set_sci_mask
(0);
70
71
/* Clear pending events that may trigger immediate wake */
72
while
(
google_chromeec_get_event
() !=
EC_HOST_EVENT_NONE
)
73
;
74
75
/* Enable wake events */
76
google_chromeec_set_wake_mask
(
LINK_EC_S3_WAKE_EVENTS
);
77
}
78
79
int
mainboard_smi_apmc
(
u8
apmc)
80
{
81
switch
(apmc) {
82
case
APM_CNT_ACPI_ENABLE
:
83
google_chromeec_set_smi_mask
(0);
84
/* Clear all pending events */
85
while
(
google_chromeec_get_event
() !=
EC_HOST_EVENT_NONE
)
86
;
87
google_chromeec_set_sci_mask
(
LINK_EC_SCI_EVENTS
);
88
break
;
89
case
APM_CNT_ACPI_DISABLE
:
90
google_chromeec_set_sci_mask
(0);
91
/* Clear all pending events */
92
while
(
google_chromeec_get_event
() !=
EC_HOST_EVENT_NONE
)
93
;
94
google_chromeec_set_smi_mask
(
LINK_EC_SMI_EVENTS
);
95
break
;
96
}
97
return
0;
98
}
PM1_CNT
#define PM1_CNT
Definition:
pm.h:27
ELOG_TYPE_EC_EVENT
#define ELOG_TYPE_EC_EVENT
Definition:
elog.h:90
printk
#define printk(level,...)
Definition:
stdlib.h:16
console.h
mainboard_smi_sleep
void __weak mainboard_smi_sleep(u8 slp_typ)
Definition:
smihandler.c:210
mainboard_smi_apmc
int __weak mainboard_smi_apmc(u8 data)
Definition:
smihandler.c:209
mainboard_smi_gpi
void __weak mainboard_smi_gpi(u32 gpi_sts)
Definition:
smihandler.c:208
google_chromeec_set_wake_mask
int google_chromeec_set_wake_mask(uint64_t mask)
Definition:
ec.c:1131
google_chromeec_set_smi_mask
int google_chromeec_set_smi_mask(uint64_t mask)
Definition:
ec.c:1125
google_chromeec_set_usb_charge_mode
int google_chromeec_set_usb_charge_mode(uint8_t port_id, enum usb_charge_mode mode)
Definition:
ec.c:1143
google_chromeec_set_sci_mask
int google_chromeec_set_sci_mask(uint64_t mask)
Definition:
ec.c:1119
ec.h
google_chromeec_get_event
enum host_event_code google_chromeec_get_event(void)
Definition:
ec_i2c.c:242
EC_HOST_EVENT_NONE
@ EC_HOST_EVENT_NONE
Definition:
ec_commands.h:654
EC_HOST_EVENT_LID_CLOSED
@ EC_HOST_EVENT_LID_CLOSED
Definition:
ec_commands.h:655
USB_CHARGE_MODE_DISABLED
@ USB_CHARGE_MODE_DISABLED
Definition:
ec_commands.h:3240
acpi.h
ACPI_S5
@ ACPI_S5
Definition:
acpi.h:1385
ACPI_S3
@ ACPI_S3
Definition:
acpi.h:1383
smm.h
APM_CNT_ACPI_DISABLE
#define APM_CNT_ACPI_DISABLE
Definition:
smm.h:21
APM_CNT_ACPI_ENABLE
#define APM_CNT_ACPI_ENABLE
Definition:
smm.h:22
elog_gsmi_add_event_byte
static int elog_gsmi_add_event_byte(u8 event_type, u8 data)
Definition:
elog.h:46
BIOS_DEBUG
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition:
loglevel.h:128
EC_SMI_GPI
#define EC_SMI_GPI
Definition:
ec.h:10
LINK_EC_SCI_EVENTS
#define LINK_EC_SCI_EVENTS
Definition:
ec.h:11
LINK_EC_S3_WAKE_EVENTS
#define LINK_EC_S3_WAKE_EVENTS
Definition:
ec.h:31
LINK_EC_SMI_EVENTS
#define LINK_EC_SMI_EVENTS
Definition:
ec.h:22
mainboard_smi_ec
static u8 mainboard_smi_ec(void)
Definition:
smihandler.c:17
ec.h
read_pmbase32
u32 read_pmbase32(const u8 addr)
Definition:
pmbase.c:57
write_pmbase32
void write_pmbase32(const u8 addr, const u32 val)
Definition:
pmbase.c:36
pmbase.h
sandybridge.h
gnvs
struct global_nvs * gnvs
Definition:
smm_module_handler.c:100
me.h
pch.h
u32
uint32_t u32
Definition:
stdint.h:51
u8
uint8_t u8
Definition:
stdint.h:45
global_nvs::s5u1
u8 s5u1
Definition:
nvs.h:33
global_nvs::s3u0
u8 s3u0
Definition:
nvs.h:34
global_nvs::s3u1
u8 s3u1
Definition:
nvs.h:35
global_nvs::s5u0
u8 s5u0
Definition:
nvs.h:32
src
mainboard
google
link
smihandler.c
Generated by
1.9.1