summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c1
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c6
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c8
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])
{
OpenPOWER on IntegriCloud