diff options
| author | Yue Du <daviddu@us.ibm.com> | 2018-02-06 21:40:06 -0600 |
|---|---|---|
| committer | hostboot <hostboot@us.ibm.com> | 2018-03-22 14:06:02 -0500 |
| commit | e96d64fbd63c6f5728167141f51ea1703777d11b (patch) | |
| tree | 52c32bb3b758d424f05924f87907ecc11e327861 | |
| parent | bd66f63b24a2bd36c171f14599d0b076d94055ce (diff) | |
| download | talos-hcode-e96d64fbd63c6f5728167141f51ea1703777d11b.tar.gz talos-hcode-e96d64fbd63c6f5728167141f51ea1703777d11b.zip | |
STOP: Block Wakeup Mode Fixes for Phyp
1) fix L3 Purge Abort in Block Wakeup mode put quad in undefined state
2) fix stop11 wakeup being converted to stop5 wakeup during Block Wakeup
3) fix some bugs between Special Wakeup and Block Wakeup mode.
4) fix racing decrementor wakeup being serviced in Block Wakeup mode
Key_Cronus_Test=PM_REGRESS
Change-Id: Ia1d10cc9af14ecc592f42116f916deca3ae56b86
Original-Change-Id: I391e6f820c0e9842fc737a1aa5e2ece8e94105bc
CQ: SW416538
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/53514
Reviewed-by: Michael S. Floyd <mfloyd@us.ibm.com>
Reviewed-by: YUE DU <daviddu@us.ibm.com>
Reviewed-by: Brian T. Vanderpool <vanderp@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Cronus HW CI <cronushw-ci+hostboot@us.ibm.com>
Reviewed-by: Gregory S. Still <stillgs@us.ibm.com>
3 files changed, 8 insertions, 6 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c index 27a721db..7ce6fdd2 100644 --- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c +++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_ipc_handlers.c @@ -295,7 +295,7 @@ p9_sgpe_stop_suspend_all_cmes() uint32_t qloop = 0; uint32_t xloop = 0; uint32_t cloop = 0; - uint32_t cpayload_t2 = 0; + uint32_t cpayload_t3 = 0; uint32_t cme_list = 0; for(qloop = 0; qloop < MAX_QUADS; qloop++) @@ -309,9 +309,9 @@ p9_sgpe_stop_suspend_all_cmes() { for(cloop = 0; cloop < CORES_PER_EX; cloop++) { - cpayload_t2 = in32(OCB_OPIT2CN(((xloop << 1) + cloop))); + cpayload_t3 = in32(OCB_OPIT3CN(((xloop << 1) + cloop))); - if (cpayload_t2 == 0x780) + if (cpayload_t3 == 0x780) { cme_list |= BIT32(xloop); 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 8128b59f..e5f19ce5 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 @@ -699,7 +699,9 @@ p9_sgpe_stop_entry() #if !SKIP_L3_PURGE_ABORT - if (in32(OCB_OISR1) & (BITS32(15, 2) | BIT32(19))) + if ((in32(OCB_OISR1) & (BITS32(15, 2) | BIT32(19))) && + // Skip L3 Purge Abort check if in Block Wakeup mode + (!(G_sgpe_stop_record.group.quad[VECTOR_BLOCKX] & BIT32(qloop)))) { PK_TRACE("Abort: interrupt detected"); 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 875bcc12..59ecefbf 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 @@ -194,7 +194,7 @@ p9_sgpe_stop_suspend_db1_cme(uint32_t qloop, uint32_t msgid) pig.fields.req_intr_payload = msgid >> 16; pig.fields.req_intr_payload |= TYPE2_PAYLOAD_SUSPEND_ACK_MASK; - pig.fields.req_intr_type = PIG_TYPE2; + pig.fields.req_intr_type = PIG_TYPE3; GPE_PUTSCOM(GPE_SCOM_ADDR_CORE(PPM_PIG, cindex), pig.value); } } @@ -450,7 +450,7 @@ p9_sgpe_pig_cpayload_parser(const uint32_t type) } // if not hardware pig and is an suspend ack pig - if ((type == PIG_TYPE2) && + if ((type == PIG_TYPE3) && ((~cpayload) & TYPE2_PAYLOAD_HARDWARE_WAKEUP) && (cpayload & TYPE2_PAYLOAD_SUSPEND_ACK_MASK)) { |

