diff options
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]) { |

