From 3f280b8d23c3c26dc28b4c0d5672f17842c7d8f6 Mon Sep 17 00:00:00 2001 From: Mark Pizzutillo Date: Tue, 29 Oct 2019 12:20:39 -0400 Subject: Fix odt RD/WR fields Change-Id: I4aaa23af53a72e4f90218daedbed80d8721ff337 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/86280 Tested-by: FSP CI Jenkins Tested-by: Jenkins Server Tested-by: Hostboot CI Reviewed-by: Louis Stermole Reviewed-by: STEPHEN GLANCY Dev-Ready: STEPHEN GLANCY Tested-by: HWSV CI Reviewed-by: Jennifer A Stofer Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/86542 Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Reviewed-by: Daniel M Crowell --- .../memory/lib/data_engine/attr_engine_traits.H | 46 ++++++++++++++-------- .../memory/lib/data_engine/data_engine_utils.H | 34 ++++++++++++++++ .../memory/lib/mss_generic_attribute_getters.H | 12 ++++-- 3 files changed, 71 insertions(+), 21 deletions(-) (limited to 'src/import/generic/memory') diff --git a/src/import/generic/memory/lib/data_engine/attr_engine_traits.H b/src/import/generic/memory/lib/data_engine/attr_engine_traits.H index c31a5ae30..adfd81b3f 100644 --- a/src/import/generic/memory/lib/data_engine/attr_engine_traits.H +++ b/src/import/generic/memory/lib/data_engine/attr_engine_traits.H @@ -40,11 +40,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include @@ -1831,6 +1831,8 @@ struct attrEngineTraitsget_ocmb_target(); + switch(i_efd_data->get_rank()) { case 0: @@ -1850,17 +1852,21 @@ struct attrEngineTraitsget_rank() ). + set_TARGET(l_ocmb), + "%s SPD decoder returned invalid rank: %d", + spd::c_str(l_ocmb), + i_efd_data->get_rank()); break; }; - // TK update to handle differentiating 2 DIMMs, defaulted to DIMM0 case for explorer - { - // Map to attribute bitmap - reverse(l_value); - o_setting = l_value; - } + // Map to attribute bitmap + l_value = mss::gen::align_odt_field_to_attr(l_value); + + o_setting = l_value; fapi_try_exit: return fapi2::current_err; @@ -1916,6 +1922,8 @@ struct attrEngineTraitsget_ocmb_target(); + switch(i_efd_data->get_rank()) { case 0: @@ -1935,17 +1943,21 @@ struct attrEngineTraitsget_rank() ). + set_TARGET(l_ocmb), + "%s SPD decoder returned invalid rank: %d", + spd::c_str(l_ocmb), + i_efd_data->get_rank()); break; }; - // TK update to handle differentiating 2 DIMMs, defaulted to DIMM0 case for explorer - { - // Map to attribute bitmap - reverse(l_value); - o_setting = l_value; - } + // Map to attribute bitmap + l_value = mss::gen::align_odt_field_to_attr(l_value); + + o_setting = l_value; fapi_try_exit: return fapi2::current_err; diff --git a/src/import/generic/memory/lib/data_engine/data_engine_utils.H b/src/import/generic/memory/lib/data_engine/data_engine_utils.H index d29f31e86..5e0c070fd 100644 --- a/src/import/generic/memory/lib/data_engine/data_engine_utils.H +++ b/src/import/generic/memory/lib/data_engine/data_engine_utils.H @@ -47,6 +47,7 @@ #include #include #include +#include namespace mss { @@ -478,6 +479,39 @@ fapi_try_exit: return fapi2::current_err; } +/// +/// @brief Shift the bits of the SPD field to match the attribute format +/// @param[in] i_value ODT field value from SPD +/// @return ATTR formatted uint8_t +/// +static inline uint8_t align_odt_field_to_attr(const uint8_t i_value) +{ + static constexpr uint8_t ODT2_OLD = 2; + static constexpr uint8_t ODT3_OLD = 3; + static constexpr uint8_t ODT2 = 4; + static constexpr uint8_t ODT3 = 5; + + fapi2::buffer l_value(i_value); + // Map to attribute bitmap + reverse(l_value); + + // l_value currently looks like: + // XXYY0000 + // ODT + // 0123---- + // + // We need it to look like: + // XX00YY00 + // 01--23-- + l_value.writeBit(l_value.getBit()); + l_value.writeBit(l_value.getBit()); + + l_value.clearBit(); + l_value.clearBit(); + + return l_value(); +} + }// gen }//mss diff --git a/src/import/generic/memory/lib/mss_generic_attribute_getters.H b/src/import/generic/memory/lib/mss_generic_attribute_getters.H index aa496b8d7..0dc348821 100644 --- a/src/import/generic/memory/lib/mss_generic_attribute_getters.H +++ b/src/import/generic/memory/lib/mss_generic_attribute_getters.H @@ -4190,7 +4190,8 @@ fapi_try_exit: /// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK /// @note Array[DIMM][RANK] READ, On Die Termination triggering bitmap. Use bitmap to determine /// which ODT to fire for the designated rank. The bits in 8 bit field are [DIMM0 ODT0][DIMM0 -/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] +/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] For +/// Explorer: Only bits 0,1,4,5 are used. They correspond to A0 A1 -- -- B0 B1 -- -- /// inline fapi2::ReturnCode get_si_odt_rd(const fapi2::Target& i_target, uint8_t (&o_array)[4]) { @@ -4215,7 +4216,8 @@ fapi_try_exit: /// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK /// @note Array[DIMM][RANK] READ, On Die Termination triggering bitmap. Use bitmap to determine /// which ODT to fire for the designated rank. The bits in 8 bit field are [DIMM0 ODT0][DIMM0 -/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] +/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] For +/// Explorer: Only bits 0,1,4,5 are used. They correspond to A0 A1 -- -- B0 B1 -- -- /// inline fapi2::ReturnCode get_si_odt_rd(const fapi2::Target& i_target, uint8_t (&o_array)[2][4]) @@ -4240,7 +4242,8 @@ fapi_try_exit: /// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK /// @note Array[DIMM][RANK] WRITE, On Die Termination triggering bitmap. Use bitmap to determine /// which ODT to fire for the designated rank. The bits in 8 bit field are [DIMM0 ODT0][DIMM0 -/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] +/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] For +/// Explorer: Only bits 0,1,4,5 are used. They correspond to A0 A1 -- -- B0 B1 -- -- /// inline fapi2::ReturnCode get_si_odt_wr(const fapi2::Target& i_target, uint8_t (&o_array)[4]) { @@ -4265,7 +4268,8 @@ fapi_try_exit: /// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK /// @note Array[DIMM][RANK] WRITE, On Die Termination triggering bitmap. Use bitmap to determine /// which ODT to fire for the designated rank. The bits in 8 bit field are [DIMM0 ODT0][DIMM0 -/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] +/// ODT1][DIMM0 ODT2][DIMM0 ODT3][DIMM1 ODT0][DIMM1 ODT1][DIMM1 ODT2][DIMM1 ODT3] For +/// Explorer: Only bits 0,1,4,5 are used. They correspond to A0 A1 -- -- B0 B1 -- -- /// inline fapi2::ReturnCode get_si_odt_wr(const fapi2::Target& i_target, uint8_t (&o_array)[2][4]) -- cgit v1.2.1