coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
smm.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/device.h>
4 #include <device/pci.h>
5 #include <console/console.h>
6 #include <arch/io.h>
7 #include <cpu/x86/smm.h>
8 #include <cpu/intel/smm_reloc.h>
9 
10 #include <soc/iomap.h>
11 #include <soc/soc_util.h>
12 #include <soc/pm.h>
13 #include <soc/smm.h>
14 
16 {
17  uint32_t smi_en;
18 
19  printk(BIOS_DEBUG, "Initializing Southbridge SMI...");
20  printk(BIOS_SPEW, " pmbase = 0x%04x\n", get_pmbase());
21 
22  smi_en = inl((uint16_t)(get_pmbase() + SMI_EN));
23  if (smi_en & APMC_EN) {
24  printk(BIOS_INFO, "SMI# handler already enabled?\n");
25  return;
26  }
27 
28  /* Dump and clear status registers */
34 }
35 
36 static void smm_southbridge_enable(uint16_t pm1_events)
37 {
38 
39  printk(BIOS_DEBUG, "Enabling SMIs.\n");
40  /* Configure events Disable PCIe wake. */
41  enable_pm1(pm1_events | PCIEXPWAK_DIS);
43 
44  /* Enable SMI generation:
45  * - on APMC writes (io 0xb2)
46  * - on writes to SLP_EN (sleep states)
47  * - on writes to GBL_RLS (bios commands)
48  * No SMIs:
49  * - on TCO events
50  * - on microcontroller writes (io 0x62/0x66)
51  */
53 }
54 
56 {
58 }
uint16_t get_pmbase(void)
Definition: pmutil.c:254
#define GBL_SMI_EN
Definition: pm.h:49
#define APMC_EN
Definition: pm.h:44
#define SLP_SMI_EN
Definition: pm.h:45
#define PME_B0_EN
Definition: pm.h:104
#define SMI_EN
Definition: pm.h:32
#define EOS
Definition: pm.h:48
void enable_pm1(uint16_t events)
Definition: pmutil.c:157
uint16_t clear_pm1_status(void)
Definition: pmutil.c:152
void enable_smi(uint32_t mask)
Definition: pmutil.c:89
void clear_pmc_status(void)
Definition: pmutil.c:317
uint32_t clear_gpe_status(void)
Definition: pmutil.c:265
uint32_t clear_tco_status(void)
Definition: pmutil.c:189
uint32_t clear_smi_status(void)
Definition: pmutil.c:84
void disable_gpe(uint32_t mask)
Definition: pmutil.c:202
void global_smi_enable(void)
Set the EOS bit and enable SMI generation from southbridge.
Definition: smm.c:98
void smm_southbridge_clear_state(void)
Definition: smm.c:22
#define PWRBTN_EN
Definition: southbridge.h:36
#define GBL_EN
Definition: southbridge.h:37
#define PCIEXPWAK_DIS
Definition: southbridge.h:34
#define printk(level,...)
Definition: stdlib.h:16
static void smm_southbridge_enable(uint16_t pm1_events)
Definition: smm.c:36
u32 inl(u16 port)
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition: loglevel.h:142
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14