summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRahul Batra <rbatra@us.ibm.com>2018-05-30 13:50:37 -0500
committerhostboot <hostboot@us.ibm.com>2018-06-08 10:35:38 -0500
commitef6955814d8ec3b716236d00eff8fd9af4173ea2 (patch)
treec99ad112bafd3ee07f552ec19c611e8c3b661a10
parent2df7ae766eb5c794d73ec3bdea1812cb5fe9819f (diff)
downloadtalos-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.c21
-rw-r--r--import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_thread_process_requests.c11
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;
OpenPOWER on IntegriCloud