summaryrefslogtreecommitdiffstats
path: root/src/import/generic/memory/lib
diff options
context:
space:
mode:
authorMark Pizzutillo <Mark.Pizzutillo@ibm.com>2019-10-29 12:20:39 -0400
committerDaniel M Crowell <dcrowell@us.ibm.com>2019-11-13 09:15:31 -0600
commit3f280b8d23c3c26dc28b4c0d5672f17842c7d8f6 (patch)
tree2c1622b977ee4706e428a1f288fbfc305d3a81bd /src/import/generic/memory/lib
parentfcbb09411953da21ad2354bbe30464ebdd61c236 (diff)
downloadtalos-hostboot-3f280b8d23c3c26dc28b4c0d5672f17842c7d8f6.tar.gz
talos-hostboot-3f280b8d23c3c26dc28b4c0d5672f17842c7d8f6.zip
Fix odt RD/WR fields
Change-Id: I4aaa23af53a72e4f90218daedbed80d8721ff337 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/86280 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: STEPHEN GLANCY <sglancy@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Reviewed-by: Jennifer A Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/86542 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>
Diffstat (limited to 'src/import/generic/memory/lib')
-rw-r--r--src/import/generic/memory/lib/data_engine/attr_engine_traits.H46
-rw-r--r--src/import/generic/memory/lib/data_engine/data_engine_utils.H34
-rw-r--r--src/import/generic/memory/lib/mss_generic_attribute_getters.H12
3 files changed, 71 insertions, 21 deletions
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 <generic/memory/lib/spd/spd_facade.H>
#include <generic/memory/lib/data_engine/data_engine_traits_def.H>
#include <generic/memory/lib/data_engine/data_engine.H>
+#include <generic/memory/lib/data_engine/data_engine_utils.H>
#include <generic/memory/lib/mss_generic_attribute_getters.H>
#include <generic/memory/lib/mss_generic_attribute_setters.H>
#include <generic/memory/lib/mss_generic_system_attribute_getters.H>
#include <generic/memory/lib/spd/ddimm/efd_decoder.H>
-#include <generic/memory/lib/utils/buffer_ops.H>
#include <generic/memory/lib/utils/dimm/mss_timing.H>
#include <generic/memory/lib/spd/spd_utils.H>
@@ -1831,6 +1831,8 @@ struct attrEngineTraits<P, attr_si_engine_fields, attr_si_engine_fields::SI_ODT_
{
uint8_t l_value = 0;
+ const auto l_ocmb = i_efd_data->get_ocmb_target();
+
switch(i_efd_data->get_rank())
{
case 0:
@@ -1850,17 +1852,21 @@ struct attrEngineTraits<P, attr_si_engine_fields, attr_si_engine_fields::SI_ODT_
break;
default:
- // TODO Add FFDC
- fapi2::Assert(false);
+ FAPI_ASSERT(false,
+ fapi2::MSS_INVALID_SPD_RANK().
+ set_FUNCTION(SET_SI_ODT_WR).
+ set_RANK( i_efd_data->get_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 attrEngineTraits<P, attr_si_engine_fields, attr_si_engine_fields::SI_ODT_
{
uint8_t l_value = 0;
+ const auto l_ocmb = i_efd_data->get_ocmb_target();
+
switch(i_efd_data->get_rank())
{
case 0:
@@ -1935,17 +1943,21 @@ struct attrEngineTraits<P, attr_si_engine_fields, attr_si_engine_fields::SI_ODT_
break;
default:
- // TODO Add FFDC
- fapi2::Assert(false);
+ FAPI_ASSERT(false,
+ fapi2::MSS_INVALID_SPD_RANK().
+ set_FUNCTION(SET_SI_ODT_RD).
+ set_RANK( i_efd_data->get_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 <generic/memory/lib/mss_generic_attribute_getters.H>
#include <generic/memory/lib/utils/conversions.H>
#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+#include <generic/memory/lib/utils/buffer_ops.H>
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<uint8_t> 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<ODT2>(l_value.getBit<ODT2_OLD>());
+ l_value.writeBit<ODT3>(l_value.getBit<ODT3_OLD>());
+
+ l_value.clearBit<ODT2_OLD>();
+ l_value.clearBit<ODT3_OLD>();
+
+ 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<fapi2::TARGET_TYPE_DIMM>& 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<fapi2::TARGET_TYPE_MEM_PORT>& 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<fapi2::TARGET_TYPE_DIMM>& 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<fapi2::TARGET_TYPE_MEM_PORT>& i_target,
uint8_t (&o_array)[2][4])
OpenPOWER on IntegriCloud