Skip to content

Commit

Permalink
Update explorer CCS ODTs to support mirroring A-B
Browse files Browse the repository at this point in the history
Follow up to: I8065296dc0f366b7abdd1aa18a0ffb7135177145

Change-Id: I0b9d9c9c9798873d531eed18b334d628146d989b
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/94022
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@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: Louis Stermole <stermole@us.ibm.com>
Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com>
Dev-Ready: Mark Pizzutillo <mark.pizzutillo@ibm.com>
Reviewed-by: Jennifer A Stofer <stofer@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/94116
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: Daniel M Crowell <dcrowell@us.ibm.com>
  • Loading branch information
markypizz authored and dcrowell77 committed Apr 10, 2020
1 parent 4b0d4cb commit 5e3449a
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 7 deletions.
Expand Up @@ -286,6 +286,33 @@ class ccsTraits<mss::mc_type::EXPLORER>
return fapi2::current_err;
}

///
/// @brief Tie DIMM0 and DIMM1 ODTs if needed, when CS's are tied
///
/// @param[in] i_target PORT target type
/// @param[in,out] io_ccs_value CCS values with ODT fields
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success, else error code
///
static fapi2::ReturnCode odt_tied(
const fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT>& i_target,
fapi2::buffer<uint8_t>& io_ccs_value)
{
bool l_cs_tied = false;
FAPI_TRY(mss::get_cs_tied(i_target, l_cs_tied));

if (l_cs_tied)
{
// Overwrite DIMM1 ODTs with DIMM0's, since they are mirrored
// when the CS's are mirrored
io_ccs_value.template writeBit<CCS_ODT_DIMM1_R0>(io_ccs_value.template getBit<CCS_ODT_DIMM0_R0>());
io_ccs_value.template writeBit<CCS_ODT_DIMM1_R1>(io_ccs_value.template getBit<CCS_ODT_DIMM0_R1>());
}

fapi_try_exit:
return fapi2::current_err;
}


///
/// @brief Gets the attribute for checking our rank configuration
/// @param[in] i_target the port target on which to operate
Expand Down
Expand Up @@ -288,6 +288,20 @@ class ccsTraits<mss::mc_type::NIMBUS>
return fapi2::FAPI2_RC_SUCCESS;
}

///
/// @brief Tie DIMM0 and DIMM1 ODTs if needed, when CS's are tied (NO-OP for Nimbus)
///
/// @param[in] i_target PORT target type
/// @param[in,out] io_ccs_value CCS values with ODT fields
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success, else error code
///
static fapi2::ReturnCode odt_tied(
const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target,
fapi2::buffer<uint8_t>& io_ccs_value)
{
return fapi2::FAPI2_RC_SUCCESS;
}

///
/// @brief Gets the attribute for checking our rank configuration
/// @param[in] i_target the port target on which to operate
Expand Down
Expand Up @@ -666,8 +666,12 @@ inline fapi2::ReturnCode mpr_read( const fapi2::Target<fapi2::TARGET_TYPE_DIMM>&

// Holds the RD ODT's for 5 cycles
{
const auto l_ccs_value = mss::ccs::convert_odt_attr_to_ccs(fapi2::buffer<uint8_t>
(l_rd_odt[l_dimm_rank]));
uint8_t l_ccs_value = 0;
FAPI_TRY(mss::ccs::convert_odt_attr_to_ccs(
fapi2::buffer<uint8_t>(l_rd_odt[l_dimm_rank]),
l_mca,
l_ccs_value));

auto l_odt = mss::ccs::odt_command(l_ccs_value, ODT_CYCLE_LEN);
l_program.iv_instructions.push_back(l_odt);
}
Expand Down
20 changes: 15 additions & 5 deletions src/import/generic/memory/lib/ccs/ccs.H
Expand Up @@ -504,12 +504,16 @@ inline instruction_t des_command(const uint16_t i_idle = 0)
/// @brief Converts an ODT attribute to CCS array input
/// @tparam TT the CCS traits of the chiplet which executes the CCS instruction
/// @param[in] i_attr_value ODT attribute value
/// @return CCS value for the ODT's
/// @param[in] i_target PORT target type
/// @param[out] CCS value for the ODT's
/// @return FAPI2_RC_SUCCESS iff success, else error code
///
inline uint8_t convert_odt_attr_to_ccs(const fapi2::buffer<uint8_t>& i_attr_value)
template< typename TT = ccsTraits<DEFAULT_MC_TYPE> >
inline fapi2::ReturnCode convert_odt_attr_to_ccs(
const fapi2::buffer<uint8_t>& i_attr_value,
const fapi2::Target<TT::PORT_TARGET_TYPE>& i_target,
uint8_t& o_ccs_value)
{
using TT = ccsTraits<DEFAULT_MC_TYPE>;

// ODT value buffer
fapi2::buffer<uint8_t> l_ccs_value;
l_ccs_value.template writeBit<TT::CCS_ODT_DIMM0_R0>(i_attr_value.template getBit<TT::ATTR_ODT_DIMM0_R0>())
Expand All @@ -518,7 +522,13 @@ inline uint8_t convert_odt_attr_to_ccs(const fapi2::buffer<uint8_t>& i_attr_valu
.template writeBit<TT::CCS_ODT_DIMM1_R0>(i_attr_value.template getBit<TT::ATTR_ODT_DIMM1_R0>())
.template writeBit<TT::CCS_ODT_DIMM1_R1>(i_attr_value.template getBit<TT::ATTR_ODT_DIMM1_R1>());

return uint8_t(l_ccs_value);
// Set ODT_DIMM1_R0 & R1 <-- ODT_DIMM0_R0 & R1 if CS/ODt needs to be tied
FAPI_TRY(TT::odt_tied(i_target, l_ccs_value));

o_ccs_value = uint8_t(l_ccs_value);

fapi_try_exit:
return fapi2::current_err;
}

///
Expand Down

0 comments on commit 5e3449a

Please sign in to comment.