summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYue Du <daviddu@us.ibm.com>2017-10-02 13:00:53 -0500
committerJoshua Hunsberger <jahunsbe@us.ibm.com>2018-02-01 15:37:51 -0600
commitaece45bf81a63309bc32216e5979d86e587e1d47 (patch)
tree9ec605ddeca18b50afc711343b96efb88acb172a
parent1ef7a601489b66d5e7ded9905de6cede4696d93a (diff)
downloadtalos-hcode-aece45bf81a63309bc32216e5979d86e587e1d47.tar.gz
talos-hcode-aece45bf81a63309bc32216e5979d86e587e1d47.zip
STOP: Fix SGPE IPC acks causing UIH stack underflow
Key_Cronus_Test=PM_REGRESS Change-Id: I0dc5a4babb37ef02fc68315e47c238e901adabcd CQ: SW406211 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/47007 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Cronus HW CI <cronushw-ci+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Michael S. Floyd <mfloyd@us.ibm.com> Dev-Ready: Gregory S. Still <stillgs@us.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c31
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h3
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_init.c3
3 files changed, 21 insertions, 16 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c
index 231b97b5..aa4b52b8 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HCODE Project */
/* */
-/* COPYRIGHT 2016,2017 */
+/* COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -35,11 +35,22 @@ GPE_BUFFER(ipcmsg_s2p_update_active_quads_t G_sgpe_ipcmsg_update_quads);
// pgpe send ack back to sgpe upon ipc will trigger interrupt to engage with uih
// which will stack up oimr, such action will require vec_restore to pop up the
-// stack again to prevent overflow. therefore registering this callback to do so.
+// stack again to prevent overflow.
+//
+// The same time the acks to multiple ipc msgs can stack up in the ipc buffer
+// and only wants to do vec_restore once with X msgs/acks read by one uih/ipc operation.
+// vec_restore per ipc msg/ack will result uih underflow(thus not doing so in callback).
+//
+// Therefore using this hook function called per ipc operation after ipc process loop.
+// Note now all ipc handlers and callbacks will not do vec_restore. In anoter word,
+// one uih engagement should cause one ipc operation and cause one vec_restore
+// during which X number of handlers/callbacks can be called and processed.
+//
-static void
-p9_sgpe_ipc_pgpe_rsp_callback(ipc_msg_t* cmd, void* arg)
+void
+p9_sgpe_ipc_uih_done_hook()
{
+ PK_TRACE_DBG("IPC: Done Hook, UIH Mask Restored");
PkMachineContext ctx;
pk_irq_vec_restore(&ctx);
}
@@ -49,8 +60,6 @@ p9_sgpe_ipc_pgpe_rsp_callback(ipc_msg_t* cmd, void* arg)
void
p9_sgpe_ipc_pgpe_ctrl_stop_updates(ipc_msg_t* cmd, void* arg)
{
- PkMachineContext ctx;
-
PK_TRACE_INF("IPC.PS: Get Control Stop Updates IPC from PGPE");
G_sgpe_stop_record.wof.updates_cmd = cmd;
@@ -66,8 +75,6 @@ p9_sgpe_ipc_pgpe_ctrl_stop_updates(ipc_msg_t* cmd, void* arg)
{
p9_sgpe_ack_pgpe_ctrl_stop_updates();
}
-
- pk_irq_vec_restore(&ctx);
}
@@ -125,7 +132,7 @@ p9_sgpe_ipc_pgpe_update_active_cores(const uint32_t type)
G_sgpe_ipccmd_to_pgpe.cmd_data = &G_sgpe_ipcmsg_update_cores;
ipc_init_msg(&G_sgpe_ipccmd_to_pgpe.cmd,
IPC_MSGID_SGPE_PGPE_UPDATE_ACTIVE_CORES,
- p9_sgpe_ipc_pgpe_rsp_callback, 0);
+ 0, 0);
rc = ipc_send_cmd(&G_sgpe_ipccmd_to_pgpe.cmd);
@@ -205,7 +212,7 @@ p9_sgpe_ipc_pgpe_update_active_quads(const uint32_t type, const uint32_t stage)
G_sgpe_ipccmd_to_pgpe.cmd_data = &G_sgpe_ipcmsg_update_quads;
ipc_init_msg(&G_sgpe_ipccmd_to_pgpe.cmd,
IPC_MSGID_SGPE_PGPE_UPDATE_ACTIVE_QUADS,
- p9_sgpe_ipc_pgpe_rsp_callback, 0);
+ 0, 0);
rc = ipc_send_cmd(&G_sgpe_ipccmd_to_pgpe.cmd);
@@ -241,8 +248,6 @@ p9_sgpe_ipc_pgpe_update_active_quads_poll_ack()
void
p9_sgpe_ipc_pgpe_suspend_stop(ipc_msg_t* cmd, void* arg)
{
- PkMachineContext ctx;
-
PK_TRACE_INF("IPC.PS: Get Suspend Stop IPC from PGPE");
G_sgpe_stop_record.wof.suspend_cmd = cmd;
@@ -259,8 +264,6 @@ p9_sgpe_ipc_pgpe_suspend_stop(ipc_msg_t* cmd, void* arg)
{
p9_sgpe_stop_suspend_all_cmes();
}
-
- pk_irq_vec_restore(&ctx);
}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h
index 9373542c..889817e5 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HCODE Project */
/* */
-/* COPYRIGHT 2015,2017 */
+/* COPYRIGHT 2015,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -367,6 +367,7 @@ struct ring_save
/// SGPE to PGPE IPC handlers
+void p9_sgpe_ipc_uih_done_hook();
void p9_sgpe_ipc_pgpe_ctrl_stop_updates(ipc_msg_t*, void*);
void p9_sgpe_ack_pgpe_ctrl_stop_updates();
void p9_sgpe_ipc_pgpe_update_active_cores(const uint32_t);
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_init.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_init.c
index 90e8dcd7..6adf5e79 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_init.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_init.c
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HCODE Project */
/* */
-/* COPYRIGHT 2015,2017 */
+/* COPYRIGHT 2015,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -594,6 +594,7 @@ p9_sgpe_stop_init()
ipc_init();
ipc_enable();
+ ipc_set_done_hook(*p9_sgpe_ipc_uih_done_hook);
#endif
OpenPOWER on IntegriCloud