summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/soc/intel/common/block/cse/cse.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/cse/cse.c b/src/soc/intel/common/block/cse/cse.c
index 5140369445..19d733602e 100644
--- a/src/soc/intel/common/block/cse/cse.c
+++ b/src/soc/intel/common/block/cse/cse.c
@@ -1184,6 +1184,68 @@ static void cse_set_state(struct device *dev)
me_reset_with_count();
}
+struct cse_notify_phase_data {
+ bool skip;
+ void (*notify_func)(void);
+};
+
+/*
+ * `cse_final_ready_to_boot` function is native implementation of equivalent events
+ * performed by FSP NotifyPhase(Ready To Boot) API invocations.
+ *
+ * Operations are:
+ * 1. Send EOP to CSE if not done.
+ * 2. Perform global reset lock.
+ * 3. Put HECI1 to D0i3 and disable the HECI1 if the user selects
+ * DISABLE_HECI1_AT_PRE_BOOT config.
+ */
+static void cse_final_ready_to_boot(void)
+{
+ cse_send_end_of_post();
+
+ cse_control_global_reset_lock();
+
+ if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT)) {
+ cse_set_to_d0i3();
+ heci1_disable();
+ }
+}
+
+/*
+ * `cse_final_end_of_firmware` function is native implementation of equivalent events
+ * performed by FSP NotifyPhase(End of Firmware) API invocations.
+ *
+ * Operations are:
+ * 1. Set D0I3 for all HECI devices.
+ */
+static void cse_final_end_of_firmware(void)
+{
+ heci_set_to_d0i3();
+}
+
+static const struct cse_notify_phase_data notify_data[] = {
+ {
+ .skip = CONFIG(USE_FSP_NOTIFY_PHASE_READY_TO_BOOT),
+ .notify_func = cse_final_ready_to_boot,
+ },
+ {
+ .skip = CONFIG(USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE),
+ .notify_func = cse_final_end_of_firmware,
+ },
+};
+
+/*
+ * `cse_final` function is native implementation of equivalent events performed by
+ * each FSP NotifyPhase() API invocations.
+ */
+static void cse_final(struct device *dev)
+{
+ for (size_t i = 0; i < ARRAY_SIZE(notify_data); i++) {
+ if (!notify_data[i].skip)
+ return notify_data[i].notify_func();
+ }
+}
+
static struct device_operations cse_ops = {
.set_resources = pci_dev_set_resources,
.read_resources = pci_dev_read_resources,
@@ -1191,6 +1253,7 @@ static struct device_operations cse_ops = {
.init = pci_dev_init,
.ops_pci = &pci_dev_ops_pci,
.enable = cse_set_state,
+ .final = cse_final,
};
static const unsigned short pci_device_ids[] = {