summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYue Du <daviddu@us.ibm.com>2018-02-14 09:15:49 -0600
committerhostboot <hostboot@us.ibm.com>2018-03-22 14:04:52 -0500
commit96d49d0b1fd1e755d8568d0b297a86b76fae9eaa (patch)
treec4a7c54ac1746342020a831034c2f61b2a405996
parent20835d260cdf35d6edae75be7151433d565b2416 (diff)
downloadtalos-hcode-96d49d0b1fd1e755d8568d0b297a86b76fae9eaa.tar.gz
talos-hcode-96d49d0b1fd1e755d8568d0b297a86b76fae9eaa.zip
STOP: Fix Block Wakeup Mode with Catchup and Abort cases
Key_Cronus_Test=PM_REGRESS Change-Id: Ic1712341137b4895ca7f48ce359891777b664376 Original-Change-Id: I9020bc4667f3f3887bf1f6560676bc3583c547c5 CQ: SW417400 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/54040 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: Brian T. Vanderpool <vanderp@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/cme/stop_cme/p9_cme_stop_exit.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c
index c1139b05..8d43e807 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c
@@ -426,11 +426,12 @@ p9_cme_stop_exit_catchup(uint32_t* core,
data64_t scom_data = {0};
wakeup = (in32(CME_LCL_EISR) >> SHIFT32(17)) & 0x3F;
- core_catchup = (~(*core)) &
- ((wakeup >> 4) | (wakeup >> 2) | wakeup);
- core_catchup = core_catchup & G_cme_record.core_enabled &
- (~G_cme_stop_record.core_running);
+ core_catchup = (~(*core)) & ((wakeup >> 4) | wakeup) & CME_MASK_BC;
+
+ // ignore wakeup being blocked, do not clear
+ core_catchup &= (~G_cme_stop_record.core_blockwu);
+ // ignore wakeup when it suppose to be handled by sgpe, do not clear
for(core_mask = 2; core_mask; core_mask--)
{
if (core_catchup & core_mask)
@@ -444,6 +445,14 @@ p9_cme_stop_exit_catchup(uint32_t* core,
}
}
+ // leave spwu alone, clear pcwu/rgwu only if not stop5+ or blocked
+ out32(CME_LCL_EISR_CLR, ((core_catchup << SHIFT32(13)) | (core_catchup << SHIFT32(17))));
+
+ // override with partial good core mask, also ignore wakeup to running cores
+ // these are being cleared and considered done for running or disabled cores
+ core_catchup = core_catchup & G_cme_record.core_enabled &
+ (~G_cme_stop_record.core_running);
+
if (core_catchup)
{
// chtm purge done
@@ -516,7 +525,10 @@ p9_cme_stop_exit()
wakeup = (in32(CME_LCL_EISR) >> SHIFT32(17)) & 0x3F;
core = ((wakeup >> 4) | (wakeup >> 2) | wakeup) & CME_MASK_BC;
- // ignore wakeup when it suppose to be handled by sgpe
+ // ignore wakeup being blocked, do not clear
+ core &= (~G_cme_stop_record.core_blockwu);
+
+ // ignore wakeup when it suppose to be handled by sgpe, do not clear
for (core_mask = 2; core_mask; core_mask--)
{
if (core & core_mask)
@@ -530,7 +542,7 @@ p9_cme_stop_exit()
}
}
- // leave spwu alone, clear pcwu/rgwu only if not stop5+
+ // leave spwu alone, clear pcwu/rgwu only if not stop5+ or blocked
out32(CME_LCL_EISR_CLR, ((core << SHIFT32(13)) | (core << SHIFT32(17))));
PK_TRACE_INF("SX.00: Core Wakeup[%x] Raw Interrupts[%x] Actual Stop Levels[%d %d]",
@@ -539,6 +551,7 @@ p9_cme_stop_exit()
G_cme_stop_record.act_level[1]);
// override with partial good core mask, also ignore wakeup to running cores
+ // these are being cleared and considered done for running or disabled cores
core = core & G_cme_record.core_enabled &
(~G_cme_stop_record.core_running);
@@ -587,6 +600,8 @@ p9_cme_stop_exit()
{
PK_PANIC(CME_STOP_EXIT_PHANTOM_WAKEUP);
}
+
+ return;
}
OpenPOWER on IntegriCloud