diff options
author | Stephen Glancy <sglancy@us.ibm.com> | 2019-03-17 14:38:46 -0400 |
---|---|---|
committer | Christian R. Geddes <crgeddes@us.ibm.com> | 2019-04-16 12:58:58 -0500 |
commit | 98267572c8c143aa73388239954331b0e1422871 (patch) | |
tree | edf220db7340fe2576c004fda54ddbbc9164137e /src/import/generic/memory/lib/utils | |
parent | ffe6b03116231ad51ef13016c2211913b7fb9bf6 (diff) | |
download | talos-hostboot-98267572c8c143aa73388239954331b0e1422871.tar.gz talos-hostboot-98267572c8c143aa73388239954331b0e1422871.zip |
Fixes LRDIM dual-drop 4R frequency/plug rules bugs
Change-Id: Ibe1fd639b5812ffb1b7baa418dccb07f869a800b
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/73512
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>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Reviewed-by: Mark Pizzutillo <mark.pizzutillo@ibm.com>
Reviewed-by: ANDRE A. MARIN <aamarin@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/73520
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Tested-by: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src/import/generic/memory/lib/utils')
-rw-r--r-- | src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H b/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H index cf96a1f5d..3b2f7ded9 100644 --- a/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H +++ b/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H @@ -63,6 +63,17 @@ fapi2::ReturnCode num_master_ranks_per_dimm(const fapi2::Target<fapi2::TARGET_TY uint8_t& o_master_ranks); /// +/// @brief Gets the DIMM type for a specific DIMM +/// @tparam P mss::proc_type on which to operate +/// @param[in] i_target DIMM target +/// @param[out] o_dimm_type DIMM type on the DIMM target +/// @return FAPI2_RC_SUCCESS iff ok +/// +template<mss::proc_type P> +fapi2::ReturnCode get_dimm_type(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + uint8_t& o_dimm_type); + +/// /// @brief Gets the attribute for the maximum allowed dimm frequency /// @tparam P mss::proc_type on which to operate /// @param[out] o_allowed_dimm_freq allowed dimm frequency @@ -583,8 +594,11 @@ inline fapi2::ReturnCode limit_freq_by_mrw(const fapi2::Target<TT::FREQ_TARGET_T for (const auto& d : l_dimms) { uint8_t l_num_master_ranks = 0; + uint8_t l_dimm_type = 0; + uint8_t l_rank_index = 0; size_t l_index = 0xFF; FAPI_TRY( num_master_ranks_per_dimm<P>(d, l_num_master_ranks) ); + FAPI_TRY( get_dimm_type<P>(d, l_dimm_type)); // Just a quick check but we're in deep yogurt if this triggers FAPI_ASSERT( (l_num_master_ranks <= TT::MAX_PRIMARY_RANK_PER_DIMM), @@ -595,7 +609,11 @@ inline fapi2::ReturnCode limit_freq_by_mrw(const fapi2::Target<TT::FREQ_TARGET_T l_dimms_on_port, mss::c_str(d)); - l_index = l_indexes[l_dimms_on_port - 1][l_num_master_ranks - 1]; + // If we have an LRDIMM, it's treated as a one rank DIMM from the memory controller's perspective + l_rank_index = l_dimm_type == TT::LRDIMM_TYPE ? 0 : l_num_master_ranks - 1; + l_index = l_indexes[l_dimms_on_port - 1][l_rank_index]; + FAPI_INF("%s is %s. rank_index%u index:%u", spd::c_str(d), l_dimm_type == TT::LRDIMM_TYPE ? "LRDIMM" : "RDIMM", + l_rank_index, l_index); FAPI_ASSERT( (l_index < NUM_MAX_FREQS), fapi2::MSS_FREQ_INDEX_TOO_LARGE() @@ -609,7 +627,7 @@ inline fapi2::ReturnCode limit_freq_by_mrw(const fapi2::Target<TT::FREQ_TARGET_T FAPI_INF("%s rank config %d drop %d yields max freq attribute index of %d (%d)", mss::c_str(d), l_num_master_ranks, l_dimms_on_port, - l_indexes[l_dimms_on_port - 1][l_num_master_ranks - 1], + l_indexes[l_dimms_on_port - 1][l_rank_index], i_max_mrw_freqs[l_index] ); l_port_max_freq = std::min(l_port_max_freq, i_max_mrw_freqs[l_index]); |