diff options
| author | Yue Du <daviddu@us.ibm.com> | 2017-06-21 00:07:37 -0500 |
|---|---|---|
| committer | Joshua Hunsberger <jahunsbe@us.ibm.com> | 2017-10-23 17:58:06 -0500 |
| commit | cd3b267a88d91517f8dc64abd17b1ef7da604df6 (patch) | |
| tree | 98e39662a4956cd5c8d219c76080b54e97f76e1b | |
| parent | f6284811f1234d57b7069a021dd951f64f09e9d8 (diff) | |
| download | talos-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>
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])); } } |

