From 548b7fd4484c4c780cb0837e8e4a920db2a1f5a9 Mon Sep 17 00:00:00 2001 From: Stephen Glancy Date: Tue, 9 Jan 2018 14:12:05 -0600 Subject: Updates error logging to log target with FIRs PRD requires that the target that experienced the FIR is logged as the target in log_related_error. This patch set fixes all instances of log related error to log the associated target. Change-Id: If722ea0935ee4de37bd482d93d3807d934e71a45 CQ:SW411492 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/51693 Tested-by: FSP CI Jenkins Reviewed-by: ANDRE A. MARIN Reviewed-by: Louis Stermole Tested-by: Jenkins Server Tested-by: Hostboot CI Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/51697 Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Reviewed-by: Christian R. Geddes --- .../chips/p9/procedures/hwp/memory/lib/fir/check.C | 93 +++++++++++++++------- .../chips/p9/procedures/hwp/memory/lib/fir/check.H | 30 ++++--- .../p9/procedures/hwp/memory/lib/phy/ddr_phy.C | 2 +- .../chips/p9/procedures/hwp/memory/lib/phy/dp16.C | 10 ++- 4 files changed, 89 insertions(+), 46 deletions(-) (limited to 'src/import/chips/p9/procedures/hwp/memory') diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.C b/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.C index aef337cde..53c0dbdb9 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.C @@ -231,7 +231,7 @@ fapi2::ReturnCode during_draminit_training( const fapi2::Target> MCA_FIR_REGS = {MCA_IOM_PHY0_DDRPHY_FIR_REG, MCA_IOM_PHY0_DDRPHY_FIR_MASK_REG}, }; +/// +/// @brief Helper function to log an error as related if needed +/// @tparam T the target type on which to log the error +/// @param[in] i_target - the target to log the error on +/// @param[in] i_fir_error - true IFF a fir is present on the passed in target +/// @param[in,out] io_rc - the return code to log +/// +template< fapi2::TargetType T > +void log_fir_helper( const fapi2::Target& i_target, const bool i_fir_error, fapi2::ReturnCode& io_rc) +{ + if(i_fir_error && (io_rc != fapi2::FAPI2_RC_SUCCESS)) + { + fapi2::log_related_error(i_target, io_rc, fapi2::FAPI2_ERRL_SEV_RECOVERED); + } +} + + + /// /// @brief Checks whether any of the PLL unlock values are set /// @param[in] i_local_fir - the overall FIR register @@ -290,10 +308,13 @@ bool pll_unlock( const fapi2::buffer& i_local_fir, /// /// @brief Checks whether any PLL FIRs have been set on a target /// @param[in] i_target - the target on which to operate +/// @param[in,out] io_rc - the return code for the function /// @param[out] o_fir_error - true iff a FIR was hit /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok /// -fapi2::ReturnCode pll_fir( const fapi2::Target& i_target, bool& o_fir_error ) +fapi2::ReturnCode pll_fir( const fapi2::Target& i_target, + fapi2::ReturnCode& io_rc, + bool& o_fir_error ) { // Sets o_fir_error to false to begin with, just in case we have scom issues o_fir_error = false; @@ -316,18 +337,31 @@ fapi2::ReturnCode pll_fir( const fapi2::Target& i_tar // Checks the data o_fir_error = pll_unlock(l_local_fir, l_perv_fir, l_mc_fir); + // Log the error if need be + log_fir_helper(l_proc, o_fir_error, io_rc); + + // Exit if we have found a FIR + if(o_fir_error) + { + return fapi2::FAPI2_RC_SUCCESS; + } + fapi_try_exit: return fapi2::current_err; } /// -/// @brief Checks whether any FIR have lit up -/// @param[in] i_target - the target on which to operate - MCBIST specialization +/// @brief Checks whether any FIRs have lit up on a target +/// @tparam T the fapi2::TargetType which hold the FIR bits +/// @param[in] i_target - the target on which to operate +/// @param[in,out] io_rc - the return code for the function /// @param[out] o_fir_error - true iff a FIR was hit /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok /// template< > -fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_target, bool& o_fir_error ) +fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_target, + fapi2::ReturnCode& io_rc, + bool& o_fir_error ) { // Start by assuming we do not have a FIR o_fir_error = false; @@ -338,7 +372,10 @@ fapi2::ReturnCode bad_fir_bits( const fapi2::Target& { FAPI_TRY(fir_with_mask(i_target, l_fir_reg, o_fir_error)); - // Exit if we found a FIR + // Log the error if need be + log_fir_helper(i_target, o_fir_error, io_rc); + + // Exit if we have found a FIR if(o_fir_error) { return fapi2::FAPI2_RC_SUCCESS; @@ -352,7 +389,10 @@ fapi2::ReturnCode bad_fir_bits( const fapi2::Target& { FAPI_TRY(fir_with_mask(l_mca, l_fir_reg, o_fir_error)); - // Exit if we found a FIR + // Log the error if need be + log_fir_helper(l_mca, o_fir_error, io_rc); + + // Exit if we have found a FIR if(o_fir_error) { return fapi2::FAPI2_RC_SUCCESS; @@ -361,21 +401,24 @@ fapi2::ReturnCode bad_fir_bits( const fapi2::Target& } // Lastly, check for PLL unlocks - FAPI_TRY(pll_fir(i_target, o_fir_error)); + FAPI_TRY(pll_fir(i_target, io_rc, o_fir_error)); fapi_try_exit: return fapi2::current_err; } - /// -/// @brief Checks whether any FIR have lit up -/// @param[in] i_target - the target on which to operate - MCA specialization +/// @brief Checks whether any FIRs have lit up on a target +/// @tparam T the fapi2::TargetType which hold the FIR bits +/// @param[in] i_target - the target on which to operate +/// @param[in,out] io_rc - the return code for the function /// @param[out] o_fir_error - true iff a FIR was hit /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok /// template< > -fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_target, bool& o_fir_error ) +fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_target, + fapi2::ReturnCode& io_rc, + bool& o_fir_error ) { const auto& l_mcbist = mss::find_target(i_target); // Start by assuming we do not have a FIR @@ -387,7 +430,10 @@ fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_t { FAPI_TRY(fir_with_mask(l_mcbist, l_fir_reg, o_fir_error)); - // Exit if we found a FIR + // Log the error if need be + log_fir_helper(l_mcbist, o_fir_error, io_rc); + + // Exit if we have found a FIR if(o_fir_error) { return fapi2::FAPI2_RC_SUCCESS; @@ -399,7 +445,10 @@ fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_t { FAPI_TRY(fir_with_mask(i_target, l_fir_reg, o_fir_error)); - // Exit if we found a FIR + // Log the error if need be + log_fir_helper(i_target, o_fir_error, io_rc); + + // Exit if we have found a FIR if(o_fir_error) { return fapi2::FAPI2_RC_SUCCESS; @@ -407,25 +456,11 @@ fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_t } // Lastly, check for PLL unlocks - FAPI_TRY(pll_fir(l_mcbist, o_fir_error)); + FAPI_TRY(pll_fir(l_mcbist, io_rc, o_fir_error)); fapi_try_exit: return fapi2::current_err; } - -/// -/// @brief Checks whether any FIR have lit up -/// @param[in] i_target - the target on which to operate - DIMM specialization -/// @param[out] o_fir_error - true iff a FIR was hit -/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok -/// -template< > -fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_target, bool& o_fir_error ) -{ - const auto l_mca = mss::find_target(i_target); - return bad_fir_bits(l_mca, o_fir_error); -} - } } diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.H b/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.H index 7e4d3c96c..9f1e96c92 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/fir/check.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2017 */ +/* Contributors Listed Below - COPYRIGHT 2016,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -85,20 +85,24 @@ bool pll_unlock( const fapi2::buffer& i_local_fir, /// /// @brief Checks whether any PLL FIRs have been set on a target /// @param[in] i_target - the target on which to operate +/// @param[in,out] io_rc - the return code for the function /// @param[out] o_fir_error - true iff a FIR was hit /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok /// -fapi2::ReturnCode pll_fir( const fapi2::Target& i_target, bool& o_fir_error ); +fapi2::ReturnCode pll_fir( const fapi2::Target& i_target, + fapi2::ReturnCode& io_rc, + bool& o_fir_error ); /// /// @brief Checks whether any FIRs have lit up on a target /// @tparam T the fapi2::TargetType which hold the FIR bits /// @param[in] i_target - the target on which to operate +/// @param[in,out] io_rc - the return code for the function /// @param[out] o_fir_error - true iff a FIR was hit /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok /// template< fapi2::TargetType T > -fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_target, bool& o_fir_error ); +fapi2::ReturnCode bad_fir_bits( const fapi2::Target& i_target, fapi2::ReturnCode& io_rc, bool& o_fir_error ); /// /// @brief Checks whether the passed in FIRs have any un-masked errors set @@ -145,15 +149,15 @@ fapi_try_exit: /// @brief Checks whether a FIR or unlocked PLL could be the root cause of another failure /// @tparam T the fapi2::TargetType which hold the FIR bits /// @param[in] i_target - the target on which to operate -/// @param[in] i_rc - the return code for the function - cannot be const due to a HB compile issue +/// @param[in,out] io_rc - the return code for the function /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok /// @note This is a helper function to enable unit testing /// template< fapi2::TargetType T > -fapi2::ReturnCode hostboot_fir_or_pll_fail( const fapi2::Target& i_target, fapi2::ReturnCode& i_rc) +fapi2::ReturnCode hostboot_fir_or_pll_fail( const fapi2::Target& i_target, fapi2::ReturnCode& io_rc) { // We didn't have an error, so return success - if(i_rc == fapi2::FAPI2_RC_SUCCESS) + if(io_rc == fapi2::FAPI2_RC_SUCCESS) { FAPI_INF("%s has a good return code, returning success", mss::c_str(i_target)); return fapi2::FAPI2_RC_SUCCESS; @@ -164,7 +168,7 @@ fapi2::ReturnCode hostboot_fir_or_pll_fail( const fapi2::Target& i_target, fa FAPI_ERR("%s has a bad return code, time to check some firs!", mss::c_str(i_target)); - l_fircheck_scom_err = bad_fir_bits(i_target, l_fir_error); + l_fircheck_scom_err = bad_fir_bits(i_target, io_rc, l_fir_error); FAPI_ERR("%s took a fail. FIR was %s", mss::c_str(i_target), l_fir_error ? "set - returning FIR RC" : "unset - returning inputted RC"); @@ -173,12 +177,11 @@ fapi2::ReturnCode hostboot_fir_or_pll_fail( const fapi2::Target& i_target, fa // PRD will handle the original error if(l_fir_error) { - fapi2::log_related_error(i_target, i_rc, fapi2::FAPI2_ERRL_SEV_RECOVERED); fapi2::current_err = fapi2::FAPI2_RC_SUCCESS; } else { - fapi2::current_err = i_rc; + fapi2::current_err = io_rc; } return fapi2::current_err; @@ -188,17 +191,18 @@ fapi2::ReturnCode hostboot_fir_or_pll_fail( const fapi2::Target& i_target, fa /// @brief Checks whether a FIR or unlocked PLL could be the root cause of another failure, if a check fir boolean is passed in /// @tparam T the fapi2::TargetType which hold the FIR bits /// @param[in] i_target - the target on which to operate -/// @param[in] i_rc - the return code for the function - cannot be const due to a HB compile issue +/// @param[in,out] io_rc - the return code for the function /// @param[in] i_check_fir - true IFF the FIR needs to be checked - defaults to true /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok /// template< fapi2::TargetType T > -fapi2::ReturnCode fir_or_pll_fail( const fapi2::Target& i_target, fapi2::ReturnCode& i_rc, +fapi2::ReturnCode fir_or_pll_fail( const fapi2::Target& i_target, + fapi2::ReturnCode& io_rc, const bool i_check_fir = true) { #ifdef __HOSTBOOT_MODULE - fapi2::ReturnCode l_rc(i_rc); + fapi2::ReturnCode l_rc(io_rc); // If need be, check the FIR below if(i_check_fir) @@ -210,7 +214,7 @@ fapi2::ReturnCode fir_or_pll_fail( const fapi2::Target& i_target, fapi2::Retu return l_rc; #else - return i_rc; + return io_rc; #endif } diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C b/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C index 6c085ce43..b8aa9366e 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C @@ -704,7 +704,7 @@ fapi_try_exit: mss::c_str(l_mca)); // Checks the FIR's, if need be - return mss::check::fir_or_pll_fail( i_target, fapi2::current_err, l_check_firs); + return mss::check::fir_or_pll_fail( l_mca, fapi2::current_err, l_check_firs); } /// diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C b/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C index 975c0ae6b..b7fceab3b 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C @@ -4208,7 +4208,11 @@ fapi2::ReturnCode record_bad_bits( const fapi2::Target& // PRD will handle the FIR and retrigger the procedure #ifdef __HOSTBOOT_MODULE bool l_fir_error = false; - FAPI_TRY(mss::check::bad_fir_bits(i_target, l_fir_error), "%s took an error while checking FIR's", + + // Note: using success here will cause an RC to not be logged + // We can still see if we do have a FIR error though + fapi2::ReturnCode l_rc(fapi2::FAPI2_RC_SUCCESS); + FAPI_TRY(mss::check::bad_fir_bits(i_target, l_rc, l_fir_error), "%s took an error while checking FIR's", mss::c_str(i_target)); // Exit if we took a FIR error - PRD will handle bad bits @@ -4359,7 +4363,7 @@ fapi2::ReturnCode process_rdvref_cal_errors( const fapi2::Target