diff options
| author | Yue Du <daviddu@us.ibm.com> | 2017-07-31 22:47:55 -0500 |
|---|---|---|
| committer | Joshua Hunsberger <jahunsbe@us.ibm.com> | 2017-10-23 18:41:15 -0500 |
| commit | f563c8d413c937ab2c7b1ecef89a120a64151dee (patch) | |
| tree | bacb9a160de8ff7a9d6bb5c0dfebc49b12995888 | |
| parent | d47c3d351b061ab18d84f1d0d46b6035b0422d35 (diff) | |
| download | talos-hcode-f563c8d413c937ab2c7b1ecef89a120a64151dee.tar.gz talos-hcode-f563c8d413c937ab2c7b1ecef89a120a64151dee.zip | |
STOP: Attempt to Fix quad spwu caused incorrect flow
Change-Id: I0f7a6e45842fc79d89b4685badbd5c4e1e7f9e61
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43962
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Juan R. Medina <jrmedina@us.ibm.com>
Reviewed-by: BRIAN D. VICTOR <brian.d.victor1@ibm.com>
Reviewed-by: Gregory S. Still <stillgs@us.ibm.com>
3 files changed, 12 insertions, 3 deletions
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 d1ac193a..955c29e1 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 @@ -70,6 +70,7 @@ p9_sgpe_stop_entry() MARK_TAG(BEGINSCOPE_STOP_ENTRY, 0) //================================ + G_sgpe_stop_record.group.core[VECTOR_ENTRY] = 0; G_sgpe_stop_record.group.quad[VECTOR_ENTRY] = 0; G_sgpe_stop_record.group.ex01[0] = 0; G_sgpe_stop_record.group.ex01[1] = 0; diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c index baaa72e5..e69d2c02 100644 --- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c +++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c @@ -237,6 +237,7 @@ p9_sgpe_stop_exit_end(uint32_t qloop) PK_TRACE("Update QSSR: drop stop_exit_ongoing"); out32(OCB_QSSR_CLR, BIT32(qloop + 26)); + G_sgpe_stop_record.group.quad[VECTOR_ACTIVE] |= BIT32(qloop); } //------------------------------------------------------------------------- @@ -298,9 +299,8 @@ p9_sgpe_stop_exit_handoff_cme(uint32_t cindex) // From IPC prospective, core is active when handoff to cme // and if core from quad is active, the quad is active - G_sgpe_stop_record.group.core[VECTOR_ACTIVE] |= BIT32(cindex); - G_sgpe_stop_record.group.quad[VECTOR_ACTIVE] |= BIT32((cindex >> 2)); - + G_sgpe_stop_record.group.core[VECTOR_EXIT] &= ~BIT32(cindex); + G_sgpe_stop_record.group.core[VECTOR_ACTIVE] |= BIT32(cindex); } //------------------------------------------------------------------------------ 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 b7fcfb9d..8c3a33c4 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 @@ -714,6 +714,7 @@ p9_sgpe_pig_type3_handler(void* arg, PkIrqId irq) // block both type3 and type6 // so another doesnt interrupt until next round out32(OCB_OIMR1_OR, (BIT32(16) | BIT32(19))); + g_oimr_override |= (BIT64(48) | BIT64(51)); if (G_sgpe_stop_record.group.core[VECTOR_PIGX]) { @@ -787,6 +788,12 @@ p9_sgpe_pig_type6_handler(void* arg, PkIrqId irq) { PK_TRACE_DBG("Quad Already in Special Wakeup"); } + else if (G_sgpe_stop_record.group.quad[VECTOR_ACTIVE] & BIT32(qloop)) + { + PK_TRACE_DBG("Quad Already Waken up, Assert SPWU_DONE"); + GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_GPMMR_OR, qloop), BIT64(0)); + G_sgpe_stop_record.group.qswu[VECTOR_ACTIVE] |= BIT32(qloop); + } else if (G_sgpe_stop_record.group.quad[VECTOR_BLOCKX] & BIT32(qloop)) { PK_TRACE_DBG("Quad is in Block Wakeup Mode, Ignore Now"); @@ -825,6 +832,7 @@ p9_sgpe_pig_type6_handler(void* arg, PkIrqId irq) // block both type3 and type6 // so another doesnt interrupt until next round out32(OCB_OIMR1_OR, (BIT32(16) | BIT32(19))); + g_oimr_override |= (BIT64(48) | BIT64(51)); if (G_sgpe_stop_record.group.qswu[VECTOR_EXIT]) { |

