diff options
Diffstat (limited to 'src/soc/intel/apollolake/pmutil.c')
-rw-r--r-- | src/soc/intel/apollolake/pmutil.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/soc/intel/apollolake/pmutil.c b/src/soc/intel/apollolake/pmutil.c index bebc1c7178..6e47911fcd 100644 --- a/src/soc/intel/apollolake/pmutil.c +++ b/src/soc/intel/apollolake/pmutil.c @@ -60,6 +60,7 @@ static uint32_t print_smi_status(uint32_t smi_sts) [SLP_SMI_STS] = "SLP_SMI", [APM_SMI_STS] = "APM", [SWSMI_TMR_SMI_STS] = "SWSMI_TMR", + [FAKE_PM1_SMI_STS] = "PM1", [GPIO_SMI_STS]= "GPIO_SMI", [GPIO_UNLOCK_SMI_STS]= "GPIO_UNLOCK_SSMI", [MC_SMI_STS] = "MCSMI", @@ -96,7 +97,23 @@ static uint32_t reset_smi_status(void) uint32_t clear_smi_status(void) { - return print_smi_status(reset_smi_status()); + uint32_t sts = reset_smi_status(); + + /* + * Check for power button status if nothing else is indicating an SMI + * and SMIs aren't turned into SCIs. Apparently, there is no PM1 status + * bit in the SMI status register. That makes things difficult for + * determining if the power button caused an SMI. + */ + if (sts == 0 && !(inl(ACPI_PMIO_BASE + PM1_CNT) & SCI_EN)) { + uint16_t pm1_sts = inw(ACPI_PMIO_BASE + PM1_STS); + + /* Fake PM1 status bit if power button pressed. */ + if (pm1_sts & PWRBTN_STS) + sts |= (1 << FAKE_PM1_SMI_STS); + } + + return print_smi_status(sts); } uint32_t get_smi_en(void) |