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 <arch/io.h>
4
#include <
console/console.h
>
5
#include <
cpu/x86/smm.h
>
6
#include <
ec/acpi/ec.h
>
7
#include <
ec/lenovo/h8/h8.h
>
8
#include <
southbridge/intel/bd82x6x/pch.h
>
9
#include <
southbridge/intel/common/pmutil.h
>
10
11
#define GPE_EC_SCI 1
12
#define GPE_EC_WAKE 13
13
14
static
void
mainboard_smi_handle_ec_sci
(
void
)
15
{
16
u8
status =
inb
(
EC_SC
);
17
u8
event;
18
19
if
(!(status &
EC_SCI_EVT
))
20
return
;
21
22
event
=
ec_query
();
23
printk
(
BIOS_DEBUG
,
"EC event %#02x\n"
, event);
24
}
25
26
void
mainboard_smi_gpi
(
u32
gpi_sts)
27
{
28
if
(gpi_sts & (1 <<
GPE_EC_SCI
))
29
mainboard_smi_handle_ec_sci
();
30
}
31
32
int
mainboard_smi_apmc
(
u8
data)
33
{
34
switch
(data) {
35
case
APM_CNT_ACPI_ENABLE
:
36
/* use 0x1600/0x1604 to prevent races with userspace */
37
ec_set_ports
(0x1604, 0x1600);
38
/* route EC_SCI to SCI */
39
gpi_route_interrupt
(
GPE_EC_SCI
,
GPI_IS_SCI
);
40
/* discard all events, and enable attention */
41
ec_write
(0x80, 0x01);
42
break
;
43
case
APM_CNT_ACPI_DISABLE
:
44
/* we have to use port 0x62/0x66, as 0x1600/0x1604 doesn't
45
provide a EC query function */
46
ec_set_ports
(0x66, 0x62);
47
/* route EC_SCI to SMI */
48
gpi_route_interrupt
(
GPE_EC_SCI
,
GPI_IS_SMI
);
49
/* discard all events, and enable attention */
50
ec_write
(0x80, 0x01);
51
break
;
52
default
:
53
break
;
54
}
55
return
0;
56
}
57
58
void
mainboard_smi_sleep
(
u8
slp_typ)
59
{
60
if
(slp_typ == 3) {
61
u8
ec_wake =
ec_read
(0x32);
62
/* If EC wake events are enabled, enable wake on EC WAKE GPE. */
63
if
(ec_wake & 0x14) {
64
/* Redirect EC WAKE GPE to SCI. */
65
gpi_route_interrupt
(
GPE_EC_WAKE
,
GPI_IS_SCI
);
66
}
67
}
68
}
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
inb
u8 inb(u16 port)
ec_read
u8 ec_read(u8 addr)
Definition:
ec.c:107
ec_query
u8 ec_query(void)
Definition:
ec.c:127
ec_set_ports
void ec_set_ports(u16 cmd_reg, u16 data_reg)
Definition:
ec.c:143
ec_write
int ec_write(u8 addr, u8 data)
Definition:
ec.c:115
ec.h
EC_SC
#define EC_SC
Definition:
ec.h:9
EC_SCI_EVT
#define EC_SCI_EVT
Definition:
ec.h:13
h8.h
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
BIOS_DEBUG
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition:
loglevel.h:128
GPI_IS_SMI
#define GPI_IS_SMI
Definition:
smihandler.c:34
GPI_IS_SCI
#define GPI_IS_SCI
Definition:
smihandler.c:35
mainboard_smi_handle_ec_sci
static void mainboard_smi_handle_ec_sci(void)
Definition:
smihandler.c:14
GPE_EC_WAKE
#define GPE_EC_WAKE
Definition:
smihandler.c:12
GPE_EC_SCI
#define GPE_EC_SCI
Definition:
smihandler.c:11
pmutil.h
pch.h
gpi_route_interrupt
void gpi_route_interrupt(u8 gpi, u8 mode)
Definition:
smihandler.c:25
u32
uint32_t u32
Definition:
stdint.h:51
u8
uint8_t u8
Definition:
stdint.h:45
src
mainboard
lenovo
x1_carbon_gen1
smihandler.c
Generated by
1.9.1