summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYue Du <daviddu@us.ibm.com>2018-01-09 01:43:54 -0600
committerhostboot <hostboot@us.ibm.com>2018-03-22 14:05:59 -0500
commitb20ca2b33f13ad31aca6c29eda186dfb9393a617 (patch)
tree1c970248b405f862b576fa0b3620b9383882fa3c
parentd6f049a7f729a619747356f46b076429c6504b01 (diff)
downloadtalos-hcode-b20ca2b33f13ad31aca6c29eda186dfb9393a617.tar.gz
talos-hcode-b20ca2b33f13ad31aca6c29eda186dfb9393a617.zip
STOP: Fix SGPE stop servicing wakeups
Key_Cronus_Test=PM_REGRESS Change-Id: I09b37a6edbec10e5701998c7f4cf506b87cf0e5f Original-Change-Id: Icb6b9fcf030a9389bf4571c5b9b3c44d72a8cb3f CQ: SW413317 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/51662 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: Michael S. Floyd <mfloyd@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/sgpe/stop_gpe/p9_sgpe_stop.h7
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c13
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c14
3 files changed, 23 insertions, 11 deletions
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 d4d67c48..0a6cf2fb 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
@@ -264,6 +264,13 @@ enum SGPE_STOP_VECTOR_INDEX
};
+enum VECTOR_RCLKE_QUAD_OFFSETS
+{
+ RCLK_DIS_REQ_OFFSET = 0,
+ RCLK_DIS_DONE_OFFSET = 8,
+ QUAD_IN_STOP11_OFFSET = 16
+};
+
enum SCOM_RESTORE_CONST
{
SCOM_ENTRY_MARK = 0xDEADDEAD,
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 8b09c7a4..8128b59f 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
@@ -151,9 +151,10 @@ p9_sgpe_stop_entry()
#else
// if resonant clock disable is completed, process stop11 entry
- if (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BIT32((qloop + 16)))
+ if (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BIT32((qloop + RCLK_DIS_DONE_OFFSET)))
{
- G_sgpe_stop_record.group.quad[VECTOR_RCLKE] &= ~BIT32((qloop + 16));
+ G_sgpe_stop_record.group.quad[VECTOR_RCLKE] &= ~BIT32((qloop + RCLK_DIS_DONE_OFFSET));
+ G_sgpe_stop_record.group.quad[VECTOR_RCLKE] |= BIT32((qloop + QUAD_IN_STOP11_OFFSET));
// if during resonant clock disable, any exit occured, re-assert them,
// but we are going to complete the stop11 entry prior to process it
@@ -183,10 +184,10 @@ p9_sgpe_stop_entry()
}
// if stop11 entry qualifies, hold on processing it but first
// send DB to Quad-Manager to disable the resonant clock
- else
+ else if (!(G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BIT32((qloop + QUAD_IN_STOP11_OFFSET))))
{
// from this point on, only process wakeup when stop11 is entered
- G_sgpe_stop_record.group.quad[VECTOR_RCLKE] |= BIT32(qloop);
+ G_sgpe_stop_record.group.quad[VECTOR_RCLKE] |= BIT32((qloop + RCLK_DIS_REQ_OFFSET));
// assume ex0 core0 is good
cindex = (qloop << 2);
@@ -219,6 +220,8 @@ p9_sgpe_stop_entry()
BIT64(CME_FLAGS_RCLK_OPERABLE));
}
+ PK_TRACE_INF("DB2 MessageID 2(Rclk Entry) sent to core %d", cindex);
+
#if NIMBUS_DD_LEVEL != 10
GPE_PUTSCOM(GPE_SCOM_ADDR_CORE(CPPM_CMEDB2, cindex), BIT64(6));
@@ -823,6 +826,8 @@ p9_sgpe_stop_entry()
// send DB2 with msgid 0x3 to the first good core
// to trigger Quad Manager to enable resonant clock again
+ PK_TRACE_INF("DB2 MessageID 3(Rclk Entry Abort) sent to core %d", cindex);
+
#if NIMBUS_DD_LEVEL != 10
GPE_PUTSCOM(GPE_SCOM_ADDR_CORE(CPPM_CMEDB2, cindex), BITS64(6, 2));
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 b36a1036..875bcc12 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
@@ -592,7 +592,7 @@ p9_sgpe_pig_cpayload_parser(const uint32_t type)
#if DISABLE_STOP8
// if having ongoing stop11 in resclk disable phase, hold on to all exits
- if (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BIT32(qloop))
+ if (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BIT32((qloop + RCLK_DIS_REQ_OFFSET)))
{
if ((type == PIG_TYPE5) && (cpayload == TYPE5_PAYLOAD_EXIT_RCLK))
{
@@ -699,8 +699,8 @@ p9_sgpe_pig_cpayload_parser(const uint32_t type)
if ((type == PIG_TYPE5) &&
(cpayload == (TYPE5_PAYLOAD_ENTRY_RCLK | STOP_LEVEL_11)))
{
- G_sgpe_stop_record.group.quad[VECTOR_RCLKE] &= ~BIT32(qloop);
- G_sgpe_stop_record.group.quad[VECTOR_RCLKE] |= BIT32((qloop + 16));
+ G_sgpe_stop_record.group.quad[VECTOR_RCLKE] &= ~BIT32((qloop + RCLK_DIS_REQ_OFFSET));
+ G_sgpe_stop_record.group.quad[VECTOR_RCLKE] |= BIT32((qloop + RCLK_DIS_DONE_OFFSET));
}
else
{
@@ -714,8 +714,8 @@ p9_sgpe_pig_cpayload_parser(const uint32_t type)
(cpayload == (TYPE5_PAYLOAD_ENTRY_RCLK | STOP_LEVEL_11)))
{
PK_TRACE_INF("Core Request Entry Allowed as Resonant Clock Disable is Completed");
- G_sgpe_stop_record.group.quad[VECTOR_RCLKE] &= ~BIT32(qloop);
- G_sgpe_stop_record.group.quad[VECTOR_RCLKE] |= BIT32((qloop + 16));
+ G_sgpe_stop_record.group.quad[VECTOR_RCLKE] &= ~BIT32((qloop + RCLK_DIS_REQ_OFFSET));
+ G_sgpe_stop_record.group.quad[VECTOR_RCLKE] |= BIT32((qloop + RCLK_DIS_DONE_OFFSET));
}
#else
@@ -849,7 +849,7 @@ p9_sgpe_pig_thread_lanucher()
// Taking Stop8/11 Actions if any
if (G_sgpe_stop_record.group.core[VECTOR_PIGX] ||
G_sgpe_stop_record.group.core[VECTOR_PIGE] ||
- (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BITS32(16, 6)))
+ (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BITS32(RCLK_DIS_DONE_OFFSET, 6)))
{
// block both type3 and type5, 6
// so another doesnt interrupt until next round
@@ -865,7 +865,7 @@ p9_sgpe_pig_thread_lanucher()
}
if ((G_sgpe_stop_record.group.core[VECTOR_PIGE]) ||
- (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BITS32(16, 6) &
+ (G_sgpe_stop_record.group.quad[VECTOR_RCLKE] & BITS32(RCLK_DIS_DONE_OFFSET, 6) &
(~(G_sgpe_stop_record.group.quad[VECTOR_BLOCKE] >> 16))))
{
PK_TRACE_INF("Unblock Entry Thread");
OpenPOWER on IntegriCloud