From c6f4989047b99254b2e50525f9019121e5b33c14 Mon Sep 17 00:00:00 2001 From: Rahul Batra Date: Tue, 15 Nov 2016 12:36:10 -0600 Subject: OCC Flags/OCC Scratch Updates Change-Id: I75bff4fc5a76c98845cf88cb6c5f055142d1005b Original-Change-Id: I21020ebf7dfe39dd48e2d2727607dd35297831d7 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32695 Tested-by: PPE CI Tested-by: Jenkins Server Tested-by: Hostboot CI Reviewed-by: AMIT KUMAR Reviewed-by: Gregory S. Still Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43178 Reviewed-by: Sachin Gupta --- .../chips/p9/procedures/hwp/pm/p9_suspend_powman.C | 28 ++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'src/import/chips/p9/procedures') diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_suspend_powman.C b/src/import/chips/p9/procedures/hwp/pm/p9_suspend_powman.C index 79ac7931..7cd88bce 100644 --- a/src/import/chips/p9/procedures/hwp/pm/p9_suspend_powman.C +++ b/src/import/chips/p9/procedures/hwp/pm/p9_suspend_powman.C @@ -46,6 +46,7 @@ #include #include #include +#include extern "C" { @@ -54,11 +55,6 @@ extern "C" { //-------------------------------------------------------------------------- const uint32_t c_tries_before_timeout = 20; - //TODO @todo RTC 164106 it looks like these may be changing - const uint32_t C_OCC_FLG_REQ_ENTER_SAFE_STATE = 31; - const uint32_t C_OCC_FLG_CHECK_PGPE_SET = 6; - const uint32_t C_OCC_FLG_REQ_PGPE_MANUAL_SAFE_MODE = 2; - const uint32_t OCC_FLG_REQ_PM_COMPLEX_SUSPEND = 3; //-------------------------------------------------------------------------- // HWP entry point @@ -70,24 +66,25 @@ extern "C" { fapi2::buffer l_pba_data(0); fapi2::buffer l_occflg_data(0); + fapi2::buffer l_occs2_data(0); fapi2::buffer l_ocr_reg_data(0); fapi2::buffer l_ppe_xixcr_data(0); uint64_t l_xixcr_force_halt_cmd = 0b111; bool l_pgpe_in_safe_mode = false; - // SBE messages request to OCC to enter safe state via OCC Flag register bit 31, which OCC polls every 500us. This does not cause any errors to be logged. + // SBE messages request to OCC to enter safe state via OCC_Flag[REQUEST_OCC_SAFE_STATE] , which OCC polls every 500us. This does not cause any errors to be logged. // In response PGPE will detect missing OCC heartbeat after an additional 8ms and go into "safe mode". This is cleanly handled on OCC across all chips. - l_occflg_data.setBit(); + l_occflg_data.setBit(); FAPI_TRY(fapi2::putScom(i_target, PU_OCB_OCI_OCCFLG_SCOM2, l_occflg_data), - "Error setting OCC Flag register bit C_OCC_FLG_REQ_ENTER_SAFE_STATE"); + "Error setting OCC Flag register bit REQUEST_OCC_SAFE_STATE"); - // SBE waits for PGPE to set OCC Flag bit6. SBE Timeout after 33ms, then sets bit 2 in OCC Flag register to request PGPE into "safe mode" manually. SBE polls on bit6 again, timeout after 8ms + // SBE waits for PGPE to set OCC Scratch2[PGPE_SAFE_MODE_ACTIVE]. SBE Timeout after 33ms, then sets OCC Flag[PGPE_SAFE_MODE] to request PGPE into "safe mode" manually. SBE polls on OCC Scratch2[PGPE_SAFE_MODE_ACTIVE] again, timeout after 8ms //TODO put in the delays here for 33ms and 8ms for (uint32_t i = 0; i < c_tries_before_timeout; i++) { - FAPI_TRY(fapi2::getScom(i_target, PU_OCB_OCI_OCCFLG_SCOM, l_occflg_data), "Error reading OCC Flag register"); + FAPI_TRY(fapi2::getScom(i_target, PU_OCB_OCI_OCCS2_SCOM, l_occs2_data), "Error reading OCC Scratch 2 register"); - if(l_occflg_data.getBit()) + if(l_occs2_data.getBit()) { l_pgpe_in_safe_mode = true; break; @@ -96,14 +93,15 @@ extern "C" { if (!l_pgpe_in_safe_mode) { - l_occflg_data.flush<0>().setBit(); + + l_occflg_data.flush<0>().setBit(); FAPI_TRY(fapi2::putScom(i_target, PU_OCB_OCI_OCCFLG_SCOM2, l_occflg_data), "Error setting OCC Flag register bit 2"); for (uint32_t i = 0; i < c_tries_before_timeout; i++) { - FAPI_TRY(fapi2::getScom(i_target, PU_OCB_OCI_OCCFLG_SCOM, l_occflg_data), "Error reading OCC Flag register"); + FAPI_TRY(fapi2::getScom(i_target, PU_OCB_OCI_OCCS2_SCOM, l_occs2_data), "Error reading OCC Scratch 2 register"); - if(l_occflg_data.getBit()) + if(l_occs2_data.getBit()) { l_pgpe_in_safe_mode = true; break; @@ -119,7 +117,7 @@ extern "C" { // Suspend PGPE, SGPE, and CME from processing Pstate, WOF, and STOP entry/exit requests. // (see above) Use OCC flag register bit 3 to request PM Complex suspend.: In response, PGPE will stop processing Pstates, message SGPE to stop calling 24x7 thread andsuspend responding to Stop entry & exit. PGPE will message CME to stop processing Stop states??????.; then wait for ACK from each engine - l_occflg_data.flush<0>().setBit(); + l_occflg_data.flush<0>().setBit(); FAPI_TRY(fapi2::putScom(i_target, PU_OCB_OCI_OCCFLG_SCOM2, l_occflg_data), "Error setting OCC Flag register bit 3"); // TODO @todo RTC 164110 How to wait for ACK from each engine - an update is needed once the PGPE implements the function -- cgit v1.2.1