soc/amd: move southbridge_smi_handler to common code

Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Change-Id: I650498321736eee3d33af51216eda1b650f11744
Reviewed-on: https://review.coreboot.org/c/coreboot/+/50463
Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Reviewed-by: Martin Roth <martinroth@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Felix Held 2021-02-10 03:29:48 +01:00 committed by Martin Roth
parent bc134812c3
commit a3a66b6e68
6 changed files with 59 additions and 90 deletions

View File

@ -1,7 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <cpu/x86/smm.h>
#include <amdblocks/smm.h>
void southbridge_smi_handler(void)
void *get_smi_source_handler(int source)
{
return NULL;
}

View File

@ -1,5 +1,6 @@
ifeq ($(CONFIG_SOC_AMD_COMMON_BLOCK_SMM),y)
ramstage-y += smm_relocate.c
smm-y += smi_handler.c
endif # CONFIG_SOC_AMD_COMMON_BLOCK_SMM

View File

@ -0,0 +1,50 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <amdblocks/acpimmio.h>
#include <amdblocks/smi.h>
#include <amdblocks/smm.h>
#include <cpu/x86/smm.h>
#include <soc/smi.h>
static void process_smi_sources(uint32_t reg)
{
const uint32_t status = smi_read32(reg);
int bit_zero = 32 / sizeof(uint32_t) * (reg - SMI_REG_SMISTS0);
void (*source_handler)(void);
int i;
for (i = 0 ; i < 32 ; i++) {
if (status & (1 << i)) {
source_handler = get_smi_source_handler(i + bit_zero);
if (source_handler)
source_handler();
}
}
if (reg == SMI_REG_SMISTS0)
if (status & GEVENT_MASK)
/* Gevent[23:0] are assumed to be mainboard-specific */
mainboard_smi_gpi(status & GEVENT_MASK);
/* Clear all events in this register */
smi_write32(reg, status);
}
void southbridge_smi_handler(void)
{
const uint16_t smi_src = smi_read16(SMI_REG_POINTER);
if (smi_src & SMI_STATUS_SRC_SCI)
/* Clear events to prevent re-entering SMI if event isn't handled */
clear_smi_sci_status();
if (smi_src & SMI_STATUS_SRC_0)
process_smi_sources(SMI_REG_SMISTS0);
if (smi_src & SMI_STATUS_SRC_1)
process_smi_sources(SMI_REG_SMISTS1);
if (smi_src & SMI_STATUS_SRC_2)
process_smi_sources(SMI_REG_SMISTS2);
if (smi_src & SMI_STATUS_SRC_3)
process_smi_sources(SMI_REG_SMISTS3);
if (smi_src & SMI_STATUS_SRC_4)
process_smi_sources(SMI_REG_SMISTS4);
}

View File

@ -10,3 +10,4 @@ struct smm_relocation_params {
void get_smm_info(uintptr_t *perm_smbase, size_t *perm_smsize, size_t *smm_save_state_size);
void smm_relocation_handler(int cpu, uintptr_t curr_smbase, uintptr_t staggered_smbase);
void *get_smi_source_handler(int source);

View File

@ -15,6 +15,7 @@
#include <amdblocks/acpi.h>
#include <amdblocks/psp.h>
#include <amdblocks/smi.h>
#include <amdblocks/smm.h>
#include <elog.h>
#include <soc/smu.h>
@ -222,7 +223,7 @@ static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SLP_TYP, .handler = sb_slp_typ_handler},
};
static void *get_source_handler(int source)
void *get_smi_source_handler(int source)
{
int i;
@ -232,46 +233,3 @@ static void *get_source_handler(int source)
return NULL;
}
static void process_smi_sources(uint32_t reg)
{
const uint32_t status = smi_read32(reg);
int bit_zero = 32 / sizeof(uint32_t) * (reg - SMI_REG_SMISTS0);
void (*source_handler)(void);
int i;
for (i = 0 ; i < 32 ; i++) {
if (status & (1 << i)) {
source_handler = get_source_handler(i + bit_zero);
if (source_handler)
source_handler();
}
}
if (reg == SMI_REG_SMISTS0)
if (status & GEVENT_MASK)
/* Gevent[23:0] are assumed to be mainboard-specific */
mainboard_smi_gpi(status & GEVENT_MASK);
/* Clear all events in this register */
smi_write32(reg, status);
}
void southbridge_smi_handler(void)
{
const uint16_t smi_src = smi_read16(SMI_REG_POINTER);
if (smi_src & SMI_STATUS_SRC_SCI)
/* Clear events to prevent re-entering SMI if event isn't handled */
clear_smi_sci_status();
if (smi_src & SMI_STATUS_SRC_0)
process_smi_sources(SMI_REG_SMISTS0);
if (smi_src & SMI_STATUS_SRC_1)
process_smi_sources(SMI_REG_SMISTS1);
if (smi_src & SMI_STATUS_SRC_2)
process_smi_sources(SMI_REG_SMISTS2);
if (smi_src & SMI_STATUS_SRC_3)
process_smi_sources(SMI_REG_SMISTS3);
if (smi_src & SMI_STATUS_SRC_4)
process_smi_sources(SMI_REG_SMISTS4);
}

View File

@ -14,6 +14,7 @@
#include <amdblocks/acpimmio.h>
#include <amdblocks/acpi.h>
#include <amdblocks/smi.h>
#include <amdblocks/smm.h>
#include <elog.h>
/* bits in smm_io_trap */
@ -217,7 +218,7 @@ static const struct smi_sources_t smi_sources[] = {
{ .type = SMITYPE_SLP_TYP, .handler = sb_slp_typ_handler},
};
static void *get_source_handler(int source)
void *get_smi_source_handler(int source)
{
int i;
@ -227,46 +228,3 @@ static void *get_source_handler(int source)
return NULL;
}
static void process_smi_sources(uint32_t reg)
{
const uint32_t status = smi_read32(reg);
int bit_zero = 32 / sizeof(uint32_t) * (reg - SMI_REG_SMISTS0);
void (*source_handler)(void);
int i;
for (i = 0 ; i < 32 ; i++) {
if (status & (1 << i)) {
source_handler = get_source_handler(i + bit_zero);
if (source_handler)
source_handler();
}
}
if (reg == SMI_REG_SMISTS0)
if (status & GEVENT_MASK)
/* Gevent[23:0] are assumed to be mainboard-specific */
mainboard_smi_gpi(status & GEVENT_MASK);
/* Clear all events in this register */
smi_write32(reg, status);
}
void southbridge_smi_handler(void)
{
const uint16_t smi_src = smi_read16(SMI_REG_POINTER);
if (smi_src & SMI_STATUS_SRC_SCI)
/* Clear events to prevent re-entering SMI if event isn't handled */
clear_smi_sci_status();
if (smi_src & SMI_STATUS_SRC_0)
process_smi_sources(SMI_REG_SMISTS0);
if (smi_src & SMI_STATUS_SRC_1)
process_smi_sources(SMI_REG_SMISTS1);
if (smi_src & SMI_STATUS_SRC_2)
process_smi_sources(SMI_REG_SMISTS2);
if (smi_src & SMI_STATUS_SRC_3)
process_smi_sources(SMI_REG_SMISTS3);
if (smi_src & SMI_STATUS_SRC_4)
process_smi_sources(SMI_REG_SMISTS4);
}