summaryrefslogtreecommitdiff
path: root/src/soc/intel/common/block
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/intel/common/block')
-rw-r--r--src/soc/intel/common/block/include/intelblocks/smihandler.h18
-rw-r--r--src/soc/intel/common/block/smm/smihandler.c23
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;