Kyösti Mälkki has uploaded this change for review.

View Change

[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();

To view, visit change 49248. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I34eeb41d929bfb18730ac821a63bde95ef9a0b3e
Gerrit-Change-Number: 49248
Gerrit-PatchSet: 1
Gerrit-Owner: Kyösti Mälkki <kyosti.malkki@gmail.com>
Gerrit-MessageType: newchange