summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYue Du <daviddu@us.ibm.com>2017-06-21 00:07:37 -0500
committerJoshua Hunsberger <jahunsbe@us.ibm.com>2017-10-23 17:58:06 -0500
commitcd3b267a88d91517f8dc64abd17b1ef7da604df6 (patch)
tree98e39662a4956cd5c8d219c76080b54e97f76e1b
parentf6284811f1234d57b7069a021dd951f64f09e9d8 (diff)
downloadtalos-hcode-cd3b267a88d91517f8dc64abd17b1ef7da604df6.tar.gz
talos-hcode-cd3b267a88d91517f8dc64abd17b1ef7da604df6.zip
STOP: Fix suspend_stop when threads are idle
Change-Id: Ia375a50988517172859a11f8f1e0117c634b3ae8 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/42176 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: BRIAN D. VICTOR <brian.d.victor1@ibm.com> Reviewed-by: Adam S. Hale <adam.samuel.hale@ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com>
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c22
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h8
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c2
3 files changed, 25 insertions, 7 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 540f47e5..a8ee7627 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
@@ -61,10 +61,26 @@ void p9_sgpe_ipc_pgpe_suspend_stop(ipc_msg_t* cmd, void* arg)
{
PkMachineContext ctx;
- G_sgpe_stop_record.wof.status_stop = STATUS_SUSPENDING;
- G_sgpe_stop_record.wof.suspend_cmd = cmd;
+ // stop in process
+ if (G_sgpe_stop_record.wof.status_stop == STATUS_PROCESSING)
+ {
+ // Note: response will be sent by stop threads when suspension is completed
+ G_sgpe_stop_record.wof.suspend_cmd = cmd;
+ G_sgpe_stop_record.wof.status_stop = STATUS_SUSPENDING;
+ }
+ // sgpe idle
+ else if (G_sgpe_stop_record.wof.status_stop == STATUS_IDLE)
+ {
+ ipc_async_cmd_t* async_cmd = (ipc_async_cmd_t*)cmd;
+ ipcmsg_p2s_suspend_stop_t* msg =
+ (ipcmsg_p2s_suspend_stop_t*)async_cmd->cmd_data;
+ msg->fields.return_code = SGPE_IPC_RETURN_CODE_ACK;
- // Note: response will be sent by stop threads when suspension is completed
+ ipc_send_rsp(cmd, IPC_RC_SUCCESS);
+
+ G_sgpe_stop_record.wof.status_stop = STATUS_SUSPENDED;
+ g_oimr_override |= (BITS64(47, 2) | BIT64(51));
+ }
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 5b8ef17f..a287b440 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
@@ -239,10 +239,10 @@ enum SGPE_STOP_PSCOM_MASK
enum SGPE_FUNCTION_STATUS
{
- STATUS_RESUMING = 0,
- STATUS_FUNCTIONAL = 1,
- STATUS_SUSPENDING = 2,
- STATUS_SUSPENDED = 3
+ STATUS_IDLE = 0,
+ STATUS_PROCESSING = 1,
+ STATUS_SUSPENDING = 2,
+ STATUS_SUSPENDED = 3
};
enum SGPE_STOP_VECTOR_INDEX
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c
index 24976afe..15a4954f 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c
@@ -391,6 +391,7 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
G_sgpe_stop_record.group.qswu[VECTOR_EXIT])
{
PK_TRACE_INF("Unblock Exit");
+ G_sgpe_stop_record.wof.status_stop = STATUS_PROCESSING;
pk_semaphore_post(&(G_sgpe_stop_record.sem[1]));
}
@@ -398,6 +399,7 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
G_sgpe_stop_record.group.qswu[VECTOR_ENTRY])
{
PK_TRACE_INF("Unblock Entry");
+ G_sgpe_stop_record.wof.status_stop = STATUS_PROCESSING;
pk_semaphore_post(&(G_sgpe_stop_record.sem[0]));
}
}
OpenPOWER on IntegriCloud