summaryrefslogtreecommitdiff
path: root/chip/ish/ipc_heci.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/ish/ipc_heci.c')
-rw-r--r--chip/ish/ipc_heci.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/chip/ish/ipc_heci.c b/chip/ish/ipc_heci.c
index e336994936..9574f38799 100644
--- a/chip/ish/ipc_heci.c
+++ b/chip/ish/ipc_heci.c
@@ -468,6 +468,20 @@ static void ipc_host2ish_isr(void)
uint32_t pisr = REG32(IPC_PISR);
uint32_t pimr = REG32(IPC_PIMR);
+#ifdef CHIP_FAMILY_ISH5
+ /*
+ * TODO(b/122364080): Remove this code once proper power management is
+ * in place for ISH.
+ *
+ * Ensure that the host IPC power is requested after getting an
+ * interrupt otherwise the resume message will never get delivered (via
+ * host ipc communication). Resume is where we would like to restore all
+ * power settings, but that is too late for this power request.
+ */
+
+ PMU_VNN_REQ = VNN_REQ_IPC_HOST_WRITE & ~PMU_VNN_REQ;
+#endif
+
if ((pisr & IPC_PISR_HOST2ISH_BIT) && (pimr & IPC_PIMR_HOST2ISH_BIT))
handle_msg_recv_interrupt(IPC_PEER_ID_HOST);
}
@@ -696,6 +710,17 @@ void ipc_mng_task(void)
struct ipc_msg msg;
ipc_handle_t handle;
+#ifdef CHIP_FAMILY_ISH5
+ /*
+ * TODO(b/122364080): Remove this code once proper power management is
+ * in place for ISH.
+ *
+ * Ensure that power for host IPCs is requested and ack'ed
+ */
+ PMU_VNN_REQ = VNN_REQ_IPC_HOST_WRITE & ~PMU_VNN_REQ;
+ while (!(PMU_VNN_REQ_ACK & PMU_VNN_REQ_ACK_STATUS))
+ continue;
+#endif
handle = ipc_open(IPC_PEER_ID_HOST, IPC_PROTOCOL_MNG,
EVENT_FLAG_BIT_MNG_MSG);