Skip to content

Commit

Permalink
Moves blame a FIR API to generic
Browse files Browse the repository at this point in the history
Change-Id: I4486acdd2fa9ee6a5d48808f52b43e2203967830
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/73325
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Louis Stermole <stermole@us.ibm.com>
Reviewed-by: Mark Pizzutillo <mark.pizzutillo@ibm.com>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Dev-Ready: STEPHEN GLANCY <sglancy@us.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/73352
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Tested-by: Christian R. Geddes <crgeddes@us.ibm.com>
  • Loading branch information
sglancy6 authored and crgeddes committed Apr 15, 2019
1 parent 4cfa805 commit 745094d
Show file tree
Hide file tree
Showing 8 changed files with 135 additions and 131 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* Contributors Listed Below - COPYRIGHT 2018,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -103,12 +103,12 @@ extern "C"

fapi_try_exit:
FAPI_INF("Draminit training - %s %s",
(fapi2::current_err == fapi2::FAPI2_RC_SUCCESS ? "success" : "errors reported"),
(fapi2::current_err == fapi2::FAPI2_RC_SUCCESS ? "success" : "errors reported - trying to blame FIR's"),
mss::c_str(i_target));

// TK update this to check FIR's or PLL failures - that will be updated in another commit
// For now, return current_err
return fapi2::current_err;

// Due to the RAS/PRD requirements, we need to check for FIR's
// If any FIR's have lit up, this draminit fail could have been caused by the FIR, rather than bad hardware
// So, let PRD retrigger this step to see if we can resolve the issue
return mss::check::fir_or_pll_fail<mss::mc_type::EXPLORER>(i_target, fapi2::current_err);
}
}
2 changes: 1 addition & 1 deletion src/import/chips/p9/procedures/hwp/memory/lib/ccs/ccs.C
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ fapi_try_exit:
// Due to the PRD update, we need to check for FIR's
// If any FIR's have lit up, this CCS fail could have been caused by the FIR
// So, let PRD retrigger this step to see if we can resolve the issue
return mss::check::fir_or_pll_fail(i_target, fapi2::current_err);
return mss::check::fir_or_pll_fail<mss::mc_type::NIMBUS>(i_target, fapi2::current_err);
}

///
Expand Down
10 changes: 5 additions & 5 deletions src/import/chips/p9/procedures/hwp/memory/lib/fir/check.C
Original file line number Diff line number Diff line change
Expand Up @@ -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( l_mca, fapi2::current_err, l_check_fir);
return mss::check::fir_or_pll_fail<mss::mc_type::NIMBUS>( l_mca, fapi2::current_err, l_check_fir);
}

// Declares FIR registers that are re-used between multiple functions
Expand Down Expand Up @@ -378,7 +378,7 @@ fapi2::ReturnCode bad_fir_bits<mss::mc_type::NIMBUS>( const fapi2::Target<fapi2:
// Note: we return out if any FIR is bad
for(const auto& l_fir_reg : MCBIST_FIR_REGS)
{
FAPI_TRY(fir_with_mask(i_target, l_fir_reg, o_fir_error));
FAPI_TRY(fir_with_mask<mss::mc_type::NIMBUS>(i_target, l_fir_reg, o_fir_error));

// Log the error if need be
log_fir_helper(i_target, o_fir_error, io_rc);
Expand All @@ -395,7 +395,7 @@ fapi2::ReturnCode bad_fir_bits<mss::mc_type::NIMBUS>( const fapi2::Target<fapi2:
{
for(const auto& l_fir_reg : MCA_FIR_REGS)
{
FAPI_TRY(fir_with_mask(l_mca, l_fir_reg, o_fir_error));
FAPI_TRY(fir_with_mask<mss::mc_type::NIMBUS>(l_mca, l_fir_reg, o_fir_error));

// Log the error if need be
log_fir_helper(l_mca, o_fir_error, io_rc);
Expand Down Expand Up @@ -441,7 +441,7 @@ fapi2::ReturnCode bad_fir_bits<mss::mc_type::NIMBUS>( const fapi2::Target<fapi2:
// Note: we return out if any FIR is bad
for(const auto& l_fir_reg : MCBIST_FIR_REGS)
{
FAPI_TRY(fir_with_mask(l_mcbist, l_fir_reg, o_fir_error));
FAPI_TRY(fir_with_mask<mss::mc_type::NIMBUS>(l_mcbist, l_fir_reg, o_fir_error));

// Log the error if need be
log_fir_helper(l_mcbist, o_fir_error, io_rc);
Expand All @@ -456,7 +456,7 @@ fapi2::ReturnCode bad_fir_bits<mss::mc_type::NIMBUS>( const fapi2::Target<fapi2:
// Loop through all MCA FIR's
for(const auto& l_fir_reg : MCA_FIR_REGS)
{
FAPI_TRY(fir_with_mask(i_target, l_fir_reg, o_fir_error));
FAPI_TRY(fir_with_mask<mss::mc_type::NIMBUS>(i_target, l_fir_reg, o_fir_error));

// Log the error if need be
log_fir_helper(i_target, o_fir_error, io_rc);
Expand Down
114 changes: 0 additions & 114 deletions src/import/chips/p9/procedures/hwp/memory/lib/fir/check.H
Original file line number Diff line number Diff line change
Expand Up @@ -94,120 +94,6 @@ fapi2::ReturnCode pll_fir( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& i_tar
fapi2::ReturnCode& io_rc,
bool& o_fir_error );

///
/// @brief Checks whether the passed in FIRs have any un-masked errors set
/// @tparam T the fapi2::TargetType which hold the FIR bits
/// @param[in] i_target - the target on which to operate
/// @param[in] i_fir_regs - FIR register and mask register
/// @param[out] o_fir_error - true iff a FIR was hit
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok
///
template< fapi2::TargetType T >
inline fapi2::ReturnCode fir_with_mask( const fapi2::Target<T>& i_target,
const std::pair<uint64_t, uint64_t>& i_fir_regs,
bool& o_fir_error )
{
// Temporary variables to make the code a bit more readable
const auto FIR_REG = i_fir_regs.first;
const auto FIR_MASK = i_fir_regs.second;

fapi2::buffer<uint64_t> l_fir;
fapi2::buffer<uint64_t> l_fir_mask;

// Read the registers
FAPI_TRY(mss::getScom(i_target, FIR_REG, l_fir));
FAPI_TRY(mss::getScom(i_target, FIR_MASK, l_fir_mask));


// The mask register will need to be inverted as a 0 in the mask register means the FIR is legit
// A bitwise and works the opposite way
l_fir_mask.invert();

// If we have any unmasked bit, set that we have a FIR error and exit out with success
// Note: we want to set success here as PRD will find the FIR as "new" and retrigger the procedure this way
o_fir_error = ((l_fir & l_fir_mask) != 0);

// And print the information for debuggability
FAPI_INF("%s %s on reg 0x%016lx value 0x%016lx and mask 0x%016lx value 0x%016lx", mss::c_str(i_target),
o_fir_error ? "has FIR's set" : "has no FIR's set", FIR_REG, l_fir, FIR_MASK, l_fir_mask.invert());

fapi_try_exit:
return fapi2::current_err;
}

///
/// @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,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& io_rc)
{
// We didn't have an error, so return 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;
}

fapi2::ReturnCode l_fircheck_scom_err(fapi2::FAPI2_RC_SUCCESS);
bool l_fir_error = false;

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<mss::mc_type::NIMBUS>(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");

// If we had a FIR error, log the original error and return success
// PRD will handle the original error
if(l_fir_error)
{
fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
}
else
{
fapi2::current_err = io_rc;
}

return fapi2::current_err;
}

///
/// @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,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& io_rc,
const bool i_check_fir = true)
{
#ifdef __HOSTBOOT_MODULE

fapi2::ReturnCode l_rc(io_rc);

// If need be, check the FIR below
if(i_check_fir)
{
// Handle any issues according to PRD FIR scheme, as a FIR could have caused this issue
l_rc = hostboot_fir_or_pll_fail(i_target, l_rc);
}

return l_rc;

#else
return io_rc;
#endif
}

}
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -723,7 +723,7 @@ fapi_try_exit:
mss::c_str(l_mca));

// Checks the FIR's, if need be
return mss::check::fir_or_pll_fail( l_mca, fapi2::current_err, l_check_firs);
return mss::check::fir_or_pll_fail<mss::mc_type::NIMBUS>( l_mca, fapi2::current_err, l_check_firs);
}

///
Expand Down
4 changes: 2 additions & 2 deletions src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C
Original file line number Diff line number Diff line change
Expand Up @@ -4324,7 +4324,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( l_mca, fapi2::current_err, l_cal_fail);
return mss::check::fir_or_pll_fail<mss::mc_type::NIMBUS>( l_mca, fapi2::current_err, l_cal_fail);
}

///
Expand Down Expand Up @@ -4426,7 +4426,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( l_mca, fapi2::current_err, l_cal_fail);
return mss::check::fir_or_pll_fail<mss::mc_type::NIMBUS>( l_mca, fapi2::current_err, l_cal_fail);
}

///
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,7 @@ fapi2::ReturnCode dqs_align_workaround(const fapi2::Target<fapi2::TARGET_TYPE_MC
fapi_try_exit:

// If the FIR's are cal fails, then check to see if FIR's or PLL's could be the cause
return mss::check::fir_or_pll_fail(i_target, fapi2::current_err, l_cal_fail);
return mss::check::fir_or_pll_fail<mss::mc_type::NIMBUS>(i_target, fapi2::current_err, l_cal_fail);
}

///
Expand Down
120 changes: 119 additions & 1 deletion src/import/generic/memory/lib/utils/mss_generic_check.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* Contributors Listed Below - COPYRIGHT 2018,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -38,6 +38,7 @@

#include <fapi2.H>
#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
#include <generic/memory/lib/utils/scom.H>
#include <generic/memory/lib/utils/c_str.H>

namespace mss
Expand All @@ -57,6 +58,123 @@ namespace check
template< mss::mc_type MC, fapi2::TargetType T >
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
/// @tparam MC MC type for which to check FIR's
/// @tparam T the fapi2::TargetType which hold the FIR bits
/// @param[in] i_target - the target on which to operate
/// @param[in] i_fir_regs - FIR register and mask register
/// @param[out] o_fir_error - true iff a FIR was hit
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok
///
template< mss::mc_type MC, fapi2::TargetType T >
inline fapi2::ReturnCode fir_with_mask( const fapi2::Target<T>& i_target,
const std::pair<uint64_t, uint64_t>& i_fir_regs,
bool& o_fir_error )
{
// Temporary variables to make the code a bit more readable
const auto FIR_REG = i_fir_regs.first;
const auto FIR_MASK = i_fir_regs.second;

fapi2::buffer<uint64_t> l_fir;
fapi2::buffer<uint64_t> l_fir_mask;

// Read the registers
FAPI_TRY(mss::getScom(i_target, FIR_REG, l_fir));
FAPI_TRY(mss::getScom(i_target, FIR_MASK, l_fir_mask));


// The mask register will need to be inverted as a 0 in the mask register means the FIR is legit
// A bitwise and works the opposite way
l_fir_mask.invert();

// If we have any unmasked bit, set that we have a FIR error and exit out with success
// Note: we want to set success here as PRD will find the FIR as "new" and retrigger the procedure this way
o_fir_error = ((l_fir & l_fir_mask) != 0);

// And print the information for debuggability
FAPI_INF("%s %s on reg 0x%016lx value 0x%016lx and mask 0x%016lx value 0x%016lx", mss::c_str(i_target),
o_fir_error ? "has FIR's set" : "has no FIR's set", FIR_REG, l_fir, FIR_MASK, l_fir_mask.invert());

fapi_try_exit:
return fapi2::current_err;
}

///
/// @brief Checks whether a FIR or unlocked PLL could be the root cause of another failure
/// @tparam MC MC type for which to check FIR's
/// @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
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok
/// @note This is a helper function to enable unit testing
///
template< mss::mc_type MC, fapi2::TargetType T >
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(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;
}

fapi2::ReturnCode l_fircheck_scom_err(fapi2::FAPI2_RC_SUCCESS);
bool l_fir_error = false;

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<MC>(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");

// If we had a FIR error, log the original error and return success
// PRD will handle the original error
if(l_fir_error)
{
fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
}
else
{
fapi2::current_err = io_rc;
}

return fapi2::current_err;
}

///
/// @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 MC MC type for which to check FIR's
/// @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[in] i_check_fir - true IFF the FIR needs to be checked - defaults to true
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff ok
///
template< mss::mc_type MC, fapi2::TargetType T >
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(io_rc);

// If need be, check the FIR below
if(i_check_fir)
{
// Handle any issues according to PRD FIR scheme, as a FIR could have caused this issue
l_rc = hostboot_fir_or_pll_fail<MC>(i_target, l_rc);
}

return l_rc;

#else
return io_rc;
#endif
}

///
/// @brief Checks conditional passes and implements traces & exits if it fails
/// @tparam T fapi2 target type
Expand Down

0 comments on commit 745094d

Please sign in to comment.