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-08-22 17:55:39 -0500
commit80df64dc8b8d745e19adfc44280a7d3d928bde00 (patch)
tree06afe375da9acbce04f677eee15bc5cb22099ef5
parent6394ad5d5d443c6b5bf41addd470a9b98ce322fa (diff)
downloadtalos-hcode-80df64dc8b8d745e19adfc44280a7d3d928bde00.tar.gz
talos-hcode-80df64dc8b8d745e19adfc44280a7d3d928bde00.zip
STOP: Fix Block Wakeup Mode with Catchup and Abort cases
Key_Cronus_Test=PM_REGRESS Change-Id: Ib95ce9e93bfc66dd0597e96a5d104b1a9740ff14 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>
-rwxr-xr-ximport/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c19
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c30
2 files changed, 16 insertions, 33 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c
index d17097f7..fd0571fa 100755
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c
@@ -233,6 +233,9 @@ p9_cme_stop_entry()
uint32_t origin_core = 0;
uint32_t core_catchup = 0;
#endif
+#if !SKIP_ABORT
+ uint32_t core_wakeup = 0;
+#endif
uint32_t core_aborted = 0;
uint32_t core_stop1 = 0;
uint32_t core_index = 0;
@@ -1214,9 +1217,10 @@ p9_cme_stop_entry()
//===========================
#if !SKIP_ABORT
- out32(CME_LCL_EIMR_CLR, (core << SHIFT32(13)) |
- (core << SHIFT32(15)) |
- (core << SHIFT32(17)));
+ core_wakeup = core & (~G_cme_stop_record.core_blockwu);
+ out32(CME_LCL_EIMR_CLR, (core_wakeup << SHIFT32(13)) |
+ (core_wakeup << SHIFT32(15)) |
+ (core_wakeup << SHIFT32(17)));
sync();
wrteei(0);
out32(CME_LCL_EIMR_OR, (BITS32(12, 6) | BITS32(20, 2)));
@@ -1444,9 +1448,10 @@ p9_cme_stop_entry()
//===========================
#if !SKIP_ABORT
- out32(CME_LCL_EIMR_CLR, (core << SHIFT32(13)) |
- (core << SHIFT32(15)) |
- (core << SHIFT32(17)));
+ core_wakeup = core & (~G_cme_stop_record.core_blockwu);
+ out32(CME_LCL_EIMR_CLR, (core_wakeup << SHIFT32(13)) |
+ (core_wakeup << SHIFT32(15)) |
+ (core_wakeup << SHIFT32(17)));
sync();
wrteei(0);
out32(CME_LCL_EIMR_OR, (BITS32(12, 6) | BITS32(20, 2)));
@@ -1488,7 +1493,7 @@ p9_cme_stop_entry()
//----------------------------------------------------------------------
// NDD1 workaround to save cme image size
-#if NIMBUS_DD_LEVEL != 10
+#if NIMBUS_DD_LEVEL != 10 && DISABLE_STOP8 != 1
if ((G_cme_stop_record.req_level[0] >= STOP_LEVEL_8) &&
(G_cme_stop_record.req_level[1] >= STOP_LEVEL_8))
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c
index e5f19ce5..e5a386e5 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c
@@ -289,30 +289,19 @@ p9_sgpe_stop_entry()
for(qloop = 0; qloop < MAX_QUADS; qloop++)
{
-
-#if NIMBUS_DD_LEVEL == 10
-
- scom_data.value = BIT64(18) | BIT64(21);
-
-#elif DISABLE_STOP8
-
- scom_data.value = BIT64(21);
-
-#endif
-
// insert tlbie quiesce before ncu purge to avoid window condition
// of ncu traffic still happening when purging starts
// Note: chtm purge and drop tlbie quiesce will be done in SGPE
if (G_sgpe_stop_record.group.ex01[qloop] & FST_EX_IN_QUAD)
{
- GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_OR, qloop, 0), scom_data.value);
+ GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_OR, qloop, 0), BIT64(18) | BIT64(21));
GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_OR, qloop, 0), BIT64(22));
}
if (G_sgpe_stop_record.group.ex01[qloop] & SND_EX_IN_QUAD)
{
- GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_OR, qloop, 1), scom_data.value);
+ GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_OR, qloop, 1), BIT64(18) | BIT64(21));
GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_OR, qloop, 1), BIT64(22));
}
}
@@ -321,24 +310,13 @@ p9_sgpe_stop_entry()
for(qloop = 0; qloop < MAX_QUADS; qloop++)
{
-
-#if NIMBUS_DD_LEVEL == 10
-
- uint32_t purge_done = BITS32(22, 2);
-
-#elif DISABLE_STOP8
-
- uint32_t purge_done = BIT32(23);
-
-#endif
-
if (G_sgpe_stop_record.group.ex01[qloop] & FST_EX_IN_QUAD)
{
do
{
GPE_GETSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_EISR, qloop, 0), scom_data.value);
}
- while((scom_data.words.upper & purge_done) != purge_done);
+ while((scom_data.words.upper & BITS32(22, 2)) != BITS32(22, 2));
GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_CLR, qloop, 0), (BIT64(18) | BIT64(22)));
}
@@ -349,7 +327,7 @@ p9_sgpe_stop_entry()
{
GPE_GETSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_EISR, qloop, 1), scom_data.value);
}
- while((scom_data.words.upper & purge_done) != purge_done);
+ while((scom_data.words.upper & BITS32(22, 2)) != BITS32(22, 2));
GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_CLR, qloop, 1), (BIT64(18) | BIT64(22)));
}
OpenPOWER on IntegriCloud