/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* $Source: src/import/chips/p9/procedures/hwp/perv/p9_sbe_check_master_stop15.C $ */ /* */ /* OpenPOWER sbe Project */ /* */ /* Contributors Listed Below - COPYRIGHT 2016 */ /* [+] International Business Machines Corp. */ /* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ /* You may obtain a copy of the License at */ /* */ /* http://www.apache.org/licenses/LICENSE-2.0 */ /* */ /* Unless required by applicable law or agreed to in writing, software */ /* distributed under the License is distributed on an "AS IS" BASIS, */ /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ /* implied. See the License for the specific language governing */ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ /// /// @file p9_sbe_check_master_stop15.H /// @brief Check if the targeted core (master) is fully in STOP15 /// // *HWP HWP Owner : Greg Still // *HWP FW Owner : Bilicon Patil // *HWP Team : PM // *HWP Level : 2 // *HWP Consumed by : SBE /// /// High-level procedure flow: /// @verbatim /// - Read the STOP History Register from the target core /// - Return SUCCESS if:: /// - STOP_GATED is set (indicating it is stopped) /// - STOP_TRANSITION is clear (indicating it is stable) /// - ACT_STOP_LEVEL is at the appropriate value (either 11 (0xB) or 15 (0x15) /// - Return PENDING if /// - STOP_TRANSITION is set (indicating transtion is progress) /// - Return ERROR if /// - STOP_GATED is set, STOP_TRANSITION is clear and ACT_STOP_LEVEL is not /// appropriate /// - STOP_TRANSITION is clear but STOP_GATED is clear /// - Hardware access errors /// @endverbatim // ----------------------------------------------------------------------------- // Includes // ----------------------------------------------------------------------------- #include #include #include // ----------------------------------------------------------------------------- // Function definitions // ----------------------------------------------------------------------------- // See .H for documentation fapi2::ReturnCode p9_sbe_check_master_stop15( const fapi2::Target& i_target) { FAPI_IMP("> p9_sbe_check_master_stop15"); fapi2::buffer l_data64; uint32_t l_stop_gated = 0; uint32_t l_stop_transition = p9ssh::SSH_UNDEFINED; uint32_t l_stop_requested_level = 0; // Running Level uint32_t l_stop_actual_level = 0; // Running Level // Read the "Other" STOP History Register FAPI_TRY(fapi2::getScom(i_target, C_PPM_SSHOTR, l_data64)); // Extract the field values l_data64.extractToRight(l_stop_gated); l_data64.extractToRight(l_stop_transition); // Testing showed the above operation was sign extending into // the l_stop_transition variable. l_stop_transition &= 0x3; l_data64.extractToRight(l_stop_requested_level); l_data64.extractToRight(l_stop_actual_level); #ifndef __PPE__ FAPI_DBG("GATED = %d; TRANSITION = %d (0x%X); REQUESTED_LEVEL = %d; ACTUAL_LEVEL = %d", l_stop_gated, l_stop_transition, l_stop_transition, l_stop_requested_level, l_stop_actual_level); #endif // Check for valide reguest level FAPI_ASSERT((l_stop_requested_level == 11 || l_stop_requested_level == 15), fapi2::CHECK_MASTER_STOP15_INVALID_REQUEST_LEVEL() .set_REQUESTED_LEVEL(l_stop_requested_level), "Invalid requested STOP Level"); // Check for valid pending condition FAPI_ASSERT(!(l_stop_transition == p9ssh::SSH_CORE_COMPLETE || l_stop_transition == p9ssh::SSH_ENTERING ), fapi2::CHECK_MASTER_STOP15_PENDING(), "STOP 15 is still pending"); // Assert completion and the core gated condition. If not, something is off. FAPI_ASSERT((l_stop_transition == p9ssh::SSH_COMPLETE && l_stop_gated == p9ssh::SSH_GATED ), fapi2::CHECK_MASTER_STOP15_INVALID_STATE() .set_STOP_HISTORY(l_data64), "STOP 15 error"); // Check for valid actual level FAPI_ASSERT((l_stop_actual_level == 11 || l_stop_actual_level == 15), fapi2::CHECK_MASTER_STOP15_INVALID_ACTUAL_LEVEL() .set_ACTUAL_LEVEL(l_stop_actual_level), "Invalid actual STOP Level"); FAPI_INF("SUCCESS!! Valid STOP entry state has been achieved.") fapi_try_exit: FAPI_INF("< p9_sbe_check_master_stop15"); return fapi2::current_err; } // END p9_sbe_check_master_stop15