diff options
author | Andre Marin <aamarin@us.ibm.com> | 2018-07-24 00:02:23 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-08-06 09:32:54 -0500 |
commit | 6a03e838d00c6fb01525019c9b8c1cc3c667c7d3 (patch) | |
tree | b2d8639f14c4e910c5a5b6efc60f17f34cde096f | |
parent | 95b925b6af0e553da06f61d89d2a0c1616882e29 (diff) | |
download | talos-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>
16 files changed, 764 insertions, 517 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C index 4e52d5083..2e2a49540 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/eff_dimm.C @@ -937,6 +937,7 @@ fapi_try_exit: /// fapi2::ReturnCode eff_dimm::primary_stack_type() { + constexpr size_t BYTE = 6; uint8_t l_stack_type = 0; uint8_t l_package_type = 0; @@ -952,22 +953,26 @@ fapi2::ReturnCode eff_dimm::primary_stack_type() // JEDEC standard says if the SPD says monolithic in A[7], // stack type must be 00 or "SDP" which is what our enum is set to FAPI_ASSERT( (l_stack_type == fapi2::ENUM_ATTR_EFF_PRIM_STACK_TYPE_SDP), - fapi2::MSS_BAD_SPD() - .set_VALUE(l_stack_type) - .set_BYTE(6) - .set_DIMM_TARGET(iv_dimm), - "Invalid SPD for calculating ATTR_EFF_PRIM_STACK_TYPE"); + fapi2::MSS_FAILED_DATA_INTEGRITY_CHECK(). + set_VALUE(l_stack_type). + set_BYTE(BYTE). + set_TARGET(iv_dimm). + set_FFDC_CODE(PRIMARY_STACK_TYPE), + "Invalid SPD for calculating ATTR_EFF_PRIM_STACK_TYPE for %s", + mss::c_str(iv_dimm) ); break; case mss::spd::NON_MONOLITHIC: FAPI_ASSERT( (l_stack_type == fapi2::ENUM_ATTR_EFF_PRIM_STACK_TYPE_DDP_QDP) || (l_stack_type == fapi2::ENUM_ATTR_EFF_PRIM_STACK_TYPE_3DS), - fapi2::MSS_BAD_SPD() - .set_VALUE(l_stack_type) - .set_BYTE(6) - .set_DIMM_TARGET(iv_dimm), - "Invalid SPD for calculating ATTR_EFF_PRIM_STACK_TYPE"); + fapi2::MSS_FAILED_DATA_INTEGRITY_CHECK(). + set_VALUE(l_stack_type). + set_BYTE(BYTE). + set_TARGET(iv_dimm). + set_FFDC_CODE(PRIMARY_STACK_TYPE), + "Invalid SPD for calculating ATTR_EFF_PRIM_STACK_TYPE for %s", + mss::c_str(iv_dimm) ); break; default: diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H b/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H index 6535cab1e..d8187e549 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/shared/mss_const.H @@ -212,6 +212,9 @@ enum ffdc_function_codes FREQ_SCOREBOARD_MAX_SUPPORTED_FREQ = 113, FREQ_SCOREBOARD_SUPPORTED_FREQS = 114, LIMIT_FREQ_BY_VPD = 115, + + // eff_dimm.C + PRIMARY_STACK_TYPE = 116, }; enum states diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml index 4f63f6bc1..fc5d460eb 100644 --- a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml +++ b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml @@ -141,4 +141,28 @@ </callout> </hwpError> + + <hwpError> + <rc>RC_MSS_FAILED_DATA_INTEGRITY_CHECK</rc> + <description> + Bad data received. + Settings are incorrect for received data. + This could be code problem (decoding) or bad data. + </description> + <ffdc>VALUE</ffdc> + <ffdc>BYTE</ffdc> + <ffdc>FFDC_CODE</ffdc> + <callout> + <procedure>CODE</procedure> + <priority>MEDIUM</priority> + </callout> + <callout> + <target>TARGET</target> + <priority>HIGH</priority> + </callout> + <deconfigure> + <target>TARGET</target> + </deconfigure> + </hwpError> + </hwpErrors> diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_spd_decode.xml b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_spd_decode.xml index e37308594..a1310dec2 100644 --- a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_spd_decode.xml +++ b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_spd_decode.xml @@ -97,28 +97,6 @@ </hwpError> <hwpError> - <rc>RC_MSS_BAD_SPD</rc> - <description> - Bad SPD data received. - Settings are incorrect within SPD. - This could be code problem (decoding) or bad SPD - </description> - <ffdc>VALUE</ffdc> - <ffdc>BYTE</ffdc> - <callout> - <procedure>CODE</procedure> - <priority>MEDIUM</priority> - </callout> - <callout> - <target>DIMM_TARGET</target> - <priority>HIGH</priority> - </callout> - <deconfigure> - <target>DIMM_TARGET</target> - </deconfigure> - </hwpError> - - <hwpError> <rc>RC_MSS_INVALID_DRAM_GEN</rc> <description> Received a DRAM gen unsupported by the SPD decoder factory 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 diff --git a/src/import/generic/memory/lib/utils/mss_buffer_utils.H b/src/import/generic/memory/lib/utils/mss_buffer_utils.H index fb1e5f2b2..f2e577d0e 100644 --- a/src/import/generic/memory/lib/utils/mss_buffer_utils.H +++ b/src/import/generic/memory/lib/utils/mss_buffer_utils.H @@ -22,3 +22,123 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ + +/// +/// @file mss_buffer_utils.H +/// @brief Buffer utility functions +/// + +// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com> +// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com> +// *HWP Team: Memory +// *HWP Level: 2 +// *HWP Consumed by: HB:FSP + +#ifndef _MSS_BUFFER_UTILS_H_ +#define _MSS_BUFFER_UTILS_H_ + +#include <generic/memory/lib/utils/shared/mss_generic_consts.H> +#include <generic/memory/lib/utils/mss_generic_check.H> + +namespace mss +{ + +/// +/// @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...); +} + +/// +/// @brief Helper function for insertion boilerplate +/// @tparam INPUT_BIT_LEN input bit length +/// @tparam T input type +/// @tparam OT output type +/// @param[in] i_data data to insert +/// @param[in,out] io_out buffer we wish to insert values to +/// @note inserts full integral size in bit length (e.g. uint8_t -> 8 bits, uint32_t -> 32 bits) +/// +template <size_t INPUT_BIT_LEN, typename T, typename OT> +static void right_aligned_insert_helper(const T i_data, fapi2::buffer<OT>& io_out) +{ + constexpr size_t BUFFER_BIT_LEN = get_bit_length<OT>(); + + constexpr size_t l_start_bit = BUFFER_BIT_LEN - 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, BUFFER_BIT_LEN, l_start_bit, l_len, i_data); + + io_out.template insertFromRight<l_start_bit, l_len >(i_data); +} + +/// +/// @brief Base 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 +/// @note inserts full integral size in bit length (e.g. uint8_t -> 8 bits, uint32_t -> 32 bits) +/// +template <typename T, typename OT> +void right_aligned_insert(fapi2::buffer<OT>& io_out, const T& i_input) +{ + constexpr size_t l_input_total_args_bit_length = get_bit_length(i_input); + right_aligned_insert_helper<l_input_total_args_bit_length>(i_input, io_out); +} + +/// +/// @brief Variadic function to insert entire values of any integral value into a buffer +/// @tparam T input type +/// @tparam OT output type of fapi2::buffer +/// @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 +/// @note inserts full integral size in bit length (e.g. uint8_t -> 8 bits, uint32_t -> 32 bits) +/// @note params are ordered to be inserted from left to right +/// +template <typename T, typename OT, typename... Types> +void right_aligned_insert(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...); + right_aligned_insert_helper<l_input_total_args_bit_length>(first, io_out); + + right_aligned_insert(io_out, args...); +} + +}// mss + +#endif // _MSS_BUFFER_UTILS_H_ diff --git a/src/import/generic/memory/lib/utils/mss_field.H b/src/import/generic/memory/lib/utils/mss_field.H index 0a3031462..54d170cd4 100644 --- a/src/import/generic/memory/lib/utils/mss_field.H +++ b/src/import/generic/memory/lib/utils/mss_field.H @@ -22,3 +22,317 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ + +/// +/// @file mss_field.H +/// @brief API for data fields and operations +/// + +// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com> +// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com> +// *HWP Team: Memory +// *HWP Level: 2 +// *HWP Consumed by: HB:FSP + +#ifndef _MSS_FIELD_H_ +#define _MSS_FIELD_H_ + +#include <generic/memory/lib/utils/shared/mss_generic_consts.H> +#include <generic/memory/lib/utils/mss_generic_check.H> + +namespace mss +{ + +/// +/// @class field_t +/// @brief data structure for 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 field + /// + constexpr size_t get_byte() const + { + return iv_byte; + } + + /// + /// @brief Starting bit getter + /// @return the starting bit position for this field + /// + constexpr size_t get_start() const + { + return iv_start; + } + + /// + /// @brief bit length getter + /// @return the bit length of this field + /// + constexpr size_t get_length() const + { + return iv_length; + } + +};// field_t + +/// +/// @brief Checks input field against a custom conditional +/// @tparam T field input type +/// @tparam F Callable object type +/// @param[in] i_field Extracted 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_field, + const size_t i_comparison_val, + const F i_op) +{ + return i_op(i_field, i_comparison_val); +} + +/// +/// @brief Helper function to extract byte information +/// @tparam F the field to extract +/// @tparam T the fapi2 target type +/// @param[in] i_target the fapi2 target +/// @param[in] i_data the data +/// @param[in] i_ffdc_codes FFDC code +/// @param[out] o_value raw value for this field +/// @return FAPI2_RC_SUCCESS iff okay +/// +template< const field_t& F, fapi2::TargetType T > +fapi2::ReturnCode get_field(const fapi2::Target<T>& i_target, + const std::vector<uint8_t>& i_data, + const generic_ffdc_codes i_ffdc_codes, + uint8_t& o_value) +{ + constexpr size_t BYTE = F.get_byte(); + + FAPI_ASSERT( BYTE < i_data.size(), + fapi2::MSS_OUT_OF_BOUNDS_INDEXING() + .set_INDEX(BYTE) + .set_LIST_SIZE(i_data.size()) + .set_FUNCTION(i_ffdc_codes) + .set_TARGET(i_target), + "Out of bounds indexing (with %d) on a list of size %d for %s", + BYTE, + i_data.size(), + spd::c_str(i_target)); + + { + // Extracting desired bits + const fapi2::buffer<uint8_t> l_buffer(i_data[BYTE]); + l_buffer.extractToRight<F.get_start(), F.get_length()>(o_value); + + FAPI_DBG("%s data[%d] = 0x%02x. Field with start bit %d, bit len %d, has data 0x%02x.", + spd::c_str(i_target), + BYTE, + i_data[BYTE], + F.get_start(), + F.get_length(), + o_value); + } + + return fapi2::FAPI2_RC_SUCCESS; + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Helper function to set byte field information +/// @tparam F the field to extract +/// @tparam T the fapi2 target type +/// @param[in] i_target the fapi2 target +/// @param[in] i_setting the setting to set +/// @param[in] i_ffdc_codes FFDC code +/// @param[in,out] io_data the data to modify +/// @return FAPI2_RC_SUCCESS iff okay +/// +template< const field_t& F, fapi2::TargetType T > +fapi2::ReturnCode set_field(const fapi2::Target<T>& i_target, + const size_t i_setting, + const generic_ffdc_codes i_ffdc_codes, + std::vector<uint8_t>& io_data) +{ + constexpr size_t BYTE = F.get_byte(); + + FAPI_ASSERT( BYTE < io_data.size(), + fapi2::MSS_OUT_OF_BOUNDS_INDEXING() + .set_INDEX(BYTE) + .set_LIST_SIZE(io_data.size()) + .set_FUNCTION(i_ffdc_codes) + .set_TARGET(i_target), + "Out of bounds indexing (with %d) on a list of size %d for %s", + BYTE, + io_data.size(), + spd::c_str(i_target)); + + { + // Insert desired setting + fapi2::buffer<uint8_t> l_buffer(io_data[BYTE]); + l_buffer.insertFromRight<F.get_start(), F.get_length()>(i_setting); + + io_data[BYTE] = static_cast<uint8_t>(l_buffer); + + FAPI_DBG("%s data[%d] = 0x%02x. Field with start bit %d, bit len %d, has data 0x%02x.", + spd::c_str(i_target), + BYTE, + io_data[BYTE], + F.get_start(), + F.get_length(), + i_setting); + } + + return fapi2::FAPI2_RC_SUCCESS; + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief byte field reader +/// @tparam F the byte field to read +/// @tparam TT traits associated with F - required +/// @tparam T the fapi2 target type +/// @tparam IT data input type +/// @tparam OT data output type +/// @param[in] i_target the dimm target +/// @param[in] i_data the data +/// @param[in] i_ffdc_codes FFDC code +/// @param[out] o_value raw value for this field +/// @return FAPI2_RC_SUCCESS iff okay +/// +template< const field_t& F, + typename TT, + fapi2::TargetType T, + typename IT, + typename OT > +inline fapi2::ReturnCode get_field( const fapi2::Target<T>& i_target, + const std::vector<IT>& i_data, + const generic_ffdc_codes i_ffdc_codes, + OT& o_value ) +{ + IT l_temp = 0; + FAPI_TRY( get_field<F>(i_target, i_data, i_ffdc_codes, l_temp), + "Failed get_field() for %s", spd::c_str(i_target) ); + + // Test if retrieved data seems valid + FAPI_TRY( check::invalid_value(i_target, + conditional( l_temp, + TT::COMPARISON_VAL, + typename TT::template COMPARISON_OP<IT>() ), + F.get_byte(), + l_temp, + i_ffdc_codes), + "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(i_ffdc_codes), + "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_exit: + return fapi2::current_err; +} + +/// +/// @brief byte field writer +/// @tparam F the byte field to read +/// @tparam TT traits associated with writer +/// @tparam T the fapi2 target type +/// @tparam IT data input type +/// @tparam OT data output type +/// @param[in] i_target the dimm target +/// @param[in] i_setting value to set for field +/// @param[in] i_ffdc_codes FFDC code +/// @param[in,out] io_data the data to modify +/// @return FAPI2_RC_SUCCESS iff okay +/// +template< const field_t& F, + typename TT, + fapi2::TargetType T, + typename IT, + typename OT > +fapi2::ReturnCode set_field( const fapi2::Target<T>& i_target, + const size_t i_setting, + const generic_ffdc_codes i_ffdc_codes, + std::vector<OT>& io_data ) +{ + constexpr size_t BYTE = F.get_byte(); + + // Test if the data we want to set is valid for this field + FAPI_TRY( check::invalid_value(i_target, + conditional( i_setting, + TT::COMPARISON_VAL, + typename TT::template COMPARISON_OP<IT>() ), + BYTE, + i_setting, + i_ffdc_codes), + "Failed fail_for_invalid_value() for %s", spd::c_str(i_target) ); + + FAPI_TRY( set_field<F>(i_target, i_setting, i_ffdc_codes, io_data), + "Failed set_field() for %s", spd::c_str(i_target) ); + + FAPI_INF("%s: Set value of 0x%02x. Data for buffer at byte %d, is now 0x%02x for %s", + TT::FIELD_STR, + i_setting, + BYTE, + io_data[BYTE], + spd::c_str(i_target)); + +fapi_try_exit: + return fapi2::current_err; +} + +}// mss + +#endif diff --git a/src/import/generic/memory/lib/utils/mss_generic_check.H b/src/import/generic/memory/lib/utils/mss_generic_check.H index 099402c05..ea18664ec 100644 --- a/src/import/generic/memory/lib/utils/mss_generic_check.H +++ b/src/import/generic/memory/lib/utils/mss_generic_check.H @@ -22,3 +22,68 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ + +/// +/// @file mss_generic_check.H +/// @brief Checker functions for generic API +/// +// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com> +// *HWP HWP Backup: Stephen Glancy <sglancy@us.ibm.com> +// *HWP Team: Memory +// *HWP Level: 3 +// *HWP Consumed by: HB:FSP + +#ifndef _MSS_GENERIC_CHECK_H_ +#define _MSS_GENERIC_CHECK_H_ + +#include <fapi2.H> +#include <generic/memory/lib/utils/shared/mss_generic_consts.H> +#include <generic/memory/lib/utils/c_str.H> + +namespace mss +{ +namespace check +{ + +/// +/// @brief Checks conditional passes and implements traces & exits if it fails +/// @tparam T fapi2 target type +/// @tparam IT input data type +/// @param[in] i_target fapi2 target +/// @param[in] i_conditional conditional that we are testing against +/// @param[in] i_byte_index byte index +/// @param[in] i_data debug data +/// @param[in] i_ffdc_codes FFDC code +/// @param[in] i_err_str error string - defaulted to "" +/// @return FAPI2_RC_SUCCESS iff okay +/// +template< fapi2::TargetType T, typename IT > +inline fapi2::ReturnCode invalid_value(const fapi2::Target<T>& i_target, + const bool i_conditional, + const size_t i_byte_index, + const IT i_data, + const generic_ffdc_codes i_ffdc_codes, + const char* i_err_str = "") +{ + FAPI_ASSERT(i_conditional, + fapi2::MSS_FAILED_DATA_INTEGRITY_CHECK(). + set_VALUE(i_data). + set_BYTE(i_byte_index). + set_TARGET(i_target). + set_FFDC_CODE(i_ffdc_codes), + "%s %s Byte %d, Data returned: %d.", + spd::c_str(i_target), + i_err_str, + i_byte_index, + i_data); + + return fapi2::FAPI2_RC_SUCCESS; +fapi_try_exit: + return fapi2::current_err; + +} // fail_for_invalid_value + +} // check +}// mss + +#endif diff --git a/src/import/generic/memory/lib/utils/shared/mss_generic_consts.H b/src/import/generic/memory/lib/utils/shared/mss_generic_consts.H index 736827295..9952519c8 100644 --- a/src/import/generic/memory/lib/utils/shared/mss_generic_consts.H +++ b/src/import/generic/memory/lib/utils/shared/mss_generic_consts.H @@ -70,8 +70,8 @@ enum generic_ffdc_codes SET_ATTR_HYBRID_MEDIA = 0x1003, SET_ATTR_MASTER_RANKS = 0x1004, PRE_DATA_ENGINE_CTOR = 0x1005, - EXTRACT_SPD_FLD = 0x1006, - SPD_READER = 0x1007, + GET_FIELD = 0x1006, + READ_SPD_FIELD = 0x1007, BASE_CFG_PARAM_SELECT = 0x1008, DIMM_MODULE_PARAM_SELECT = 0x1009, BASE_CFG_FACTORY = 0x100A, @@ -93,6 +93,8 @@ enum generic_ffdc_codes TWTR_L_MIN = 0x101A, DEVICE_TYPE = 0x101B, BASE_MODULE_TYPE = 0x101C, + BAD_SPD_DATA = 0x101C, + SET_FIELD = 0x101D, }; /// |