Arthur Heymans has uploaded this change for review.

View Change

soc/amd/stoneyridge: Use common SMM save state ops

Change-Id: I2f98062dd254528c0c72e8739035c9e620a8497f
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
---
M src/soc/amd/stoneyridge/smihandler.c
1 file changed, 24 insertions(+), 15 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/18/37018/1
diff --git a/src/soc/amd/stoneyridge/smihandler.c b/src/soc/amd/stoneyridge/smihandler.c
index 2b88397..d2945c8 100644
--- a/src/soc/amd/stoneyridge/smihandler.c
+++ b/src/soc/amd/stoneyridge/smihandler.c
@@ -19,7 +19,6 @@
#include <console/console.h>
#include <cpu/x86/smm.h>
#include <cpu/x86/cache.h>
-#include <cpu/amd/amd64_save_state.h>
#include <arch/acpi.h>
#include <arch/hlt.h>
#include <device/pci_def.h>
@@ -41,17 +40,18 @@
SMM_IO_TRAP_PORT_ADDRESS_MASK);
}

-static void *find_save_state(int cmd)
+static int find_save_state_node(int cmd)
{
int core;
- amd64_smm_state_save_area_t *state;
+ const struct smm_save_state_ops *ops = get_save_state_ops();
u32 smm_io_trap;
u8 reg_al;
+ u64 rax;

/* Check all nodes looking for the one that issued the IO */
for (core = 0; core < CONFIG_MAX_CPUS; core++) {
- state = smm_get_save_state(core);
- smm_io_trap = state->smm_io_trap_offset;
+ if (ops->get_io_trap(core, &smm_io_trap))
+ continue;
/* Check for Valid IO Trap Word (bit1==1) */
if (!(smm_io_trap & SMM_IO_TRAP_VALID))
continue;
@@ -62,30 +62,39 @@
if (pm_acpi_smi_cmd_port() != get_io_address(smm_io_trap))
continue;
/* Check AL against the requested command */
- reg_al = state->rax;
+ if (ops->get_reg(core, RAX, &rax))
+ continue;
+ reg_al = rax;
if (reg_al == cmd)
- return state;
+ return core;
}
- return NULL;
+ return -1;
}

static void southbridge_smi_gsmi(void)
{
+ u32 ret, param;
u8 sub_command;
- amd64_smm_state_save_area_t *io_smi;
- u32 reg_ebx;
+ int node = find_save_state_node(APM_CNT_ELOG_GSMI);
+ const struct smm_save_state_ops *ops = get_save_state_ops();

- io_smi = find_save_state(APM_CNT_ELOG_GSMI);
- if (!io_smi)
+ if (node < -1)
return;
+
/* Command and return value in EAX */
- sub_command = (io_smi->rax >> 8) & 0xff;
+ uint64_t reg;
+ if (ops->get_reg(node, RAX, &reg))
+ return;
+ sub_command = (u8)(reg >> 8);

/* Parameter buffer in EBX */
- reg_ebx = io_smi->rbx;
+ if (ops->get_reg(node, RBX, &reg))
+ return;
+ param = reg & UINT32_MAX;

/* drivers/elog/gsmi.c */
- io_smi->rax = gsmi_exec(sub_command, &reg_ebx);
+ ret = gsmi_exec(sub_command, (u32 *)param);
+ ops->set_reg(node, RAX, reg);
}

static void sb_apmc_smi_handler(void)

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

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I2f98062dd254528c0c72e8739035c9e620a8497f
Gerrit-Change-Number: 37018
Gerrit-PatchSet: 1
Gerrit-Owner: Arthur Heymans <arthur@aheymans.xyz>
Gerrit-MessageType: newchange