skylake: Add support for eSPI SMI events

Add the necessary infrastructure to support eSPI SMI events,
and a mainboard handler to pass control to the EC.

BUG=chrome-os-partner:58666
TEST=tested on eve board with eSPI enabled, verified that lid
close event from the EC during firmware will result in an SMI
and shut down the system.

Change-Id: I6367e233e070a8fca053a7bdd2534c0578d15d12
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: https://review.coreboot.org/17134
Tested-by: build bot (Jenkins)
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Duncan Laurie 2016-10-25 19:58:27 -07:00
parent f0ba2259b8
commit 8d01902bb7
5 changed files with 14 additions and 2 deletions

View File

@ -46,6 +46,7 @@
#define SMI_EN 0x30
#define XHCI_SMI_EN (1 << 31)
#define ME_SMI_EN (1 << 30)
#define ESPI_SMI_EN (1 << 28)
#define GPIO_UNLOCK_SMI_EN (1 << 27)
#define INTEL_USB2_EN (1 << 18)
#define LEGACY_USB2_EN (1 << 17)

View File

@ -50,6 +50,8 @@ struct smm_relocation_params {
/* Mainboard handler for GPI SMIs*/
void mainboard_smi_gpi_handler(const struct gpi_status *sts);
/* Mainboard handler for eSPI SMIs */
void mainboard_smi_espi_handler(void);
#if IS_ENABLED(CONFIG_HAVE_SMI_HANDLER)
void smm_relocation_handler(int cpu, uintptr_t curr_smbase,

View File

@ -177,7 +177,8 @@ static u32 print_smi_status(u32 smi_sts)
[20] = "PCI_EXP_SMI",
[21] = "MONITOR",
[26] = "SPI",
[27] = "GPIO_UNLOCK"
[27] = "GPIO_UNLOCK",
[28] = "ESPI_SMI",
};
if (!smi_sts)

View File

@ -62,11 +62,12 @@ void southbridge_smm_enable_smi(void)
* - on APMC writes (io 0xb2)
* - on writes to SLP_EN (sleep states)
* - on writes to GBL_RLS (bios commands)
* - on eSPI events (does nothing on LPC systems)
* No SMIs:
* - on microcontroller writes (io 0x62/0x66)
* - on TCO events
*/
enable_smi(APMC_EN | SLP_SMI_EN | GBL_SMI_EN | EOS);
enable_smi(APMC_EN | SLP_SMI_EN | GBL_SMI_EN | ESPI_SMI_EN | EOS);
}
void southbridge_trigger_smi(void)

View File

@ -361,6 +361,12 @@ static void southbridge_smi_gpi(void)
gpi_clear_get_smi_status(&smi_sts);
}
void __attribute__((weak)) mainboard_smi_espi_handler(void) { }
static void southbridge_smi_espi(void)
{
mainboard_smi_espi_handler();
}
static void southbridge_smi_mc(void)
{
u32 reg32 = inl(ACPI_BASE_ADDRESS + SMI_EN);
@ -482,6 +488,7 @@ static smi_handler_t southbridge_smi[SMI_STS_BITS] = {
[PM1_STS_BIT] = southbridge_smi_pm1,
[GPE0_STS_BIT] = southbridge_smi_gpe0,
[GPIO_STS_BIT] = southbridge_smi_gpi,
[ESPI_SMI_STS_BIT] = southbridge_smi_espi,
[MCSMI_STS_BIT] = southbridge_smi_mc,
[TCO_STS_BIT] = southbridge_smi_tco,
[PERIODIC_STS_BIT] = southbridge_smi_periodic,