soc/amd/cezanne/smihandler: add ELOG and SMMSTORE support
Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: I6bad684bc6a36bb4a2b83d10ff9da1c136f8bbd9 Reviewed-on: https://review.coreboot.org/c/coreboot/+/51356 Reviewed-by: Raul Rangel <rrangel@chromium.org> Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com> Reviewed-by: Mathew King <mathewk@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
6890d935d8
commit
3680e02e9e
|
@ -11,6 +11,7 @@
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <cpu/x86/cache.h>
|
#include <cpu/x86/cache.h>
|
||||||
#include <cpu/x86/smm.h>
|
#include <cpu/x86/smm.h>
|
||||||
|
#include <elog.h>
|
||||||
#include <soc/smi.h>
|
#include <soc/smi.h>
|
||||||
#include <soc/smu.h>
|
#include <soc/smu.h>
|
||||||
#include <soc/southbridge.h>
|
#include <soc/southbridge.h>
|
||||||
|
@ -27,6 +28,14 @@ static void fch_apmc_smi_handler(void)
|
||||||
case APM_CNT_ACPI_DISABLE:
|
case APM_CNT_ACPI_DISABLE:
|
||||||
acpi_disable_sci();
|
acpi_disable_sci();
|
||||||
break;
|
break;
|
||||||
|
case APM_CNT_ELOG_GSMI:
|
||||||
|
if (CONFIG(ELOG_GSMI))
|
||||||
|
handle_smi_gsmi();
|
||||||
|
break;
|
||||||
|
case APM_CNT_SMMSTORE:
|
||||||
|
if (CONFIG(SMMSTORE))
|
||||||
|
handle_smi_store();
|
||||||
|
break;
|
||||||
case APM_CNT_SMMINFO:
|
case APM_CNT_SMMINFO:
|
||||||
psp_notify_smm();
|
psp_notify_smm();
|
||||||
break;
|
break;
|
||||||
|
@ -37,8 +46,8 @@ static void fch_apmc_smi_handler(void)
|
||||||
|
|
||||||
static void fch_slp_typ_handler(void)
|
static void fch_slp_typ_handler(void)
|
||||||
{
|
{
|
||||||
uint32_t pci_ctrl;
|
uint32_t pci_ctrl, reg32;
|
||||||
uint16_t pm1cnt;
|
uint16_t pm1cnt, reg16;
|
||||||
uint8_t slp_typ, rst_ctrl;
|
uint8_t slp_typ, rst_ctrl;
|
||||||
|
|
||||||
/* Figure out SLP_TYP */
|
/* Figure out SLP_TYP */
|
||||||
|
@ -82,6 +91,31 @@ static void fch_slp_typ_handler(void)
|
||||||
rst_ctrl |= SLPTYPE_CONTROL_EN;
|
rst_ctrl |= SLPTYPE_CONTROL_EN;
|
||||||
pm_write8(PM_RST_CTRL1, rst_ctrl);
|
pm_write8(PM_RST_CTRL1, rst_ctrl);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Before the final command, check if there's pending wake
|
||||||
|
* event. Read enable first, so that reading the actual status
|
||||||
|
* is as close as possible to entering S3. The idea is to
|
||||||
|
* minimize the opportunity for a wake event to happen before
|
||||||
|
* actually entering S3. If there's a pending wake event, log
|
||||||
|
* it and continue normal path. S3 will fail and the wake event
|
||||||
|
* becomes a SCI.
|
||||||
|
*/
|
||||||
|
if (CONFIG(ELOG_GSMI)) {
|
||||||
|
reg16 = acpi_read16(MMIO_ACPI_PM1_EN);
|
||||||
|
reg16 &= acpi_read16(MMIO_ACPI_PM1_STS);
|
||||||
|
if (reg16)
|
||||||
|
elog_add_extended_event(
|
||||||
|
ELOG_SLEEP_PENDING_PM1_WAKE,
|
||||||
|
(u32)reg16);
|
||||||
|
|
||||||
|
reg32 = acpi_read32(MMIO_ACPI_GPE0_EN);
|
||||||
|
reg32 &= acpi_read32(MMIO_ACPI_GPE0_STS);
|
||||||
|
if (reg32)
|
||||||
|
elog_add_extended_event(
|
||||||
|
ELOG_SLEEP_PENDING_GPE0_WAKE,
|
||||||
|
reg32);
|
||||||
|
} /* if (CONFIG(ELOG_GSMI)) */
|
||||||
|
|
||||||
if (slp_typ == ACPI_S3)
|
if (slp_typ == ACPI_S3)
|
||||||
psp_notify_sx_info(ACPI_S3);
|
psp_notify_sx_info(ACPI_S3);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue