summaryrefslogtreecommitdiff
path: root/src/soc
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc')
-rw-r--r--src/soc/intel/apollolake/include/soc/smm.h3
-rw-r--r--src/soc/intel/apollolake/smihandler.c17
-rw-r--r--src/soc/intel/common/block/include/intelblocks/smihandler.h18
-rw-r--r--src/soc/intel/common/block/smm/smihandler.c23
4 files changed, 42 insertions, 19 deletions
diff --git a/src/soc/intel/apollolake/include/soc/smm.h b/src/soc/intel/apollolake/include/soc/smm.h
index b37694e6f7..eda0bc4422 100644
--- a/src/soc/intel/apollolake/include/soc/smm.h
+++ b/src/soc/intel/apollolake/include/soc/smm.h
@@ -30,7 +30,4 @@
void southbridge_smm_clear_state(void);
void southbridge_smm_enable_smi(void);
-/* Mainboard handler for GPI SMIs*/
-void mainboard_smi_gpi_handler(const struct gpi_status *sts);
-
#endif
diff --git a/src/soc/intel/apollolake/smihandler.c b/src/soc/intel/apollolake/smihandler.c
index f834b1da70..22c793051d 100644
--- a/src/soc/intel/apollolake/smihandler.c
+++ b/src/soc/intel/apollolake/smihandler.c
@@ -34,26 +34,11 @@ const struct smm_save_state_ops *get_smm_save_state_ops(void)
return &em64t100_smm_ops;
}
-void __attribute__((weak))
-mainboard_smi_gpi_handler(const struct gpi_status *sts) { }
-
-static void southbridge_smi_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);
-}
-
const smi_handler_t southbridge_smi[32] = {
[SLP_SMI_STS] = smihandler_southbridge_sleep,
[APM_SMI_STS] = smihandler_southbridge_apmc,
[FAKE_PM1_SMI_STS] = smihandler_southbridge_pm1,
- [GPIO_SMI_STS] = southbridge_smi_gpi,
+ [GPIO_SMI_STS] = smihandler_southbridge_gpi,
[TCO_SMI_STS] = smihandler_southbridge_tco,
[PERIODIC_SMI_STS] = smihandler_southbridge_periodic,
};
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;