summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/memory
diff options
context:
space:
mode:
authorStephen Glancy <sglancy@us.ibm.com>2018-01-09 14:12:05 -0600
committerChristian R. Geddes <crgeddes@us.ibm.com>2018-01-25 10:42:59 -0500
commit548b7fd4484c4c780cb0837e8e4a920db2a1f5a9 (patch)
tree4e1172e08202dcdbefa6018d149355cb3a2ef629 /src/import/chips/p9/procedures/hwp/memory
parent82769e0a939f902d9bbbb36404ab787990ff237b (diff)
downloadtalos-hostboot-548b7fd4484c4c780cb0837e8e4a920db2a1f5a9.tar.gz
talos-hostboot-548b7fd4484c4c780cb0837e8e4a920db2a1f5a9.zip
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 <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: ANDRE A. MARIN <aamarin@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/51697 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory')
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/fir/check.C93
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/fir/check.H30
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/phy/ddr_phy.C2
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C10
4 files changed, 89 insertions, 46 deletions
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<fapi2::TARGET_TY
fapi_try_exit:
// Handle any fails seen above accordingly
- return mss::check::fir_or_pll_fail( i_target, fapi2::current_err, l_check_fir);
+ return mss::check::fir_or_pll_fail( l_mca, fapi2::current_err, l_check_fir);
}
// Declares FIR registers that are re-used between multiple functions
@@ -256,6 +256,24 @@ static const std::vector<std::pair<uint64_t, uint64_t>> MCA_FIR_REGS =
};
///
+/// @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<T>& 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
/// @param[in] i_perv_fir - the pervasive PLL FIR
@@ -290,10 +308,13 @@ bool pll_unlock( const fapi2::buffer<uint64_t>& 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<fapi2::TARGET_TYPE_MCBIST>& i_target, bool& o_fir_error )
+fapi2::ReturnCode pll_fir( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& 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<fapi2::TARGET_TYPE_MCBIST>& 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<fapi2::TARGET_TYPE_MCBIST>& i_target, bool& o_fir_error )
+fapi2::ReturnCode bad_fir_bits( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& 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<fapi2::TARGET_TYPE_MCBIST>&
{
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<fapi2::TARGET_TYPE_MCBIST>&
{
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<fapi2::TARGET_TYPE_MCBIST>&
}
// 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<fapi2::TARGET_TYPE_MCA>& i_target, bool& o_fir_error )
+fapi2::ReturnCode bad_fir_bits( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target,
+ fapi2::ReturnCode& io_rc,
+ bool& o_fir_error )
{
const auto& l_mcbist = mss::find_target<fapi2::TARGET_TYPE_MCBIST>(i_target);
// Start by assuming we do not have a FIR
@@ -387,7 +430,10 @@ fapi2::ReturnCode bad_fir_bits( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& 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<fapi2::TARGET_TYPE_MCA>& 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<fapi2::TARGET_TYPE_MCA>& 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<fapi2::TARGET_TYPE_DIMM>& i_target, bool& o_fir_error )
-{
- const auto l_mca = mss::find_target<fapi2::TARGET_TYPE_MCA>(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<uint64_t>& 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<fapi2::TARGET_TYPE_MCBIST>& i_target, bool& o_fir_error );
+fapi2::ReturnCode pll_fir( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& 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<T>& i_target, bool& o_fir_error );
+fapi2::ReturnCode bad_fir_bits( const fapi2::Target<T>& 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<T>& i_target, fapi2::ReturnCode& i_rc)
+fapi2::ReturnCode hostboot_fir_or_pll_fail( const fapi2::Target<T>& 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<T>& 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<T>& 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<T>& 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<T>& i_target, fapi2::ReturnCode& i_rc,
+fapi2::ReturnCode fir_or_pll_fail( const fapi2::Target<T>& 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<T>& 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<fapi2::TARGET_TYPE_MCA>&
// 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<fapi2::TARGET_T
fapi_try_exit:
// If the FIR's are cal fails, then check to see if FIRs or PLL fails were the cause
- return mss::check::fir_or_pll_fail( i_target, fapi2::current_err, l_cal_fail);
+ return mss::check::fir_or_pll_fail( l_mca, fapi2::current_err, l_cal_fail);
}
///
@@ -4461,7 +4465,7 @@ fapi2::ReturnCode process_wrvref_cal_errors( const fapi2::Target<fapi2::TARGET_T
fapi_try_exit:
// If the FIR's are cal fails, then check to see if FIR's were the cause
- return mss::check::fir_or_pll_fail( i_target, fapi2::current_err, l_cal_fail);
+ return mss::check::fir_or_pll_fail( l_mca, fapi2::current_err, l_cal_fail);
}
///
OpenPOWER on IntegriCloud