diff options
| author | Rahul Batra <rbatra@us.ibm.com> | 2018-05-30 13:50:37 -0500 |
|---|---|---|
| committer | hostboot <hostboot@us.ibm.com> | 2018-06-08 10:35:38 -0500 |
| commit | ef6955814d8ec3b716236d00eff8fd9af4173ea2 (patch) | |
| tree | c99ad112bafd3ee07f552ec19c611e8c3b661a10 | |
| parent | 2df7ae766eb5c794d73ec3bdea1812cb5fe9819f (diff) | |
| download | talos-hcode-ef6955814d8ec3b716236d00eff8fd9af4173ea2.tar.gz talos-hcode-ef6955814d8ec3b716236d00eff8fd9af4173ea2.zip | |
PGPE: Ack Back any pending quad active update during WOF Disable
Key_Cronus_Test=PM_REGRESS
Change-Id: I6c473add9d794aa0cf99acc3da4b2248e3afb4c0
CQ: SW431277
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/60036
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
| -rw-r--r-- | import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c | 21 | ||||
| -rw-r--r-- | import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_thread_process_requests.c | 11 |
2 files changed, 27 insertions, 5 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c index f4c09943..9a683781 100644 --- a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c +++ b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c @@ -1191,6 +1191,27 @@ void p9_pgpe_pstate_wof_ctrl(uint32_t action) G_pgpe_pstate_record.wofStatus = WOF_DISABLED; + //ACK any pending quad active update exit. PGPE might have been waiting for WOF VFRT from OCC, but + //with WOF disabled that will never come. + if (G_pgpe_pstate_record.ipcPendTbl[IPC_PEND_SGPE_ACTIVE_QUADS_UPDT].pending_ack == 1) + { + ipc_async_cmd_t* async_cmd = (ipc_async_cmd_t*)G_pgpe_pstate_record.ipcPendTbl[IPC_PEND_SGPE_ACTIVE_QUADS_UPDT].cmd; + ipcmsg_s2p_update_active_quads_t* args = (ipcmsg_s2p_update_active_quads_t*)async_cmd->cmd_data; + + G_pgpe_pstate_record.ipcPendTbl[IPC_PEND_SGPE_ACTIVE_QUADS_UPDT].pending_ack = 0; + G_pgpe_pstate_record.pReqActQuads->fields.requested_active_quads |= (args->fields.requested_quads << 2); + + p9_pgpe_pstate_process_quad_exit_notify(args->fields.requested_quads << 2); + + args->fields.return_active_quads = G_pgpe_pstate_record.pReqActQuads->fields.requested_active_quads >> 2; + args->fields.return_code = IPC_SGPE_PGPE_RC_SUCCESS; + ipc_send_rsp(G_pgpe_pstate_record.ipcPendTbl[IPC_PEND_SGPE_ACTIVE_QUADS_UPDT].cmd, IPC_RC_SUCCESS); + + p9_pgpe_optrace(ACK_QUAD_ACTV); + + GPE_PUTSCOM(G_OCB_OCCFLG_CLR, BIT32(REQUESTED_ACTIVE_QUAD_UPDATE));//Clear OCCFLG[REQUESTED_ACTIVE_QUAD_UPDATE] + } + PK_TRACE_DBG("WCT: WOF Disabled"); } } diff --git a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_thread_process_requests.c b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_thread_process_requests.c index 235d26b4..c6b12931 100644 --- a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_thread_process_requests.c +++ b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_thread_process_requests.c @@ -363,16 +363,17 @@ inline void p9_pgpe_process_sgpe_updt_active_quads() } args->fields.return_active_quads = - ((G_pgpe_pstate_record.pReqActQuads->fields.requested_active_quads &= (~(quads_requested))) >> 2); + ((G_pgpe_pstate_record.pReqActQuads->fields.requested_active_quads & (~(quads_requested))) >> 2); args->fields.return_code = IPC_SGPE_PGPE_RC_SUCCESS; } //EXIT else { - if (args->fields.exit_type == UPDATE_ACTIVE_QUADS_ENTRY_TYPE_NOTIFY) + //Update Shared Memory Region + G_pgpe_pstate_record.pReqActQuads->fields.requested_active_quads |= (quads_requested); + + if (args->fields.exit_type == UPDATE_ACTIVE_QUADS_EXIT_TYPE_NOTIFY) { - //Update Shared Memory Region - G_pgpe_pstate_record.pReqActQuads->fields.requested_active_quads |= (args->fields.requested_quads << 2); //WOF Enabled //If WOF_ENABLED=1, and pstatesStatus == ACITVE, then request for WOF_VFRT @@ -385,7 +386,7 @@ inline void p9_pgpe_process_sgpe_updt_active_quads() } else { - p9_pgpe_pstate_process_quad_exit_notify(args->fields.requested_quads << 2); + p9_pgpe_pstate_process_quad_exit_notify(quads_requested); args->fields.return_active_quads = G_pgpe_pstate_record.pReqActQuads->fields.requested_active_quads >> 2; //activeQuads isn't updated until registration, so we OR with requested quads. args->fields.return_code = IPC_SGPE_PGPE_RC_SUCCESS; |

