Arthur Heymans has uploaded this change for review.

View Change

cpu/x86: Move SMI GSMI calls entry to a common place

Now that SMM save states are handled in a common place so can the GSMI
calls entry.

Change-Id: I93639d8d0fde2e874eb9b963c449be1b754ca63d
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
---
M src/drivers/elog/gsmi.c
M src/include/elog.h
M src/soc/amd/picasso/smihandler.c
M src/soc/amd/stoneyridge/smihandler.c
M src/soc/intel/baytrail/smihandler.c
M src/soc/intel/braswell/smihandler.c
M src/soc/intel/broadwell/smihandler.c
M src/soc/intel/common/block/smm/smihandler.c
M src/southbridge/intel/common/smihandler.c
M src/southbridge/intel/lynxpoint/smihandler.c
10 files changed, 37 insertions(+), 194 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/74/45474/1
diff --git a/src/drivers/elog/gsmi.c b/src/drivers/elog/gsmi.c
index ebdde19..128f4a7 100644
--- a/src/drivers/elog/gsmi.c
+++ b/src/drivers/elog/gsmi.c
@@ -2,6 +2,7 @@

#include <console/console.h>
#include <elog.h>
+#include <cpu/x86/save_state.h>

#define GSMI_RET_SUCCESS 0x00
#define GSMI_RET_INVALID_PARAMETER 0x82
@@ -43,7 +44,7 @@
}

/* Param is usually EBX, ret in EAX */
-u32 gsmi_exec(u8 command, u32 *param)
+static u32 gsmi_exec(u8 command, u32 *param)
{
struct gsmi_set_eventlog_param *sel;
struct gsmi_set_eventlog_type1 *type1;
@@ -121,3 +122,28 @@

return ret;
}
+
+void apmc_smi_gsmi(void)
+{
+ u8 sub_command;
+ u16 ax;
+ u32 ret, param;
+ const int apmc_node = get_apmc_node(APM_CNT_ELOG_GSMI);
+
+ if (apmc_node < 0)
+ return;
+
+ /* Command and return value in EAX */
+ if (get_save_state_reg(RAX, apmc_node, &ax, sizeof(ax)))
+ return;
+
+ sub_command = (ax >> 8);
+
+ /* Parameter buffer in EBX */
+ if (get_save_state_reg(RBX, apmc_node, &param, sizeof(param)))
+ return;
+
+ ret = gsmi_exec(sub_command, &param);
+ set_save_state_reg(RAX, apmc_node, &ret, sizeof(ret));
+}
+
diff --git a/src/include/elog.h b/src/include/elog.h
index 6c2c531..89195c5 100644
--- a/src/include/elog.h
+++ b/src/include/elog.h
@@ -248,7 +248,8 @@
static inline int elog_gsmi_add_event_word(u8 event_type, u16 data) { return 0; }
#endif

-extern u32 gsmi_exec(u8 command, u32 *param);
+void apmc_smi_gsmi(void);
+//extern u32 gsmi_exec(u8 command, u32 *param);

#if CONFIG(ELOG_BOOT_COUNT)
u32 boot_count_read(void);
diff --git a/src/soc/amd/picasso/smihandler.c b/src/soc/amd/picasso/smihandler.c
index 7e762a9..89df86f 100644
--- a/src/soc/amd/picasso/smihandler.c
+++ b/src/soc/amd/picasso/smihandler.c
@@ -57,25 +57,6 @@
return NULL;
}

-static void southbridge_smi_gsmi(void)
-{
- u8 sub_command;
- amd64_smm_state_save_area_t *io_smi;
- u32 reg_ebx;
-
- io_smi = find_save_state(APM_CNT_ELOG_GSMI);
- if (!io_smi)
- return;
- /* Command and return value in EAX */
- sub_command = (io_smi->rax >> 8) & 0xff;
-
- /* Parameter buffer in EBX */
- reg_ebx = io_smi->rbx;
-
- /* drivers/elog/gsmi.c */
- io_smi->rax = gsmi_exec(sub_command, &reg_ebx);
-}
-
static void southbridge_smi_store(void)
{
u8 sub_command;
@@ -108,7 +89,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ apmc_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))
diff --git a/src/soc/amd/stoneyridge/smihandler.c b/src/soc/amd/stoneyridge/smihandler.c
index be55458..d55c545 100644
--- a/src/soc/amd/stoneyridge/smihandler.c
+++ b/src/soc/amd/stoneyridge/smihandler.c
@@ -55,25 +55,6 @@
return NULL;
}

-static void southbridge_smi_gsmi(void)
-{
- u8 sub_command;
- amd64_smm_state_save_area_t *io_smi;
- u32 reg_ebx;
-
- io_smi = find_save_state(APM_CNT_ELOG_GSMI);
- if (!io_smi)
- return;
- /* Command and return value in EAX */
- sub_command = (io_smi->rax >> 8) & 0xff;
-
- /* Parameter buffer in EBX */
- reg_ebx = io_smi->rbx;
-
- /* drivers/elog/gsmi.c */
- io_smi->rax = gsmi_exec(sub_command, &reg_ebx);
-}
-
static void southbridge_smi_store(void)
{
u8 sub_command;
@@ -106,7 +87,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ apmc_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))
diff --git a/src/soc/intel/baytrail/smihandler.c b/src/soc/intel/baytrail/smihandler.c
index 6f3f07e..bfe933f 100644
--- a/src/soc/intel/baytrail/smihandler.c
+++ b/src/soc/intel/baytrail/smihandler.c
@@ -186,26 +186,6 @@
return NULL;
}

-static void southbridge_smi_gsmi(void)
-{
- u32 *ret, *param;
- uint8_t sub_command;
- em64t100_smm_state_save_area_t *io_smi = smi_apmc_find_state_save(APM_CNT_ELOG_GSMI);
-
- if (!io_smi)
- return;
-
- /* Command and return value in EAX */
- ret = (u32 *)&io_smi->rax;
- sub_command = (uint8_t)(*ret >> 8);
-
- /* Parameter buffer in EBX */
- param = (u32 *)&io_smi->rbx;
-
- /* drivers/elog/gsmi.c */
- *ret = gsmi_exec(sub_command, param);
-}
-
/*
* soc_legacy: A payload (Depthcharge) has indicated that the
* legacy payload (SeaBIOS) is being loaded. Switch devices that are
@@ -327,7 +307,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ apmc_smi_gsmi();
break;
case APM_CNT_LEGACY:
soc_legacy();
diff --git a/src/soc/intel/braswell/smihandler.c b/src/soc/intel/braswell/smihandler.c
index a2c26c11..f6ac703 100644
--- a/src/soc/intel/braswell/smihandler.c
+++ b/src/soc/intel/braswell/smihandler.c
@@ -220,26 +220,6 @@
return NULL;
}

-static void southbridge_smi_gsmi(void)
-{
- u32 *ret, *param;
- uint8_t sub_command;
- em64t100_smm_state_save_area_t *io_smi = smi_apmc_find_state_save(APM_CNT_ELOG_GSMI);
-
- if (!io_smi)
- return;
-
- /* Command and return value in EAX */
- ret = (u32 *)&io_smi->rax;
- sub_command = (uint8_t)(*ret >> 8);
-
- /* Parameter buffer in EBX */
- param = (u32 *)&io_smi->rbx;
-
- /* drivers/elog/gsmi.c */
- *ret = gsmi_exec(sub_command, param);
-}
-
static void southbridge_smi_store(void)
{
u8 sub_command, ret;
@@ -307,7 +287,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ apmc_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))
diff --git a/src/soc/intel/broadwell/smihandler.c b/src/soc/intel/broadwell/smihandler.c
index 86be400..ea5bf8a 100644
--- a/src/soc/intel/broadwell/smihandler.c
+++ b/src/soc/intel/broadwell/smihandler.c
@@ -267,27 +267,6 @@
return NULL;
}

-static void southbridge_smi_gsmi(void)
-{
- u32 *ret, *param;
- u8 sub_command;
- em64t101_smm_state_save_area_t *io_smi =
- smi_apmc_find_state_save(APM_CNT_ELOG_GSMI);
-
- if (!io_smi)
- return;
-
- /* Command and return value in EAX */
- ret = (u32 *)&io_smi->rax;
- sub_command = (u8)(*ret >> 8);
-
- /* Parameter buffer in EBX */
- param = (u32 *)&io_smi->rbx;
-
- /* drivers/elog/gsmi.c */
- *ret = gsmi_exec(sub_command, param);
-}
-
static void southbridge_smi_store(void)
{
u8 sub_command, ret;
@@ -347,7 +326,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ apmc_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))
diff --git a/src/soc/intel/common/block/smm/smihandler.c b/src/soc/intel/common/block/smm/smihandler.c
index 7bd17c3..77eaad9 100644
--- a/src/soc/intel/common/block/smm/smihandler.c
+++ b/src/soc/intel/common/block/smm/smihandler.c
@@ -266,49 +266,6 @@
}
}

-static void southbridge_smi_gsmi(
- const struct smm_save_state_ops *save_state_ops)
-{
- u8 sub_command, ret;
- void *io_smi = NULL;
- uint32_t reg_ebx;
-
- io_smi = find_save_state(save_state_ops, APM_CNT_ELOG_GSMI);
- if (!io_smi)
- return;
- /* Command and return value in EAX */
- sub_command = (save_state_ops->get_reg(io_smi, RAX) >> 8)
- & 0xff;
-
- /* Parameter buffer in EBX */
- reg_ebx = save_state_ops->get_reg(io_smi, RBX);
-
- /* drivers/elog/gsmi.c */
- ret = gsmi_exec(sub_command, &reg_ebx);
- save_state_ops->set_reg(io_smi, RAX, ret);
-}
-
-static void southbridge_smi_store(
- const struct smm_save_state_ops *save_state_ops)
-{
- u8 sub_command, ret;
- void *io_smi;
- uint32_t reg_ebx;
-
- io_smi = find_save_state(save_state_ops, APM_CNT_SMMSTORE);
- if (!io_smi)
- return;
- /* Command and return value in EAX */
- sub_command = (save_state_ops->get_reg(io_smi, RAX) >> 8) & 0xff;
-
- /* Parameter buffer in EBX */
- reg_ebx = save_state_ops->get_reg(io_smi, RBX);
-
- /* drivers/smmstore/smi.c */
- ret = smmstore_exec(sub_command, (void *)reg_ebx);
- save_state_ops->set_reg(io_smi, RAX, ret);
-}
-
static void finalize(void)
{
static int finalize_done;
@@ -379,7 +336,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi(save_state_ops);
+ apmc_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))
diff --git a/src/southbridge/intel/common/smihandler.c b/src/southbridge/intel/common/smihandler.c
index 49e306f..3ce4ba8 100644
--- a/src/southbridge/intel/common/smihandler.c
+++ b/src/southbridge/intel/common/smihandler.c
@@ -230,27 +230,6 @@
return NULL;
}

-static void southbridge_smi_gsmi(void)
-{
- u32 *ret, *param;
- u8 sub_command;
- em64t101_smm_state_save_area_t *io_smi =
- smi_apmc_find_state_save(APM_CNT_ELOG_GSMI);
-
- if (!io_smi)
- return;
-
- /* Command and return value in EAX */
- ret = (u32*)&io_smi->rax;
- sub_command = (u8)(*ret >> 8);
-
- /* Parameter buffer in EBX */
- param = (u32*)&io_smi->rbx;
-
- /* drivers/elog/gsmi.c */
- *ret = gsmi_exec(sub_command, param);
-}
-
static void southbridge_smi_store(void)
{
u8 sub_command, ret;
@@ -322,7 +301,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ apmc_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))
diff --git a/src/southbridge/intel/lynxpoint/smihandler.c b/src/southbridge/intel/lynxpoint/smihandler.c
index e4ebffd..9464904 100644
--- a/src/southbridge/intel/lynxpoint/smihandler.c
+++ b/src/southbridge/intel/lynxpoint/smihandler.c
@@ -218,27 +218,6 @@
return NULL;
}

-static void southbridge_smi_gsmi(void)
-{
- u32 *ret, *param;
- u8 sub_command;
- em64t101_smm_state_save_area_t *io_smi =
- smi_apmc_find_state_save(APM_CNT_ELOG_GSMI);
-
- if (!io_smi)
- return;
-
- /* Command and return value in EAX */
- ret = (u32*)&io_smi->rax;
- sub_command = (u8)(*ret >> 8);
-
- /* Parameter buffer in EBX */
- param = (u32*)&io_smi->rbx;
-
- /* drivers/elog/gsmi.c */
- *ret = gsmi_exec(sub_command, param);
-}
-
static void southbridge_smi_store(void)
{
u8 sub_command, ret;
@@ -323,7 +302,7 @@
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ apmc_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))

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

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I93639d8d0fde2e874eb9b963c449be1b754ca63d
Gerrit-Change-Number: 45474
Gerrit-PatchSet: 1
Gerrit-Owner: Arthur Heymans <arthur@aheymans.xyz>
Gerrit-Reviewer: Patrick Rudolph <siro@das-labor.org>
Gerrit-MessageType: newchange