summaryrefslogtreecommitdiffstats
path: root/src/import/generic/memory/lib/spd
diff options
context:
space:
mode:
authorAndre Marin <aamarin@us.ibm.com>2018-07-24 00:02:23 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-08-06 09:32:54 -0500
commit6a03e838d00c6fb01525019c9b8c1cc3c667c7d3 (patch)
treeb2d8639f14c4e910c5a5b6efc60f17f34cde096f /src/import/generic/memory/lib/spd
parent95b925b6af0e553da06f61d89d2a0c1616882e29 (diff)
downloadtalos-hostboot-6a03e838d00c6fb01525019c9b8c1cc3c667c7d3.tar.gz
talos-hostboot-6a03e838d00c6fb01525019c9b8c1cc3c667c7d3.zip
Generalize byte reading from SPD reading, for exp i2c reuse
Change-Id: I388e5abd6639464514fb9ca2d555362e431b753c Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63209 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/63538 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/generic/memory/lib/spd')
-rw-r--r--src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H65
-rw-r--r--src/import/generic/memory/lib/spd/lrdimm/ddr4/lrdimm_decoder_ddr4.H3
-rw-r--r--src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H3
-rw-r--r--src/import/generic/memory/lib/spd/spd_checker.H35
-rw-r--r--src/import/generic/memory/lib/spd/spd_field.H79
-rw-r--r--src/import/generic/memory/lib/spd/spd_fields_ddr4.H324
-rw-r--r--src/import/generic/memory/lib/spd/spd_reader.H176
-rw-r--r--src/import/generic/memory/lib/spd/spd_traits.H17
8 files changed, 219 insertions, 483 deletions
diff --git a/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H b/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H
index 422d95443..96765b420 100644
--- a/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H
+++ b/src/import/generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H
@@ -49,7 +49,9 @@
#include <generic/memory/lib/spd/common/dimm_module_decoder.H>
#include <generic/memory/lib/spd/common/rcw_settings.H>
#include <generic/memory/lib/spd/common/spd_decoder_base.H>
+#include <generic/memory/lib/utils/mss_generic_check.H>
#include <generic/memory/lib/spd/spd_checker.H>
+#include <generic/memory/lib/utils/mss_buffer_utils.H>
namespace mss
{
@@ -155,11 +157,12 @@ static fapi2::ReturnCode nibble_map_helper( const fapi2::Target<fapi2::TARGET_TY
const bool VALID_LOWER_NIBBLE = (i_bit_order >= LOW_BIT_ORDER_MIN) && (i_bit_order <= LOW_BIT_ORDER_MAX);
const bool VALID_UPPER_NIBBLE = (i_bit_order >= UP_BIT_ORDER_MIN) && (i_bit_order <= UP_BIT_ORDER_MAX);
- FAPI_TRY(check::fail_for_invalid_value(i_target,
- (VALID_LOWER_NIBBLE || VALID_UPPER_NIBBLE),
- i_byte,
- i_bit_order,
- "Failed check on the NIBBLE_MAP field") );
+ FAPI_TRY(mss::check::invalid_value(i_target,
+ (VALID_LOWER_NIBBLE || VALID_UPPER_NIBBLE),
+ i_byte,
+ i_bit_order,
+ mss::BAD_SPD_DATA,
+ "Failed check on the NIBBLE_MAP field") );
fapi_try_exit:
return fapi2::current_err;
}
@@ -177,11 +180,12 @@ static fapi2::ReturnCode package_rank_map_helper( const fapi2::Target<fapi2::TAR
{
// Taken from the SPD JEDEC spec, only valid encoding, the rest are reserved
constexpr uint64_t VALID_VALUE = 0;
- FAPI_TRY(check::fail_for_invalid_value(i_target,
- (i_pkg_rank_map == VALID_VALUE),
- i_byte,
- i_pkg_rank_map,
- "Failed check on Package Rank Map") );
+ FAPI_TRY(mss::check::invalid_value(i_target,
+ (i_pkg_rank_map == VALID_VALUE),
+ i_byte,
+ i_pkg_rank_map,
+ mss::BAD_SPD_DATA,
+ "Failed check on Package Rank Map") );
fapi_try_exit:
return fapi2::current_err;
}
@@ -486,7 +490,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_twrmin_msn, l_twrmin_lsb);
+ right_aligned_insert(l_buffer, l_twrmin_msn, l_twrmin_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS12>(i_target, l_buffer, TWRMIN));
@@ -519,7 +523,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_twtr_lmin_msn, l_twtr_lmin_lsb);
+ right_aligned_insert(l_buffer, l_twtr_lmin_msn, l_twtr_lmin_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS12>(i_target, l_buffer, TWTR_L_MIN));
@@ -553,7 +557,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_twtr_smin_msn, l_twtr_smin_lsb);
+ right_aligned_insert(l_buffer, l_twtr_smin_msn, l_twtr_smin_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS12>(i_target, l_buffer, TWTR_S_MIN));
@@ -1182,17 +1186,18 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
// Buffers used for bit manipulation
// Combine Bytes to create bitmap - right aligned
fapi2::buffer<uint64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_fourth_raw_byte, l_third_raw_byte, l_sec_raw_byte, l_first_raw_byte);
+ right_aligned_insert(l_buffer, l_fourth_raw_byte, l_third_raw_byte, l_sec_raw_byte, l_first_raw_byte);
// According to the JEDEC spec:
// Byte 22 (Bits 7~0) and Byte 23 are reserved and thus not supported
// Check for a valid value
constexpr size_t MAX_VALID_VAL = 0x3FFFF;
- FAPI_TRY( check::fail_for_invalid_value(iv_target,
- l_buffer <= MAX_VALID_VAL,
- 23,
- l_buffer,
- "Failed check on CAS latencies supported") );
+ FAPI_TRY( mss::check::invalid_value(iv_target,
+ l_buffer <= MAX_VALID_VAL,
+ 23,
+ l_buffer,
+ mss::BAD_SPD_DATA,
+ "Failed check on CAS latencies supported") );
// Update output value only if range check passes
o_value = int64_t(l_buffer);
@@ -1259,7 +1264,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_tRASmin_msn, l_tRASmin_lsb);
+ right_aligned_insert(l_buffer, l_tRASmin_msn, l_tRASmin_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS12>(iv_target, l_buffer, TRASMIN));
@@ -1289,7 +1294,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
// Combining bits to create timing value (in a buffer)
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_trcmin_msn, l_trcmin_lsb);
+ right_aligned_insert(l_buffer, l_trcmin_msn, l_trcmin_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS12>(iv_target, l_buffer, TRCMIN));
@@ -1320,7 +1325,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
// Combining bits to create timing value (in a buffer)
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_trfc1min_msb, l_trfc1min_lsb);
+ right_aligned_insert(l_buffer, l_trfc1min_msb, l_trfc1min_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS16>(iv_target, l_buffer, TRFC1MIN));
@@ -1350,7 +1355,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
// Combining bits to create timing value (in a buffer)
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_trfc2min_msb, l_trfc2min_lsb);
+ right_aligned_insert(l_buffer, l_trfc2min_msb, l_trfc2min_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS16>(iv_target, l_buffer, TRFC2MIN));
@@ -1380,7 +1385,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
// Combining bits to create timing value (in a buffer)
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_trfc4min_msb, l_trfc4min_lsb);
+ right_aligned_insert(l_buffer, l_trfc4min_msb, l_trfc4min_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS16>(iv_target, l_buffer, TRFC4MIN));
@@ -1410,7 +1415,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
// Combining bits to create timing value (in a buffer)
fapi2::buffer<int64_t> l_buffer;
- rightAlignedInsert(l_buffer, l_tfawmin_msn, l_tfawmin_lsb);
+ right_aligned_insert(l_buffer, l_tfawmin_msn, l_tfawmin_lsb);
// Update output only after check passes
FAPI_TRY( check::max_timing_range<BITS12>(iv_target, l_buffer, TFAWMIN));
@@ -1689,7 +1694,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
// Combining bits to create timing value (in a buffer)
fapi2::buffer<uint16_t> l_buffer;
- rightAlignedInsert(l_buffer, l_crc_msb, l_crc_lsb);
+ right_aligned_insert(l_buffer, l_crc_msb, l_crc_lsb);
// This value isn't bounded in the SPD document
o_value = l_buffer;
@@ -1718,7 +1723,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<uint16_t> l_buffer;
- rightAlignedInsert(l_buffer, l_last_nonzero_byte, l_cont_codes);
+ right_aligned_insert(l_buffer, l_last_nonzero_byte, l_cont_codes);
o_value = l_buffer;
@@ -1758,7 +1763,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<uint16_t> l_buffer;
- rightAlignedInsert(l_buffer, l_date_msb, l_date_lsb);
+ right_aligned_insert(l_buffer, l_date_msb, l_date_lsb);
o_value = l_buffer;
@@ -1790,7 +1795,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<uint32_t> l_buffer;
- rightAlignedInsert(l_buffer, l_sn_byte_3, l_sn_byte_2, l_sn_byte_1, l_sn_byte_0);
+ right_aligned_insert(l_buffer, l_sn_byte_3, l_sn_byte_2, l_sn_byte_1, l_sn_byte_0);
o_value = l_buffer;
@@ -1831,7 +1836,7 @@ class decoder<DDR4, BASE_CNFG, R> : public base_cnfg_decoder
{
fapi2::buffer<uint16_t> l_buffer;
- rightAlignedInsert(l_buffer, l_mfgid_msb, l_mfgid_lsb);
+ right_aligned_insert(l_buffer, l_mfgid_msb, l_mfgid_lsb);
o_value = l_buffer;
diff --git a/src/import/generic/memory/lib/spd/lrdimm/ddr4/lrdimm_decoder_ddr4.H b/src/import/generic/memory/lib/spd/lrdimm/ddr4/lrdimm_decoder_ddr4.H
index 49220680c..4a5de2b5b 100644
--- a/src/import/generic/memory/lib/spd/lrdimm/ddr4/lrdimm_decoder_ddr4.H
+++ b/src/import/generic/memory/lib/spd/lrdimm/ddr4/lrdimm_decoder_ddr4.H
@@ -42,6 +42,7 @@
#include <generic/memory/lib/spd/spd_decoder_def.H>
#include <generic/memory/lib/spd/common/dimm_module_decoder.H>
#include <generic/memory/lib/spd/spd_reader.H>
+#include <generic/memory/lib/utils/mss_buffer_utils.H>
namespace mss
{
@@ -317,7 +318,7 @@ class decoder<DDR4, LRDIMM_MODULE, R > : public dimm_module_decoder
{
fapi2::buffer<uint16_t> l_buffer;
- rightAlignedInsert(l_buffer, l_last_nonzero_byte, l_cont_codes);
+ right_aligned_insert(l_buffer, l_last_nonzero_byte, l_cont_codes);
o_output = l_buffer;
diff --git a/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H b/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H
index 96290460b..08a73d712 100644
--- a/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H
+++ b/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H
@@ -41,6 +41,7 @@
#include <generic/memory/lib/spd/spd_decoder_def.H>
#include <generic/memory/lib/spd/spd_traits_ddr4.H>
#include <generic/memory/lib/spd/spd_reader.H>
+#include <generic/memory/lib/utils/mss_buffer_utils.H>
namespace mss
{
@@ -285,7 +286,7 @@ class decoder<DDR4, RDIMM_MODULE, R > : public dimm_module_decoder
{
fapi2::buffer<uint16_t> l_buffer;
- rightAlignedInsert(l_buffer, l_last_nonzero_byte, l_cont_codes);
+ right_aligned_insert(l_buffer, l_last_nonzero_byte, l_cont_codes);
o_output = l_buffer;
diff --git a/src/import/generic/memory/lib/spd/spd_checker.H b/src/import/generic/memory/lib/spd/spd_checker.H
index a26ac4741..d393a83e7 100644
--- a/src/import/generic/memory/lib/spd/spd_checker.H
+++ b/src/import/generic/memory/lib/spd/spd_checker.H
@@ -38,6 +38,7 @@
#include <fapi2.H>
#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+#include <generic/memory/lib/utils/c_str.H>
namespace mss
{
@@ -124,40 +125,6 @@ fapi_try_exit:
}
///
-/// @brief Checks conditional passes and implements traces & exits if it fails
-/// @tparam T input data of any size
-/// @param[in] i_target fapi2 dimm target
-/// @param[in] i_conditional conditional that we are testing against
-/// @param[in] i_spd_byte_index current SPD byte
-/// @param[in] i_spd_data debug data
-/// @param[in] i_err_str error string to print out when conditional fails
-/// @return FAPI2_RC_SUCCESS iff okay
-///
-template< typename T >
-inline fapi2::ReturnCode fail_for_invalid_value(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
- const bool i_conditional,
- const size_t i_spd_byte_index,
- const T i_spd_data,
- const char* i_err_str = "")
-{
- FAPI_ASSERT(i_conditional,
- fapi2::MSS_BAD_SPD().
- set_VALUE(i_spd_data).
- set_BYTE(i_spd_byte_index).
- set_DIMM_TARGET(i_target),
- "%s %s Byte %d, data 0x%02x, extracted value: 0x%02x.",
- spd::c_str(i_target),
- i_err_str,
- i_spd_byte_index,
- i_spd_data);
-
- return fapi2::FAPI2_RC_SUCCESS;
-fapi_try_exit:
- return fapi2::current_err;
-
-} // fail_for_invalid_value
-
-///
/// @brief Helper function to test if a DRAM generation is valid
/// @param[in] i_dram_gen the DRAM gen from SPD
/// @return true if this DRAM gen is valid, else false
diff --git a/src/import/generic/memory/lib/spd/spd_field.H b/src/import/generic/memory/lib/spd/spd_field.H
index 70761a2ed..03c1da7b1 100644
--- a/src/import/generic/memory/lib/spd/spd_field.H
+++ b/src/import/generic/memory/lib/spd/spd_field.H
@@ -39,6 +39,7 @@
#include <cstdint>
#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+#include <generic/memory/lib/utils/mss_field.H>
namespace mss
{
@@ -46,72 +47,6 @@ namespace spd
{
///
-/// @class field_t
-/// @brief data structure for SPD byte fields
-/// @note holds byte index, start bit, and bit length of a decoded field
-///
-class field_t
-{
- private:
-
- const size_t iv_byte;
- const size_t iv_start;
- const size_t iv_length;
-
- public:
-
- // default ctor deleted
- field_t() = delete;
-
- ///
- /// @brief ctor
- /// @param[in] i_byte_index
- /// @param[in] i_start_bit
- /// @param[in] i_bit_length
- ///
- constexpr field_t(const size_t i_byte_index,
- const size_t i_start_bit,
- const size_t i_bit_length)
- : iv_byte(i_byte_index),
- iv_start(i_start_bit),
- iv_length(i_bit_length)
- {}
-
- ///
- /// @brief default dtor
- ///
- ~field_t() = default;
-
- ///
- /// @brief Byte index getter
- /// @return the byte index for this SPD field
- ///
- constexpr size_t get_byte() const
- {
- return iv_byte;
- }
-
- ///
- /// @brief Starting bit getter
- /// @return the starting bit position for this SPD field
- ///
- constexpr size_t get_start() const
- {
- return iv_start;
- }
-
- ///
- /// @brief bit length getter
- /// @return the bit length of this SPD field
- ///
- constexpr size_t get_length() const
- {
- return iv_length;
- }
-
-};// field_t
-
-///
/// @class init_fields
/// @brief Initial fields needed to know how to parse the SPD
/// @note These are preliminary fields that need to be independently
@@ -149,12 +84,12 @@ class init_fields
// 1st field: Byte number
// 2nd field: Start bit
// 3rd field: Bit length
- static constexpr field_t REVISION{1, REVISION_START, REVISION_LEN};
- static constexpr field_t DEVICE_TYPE{2, DEVICE_TYPE_START, DEVICE_TYPE_LEN};
- static constexpr field_t BASE_MODULE{3, BASE_MODULE_START, BASE_MODULE_LEN};
- static constexpr field_t HYBRID{3, HYBRID_START, HYBRID_LEN};
- static constexpr field_t HYBRID_MEDIA{3, HYBRID_MEDIA_START, HYBRID_MEDIA_LEN};
- static constexpr field_t REF_RAW_CARD{130, REF_RAW_CARD_START, REF_RAW_CARD_LEN};
+ static constexpr mss::field_t REVISION{1, REVISION_START, REVISION_LEN};
+ static constexpr mss::field_t DEVICE_TYPE{2, DEVICE_TYPE_START, DEVICE_TYPE_LEN};
+ static constexpr mss::field_t BASE_MODULE{3, BASE_MODULE_START, BASE_MODULE_LEN};
+ static constexpr mss::field_t HYBRID{3, HYBRID_START, HYBRID_LEN};
+ static constexpr mss::field_t HYBRID_MEDIA{3, HYBRID_MEDIA_START, HYBRID_MEDIA_LEN};
+ static constexpr mss::field_t REF_RAW_CARD{130, REF_RAW_CARD_START, REF_RAW_CARD_LEN};
};
///
diff --git a/src/import/generic/memory/lib/spd/spd_fields_ddr4.H b/src/import/generic/memory/lib/spd/spd_fields_ddr4.H
index 15c95ff77..8abadf9eb 100644
--- a/src/import/generic/memory/lib/spd/spd_fields_ddr4.H
+++ b/src/import/generic/memory/lib/spd/spd_fields_ddr4.H
@@ -385,94 +385,94 @@ class fields<DDR4, BASE_CNFG>
// 1st field: Byte number
// 2nd field: Start bit
// 3rd field: Bit length
- static constexpr field_t BYTES_USED{0, BYTES_USED_START, BYTES_USED_LEN};
- static constexpr field_t TOTAL_BYTES{0, BYTES_TOTAL_START, BYTES_TOTAL_LEN};
- static constexpr field_t REVISION{1, REVISION_START, REVISION_LEN};
- static constexpr field_t DEVICE_TYPE{2, DEVICE_TYPE_START, DEVICE_TYPE_LEN};
- static constexpr field_t BASE_MODULE{3, BASE_MODULE_START, BASE_MODULE_LEN};
- static constexpr field_t HYBRID{3, HYBRID_START, HYBRID_LEN};
- static constexpr field_t HYBRID_MEDIA{3, HYBRID_MEDIA_START, HYBRID_MEDIA_LEN};
- static constexpr field_t SDRAM_CAPACITY{4, SDRAM_CAPACITY_START, SDRAM_CAPACITY_LEN};
- static constexpr field_t BANKS_ADDR_BITS{4, SDRAM_BANKS_START, SDRAM_BANKS_LEN};
- static constexpr field_t BANK_GROUP_BITS{4, BANK_GROUP_START, BANK_GROUP_LEN};
- static constexpr field_t COL_ADDR_BITS{5, COL_ADDRESS_START, COL_ADDRESS_LEN};
- static constexpr field_t ROW_ADDR_BITS{5, ROW_ADDRESS_START, ROW_ADDRESS_LEN};
- static constexpr field_t PRIM_SIGNAL_LOADING{6, PRIM_SIGNAL_LOAD_START, PRIM_SIGNAL_LOAD_LEN};
- static constexpr field_t PRIM_DIE_COUNT{6, PRIM_DIE_COUNT_START, PRIM_DIE_COUNT_LEN};
- static constexpr field_t PRIM_PACKAGE_TYPE{6, PRIM_PACKAGE_TYPE_START, PRIM_PACKAGE_TYPE_LEN};
- static constexpr field_t MAC{7, MAC_START, MAC_LEN};
- static constexpr field_t TMAW{7, TMAW_START, TMAW_LEN};
- static constexpr field_t PPR{9, PPR_START, PPR_LEN};
- static constexpr field_t SOFT_PPR{9, SOFT_PPR_START, SOFT_PPR_LEN};
- static constexpr field_t SEC_SIGNAL_LOADING{10, SEC_SIGNAL_LOAD_START, SEC_SIGNAL_LOAD_LEN};
- static constexpr field_t SEC_DENSITY_RATIO{10, DENSITY_RATIO_START, DENSITY_RATIO_LEN};
- static constexpr field_t SEC_DIE_COUNT{10, SEC_DIE_COUNT_START, SEC_DIE_COUNT_LEN};
- static constexpr field_t SEC_PACKAGE_TYPE{10, SEC_PACKAGE_TYPE_START, SEC_PACKAGE_TYPE_LEN};
- static constexpr field_t OPERABLE_FLD{11, OPERABLE_START, OPERABLE_LEN};
- static constexpr field_t ENDURANT_FLD{11, ENDURANT_START, ENDURANT_LEN};
- static constexpr field_t SDRAM_WIDTH{12, SDRAM_WIDTH_START, SDRAM_WIDTH_LEN};
- static constexpr field_t RANK_MIX{12, RANK_MIX_START, RANK_MIX_LEN};
- static constexpr field_t PACKAGE_RANKS{12, PACKAGE_RANKS_START, PACKAGE_RANKS_LEN};
- static constexpr field_t BUS_WIDTH{13, BUS_WIDTH_START, BUS_WIDTH_LEN};
- static constexpr field_t BUS_EXT_WIDTH{13, BUS_EXT_WIDTH_START, BUS_EXT_WIDTH_LEN};
- static constexpr field_t THERM_SENSOR{14, THERM_SENSOR_START, THERM_SENSOR_LEN};
- static constexpr field_t EXTENDED_MODULE_TYPE{15, EXT_MOD_TYPE_START, EXT_MOD_TYPE_LEN};
- static constexpr field_t FINE_TIMEBASE{17, FINE_TIMEBASE_START, FINE_TIMEBASE_LEN};
- static constexpr field_t MEDIUM_TIMEBASE{17, MED_TIMEBASE_START, MED_TIMEBASE_LEN};
- static constexpr field_t TCK_MIN{18, TCK_MIN_START, TCK_MIN_LEN};
- static constexpr field_t TCK_MAX{19, TCK_MAX_START, TCK_MAX_LEN};
- static constexpr field_t CL_FIRST_BYTE{20, CAS_BYTE_1_START, CAS_BYTE_1_LEN};
- static constexpr field_t CL_SECOND_BYTE{21, CAS_BYTE_2_START, CAS_BYTE_2_LEN};
- static constexpr field_t CL_THIRD_BYTE{22, CAS_BYTE_3_START, CAS_BYTE_3_LEN};
- static constexpr field_t CL_FOURTH_BYTE{23, CAS_BYTE_4_START, CAS_BYTE_4_LEN};
- static constexpr field_t TAA_MIN{24, TAA_MIN_START, TAA_MIN_LEN};
- static constexpr field_t TRCD_MIN{25, TRCD_MIN_START, TRCD_MIN_LEN};
- static constexpr field_t TRP_MIN{26, TRP_MIN_START, TRP_MIN_LEN};
- static constexpr field_t TRASMIN_MSN{27, TRASMIN_MSN_START, TRASMIN_MSN_LEN};
- static constexpr field_t TRASMIN_LSB{28, TRASMIN_LSB_START, TRASMIN_LSB_LEN};
- static constexpr field_t TRCMIN_MSN{27, TRCMIN_MSN_START, TRCMIN_MSN_LEN};
- static constexpr field_t TRCMIN_LSB{29, TRCMIN_LSB_START, TRCMIN_LSB_LEN};
- static constexpr field_t TRFC1MIN_LSB{30, TRFC1MIN_LSB_START, TRFC1MIN_LSB_LEN};
- static constexpr field_t TRFC1MIN_MSB{31, TRFC1MIN_MSB_START, TRFC1MIN_MSB_LEN};
- static constexpr field_t TRFC2MIN_LSB{32, TRFC2MIN_LSB_START, TRFC2MIN_LSB_LEN};
- static constexpr field_t TRFC2MIN_MSB{33, TRFC2MIN_MSB_START, TRFC2MIN_MSB_LEN};
- static constexpr field_t TRFC4MIN_LSB{34, TRFC4MIN_LSB_START, TRFC4MIN_LSB_LEN};
- static constexpr field_t TRFC4MIN_MSB{35, TRFC4MIN_MSB_START, TRFC4MIN_MSB_LEN};
- static constexpr field_t TFAWMIN_MSN{36, TFAWMIN_MSN_START, TFAWMIN_MSN_LEN};
- static constexpr field_t TFAWMIN_LSB{37, TFAWMIN_LSB_START, TFAWMIN_LSB_LEN};
- static constexpr field_t TRRD_S_MIN{38, TRRD_S_MIN_START, TRRD_S_MIN_LEN};
- static constexpr field_t TRRD_L_MIN{39, TRRD_L_MIN_START, TRRD_L_MIN_LEN};
- static constexpr field_t TCCD_L_MIN{39, TCCD_L_MIN_START, TCCD_L_MIN_LEN};
- static constexpr field_t TWRMIN_MSN{41, TWRMIN_MSN_START, TWRMIN_MSN_LEN};
- static constexpr field_t TWRMIN_LSB{42, TWRMIN_LSB_START, TWRMIN_LSB_LEN};
- static constexpr field_t TWTRMIN_S_MSN{43, TWTRMIN_S_MSN_START, TWTRMIN_S_MSN_LEN};
- static constexpr field_t TWTRMIN_S_LSB{44, TWTRMIN_S_LSB_START, TWTRMIN_S_LSB_LEN};
- static constexpr field_t TWTRMIN_L_MSN{43, TWTRMIN_L_MSN_START, TWTRMIN_L_MSN_LEN};
- static constexpr field_t TWTRMIN_L_LSB{45, TWTRMIN_L_LSB_START, TWTRMIN_L_LSB_LEN};
- static constexpr field_t OFFSET_TCCD_L_MIN{117, OFFSET_TCCD_L_MIN_START, OFFSET_TCCD_L_MIN_LEN};
- static constexpr field_t OFFSET_TRRD_L_MIN{118, OFFSET_TRRD_L_MIN_START, OFFSET_TRRD_L_MIN_LEN};
- static constexpr field_t OFFSET_TRRD_S_MIN{119, OFFSET_TRRD_S_MIN_START, OFFSET_TRRD_S_MIN_LEN};
- static constexpr field_t OFFSET_TRC_MIN{120, OFFSET_TRC_MIN_START, OFFSET_TRC_MIN_LEN};
- static constexpr field_t OFFSET_TRP_MIN{121, OFFSET_TRP_MIN_START, OFFSET_TRP_MIN_LEN};
- static constexpr field_t OFFSET_TRCD_MIN{122, OFFSET_TRCD_MIN_START, OFFSET_TRCD_MIN_LEN};
- static constexpr field_t OFFSET_TAA_MIN{123, OFFSET_TAA_MIN_START, OFFSET_TAA_MIN_LEN};
- static constexpr field_t OFFSET_TCK_MAX{124, OFFSET_TCK_MAX_START, OFFSET_TCK_MAX_LEN};
- static constexpr field_t OFFSET_TCK_MIN{125, OFFSET_TCK_MIN_START, OFFSET_TCK_MIN_LEN};
- static constexpr field_t CRC_LSB{126, CRC_LSB_START, CRC_LSB_LEN};
- static constexpr field_t CRC_MSB{127, CRC_MSB_START, CRC_MSB_LEN};
- static constexpr field_t CONTINUATION_CODES{320, CONTINUATION_CODES_START, CONTINUATION_CODES_LEN};
- static constexpr field_t LAST_NON_ZERO_BYTE{321, LAST_NON_ZERO_BYTE_START, LAST_NON_ZERO_BYTE_LEN};
- static constexpr field_t MODULE_MFG_LOCATION{322, MODULE_MFG_LOC_START, MODULE_MFG_LOC_LEN};
- static constexpr field_t MODULE_MFG_DATE_LSB{323, MODULE_MFG_DATE_START, MODULE_MFG_DATE_LEN};
- static constexpr field_t MODULE_MFG_DATE_MSB{324, MODULE_MFG_DATE_START, MODULE_MFG_DATE_LEN};
- static constexpr field_t MODULE_SERIAL_NUM_BYTE1{325, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
- static constexpr field_t MODULE_SERIAL_NUM_BYTE2{326, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
- static constexpr field_t MODULE_SERIAL_NUM_BYTE3{327, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
- static constexpr field_t MODULE_SERIAL_NUM_BYTE4{328, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
- static constexpr field_t MODULE_REV_CODE{349, MODULE_REV_CODE_START, MODULE_REV_CODE_LEN};
- static constexpr field_t DRAM_MFR_ID_CODE_LSB{350, DRAM_MFR_ID_CODE_START, DRAM_MFR_ID_CODE_LEN};
- static constexpr field_t DRAM_MFR_ID_CODE_MSB{351, DRAM_MFR_ID_CODE_START, DRAM_MFR_ID_CODE_LEN};
- static constexpr field_t DRAM_STEPPING{352, DRAM_STEPPING_START, DRAM_STEPPING_LEN};
+ static constexpr mss::field_t BYTES_USED{0, BYTES_USED_START, BYTES_USED_LEN};
+ static constexpr mss::field_t TOTAL_BYTES{0, BYTES_TOTAL_START, BYTES_TOTAL_LEN};
+ static constexpr mss::field_t REVISION{1, REVISION_START, REVISION_LEN};
+ static constexpr mss::field_t DEVICE_TYPE{2, DEVICE_TYPE_START, DEVICE_TYPE_LEN};
+ static constexpr mss::field_t BASE_MODULE{3, BASE_MODULE_START, BASE_MODULE_LEN};
+ static constexpr mss::field_t HYBRID{3, HYBRID_START, HYBRID_LEN};
+ static constexpr mss::field_t HYBRID_MEDIA{3, HYBRID_MEDIA_START, HYBRID_MEDIA_LEN};
+ static constexpr mss::field_t SDRAM_CAPACITY{4, SDRAM_CAPACITY_START, SDRAM_CAPACITY_LEN};
+ static constexpr mss::field_t BANKS_ADDR_BITS{4, SDRAM_BANKS_START, SDRAM_BANKS_LEN};
+ static constexpr mss::field_t BANK_GROUP_BITS{4, BANK_GROUP_START, BANK_GROUP_LEN};
+ static constexpr mss::field_t COL_ADDR_BITS{5, COL_ADDRESS_START, COL_ADDRESS_LEN};
+ static constexpr mss::field_t ROW_ADDR_BITS{5, ROW_ADDRESS_START, ROW_ADDRESS_LEN};
+ static constexpr mss::field_t PRIM_SIGNAL_LOADING{6, PRIM_SIGNAL_LOAD_START, PRIM_SIGNAL_LOAD_LEN};
+ static constexpr mss::field_t PRIM_DIE_COUNT{6, PRIM_DIE_COUNT_START, PRIM_DIE_COUNT_LEN};
+ static constexpr mss::field_t PRIM_PACKAGE_TYPE{6, PRIM_PACKAGE_TYPE_START, PRIM_PACKAGE_TYPE_LEN};
+ static constexpr mss::field_t MAC{7, MAC_START, MAC_LEN};
+ static constexpr mss::field_t TMAW{7, TMAW_START, TMAW_LEN};
+ static constexpr mss::field_t PPR{9, PPR_START, PPR_LEN};
+ static constexpr mss::field_t SOFT_PPR{9, SOFT_PPR_START, SOFT_PPR_LEN};
+ static constexpr mss::field_t SEC_SIGNAL_LOADING{10, SEC_SIGNAL_LOAD_START, SEC_SIGNAL_LOAD_LEN};
+ static constexpr mss::field_t SEC_DENSITY_RATIO{10, DENSITY_RATIO_START, DENSITY_RATIO_LEN};
+ static constexpr mss::field_t SEC_DIE_COUNT{10, SEC_DIE_COUNT_START, SEC_DIE_COUNT_LEN};
+ static constexpr mss::field_t SEC_PACKAGE_TYPE{10, SEC_PACKAGE_TYPE_START, SEC_PACKAGE_TYPE_LEN};
+ static constexpr mss::field_t OPERABLE_FLD{11, OPERABLE_START, OPERABLE_LEN};
+ static constexpr mss::field_t ENDURANT_FLD{11, ENDURANT_START, ENDURANT_LEN};
+ static constexpr mss::field_t SDRAM_WIDTH{12, SDRAM_WIDTH_START, SDRAM_WIDTH_LEN};
+ static constexpr mss::field_t RANK_MIX{12, RANK_MIX_START, RANK_MIX_LEN};
+ static constexpr mss::field_t PACKAGE_RANKS{12, PACKAGE_RANKS_START, PACKAGE_RANKS_LEN};
+ static constexpr mss::field_t BUS_WIDTH{13, BUS_WIDTH_START, BUS_WIDTH_LEN};
+ static constexpr mss::field_t BUS_EXT_WIDTH{13, BUS_EXT_WIDTH_START, BUS_EXT_WIDTH_LEN};
+ static constexpr mss::field_t THERM_SENSOR{14, THERM_SENSOR_START, THERM_SENSOR_LEN};
+ static constexpr mss::field_t EXTENDED_MODULE_TYPE{15, EXT_MOD_TYPE_START, EXT_MOD_TYPE_LEN};
+ static constexpr mss::field_t FINE_TIMEBASE{17, FINE_TIMEBASE_START, FINE_TIMEBASE_LEN};
+ static constexpr mss::field_t MEDIUM_TIMEBASE{17, MED_TIMEBASE_START, MED_TIMEBASE_LEN};
+ static constexpr mss::field_t TCK_MIN{18, TCK_MIN_START, TCK_MIN_LEN};
+ static constexpr mss::field_t TCK_MAX{19, TCK_MAX_START, TCK_MAX_LEN};
+ static constexpr mss::field_t CL_FIRST_BYTE{20, CAS_BYTE_1_START, CAS_BYTE_1_LEN};
+ static constexpr mss::field_t CL_SECOND_BYTE{21, CAS_BYTE_2_START, CAS_BYTE_2_LEN};
+ static constexpr mss::field_t CL_THIRD_BYTE{22, CAS_BYTE_3_START, CAS_BYTE_3_LEN};
+ static constexpr mss::field_t CL_FOURTH_BYTE{23, CAS_BYTE_4_START, CAS_BYTE_4_LEN};
+ static constexpr mss::field_t TAA_MIN{24, TAA_MIN_START, TAA_MIN_LEN};
+ static constexpr mss::field_t TRCD_MIN{25, TRCD_MIN_START, TRCD_MIN_LEN};
+ static constexpr mss::field_t TRP_MIN{26, TRP_MIN_START, TRP_MIN_LEN};
+ static constexpr mss::field_t TRASMIN_MSN{27, TRASMIN_MSN_START, TRASMIN_MSN_LEN};
+ static constexpr mss::field_t TRASMIN_LSB{28, TRASMIN_LSB_START, TRASMIN_LSB_LEN};
+ static constexpr mss::field_t TRCMIN_MSN{27, TRCMIN_MSN_START, TRCMIN_MSN_LEN};
+ static constexpr mss::field_t TRCMIN_LSB{29, TRCMIN_LSB_START, TRCMIN_LSB_LEN};
+ static constexpr mss::field_t TRFC1MIN_LSB{30, TRFC1MIN_LSB_START, TRFC1MIN_LSB_LEN};
+ static constexpr mss::field_t TRFC1MIN_MSB{31, TRFC1MIN_MSB_START, TRFC1MIN_MSB_LEN};
+ static constexpr mss::field_t TRFC2MIN_LSB{32, TRFC2MIN_LSB_START, TRFC2MIN_LSB_LEN};
+ static constexpr mss::field_t TRFC2MIN_MSB{33, TRFC2MIN_MSB_START, TRFC2MIN_MSB_LEN};
+ static constexpr mss::field_t TRFC4MIN_LSB{34, TRFC4MIN_LSB_START, TRFC4MIN_LSB_LEN};
+ static constexpr mss::field_t TRFC4MIN_MSB{35, TRFC4MIN_MSB_START, TRFC4MIN_MSB_LEN};
+ static constexpr mss::field_t TFAWMIN_MSN{36, TFAWMIN_MSN_START, TFAWMIN_MSN_LEN};
+ static constexpr mss::field_t TFAWMIN_LSB{37, TFAWMIN_LSB_START, TFAWMIN_LSB_LEN};
+ static constexpr mss::field_t TRRD_S_MIN{38, TRRD_S_MIN_START, TRRD_S_MIN_LEN};
+ static constexpr mss::field_t TRRD_L_MIN{39, TRRD_L_MIN_START, TRRD_L_MIN_LEN};
+ static constexpr mss::field_t TCCD_L_MIN{39, TCCD_L_MIN_START, TCCD_L_MIN_LEN};
+ static constexpr mss::field_t TWRMIN_MSN{41, TWRMIN_MSN_START, TWRMIN_MSN_LEN};
+ static constexpr mss::field_t TWRMIN_LSB{42, TWRMIN_LSB_START, TWRMIN_LSB_LEN};
+ static constexpr mss::field_t TWTRMIN_S_MSN{43, TWTRMIN_S_MSN_START, TWTRMIN_S_MSN_LEN};
+ static constexpr mss::field_t TWTRMIN_S_LSB{44, TWTRMIN_S_LSB_START, TWTRMIN_S_LSB_LEN};
+ static constexpr mss::field_t TWTRMIN_L_MSN{43, TWTRMIN_L_MSN_START, TWTRMIN_L_MSN_LEN};
+ static constexpr mss::field_t TWTRMIN_L_LSB{45, TWTRMIN_L_LSB_START, TWTRMIN_L_LSB_LEN};
+ static constexpr mss::field_t OFFSET_TCCD_L_MIN{117, OFFSET_TCCD_L_MIN_START, OFFSET_TCCD_L_MIN_LEN};
+ static constexpr mss::field_t OFFSET_TRRD_L_MIN{118, OFFSET_TRRD_L_MIN_START, OFFSET_TRRD_L_MIN_LEN};
+ static constexpr mss::field_t OFFSET_TRRD_S_MIN{119, OFFSET_TRRD_S_MIN_START, OFFSET_TRRD_S_MIN_LEN};
+ static constexpr mss::field_t OFFSET_TRC_MIN{120, OFFSET_TRC_MIN_START, OFFSET_TRC_MIN_LEN};
+ static constexpr mss::field_t OFFSET_TRP_MIN{121, OFFSET_TRP_MIN_START, OFFSET_TRP_MIN_LEN};
+ static constexpr mss::field_t OFFSET_TRCD_MIN{122, OFFSET_TRCD_MIN_START, OFFSET_TRCD_MIN_LEN};
+ static constexpr mss::field_t OFFSET_TAA_MIN{123, OFFSET_TAA_MIN_START, OFFSET_TAA_MIN_LEN};
+ static constexpr mss::field_t OFFSET_TCK_MAX{124, OFFSET_TCK_MAX_START, OFFSET_TCK_MAX_LEN};
+ static constexpr mss::field_t OFFSET_TCK_MIN{125, OFFSET_TCK_MIN_START, OFFSET_TCK_MIN_LEN};
+ static constexpr mss::field_t CRC_LSB{126, CRC_LSB_START, CRC_LSB_LEN};
+ static constexpr mss::field_t CRC_MSB{127, CRC_MSB_START, CRC_MSB_LEN};
+ static constexpr mss::field_t CONTINUATION_CODES{320, CONTINUATION_CODES_START, CONTINUATION_CODES_LEN};
+ static constexpr mss::field_t LAST_NON_ZERO_BYTE{321, LAST_NON_ZERO_BYTE_START, LAST_NON_ZERO_BYTE_LEN};
+ static constexpr mss::field_t MODULE_MFG_LOCATION{322, MODULE_MFG_LOC_START, MODULE_MFG_LOC_LEN};
+ static constexpr mss::field_t MODULE_MFG_DATE_LSB{323, MODULE_MFG_DATE_START, MODULE_MFG_DATE_LEN};
+ static constexpr mss::field_t MODULE_MFG_DATE_MSB{324, MODULE_MFG_DATE_START, MODULE_MFG_DATE_LEN};
+ static constexpr mss::field_t MODULE_SERIAL_NUM_BYTE1{325, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
+ static constexpr mss::field_t MODULE_SERIAL_NUM_BYTE2{326, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
+ static constexpr mss::field_t MODULE_SERIAL_NUM_BYTE3{327, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
+ static constexpr mss::field_t MODULE_SERIAL_NUM_BYTE4{328, MODULE_SERIAL_NUM_START, MODULE_SERIAL_NUM_LEN};
+ static constexpr mss::field_t MODULE_REV_CODE{349, MODULE_REV_CODE_START, MODULE_REV_CODE_LEN};
+ static constexpr mss::field_t DRAM_MFR_ID_CODE_LSB{350, DRAM_MFR_ID_CODE_START, DRAM_MFR_ID_CODE_LEN};
+ static constexpr mss::field_t DRAM_MFR_ID_CODE_MSB{351, DRAM_MFR_ID_CODE_START, DRAM_MFR_ID_CODE_LEN};
+ static constexpr mss::field_t DRAM_STEPPING{352, DRAM_STEPPING_START, DRAM_STEPPING_LEN};
};
///
@@ -553,26 +553,26 @@ class fields<DDR4, RDIMM_MODULE>
// First field - SPD byte
// Second field - start bit
// Third field - bit length
- static constexpr field_t MODULE_NOMINAL_HEIGHT{128, MODULE_NOM_HEIGHT_START, MODULE_NOM_HEIGHT_LEN};
- static constexpr field_t RAW_CARD_EXTENSION{128, RAW_CARD_EXT_START, RAW_CARD_EXT_LEN};
- static constexpr field_t FRONT_MODULE_THICKNESS{129, FRONT_MODULE_THICKNESS_START, FRONT_MODULE_THICKNESS_LEN};
- static constexpr field_t BACK_MODULE_THICKNESS{129, BACK_MODULE_THICKNESS_START, BACK_MODULE_THICKNESS_LEN};
- static constexpr field_t REF_RAW_CARD{130, REF_RAW_CARD_START, REF_RAW_CARD_LEN};
- static constexpr field_t NUM_REGS_USED{131, REGS_USED_START, REGS_USED_LEN};
- static constexpr field_t ROWS_OF_DRAMS{131, ROWS_OF_DRAMS_START, ROWS_OF_DRAMS_LEN};
- static constexpr field_t REGISTER_TYPE{131, REGISTER_TYPE_START, REGISTER_TYPE_LEN};
- static constexpr field_t HEAT_SPREADER_CHAR{132, HEAT_SPREADER_CHAR_START, HEAT_SPREADER_CHAR_LEN};
- static constexpr field_t HEAT_SPREADER_SOL{132, HEAT_SPREADER_SOL_START, HEAT_SPREADER_SOL_LEN};
- static constexpr field_t CONTINUATION_CODES{133, CONTINUATION_CODES_START, CONTINUATION_CODES_LEN};
- static constexpr field_t LAST_NON_ZERO_BYTE{134, LAST_NON_ZERO_BYTE_START, LAST_NON_ZERO_BYTE_LEN};
- static constexpr field_t REGISTER_REV{135, REGISTER_REV_START, REGISTER_REV_LEN};
- static constexpr field_t ADDR_MAP_REG_TO_DRAM{136, ADDR_MAPPING_START, ADDR_MAPPING_LEN};
- static constexpr field_t CKE_DRIVER{137, CKE_DRIVER_START, CKE_DRIVER_LEN};
- static constexpr field_t ODT_DRIVER{137, ODT_DRIVER_START, ODT_DRIVER_LEN};
- static constexpr field_t CA_DRIVER{137, CA_DRIVER_START, CA_DRIVER_LEN};
- static constexpr field_t CS_DRIVER{137, CS_DRIVER_START, CS_DRIVER_LEN};
- static constexpr field_t YO_Y2_DRIVER{138, YO_Y2_DRIVER_START, YO_Y2_DRIVER_LEN};
- static constexpr field_t Y1_Y3_DRIVER{138, Y1_Y3_DRIVER_START, Y1_Y3_DRIVER_LEN};
+ static constexpr mss::field_t MODULE_NOMINAL_HEIGHT{128, MODULE_NOM_HEIGHT_START, MODULE_NOM_HEIGHT_LEN};
+ static constexpr mss::field_t RAW_CARD_EXTENSION{128, RAW_CARD_EXT_START, RAW_CARD_EXT_LEN};
+ static constexpr mss::field_t FRONT_MODULE_THICKNESS{129, FRONT_MODULE_THICKNESS_START, FRONT_MODULE_THICKNESS_LEN};
+ static constexpr mss::field_t BACK_MODULE_THICKNESS{129, BACK_MODULE_THICKNESS_START, BACK_MODULE_THICKNESS_LEN};
+ static constexpr mss::field_t REF_RAW_CARD{130, REF_RAW_CARD_START, REF_RAW_CARD_LEN};
+ static constexpr mss::field_t NUM_REGS_USED{131, REGS_USED_START, REGS_USED_LEN};
+ static constexpr mss::field_t ROWS_OF_DRAMS{131, ROWS_OF_DRAMS_START, ROWS_OF_DRAMS_LEN};
+ static constexpr mss::field_t REGISTER_TYPE{131, REGISTER_TYPE_START, REGISTER_TYPE_LEN};
+ static constexpr mss::field_t HEAT_SPREADER_CHAR{132, HEAT_SPREADER_CHAR_START, HEAT_SPREADER_CHAR_LEN};
+ static constexpr mss::field_t HEAT_SPREADER_SOL{132, HEAT_SPREADER_SOL_START, HEAT_SPREADER_SOL_LEN};
+ static constexpr mss::field_t CONTINUATION_CODES{133, CONTINUATION_CODES_START, CONTINUATION_CODES_LEN};
+ static constexpr mss::field_t LAST_NON_ZERO_BYTE{134, LAST_NON_ZERO_BYTE_START, LAST_NON_ZERO_BYTE_LEN};
+ static constexpr mss::field_t REGISTER_REV{135, REGISTER_REV_START, REGISTER_REV_LEN};
+ static constexpr mss::field_t ADDR_MAP_REG_TO_DRAM{136, ADDR_MAPPING_START, ADDR_MAPPING_LEN};
+ static constexpr mss::field_t CKE_DRIVER{137, CKE_DRIVER_START, CKE_DRIVER_LEN};
+ static constexpr mss::field_t ODT_DRIVER{137, ODT_DRIVER_START, ODT_DRIVER_LEN};
+ static constexpr mss::field_t CA_DRIVER{137, CA_DRIVER_START, CA_DRIVER_LEN};
+ static constexpr mss::field_t CS_DRIVER{137, CS_DRIVER_START, CS_DRIVER_LEN};
+ static constexpr mss::field_t YO_Y2_DRIVER{138, YO_Y2_DRIVER_START, YO_Y2_DRIVER_LEN};
+ static constexpr mss::field_t Y1_Y3_DRIVER{138, Y1_Y3_DRIVER_START, Y1_Y3_DRIVER_LEN};
};
///
@@ -720,60 +720,60 @@ class fields<DDR4, LRDIMM_MODULE>
// First field - SPD byte
// Second field - start bit
// Third field - bit length
- static constexpr field_t MODULE_NOMINAL_HEIGHT{128, MODULE_NOM_HEIGHT_START, MODULE_NOM_HEIGHT_LEN};
- static constexpr field_t RAW_CARD_EXT{128, RAW_CARD_EXT_START, RAW_CARD_EXT_LEN};
- static constexpr field_t FRONT_MODULE_THICKNESS{129, FRONT_MODULE_THICKNESS_START, FRONT_MODULE_THICKNESS_LEN};
- static constexpr field_t BACK_MODULE_THICKNESS{129, BACK_MODULE_THICKNESS_START, BACK_MODULE_THICKNESS_LEN};
- static constexpr field_t REF_RAW_CARD{130, REF_RAW_CARD_START, REF_RAW_CARD_LEN};
- static constexpr field_t NUM_REGS_USED{131, REGS_USED_START, REGS_USED_LEN};
- static constexpr field_t ROWS_OF_DRAMS{131, ROWS_OF_DRAMS_START, ROWS_OF_DRAMS_LEN};
- static constexpr field_t REGISTER_TYPE{131, REGISTER_TYPE_START, REGISTER_TYPE_LEN};
- static constexpr field_t HEAT_SPREADER_CHAR{132, HEAT_SPREADER_CHAR_START, HEAT_SPREADER_CHAR_LEN};
- static constexpr field_t HEAT_SPREADER_SOL{132, HEAT_SPREADER_SOL_START, HEAT_SPREADER_SOL_LEN};
- static constexpr field_t CONTINUATION_CODES{133, CONTINUATION_CODES_START, CONTINUATION_CODES_LEN};
- static constexpr field_t LAST_NON_ZERO_BYTE{134, LAST_NON_ZERO_BYTE_START, LAST_NON_ZERO_BYTE_LEN};
- static constexpr field_t REGISTER_REV{135, REGISTER_REV_START, REGISTER_REV_LEN};
- static constexpr field_t ADDR_MAP_REG_TO_DRAM{136, ADDR_MAPPING_START, ADDR_MAPPING_LEN};
- static constexpr field_t CKE_DRIVER{137, CKE_DRIVER_START, CKE_DRIVER_LEN};
- static constexpr field_t ODT_DRIVER{137, ODT_DRIVER_START, ODT_DRIVER_LEN};
- static constexpr field_t CA_DRIVER{137, CA_DRIVER_START, CA_DRIVER_LEN};
- static constexpr field_t CS_DRIVER{137, CS_DRIVER_START, CS_DRIVER_LEN};
- static constexpr field_t YO_Y2_DRIVER{138, YO_Y2_DRIVER_START, YO_Y2_DRIVER_LEN};
- static constexpr field_t Y1_Y3_DRIVER{138, Y1_Y3_DRIVER_START, Y1_Y3_DRIVER_LEN};
- static constexpr field_t DATA_BUFFER_REV{139, DB_REV_START, DB_REV_LEN};
- static constexpr field_t BCOM_BODT_BCKE_DRIVER{138, BCOM_BODT_BCKE_DRIVER_START, BCOM_BODT_BCKE_DRIVER_LEN};
- static constexpr field_t BCK_DRIVER{138, BCK_DRIVER_START, BCK_DRIVER_LEN};
- static constexpr field_t RCD_SLEW_CNTRL{138, RCD_SLEW_CNTRL_START, RCD_SLEW_CNTRL_LEN };
- static constexpr field_t VREF_DQ_RANK0{140, VREF_DQ_RANK0_START, VREF_DQ_RANK0_LEN};
- static constexpr field_t VREF_DQ_RANK1{141, VREF_DQ_RANK1_START, VREF_DQ_RANK1_LEN};
- static constexpr field_t VREF_DQ_RANK2{142, VREF_DQ_RANK2_START, VREF_DQ_RANK2_LEN};
- static constexpr field_t VREF_DQ_RANK3{143, VREF_DQ_RANK3_START, VREF_DQ_RANK3_LEN};
- static constexpr field_t DATA_BUFFER_VREF_DQ{144, DB_VREF_DQ_START, DB_VREF_DQ_LEN};
- static constexpr field_t DB_MDQ_LTE_1866{145, DB_MDQ_START, DB_MDQ_LEN};
- static constexpr field_t DB_MDQ_LTE_2400{146, DB_MDQ_START, DB_MDQ_LEN};
- static constexpr field_t DB_MDQ_LTE_3200{147, DB_MDQ_START, DB_MDQ_LEN};
- static constexpr field_t DB_MDQ_RTT_LTE_1866{145, DB_MDQ_RTT_START, DB_MDQ_RTT_LEN};
- static constexpr field_t DB_MDQ_RTT_LTE_2400{146, DB_MDQ_RTT_START, DB_MDQ_RTT_LEN};
- static constexpr field_t DB_MDQ_RTT_LTE_3200{147, DB_MDQ_RTT_START, DB_MDQ_RTT_LEN};
- static constexpr field_t DRAM_DRIVE_STRENGTH_LTE_1866{148, DRAM_DRIVE_1866_START, DRAM_DRIVE_LEN};
- static constexpr field_t DRAM_DRIVE_STRENGTH_LTE_2400{148, DRAM_DRIVE_2400_START, DRAM_DRIVE_LEN};
- static constexpr field_t DRAM_DRIVE_STRENGTH_LTE_3200{148, DRAM_DRIVE_3200_START, DRAM_DRIVE_LEN};
- static constexpr field_t DRAM_ODT_RTT_NOM_LTE_1866{149, DRAM_ODT_RTT_NOM_START, DRAM_ODT_RTT_NOM_LEN};
- static constexpr field_t DRAM_ODT_RTT_WR_LTE_1866{149, DRAM_ODT_RTT_WR_START, DRAM_ODT_RTT_WR_LEN};
- static constexpr field_t DRAM_ODT_RTT_NOM_LTE_2400{150, DRAM_ODT_RTT_NOM_START, DRAM_ODT_RTT_NOM_LEN};
- static constexpr field_t DRAM_ODT_RTT_WR_LTE_2400{150, DRAM_ODT_RTT_WR_START, DRAM_ODT_RTT_WR_LEN};
- static constexpr field_t DRAM_ODT_RTT_NOM_LTE_3200{151, DRAM_ODT_RTT_NOM_START, DRAM_ODT_RTT_NOM_LEN};
- static constexpr field_t DRAM_ODT_RTT_WR_LTE_3200{151, DRAM_ODT_RTT_WR_START, DRAM_ODT_RTT_WR_LEN};
- static constexpr field_t DRAM_ODT_RTT_PARK_R01_LTE_1866{152, DRAM_ODT_RTT_PARK_R01_START, DRAM_ODT_RTT_PARK_R01_LEN};
- static constexpr field_t DRAM_ODT_RTT_PARK_R23_LTE_1866{152, DRAM_ODT_RTT_PARK_R23_START, DRAM_ODT_RTT_PARK_R23_LEN};
- static constexpr field_t DRAM_ODT_RTT_PARK_R01_LTE_2400{153, DRAM_ODT_RTT_PARK_R01_START, DRAM_ODT_RTT_PARK_R01_LEN};
- static constexpr field_t DRAM_ODT_RTT_PARK_R23_LTE_2400{153, DRAM_ODT_RTT_PARK_R23_START, DRAM_ODT_RTT_PARK_R23_LEN};
- static constexpr field_t DRAM_ODT_RTT_PARK_R01_LTE_3200{154, DRAM_ODT_RTT_PARK_R01_START, DRAM_ODT_RTT_PARK_R01_LEN};
- static constexpr field_t DRAM_ODT_RTT_PARK_R23_LTE_3200{154, DRAM_ODT_RTT_PARK_R23_START, DRAM_ODT_RTT_PARK_R23_LEN};
- static constexpr field_t DRAM_VREF_DQ_RANGE{155, DRAM_VREF_DQ_RANGE_START, DRAM_VREF_DQ_RANGE_LEN};
- static constexpr field_t DATA_BUFFER_VREF_DQ_RANGE{155, DB_VREF_DQ_RANGE_START, DB_VREF_DQ_RANGE_LEN};
- static constexpr field_t DATA_BUFFER_GAIN_ADJUST{156, DB_GAIN_ADJUST_START, DB_GAIN_ADJUST_LEN};
- static constexpr field_t DATA_BUFFER_DFE{156, DB_DFE_START, DB_DFE_LEN};
+ static constexpr mss::field_t MODULE_NOMINAL_HEIGHT{128, MODULE_NOM_HEIGHT_START, MODULE_NOM_HEIGHT_LEN};
+ static constexpr mss::field_t RAW_CARD_EXT{128, RAW_CARD_EXT_START, RAW_CARD_EXT_LEN};
+ static constexpr mss::field_t FRONT_MODULE_THICKNESS{129, FRONT_MODULE_THICKNESS_START, FRONT_MODULE_THICKNESS_LEN};
+ static constexpr mss::field_t BACK_MODULE_THICKNESS{129, BACK_MODULE_THICKNESS_START, BACK_MODULE_THICKNESS_LEN};
+ static constexpr mss::field_t REF_RAW_CARD{130, REF_RAW_CARD_START, REF_RAW_CARD_LEN};
+ static constexpr mss::field_t NUM_REGS_USED{131, REGS_USED_START, REGS_USED_LEN};
+ static constexpr mss::field_t ROWS_OF_DRAMS{131, ROWS_OF_DRAMS_START, ROWS_OF_DRAMS_LEN};
+ static constexpr mss::field_t REGISTER_TYPE{131, REGISTER_TYPE_START, REGISTER_TYPE_LEN};
+ static constexpr mss::field_t HEAT_SPREADER_CHAR{132, HEAT_SPREADER_CHAR_START, HEAT_SPREADER_CHAR_LEN};
+ static constexpr mss::field_t HEAT_SPREADER_SOL{132, HEAT_SPREADER_SOL_START, HEAT_SPREADER_SOL_LEN};
+ static constexpr mss::field_t CONTINUATION_CODES{133, CONTINUATION_CODES_START, CONTINUATION_CODES_LEN};
+ static constexpr mss::field_t LAST_NON_ZERO_BYTE{134, LAST_NON_ZERO_BYTE_START, LAST_NON_ZERO_BYTE_LEN};
+ static constexpr mss::field_t REGISTER_REV{135, REGISTER_REV_START, REGISTER_REV_LEN};
+ static constexpr mss::field_t ADDR_MAP_REG_TO_DRAM{136, ADDR_MAPPING_START, ADDR_MAPPING_LEN};
+ static constexpr mss::field_t CKE_DRIVER{137, CKE_DRIVER_START, CKE_DRIVER_LEN};
+ static constexpr mss::field_t ODT_DRIVER{137, ODT_DRIVER_START, ODT_DRIVER_LEN};
+ static constexpr mss::field_t CA_DRIVER{137, CA_DRIVER_START, CA_DRIVER_LEN};
+ static constexpr mss::field_t CS_DRIVER{137, CS_DRIVER_START, CS_DRIVER_LEN};
+ static constexpr mss::field_t YO_Y2_DRIVER{138, YO_Y2_DRIVER_START, YO_Y2_DRIVER_LEN};
+ static constexpr mss::field_t Y1_Y3_DRIVER{138, Y1_Y3_DRIVER_START, Y1_Y3_DRIVER_LEN};
+ static constexpr mss::field_t DATA_BUFFER_REV{139, DB_REV_START, DB_REV_LEN};
+ static constexpr mss::field_t BCOM_BODT_BCKE_DRIVER{138, BCOM_BODT_BCKE_DRIVER_START, BCOM_BODT_BCKE_DRIVER_LEN};
+ static constexpr mss::field_t BCK_DRIVER{138, BCK_DRIVER_START, BCK_DRIVER_LEN};
+ static constexpr mss::field_t RCD_SLEW_CNTRL{138, RCD_SLEW_CNTRL_START, RCD_SLEW_CNTRL_LEN };
+ static constexpr mss::field_t VREF_DQ_RANK0{140, VREF_DQ_RANK0_START, VREF_DQ_RANK0_LEN};
+ static constexpr mss::field_t VREF_DQ_RANK1{141, VREF_DQ_RANK1_START, VREF_DQ_RANK1_LEN};
+ static constexpr mss::field_t VREF_DQ_RANK2{142, VREF_DQ_RANK2_START, VREF_DQ_RANK2_LEN};
+ static constexpr mss::field_t VREF_DQ_RANK3{143, VREF_DQ_RANK3_START, VREF_DQ_RANK3_LEN};
+ static constexpr mss::field_t DATA_BUFFER_VREF_DQ{144, DB_VREF_DQ_START, DB_VREF_DQ_LEN};
+ static constexpr mss::field_t DB_MDQ_LTE_1866{145, DB_MDQ_START, DB_MDQ_LEN};
+ static constexpr mss::field_t DB_MDQ_LTE_2400{146, DB_MDQ_START, DB_MDQ_LEN};
+ static constexpr mss::field_t DB_MDQ_LTE_3200{147, DB_MDQ_START, DB_MDQ_LEN};
+ static constexpr mss::field_t DB_MDQ_RTT_LTE_1866{145, DB_MDQ_RTT_START, DB_MDQ_RTT_LEN};
+ static constexpr mss::field_t DB_MDQ_RTT_LTE_2400{146, DB_MDQ_RTT_START, DB_MDQ_RTT_LEN};
+ static constexpr mss::field_t DB_MDQ_RTT_LTE_3200{147, DB_MDQ_RTT_START, DB_MDQ_RTT_LEN};
+ static constexpr mss::field_t DRAM_DRIVE_STRENGTH_LTE_1866{148, DRAM_DRIVE_1866_START, DRAM_DRIVE_LEN};
+ static constexpr mss::field_t DRAM_DRIVE_STRENGTH_LTE_2400{148, DRAM_DRIVE_2400_START, DRAM_DRIVE_LEN};
+ static constexpr mss::field_t DRAM_DRIVE_STRENGTH_LTE_3200{148, DRAM_DRIVE_3200_START, DRAM_DRIVE_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_NOM_LTE_1866{149, DRAM_ODT_RTT_NOM_START, DRAM_ODT_RTT_NOM_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_WR_LTE_1866{149, DRAM_ODT_RTT_WR_START, DRAM_ODT_RTT_WR_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_NOM_LTE_2400{150, DRAM_ODT_RTT_NOM_START, DRAM_ODT_RTT_NOM_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_WR_LTE_2400{150, DRAM_ODT_RTT_WR_START, DRAM_ODT_RTT_WR_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_NOM_LTE_3200{151, DRAM_ODT_RTT_NOM_START, DRAM_ODT_RTT_NOM_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_WR_LTE_3200{151, DRAM_ODT_RTT_WR_START, DRAM_ODT_RTT_WR_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_PARK_R01_LTE_1866{152, DRAM_ODT_RTT_PARK_R01_START, DRAM_ODT_RTT_PARK_R01_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_PARK_R23_LTE_1866{152, DRAM_ODT_RTT_PARK_R23_START, DRAM_ODT_RTT_PARK_R23_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_PARK_R01_LTE_2400{153, DRAM_ODT_RTT_PARK_R01_START, DRAM_ODT_RTT_PARK_R01_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_PARK_R23_LTE_2400{153, DRAM_ODT_RTT_PARK_R23_START, DRAM_ODT_RTT_PARK_R23_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_PARK_R01_LTE_3200{154, DRAM_ODT_RTT_PARK_R01_START, DRAM_ODT_RTT_PARK_R01_LEN};
+ static constexpr mss::field_t DRAM_ODT_RTT_PARK_R23_LTE_3200{154, DRAM_ODT_RTT_PARK_R23_START, DRAM_ODT_RTT_PARK_R23_LEN};
+ static constexpr mss::field_t DRAM_VREF_DQ_RANGE{155, DRAM_VREF_DQ_RANGE_START, DRAM_VREF_DQ_RANGE_LEN};
+ static constexpr mss::field_t DATA_BUFFER_VREF_DQ_RANGE{155, DB_VREF_DQ_RANGE_START, DB_VREF_DQ_RANGE_LEN};
+ static constexpr mss::field_t DATA_BUFFER_GAIN_ADJUST{156, DB_GAIN_ADJUST_START, DB_GAIN_ADJUST_LEN};
+ static constexpr mss::field_t DATA_BUFFER_DFE{156, DB_DFE_START, DB_DFE_LEN};
};
}// spd
diff --git a/src/import/generic/memory/lib/spd/spd_reader.H b/src/import/generic/memory/lib/spd/spd_reader.H
index c67db544b..049d4171a 100644
--- a/src/import/generic/memory/lib/spd/spd_reader.H
+++ b/src/import/generic/memory/lib/spd/spd_reader.H
@@ -40,10 +40,8 @@
#include <fapi2.H>
#include <cstdint>
#include <generic/memory/lib/spd/spd_field.H>
-#include <generic/memory/lib/utils/c_str.H>
#include <generic/memory/lib/spd/spd_traits_ddr4.H>
-#include <generic/memory/lib/spd/spd_checker.H>
-#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+#include <generic/memory/lib/utils/mss_field.H>
namespace mss
{
@@ -51,139 +49,10 @@ namespace spd
{
///
-/// @brief Helper function to find bit length of an integral type
-/// @tparam T integral type
-/// @return bit length for given integral type
-///
-template < typename T >
-constexpr size_t get_bit_length()
-{
- return sizeof(T) * BITS_PER_BYTE;
-}
-
-///
-/// @brief Helper function to find bit length of an input param
-/// @tparam T input type
-/// @param[in] i_input argument we want to get bit length of
-/// @return bit length for given input
-///
-template < typename T >
-constexpr size_t get_bit_length(const T& i_input)
-{
- return sizeof(T) * BITS_PER_BYTE;
-}
-
-///
-/// @brief Variadic helper function to find bit length of integral types
-/// @tparam T input type
-/// @tparam Types input type for a list in input params
-/// @param[in] i_first first argument we want to get bit length of
-/// @param[in] i_args list of arguments we want to get the total bit length of
-/// @return total bit length for given input
-//
-template < typename T, typename... Types >
-constexpr size_t get_bit_length (const T& i_first, const Types& ... i_args)
-{
- // Recursive-ish pattern to add up bit length of passed in params
- return get_bit_length(i_first) + get_bit_length(i_args...);
-}
-
-///
-/// @tparam T input type
-/// @tparam T
-/// @param[in] i_data data to insert
-/// @param[in,out] io_out buffer we wish to insert values to
-///
-template <size_t INPUT_BIT_LEN, typename T, typename OT>
-static void set_buffer_helper(const T i_data, fapi2::buffer<OT>& io_out)
-{
- constexpr size_t l_output_bit_length = get_bit_length<OT>();
-
- constexpr size_t l_start_bit = l_output_bit_length - INPUT_BIT_LEN;
- constexpr size_t l_len = get_bit_length<T>();
-
- FAPI_DBG("Total input bit length %d, output bit length %d, insert start bit %d, insert length %d, data %d",
- INPUT_BIT_LEN, l_output_bit_length, l_start_bit, l_len, i_data);
-
- io_out.template insertFromRight<l_start_bit, l_len >(i_data);
-}
-
-///
-/// @brief Helper function to insert entire values of any integral value into a buffer
-/// @tparam T input type
-/// @tparam OT output type of fapi2::buffer
-/// @param[in,out] io_out buffer we wish to insert values to
-/// @param[in] i_input argument we want to get bit length of
-///
-template <typename T, typename OT>
-void rightAlignedInsert(fapi2::buffer<OT>& io_out, const T& i_input)
-{
- constexpr size_t l_input_total_args_bit_length = get_bit_length(i_input);
- set_buffer_helper<l_input_total_args_bit_length>(i_input, io_out);
-}
-
-///
-/// @tparam T input type
-/// @tparam Types input type for a list in input params
-/// @param[in,out] io_out buffer we wish to insert values to
-/// @param[in] i_first first argument we want to get bit length of
-/// @param[in] i_args list of arguments we want to get the total bit length of
-///
-template <typename T, typename OT, typename... Types>
-void rightAlignedInsert(fapi2::buffer<OT>& io_out, const T& first, const Types& ... args)
-{
- constexpr size_t l_input_total_args_bit_length = get_bit_length(first, args...);
- set_buffer_helper<l_input_total_args_bit_length>(first, io_out);
-
- rightAlignedInsert(io_out, args...);
-}
-
-///
-/// @brief Helper function to extract byte information
-/// @tparam F the SPD field to extract
-/// @param[in] i_target the dimm target
-/// @param[in] i_spd_data the SPD data
-/// @param[out] o_value raw value for this SPD field
-/// @return FAPI2_RC_SUCCESS iff okay
-///
-template< const field_t& F >
-fapi2::ReturnCode extract_field(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
- const std::vector<uint8_t>& i_spd_data,
- uint8_t& o_value)
-{
- FAPI_ASSERT( F.get_byte() < i_spd_data.size(),
- fapi2::MSS_OUT_OF_BOUNDS_INDEXING()
- .set_INDEX(F.get_byte())
- .set_LIST_SIZE(i_spd_data.size())
- .set_FUNCTION(EXTRACT_SPD_FLD)
- .set_TARGET(i_target),
- "Out of bounds indexing (with %d) on a list of size %d for %s",
- F.get_byte(),
- i_spd_data.size(),
- spd::c_str(i_target));
-
- {
- // Extracting desired bits
- const fapi2::buffer<uint8_t> l_buffer(i_spd_data[F.get_byte()]);
- l_buffer.extractToRight<F.get_start(), F.get_length()>(o_value);
-
- FAPI_INF("%s SPD data at Byte %d: 0x%02x.",
- spd::c_str(i_target),
- F.get_byte(),
- o_value);
- }
-
- return fapi2::FAPI2_RC_SUCCESS;
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
/// @brief SPD reader
/// @tparam F the SPD field to read
/// @tparam R the SPD revision
-/// @tparam T data input type
+/// @tparam IT data input type
/// @tparam OT data output type
/// @tparam TT traits associated with reader, defaulted to readerTraits<F, T>
/// @param[in] i_target the dimm target
@@ -191,43 +60,18 @@ fapi_try_exit:
/// @param[out] o_value raw value for this SPD field
/// @return FAPI2_RC_SUCCESS iff okay
///
-template< const field_t& F, rev R, typename T, typename OT, typename TT = readerTraits<F, R> >
+template< const field_t& F,
+ rev R,
+ typename IT,
+ typename OT,
+ typename TT = readerTraits<F, R> >
fapi2::ReturnCode reader( const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
- const std::vector<T>& i_spd_data,
+ const std::vector<IT>& i_spd_data,
OT& o_value)
{
- T l_temp = 0;
- FAPI_TRY( extract_field<F>(i_target, i_spd_data, l_temp),
- "Failed extract_field() for %s", spd::c_str(i_target) );
-
- FAPI_DBG("extracted %s value: 0x%02x for %s",
- TT::FIELD_STR, l_temp, spd::c_str(i_target));
-
- // Test if retrieved data seems valid
- FAPI_TRY( check::fail_for_invalid_value(i_target,
- conditional( l_temp,
- TT::COMPARISON_VAL,
- typename TT::template COMPARISON_OP<T>() ),
- F.get_byte(),
- l_temp),
- "Failed fail_for_invalid_value() for %s", spd::c_str(i_target) );
-
- // Output should only change if data check passes
- o_value = static_cast<OT>(l_temp);
-
- FAPI_ASSERT( o_value == l_temp,
- fapi2::MSS_CONVERSION_ERROR()
- .set_ORIGINAL_VAL(l_temp)
- .set_CONVERTED_VAL(o_value)
- .set_TARGET(i_target)
- .set_FUNCTION(SPD_READER),
- "Conversion error between original %d to converted %d value for %s",
- l_temp, o_value, spd::c_str(i_target) );
- FAPI_INF("%s: 0x%02x for %s",
- TT::FIELD_STR,
- o_value,
- spd::c_str(i_target));
+ FAPI_TRY( (mss::get_field<F, TT>(i_target, i_spd_data, mss::READ_SPD_FIELD, o_value)),
+ "Failed read_field() for %s", spd::c_str(i_target) );
fapi_try_exit:
return fapi2::current_err;
diff --git a/src/import/generic/memory/lib/spd/spd_traits.H b/src/import/generic/memory/lib/spd/spd_traits.H
index b05f2c447..fe3f91440 100644
--- a/src/import/generic/memory/lib/spd/spd_traits.H
+++ b/src/import/generic/memory/lib/spd/spd_traits.H
@@ -46,23 +46,6 @@ namespace spd
{
///
-/// @brief Checks SPD input field against a custom conditional
-/// @tparam T SPD field input type
-/// @tparam F Callable object type
-/// @param[in] i_spd_field Extracted SPD field
-/// @param[in] i_comparison_val value we are comparing against
-/// @param[in] i_op comparison operator function object
-/// @return boolean true or false
-///
-template < typename T, typename F >
-bool conditional(const T i_spd_field,
- const size_t i_comparison_val,
- const F i_op)
-{
- return i_op(i_spd_field, i_comparison_val);
-}
-
-///
/// @class readerTraits
/// @brief trait structure to hold static SPD information
/// @tparam F holds SPD field info
OpenPOWER on IntegriCloud