diff options
Diffstat (limited to 'src/soc/intel/common/block')
-rw-r--r-- | src/soc/intel/common/block/include/intelblocks/smihandler.h | 18 | ||||
-rw-r--r-- | src/soc/intel/common/block/smm/smihandler.c | 23 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/include/intelblocks/smihandler.h b/src/soc/intel/common/block/include/intelblocks/smihandler.h index 4423904371..389d2415b8 100644 --- a/src/soc/intel/common/block/include/intelblocks/smihandler.h +++ b/src/soc/intel/common/block/include/intelblocks/smihandler.h @@ -109,6 +109,21 @@ void smihandler_southbridge_periodic( const struct smm_save_state_ops *save_state_ops); /* + * This function should be implemented in SOC specific code to handle + * SMI GPIO_STS event. The default functionality is provided in + * soc/intel/common/block/smm/smihandler.c + */ +void smihandler_southbridge_gpi( + const struct smm_save_state_ops *save_state_ops); + +/* + * This function should be implemented in SOC specific code to handle + * SMI ESPI_STS event. The default functionality is provided in + * soc/intel/common/block/smm/smihandler.c + */ +void smihandler_southbridge_espi( + const struct smm_save_state_ops *save_state_ops); +/* * This function returns a 1 or 0 depending on whether disable_busmaster * needs to be done for the specified device on S5 entry */ @@ -122,6 +137,9 @@ struct global_nvs_t *smm_get_gnvs(void); /* Mainboard handler for GPI SMIs */ void mainboard_smi_gpi_handler(const struct gpi_status *sts); +/* Mainboard handler for ESPI EMIs */ +void mainboard_smi_espi_handler(void); + extern const struct smm_save_state_ops em64t100_smm_ops; extern const struct smm_save_state_ops em64t101_smm_ops; diff --git a/src/soc/intel/common/block/smm/smihandler.c b/src/soc/intel/common/block/smm/smihandler.c index 7a4be47844..24327f2aa8 100644 --- a/src/soc/intel/common/block/smm/smihandler.c +++ b/src/soc/intel/common/block/smm/smihandler.c @@ -356,6 +356,29 @@ void smihandler_southbridge_periodic( printk(BIOS_DEBUG, "Periodic SMI.\n"); } +void __attribute__((weak)) +mainboard_smi_gpi_handler(const struct gpi_status *sts) { } + +void smihandler_southbridge_gpi( + const struct smm_save_state_ops *save_state_ops) +{ + struct gpi_status smi_sts; + + gpi_clear_get_smi_status(&smi_sts); + mainboard_smi_gpi_handler(&smi_sts); + + /* Clear again after mainboard handler */ + gpi_clear_get_smi_status(&smi_sts); +} + +void __attribute__((weak)) mainboard_smi_espi_handler(void) { } + +void smihandler_southbridge_espi( + const struct smm_save_state_ops *save_state_ops) +{ + mainboard_smi_espi_handler(); +} + void southbridge_smi_handler(void) { int i; |