Kyösti Mälkki has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/49248 )
Change subject: [WIP] cpu/x86/smm: Use common APMC logging ......................................................................
[WIP] cpu/x86/smm: Use common APMC logging
Change-Id: I34eeb41d929bfb18730ac821a63bde95ef9a0b3e Signed-off-by: Kyösti Mälkki kyosti.malkki@gmail.com --- M src/cpu/x86/smm/Makefile.inc M src/cpu/x86/smm/smi_trigger.c M src/include/cpu/x86/smm.h M src/mainboard/dell/optiplex_9010/smihandler.c M src/mainboard/google/butterfly/smihandler.c M src/mainboard/google/parrot/smihandler.c M src/mainboard/lenovo/s230u/smihandler.c M src/soc/intel/baytrail/smihandler.c M src/soc/intel/braswell/smihandler.c M src/soc/intel/broadwell/pch/smihandler.c M src/soc/intel/common/block/smm/smihandler.c M src/soc/intel/denverton_ns/smihandler.c M src/southbridge/intel/common/smihandler.c M src/southbridge/intel/i82801dx/smihandler.c M src/southbridge/intel/lynxpoint/smihandler.c 15 files changed, 36 insertions(+), 74 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/48/49248/1
diff --git a/src/cpu/x86/smm/Makefile.inc b/src/cpu/x86/smm/Makefile.inc index 1ed018d..9d74558 100644 --- a/src/cpu/x86/smm/Makefile.inc +++ b/src/cpu/x86/smm/Makefile.inc @@ -33,6 +33,7 @@ endif
smm-y += save_state.c +smm-y += smi_trigger.c
ifeq ($(CONFIG_SMM_TSEG),y)
diff --git a/src/cpu/x86/smm/smi_trigger.c b/src/cpu/x86/smm/smi_trigger.c index 7e3ddb1..00d5371 100644 --- a/src/cpu/x86/smm/smi_trigger.c +++ b/src/cpu/x86/smm/smi_trigger.c @@ -4,24 +4,23 @@ #include <console/console.h> #include <cpu/x86/smm.h>
-int apm_control(u8 cmd) +static void apmc_log(const char *fn, u8 cmd) { - if (!CONFIG(HAVE_SMI_HANDLER)) - return -1; - switch (cmd) { case APM_CNT_CST_CONTROL: + printk(BIOS_DEBUG, "%s: C-state control.\n", fn); break; case APM_CNT_PST_CONTROL: + printk(BIOS_DEBUG, "%s: P-state control.\n", fn); break; case APM_CNT_ACPI_DISABLE: - printk(BIOS_DEBUG, "Disabling ACPI via APMC.\n"); + printk(BIOS_DEBUG, "%s: Disabling ACPI.\n", fn); break; case APM_CNT_ACPI_ENABLE: - printk(BIOS_DEBUG, "Enabling ACPI via APMC.\n"); + printk(BIOS_DEBUG, "%s: Enabling ACPI.\n", fn); break; case APM_CNT_FINALIZE: - printk(BIOS_DEBUG, "Finalizing SMM.\n"); + printk(BIOS_DEBUG, "%s: Finalizing SMM.\n", fn); break; case APM_CNT_ELOG_GSMI: break; @@ -32,6 +31,15 @@ default: break; } +} + +int apm_control(u8 cmd) +{ + /* Never proceed inside SMI handler or without one. */ + if (ENV_SMM || !CONFIG(HAVE_SMI_HANDLER)) + return -1; + + apmc_log(__func__, cmd);
/* Now raise the SMI. */ outb(cmd, APM_CNT); @@ -39,3 +47,12 @@ printk(BIOS_DEBUG, "APMC done.\n"); return 0; } + +u8 apm_get_apmc(void) +{ + /* Emulate B2 register as the FADT / Linux expects it */ + u8 cmd = inb(APM_CNT); + + apmc_log("SMI: ", cmd); + return cmd; +} diff --git a/src/include/cpu/x86/smm.h b/src/include/cpu/x86/smm.h index 9106842..31827cf 100644 --- a/src/include/cpu/x86/smm.h +++ b/src/include/cpu/x86/smm.h @@ -33,6 +33,7 @@
/* Send cmd to APM_CNT with HAVE_SMI_HANDLER checking. */ int apm_control(u8 cmd); +u8 apm_get_apmc(void);
void io_trap_handler(int smif); int southbridge_io_trap_handler(int smif); diff --git a/src/mainboard/dell/optiplex_9010/smihandler.c b/src/mainboard/dell/optiplex_9010/smihandler.c index d3c83ef..f3ba57c 100644 --- a/src/mainboard/dell/optiplex_9010/smihandler.c +++ b/src/mainboard/dell/optiplex_9010/smihandler.c @@ -16,7 +16,6 @@ u8 val; switch (data) { case APM_CNT_ACPI_ENABLE: - printk(BIOS_SPEW, "%s: APM CNT EN: %02x\n", __func__, data); /* Enable wake on PS2 */ val = inb(SCH5545_RUNTIME_REG_BASE + SCH5545_RR_PME_EN1); val |= (SCH5545_KBD_PME_EN | SCH5545_MOUSE_PME_EN); @@ -26,7 +25,6 @@ outb(SCH5545_GLOBAL_PME_EN, SCH5545_RUNTIME_REG_BASE + SCH5545_RR_PME_EN); break; case APM_CNT_ACPI_DISABLE: - printk(BIOS_SPEW, "%s: APM CNT DIS: %02x\n", __func__, data); /* Disable wake on PS2 */ val = inb(SCH5545_RUNTIME_REG_BASE + SCH5545_RR_PME_EN1); val &= ~(SCH5545_KBD_PME_EN | SCH5545_MOUSE_PME_EN); diff --git a/src/mainboard/google/butterfly/smihandler.c b/src/mainboard/google/butterfly/smihandler.c index d71d9bf..0ffa0e6 100644 --- a/src/mainboard/google/butterfly/smihandler.c +++ b/src/mainboard/google/butterfly/smihandler.c @@ -36,16 +36,13 @@
int mainboard_smi_apmc(u8 apmc) { - printk(BIOS_DEBUG, "mainboard_smi_apmc: %x\n", apmc); switch (apmc) { case APM_CNT_ACPI_ENABLE: - printk(BIOS_DEBUG, "APMC: ACPI_EN\n"); /* Clear all pending events and enable SCI */ ec_write_cmd(EC_CMD_ENABLE_ACPI_MODE); break;
case APM_CNT_ACPI_DISABLE: - printk(BIOS_DEBUG, "APMC: ACPI_DIS\n"); /* Clear all pending events and tell the EC that ACPI is disabled */ ec_write_cmd(EC_CMD_DISABLE_ACPI_MODE); break; diff --git a/src/mainboard/google/parrot/smihandler.c b/src/mainboard/google/parrot/smihandler.c index 22e372d..89d4cac 100644 --- a/src/mainboard/google/parrot/smihandler.c +++ b/src/mainboard/google/parrot/smihandler.c @@ -67,10 +67,8 @@
int mainboard_smi_apmc(u8 apmc) { - printk(BIOS_DEBUG, "mainboard_smi_apmc: %x\n", apmc); switch (apmc) { case APM_CNT_ACPI_ENABLE: - printk(BIOS_DEBUG, "APMC: ACPI_EN\n"); /* Clear all pending events */ /* EC cmd:59 data:E8 */ ec_kbc_write_cmd(0x59); @@ -80,7 +78,6 @@ gpi_route_interrupt(EC_LID_GPI, GPI_IS_SCI); break; case APM_CNT_ACPI_DISABLE: - printk(BIOS_DEBUG, "APMC: ACPI_DIS\n"); /* Clear all pending events */ /* EC cmd:59 data:e9 */ ec_kbc_write_cmd(0x59); diff --git a/src/mainboard/lenovo/s230u/smihandler.c b/src/mainboard/lenovo/s230u/smihandler.c index 62bba44..f5fb9b4 100644 --- a/src/mainboard/lenovo/s230u/smihandler.c +++ b/src/mainboard/lenovo/s230u/smihandler.c @@ -74,18 +74,14 @@
int mainboard_smi_apmc(u8 data) { - printk(BIOS_INFO, "mainboard_smi_apmc(%02x)\n", data); - switch (data) { case APM_CNT_ACPI_ENABLE: - printk(BIOS_DEBUG, "Enable ACPI mode\n"); ec_enter_acpi_mode(); gpi_route_interrupt(GPE_EC_SCI, GPI_IS_SCI); gpi_route_interrupt(GPE_PALMDET1, GPI_IS_SCI); gpi_route_interrupt(GPE_PALMDET2, GPI_IS_SCI); break; case APM_CNT_ACPI_DISABLE: - printk(BIOS_DEBUG, "Disable ACPI mode\n"); ec_enter_apm_mode(); gpi_route_interrupt(GPE_EC_SCI, GPI_IS_SMI); break; diff --git a/src/soc/intel/baytrail/smihandler.c b/src/soc/intel/baytrail/smihandler.c index 6fedba7..1a33444 100644 --- a/src/soc/intel/baytrail/smihandler.c +++ b/src/soc/intel/baytrail/smihandler.c @@ -281,9 +281,7 @@ { uint8_t reg8;
- /* Emulate B2 register as the FADT / Linux expects it */ - - reg8 = inb(APM_CNT); + reg8 = apm_get_apmc(); switch (reg8) { case APM_CNT_CST_CONTROL: /* @@ -291,7 +289,6 @@ * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: /* @@ -299,15 +296,12 @@ * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: disable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: enable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; case APM_CNT_ELOG_GSMI: if (CONFIG(ELOG_GSMI)) diff --git a/src/soc/intel/braswell/smihandler.c b/src/soc/intel/braswell/smihandler.c index a4fdb01..7343d47 100644 --- a/src/soc/intel/braswell/smihandler.c +++ b/src/soc/intel/braswell/smihandler.c @@ -260,9 +260,7 @@ { uint8_t reg8;
- /* Emulate B2 register as the FADT / Linux expects it */ - - reg8 = inb(APM_CNT); + reg8 = apm_get_apmc(); switch (reg8) { case APM_CNT_CST_CONTROL: /* @@ -270,7 +268,6 @@ * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: /* @@ -278,15 +275,12 @@ * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: disable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: enable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; case APM_CNT_ELOG_GSMI: if (CONFIG(ELOG_GSMI)) diff --git a/src/soc/intel/broadwell/pch/smihandler.c b/src/soc/intel/broadwell/pch/smihandler.c index 5ed52d8..02c795e 100644 --- a/src/soc/intel/broadwell/pch/smihandler.c +++ b/src/soc/intel/broadwell/pch/smihandler.c @@ -312,23 +312,17 @@ { u8 reg8;
- /* Emulate B2 register as the FADT / Linux expects it */ - - reg8 = inb(APM_CNT); + reg8 = apm_get_apmc(); switch (reg8) { case APM_CNT_CST_CONTROL: - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: disable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: enable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; case APM_CNT_ELOG_GSMI: if (CONFIG(ELOG_GSMI)) diff --git a/src/soc/intel/common/block/smm/smihandler.c b/src/soc/intel/common/block/smm/smihandler.c index 51a3003..79605ce 100644 --- a/src/soc/intel/common/block/smm/smihandler.c +++ b/src/soc/intel/common/block/smm/smihandler.c @@ -331,9 +331,10 @@ { uint8_t reg8;
- /* Emulate B2 register as the FADT / Linux expects it */ + reg8 = apm_get_apmc();
- reg8 = inb(APM_CNT); + apmc_log(__func__, reg8); + switch (reg8) { case APM_CNT_CST_CONTROL: /* @@ -341,7 +342,6 @@ * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: /* @@ -349,15 +349,12 @@ * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: pmc_disable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: pmc_enable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; case APM_CNT_ELOG_GSMI: if (CONFIG(ELOG_GSMI)) diff --git a/src/soc/intel/denverton_ns/smihandler.c b/src/soc/intel/denverton_ns/smihandler.c index ae15795..f00d921 100644 --- a/src/soc/intel/denverton_ns/smihandler.c +++ b/src/soc/intel/denverton_ns/smihandler.c @@ -220,31 +220,25 @@ { uint8_t reg8;
- /* Emulate B2 register as the FADT / Linux expects it */ - - reg8 = inb(APM_CNT); + reg8 = apm_get_apmc(); switch (reg8) { case APM_CNT_CST_CONTROL: /* Calling this function seems to cause * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: /* Calling this function seems to cause * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: disable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: enable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; case APM_CNT_FINALIZE: finalize(); diff --git a/src/southbridge/intel/common/smihandler.c b/src/southbridge/intel/common/smihandler.c index d59e29c..7256497 100644 --- a/src/southbridge/intel/common/smihandler.c +++ b/src/southbridge/intel/common/smihandler.c @@ -274,31 +274,25 @@ { u8 reg8;
- /* Emulate B2 register as the FADT / Linux expects it */ - - reg8 = inb(APM_CNT); + reg8 = apm_get_apmc(); switch (reg8) { case APM_CNT_CST_CONTROL: /* Calling this function seems to cause * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: /* Calling this function seems to cause * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: write_pmbase32(PM1_CNT, read_pmbase32(PM1_CNT) & ~SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: write_pmbase32(PM1_CNT, read_pmbase32(PM1_CNT) | SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; case APM_CNT_FINALIZE: if (mainboard_finalized) { diff --git a/src/southbridge/intel/i82801dx/smihandler.c b/src/southbridge/intel/i82801dx/smihandler.c index 19fe5bb..bb50eaa 100644 --- a/src/southbridge/intel/i82801dx/smihandler.c +++ b/src/southbridge/intel/i82801dx/smihandler.c @@ -297,35 +297,29 @@ u32 pmctrl; u8 reg8;
- /* Emulate B2 register as the FADT / Linux expects it */ - - reg8 = inb(APM_CNT); + reg8 = apm_get_apmc(); switch (reg8) { case APM_CNT_CST_CONTROL: /* Calling this function seems to cause * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: /* Calling this function seems to cause * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: pmctrl = inl(pmbase + PM1_CNT); pmctrl &= ~SCI_EN; outl(pmctrl, pmbase + PM1_CNT); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: pmctrl = inl(pmbase + PM1_CNT); pmctrl |= SCI_EN; outl(pmctrl, pmbase + PM1_CNT); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; default: printk(BIOS_DEBUG, "SMI#: Unknown function APM_CNT=%02x\n", reg8); diff --git a/src/southbridge/intel/lynxpoint/smihandler.c b/src/southbridge/intel/lynxpoint/smihandler.c index bd44500..c923f68 100644 --- a/src/southbridge/intel/lynxpoint/smihandler.c +++ b/src/southbridge/intel/lynxpoint/smihandler.c @@ -262,9 +262,7 @@ u8 reg8; static int chipset_finalized = 0;
- /* Emulate B2 register as the FADT / Linux expects it */ - - reg8 = inb(APM_CNT); + reg8 = apm_get_apmc(); switch (reg8) { case APM_CNT_FINALIZE: if (chipset_finalized) { @@ -284,22 +282,18 @@ * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "C-state control\n"); break; case APM_CNT_PST_CONTROL: /* Calling this function seems to cause * some kind of race condition in Linux * and causes a kernel oops */ - printk(BIOS_DEBUG, "P-state control\n"); break; case APM_CNT_ACPI_DISABLE: disable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n"); break; case APM_CNT_ACPI_ENABLE: enable_pm1_control(SCI_EN); - printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n"); break; case APM_CNT_ROUTE_ALL_XHCI: usb_xhci_route_all();