summaryrefslogtreecommitdiff
path: root/src/soc/amd/stoneyridge/smihandler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/amd/stoneyridge/smihandler.c')
-rw-r--r--src/soc/amd/stoneyridge/smihandler.c84
1 files changed, 2 insertions, 82 deletions
diff --git a/src/soc/amd/stoneyridge/smihandler.c b/src/soc/amd/stoneyridge/smihandler.c
index 23951b2a58..2b0c85b60d 100644
--- a/src/soc/amd/stoneyridge/smihandler.c
+++ b/src/soc/amd/stoneyridge/smihandler.c
@@ -4,11 +4,9 @@
#include <console/console.h>
#include <cpu/x86/smm.h>
#include <cpu/x86/cache.h>
-#include <cpu/amd/amd64_save_state.h>
#include <acpi/acpi.h>
#include <arch/hlt.h>
#include <device/pci_def.h>
-#include <smmstore.h>
#include <soc/smi.h>
#include <soc/southbridge.h>
#include <amdblocks/acpimmio.h>
@@ -18,84 +16,6 @@
#include <elog.h>
#include <types.h>
-/* bits in smm_io_trap */
-#define SMM_IO_TRAP_PORT_OFFSET 16
-#define SMM_IO_TRAP_PORT_ADDRESS_MASK 0xffff
-#define SMM_IO_TRAP_RW (1 << 0)
-#define SMM_IO_TRAP_VALID (1 << 1)
-
-static inline u16 get_io_address(u32 info)
-{
- return ((info >> SMM_IO_TRAP_PORT_OFFSET) &
- SMM_IO_TRAP_PORT_ADDRESS_MASK);
-}
-
-static void *find_save_state(int cmd)
-{
- unsigned int core;
- amd64_smm_state_save_area_t *state;
- u32 smm_io_trap;
- u8 reg_al;
-
- /* 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;
- /* Check for Valid IO Trap Word (bit1==1) */
- if (!(smm_io_trap & SMM_IO_TRAP_VALID))
- continue;
- /* Make sure it was a write (bit0==0) */
- if (smm_io_trap & SMM_IO_TRAP_RW)
- continue;
- /* Check for APMC IO port */
- if (pm_acpi_smi_cmd_port() != get_io_address(smm_io_trap))
- continue;
- /* Check AL against the requested command */
- reg_al = state->rax;
- if (reg_al == cmd)
- return state;
- }
- 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;
- amd64_smm_state_save_area_t *io_smi;
- u32 reg_ebx;
-
- io_smi = find_save_state(APM_CNT_SMMSTORE);
- 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/smmstore/smi.c */
- io_smi->rax = smmstore_exec(sub_command, (void *)reg_ebx);
-}
-
static void fch_apmc_smi_handler(void)
{
const uint8_t cmd = inb(pm_acpi_smi_cmd_port());
@@ -109,11 +29,11 @@ static void fch_apmc_smi_handler(void)
break;
case APM_CNT_ELOG_GSMI:
if (CONFIG(ELOG_GSMI))
- southbridge_smi_gsmi();
+ handle_smi_gsmi();
break;
case APM_CNT_SMMSTORE:
if (CONFIG(SMMSTORE))
- southbridge_smi_store();
+ handle_smi_store();
break;
}