coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
fadt.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/pci_ops.h>
4 #include <acpi/acpi.h>
5 #include <cpu/x86/smm.h>
7 #include "chip.h"
8 
10 {
11  struct device *dev = pcidev_on_root(0x1f, 0);
13  u16 pmbase = get_pmbase();
14 
15  fadt->sci_int = 0x9;
16 
17  if (permanent_smi_handler()) {
18  fadt->smi_cmd = APM_CNT;
21  }
22 
23  fadt->pm1a_evt_blk = pmbase + PM1_STS;
24  fadt->pm1a_cnt_blk = pmbase + PM1_CNT;
25  fadt->pm2_cnt_blk = pmbase + PM2_CNT;
26  fadt->pm_tmr_blk = pmbase + PM1_TMR;
27  if (pch_is_lp())
28  fadt->gpe0_blk = pmbase + LP_GPE0_STS_1;
29  else
30  fadt->gpe0_blk = pmbase + GPE0_STS;
31 
32  /*
33  * Some of the lengths here are doubled. This is because they describe
34  * blocks containing two registers, where the size of each register
35  * is found by halving the block length. See Table 5-34 and section
36  * 4.8.3 of the ACPI specification for details.
37  */
38  fadt->pm1_evt_len = 2 * 2;
39  fadt->pm1_cnt_len = 2;
40  fadt->pm2_cnt_len = 1;
41  fadt->pm_tmr_len = 4;
42  if (pch_is_lp())
43  fadt->gpe0_blk_len = 2 * 16;
44  else
45  fadt->gpe0_blk_len = 2 * 8;
46 
47  /* P_LVLx not used */
48  fadt->p_lvl2_lat = 101;
49  fadt->p_lvl3_lat = 1001;
50  fadt->duty_offset = 0;
51  fadt->duty_width = 0;
52  fadt->day_alrm = 0xd;
53  fadt->mon_alrm = 0x00;
55 
56  fadt->flags |= ACPI_FADT_WBINVD |
62 
63  if (cfg && cfg->docking_supported)
65 
67  fadt->x_pm1a_evt_blk.bit_width = fadt->pm1_evt_len * 8;
68  fadt->x_pm1a_evt_blk.bit_offset = 0;
71  fadt->x_pm1a_evt_blk.addrh = 0x0;
72 
74  fadt->x_pm1a_cnt_blk.bit_width = fadt->pm1_cnt_len * 8;
75  fadt->x_pm1a_cnt_blk.bit_offset = 0;
78  fadt->x_pm1a_cnt_blk.addrh = 0x0;
79 
81  fadt->x_pm2_cnt_blk.bit_width = fadt->pm2_cnt_len * 8;
82  fadt->x_pm2_cnt_blk.bit_offset = 0;
85  fadt->x_pm2_cnt_blk.addrh = 0x0;
86 
88  fadt->x_pm_tmr_blk.bit_width = fadt->pm_tmr_len * 8;
89  fadt->x_pm_tmr_blk.bit_offset = 0;
91  fadt->x_pm_tmr_blk.addrl = pmbase + PM1_TMR;
92  fadt->x_pm_tmr_blk.addrh = 0x0;
93 
94  /*
95  * Windows 10 requires x_gpe0_blk to be set starting with FADT revision 5.
96  * The bit_width field intentionally overflows here.
97  * The OSPM can instead use the values in `fadt->gpe0_blk{,_len}`, which
98  * seems to work fine on Linux 5.0 and Windows 10.
99  */
101  fadt->x_gpe0_blk.bit_width = fadt->gpe0_blk_len * 8;
102  fadt->x_gpe0_blk.bit_offset = 0;
104  fadt->x_gpe0_blk.addrl = fadt->gpe0_blk;
105  fadt->x_gpe0_blk.addrh = 0x0;
106 }
uint16_t get_pmbase(void)
Definition: pmutil.c:254
#define GPE0_STS(x)
Definition: pm.h:81
#define PM1_STS
Definition: pm.h:12
#define PM1_TMR
Definition: pm.h:31
#define PM1_CNT
Definition: pm.h:27
#define PM2_CNT
Definition: pm.h:77
DEVTREE_CONST struct device * pcidev_on_root(uint8_t dev, uint8_t fn)
Definition: device_const.c:260
#define ACPI_FADT_LEGACY_DEVICES
Definition: acpi.h:818
#define ACPI_FADT_SEALED_CASE
Definition: acpi.h:803
#define ACPI_FADT_S4_RTC_WAKE
Definition: acpi.h:799
#define ACPI_FADT_PLATFORM_CLOCK
Definition: acpi.h:807
static int permanent_smi_handler(void)
Definition: acpi.h:1414
#define ACPI_ACCESS_SIZE_WORD_ACCESS
Definition: acpi.h:128
#define ACPI_ACCESS_SIZE_DWORD_ACCESS
Definition: acpi.h:129
#define ACPI_FADT_8042
Definition: acpi.h:819
#define ACPI_FADT_DOCKING_SUPPORTED
Definition: acpi.h:801
#define ACPI_FADT_SLEEP_BUTTON
Definition: acpi.h:797
#define ACPI_FADT_WBINVD
Definition: acpi.h:792
#define ACPI_FADT_C1_SUPPORTED
Definition: acpi.h:794
#define ACPI_ACCESS_SIZE_BYTE_ACCESS
Definition: acpi.h:127
#define ACPI_ADDRESS_SPACE_IO
Definition: acpi.h:105
#define APM_CNT_ACPI_DISABLE
Definition: smm.h:21
#define APM_CNT_ACPI_ENABLE
Definition: smm.h:22
void acpi_fill_fadt(acpi_fadt_t *fadt)
Definition: fadt.c:10
#define APM_CNT
Definition: fadt.c:11
static u16 pmbase
Definition: smi.c:27
static int pch_is_lp(void)
Definition: pch.h:104
#define LP_GPE0_STS_1
Definition: pch.h:631
uint16_t u16
Definition: stdint.h:48
u32 pm1a_cnt_blk
Definition: acpi.h:721
u32 pm_tmr_blk
Definition: acpi.h:724
u8 acpi_enable
Definition: acpi.h:715
u8 duty_offset
Definition: acpi.h:739
u8 pm1_evt_len
Definition: acpi.h:727
u32 gpe0_blk
Definition: acpi.h:725
acpi_addr_t x_gpe0_blk
Definition: acpi.h:761
acpi_addr_t x_pm2_cnt_blk
Definition: acpi.h:759
u8 pm_tmr_len
Definition: acpi.h:730
u32 smi_cmd
Definition: acpi.h:714
u8 day_alrm
Definition: acpi.h:741
u8 duty_width
Definition: acpi.h:740
u8 pm2_cnt_len
Definition: acpi.h:729
u8 acpi_disable
Definition: acpi.h:716
u8 pm1_cnt_len
Definition: acpi.h:728
acpi_addr_t x_pm1a_evt_blk
Definition: acpi.h:755
u32 pm1a_evt_blk
Definition: acpi.h:719
acpi_addr_t x_pm1a_cnt_blk
Definition: acpi.h:757
u16 p_lvl2_lat
Definition: acpi.h:735
u8 gpe0_blk_len
Definition: acpi.h:731
u16 p_lvl3_lat
Definition: acpi.h:736
u32 flags
Definition: acpi.h:746
u16 iapc_boot_arch
Definition: acpi.h:744
acpi_addr_t x_pm_tmr_blk
Definition: acpi.h:760
u16 sci_int
Definition: acpi.h:713
u32 pm2_cnt_blk
Definition: acpi.h:723
u8 mon_alrm
Definition: acpi.h:742
u8 bit_offset
Definition: acpi.h:98
u8 bit_width
Definition: acpi.h:97
u8 access_size
Definition: acpi.h:99
Definition: device.h:107
DEVTREE_CONST void * chip_info
Definition: device.h:164