summaryrefslogtreecommitdiffstats
path: root/src/import/generic
diff options
context:
space:
mode:
Diffstat (limited to 'src/import/generic')
-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
-rw-r--r--src/import/generic/procedures/xml/attribute_info/generic_memory_si_attributes.xml2
4 files changed, 73 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])
diff --git a/src/import/generic/procedures/xml/attribute_info/generic_memory_si_attributes.xml b/src/import/generic/procedures/xml/attribute_info/generic_memory_si_attributes.xml
index 38eccdbe3..9ff21bdd1 100644
--- a/src/import/generic/procedures/xml/attribute_info/generic_memory_si_attributes.xml
+++ b/src/import/generic/procedures/xml/attribute_info/generic_memory_si_attributes.xml
@@ -458,6 +458,7 @@
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]
+ For Explorer: Only bits 0,1,4,5 are used. They correspond to A0 A1 -- -- B0 B1 -- --
</description>
<initToZero></initToZero>
<valueType>uint8</valueType>
@@ -474,6 +475,7 @@
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]
+ For Explorer: Only bits 0,1,4,5 are used. They correspond to A0 A1 -- -- B0 B1 -- --
</description>
<initToZero></initToZero>
<valueType>uint8</valueType>
OpenPOWER on IntegriCloud