summaryrefslogtreecommitdiffstats
path: root/src/import/generic/memory/lib/spd/rdimm
diff options
context:
space:
mode:
authorAndre Marin <aamarin@us.ibm.com>2018-05-29 08:37:46 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-07-31 15:34:02 -0500
commit77a99242f79dbe5aaf47b950f070ccaeaa58d240 (patch)
treed892c4a8b69d77769a38d8dc77d6bd64d4aca468 /src/import/generic/memory/lib/spd/rdimm
parent73f196ac8f86bbe898733721db58e143b0a42d6c (diff)
downloadblackbird-hostboot-77a99242f79dbe5aaf47b950f070ccaeaa58d240.tar.gz
blackbird-hostboot-77a99242f79dbe5aaf47b950f070ccaeaa58d240.zip
Remove Nimbus dependencies from the SPD decoder
Created a new pre_data_engine to set preliminary data needed before eff_config. Moved SPD to attribute mapping to eff_dimm structure and away from the SPD decoder to make it reusable for future memory controllers. Updated bugs in unit tests. Added SPD factory classes. This is only needed for Axone. Change-Id: Ief0a479ee1c7a4dab852ffb18b595564c0125e35 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/58611 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Dev-Ready: ANDRE A. MARIN <aamarin@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@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/59470 Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Tested-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/generic/memory/lib/spd/rdimm')
-rw-r--r--src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H436
-rw-r--r--src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_0.C644
-rw-r--r--src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_1.C268
3 files changed, 209 insertions, 1139 deletions
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 0ec15c90e..96290460b 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
@@ -38,137 +38,79 @@
#include <fapi2.H>
#include <generic/memory/lib/spd/common/dimm_module_decoder.H>
+#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>
namespace mss
{
namespace spd
{
-namespace ddr4
-{
-namespace rdimm
-{
///
/// @class decoder
-/// @brief RDIMM module SPD DRAM decoder for rev 1.0
+/// @tparam R SPD revision - partial specialization
+/// @brief RDIMM module SPD DRAM decoder
///
-class decoder_v1_0 : public dimm_module_decoder
+template < rev R >
+class decoder<DDR4, RDIMM_MODULE, R > : public dimm_module_decoder
{
- protected:
+ private:
- enum
- {
- // Byte 128
- MODULE_NOM_HEIGHT_START = 3,
- MODULE_NOM_HEIGHT_LEN = 5,
- RAW_CARD_EXT_START = 0,
- RAW_CARD_EXT_LEN = 3,
-
- // Byte 129
- FRONT_MODULE_THICKNESS_START = 4,
- FRONT_MODULE_THICKNESS_LEN = 4,
- BACK_MODULE_THICKNESS_START = 0,
- BACK_MODULE_THICKNESS_LEN = 4,
-
- // Byte 130
- REF_RAW_CARD_START = 3,
- REF_RAW_CARD_LEN = 5,
- REF_RAW_CARD_REV_START = 1,
- REF_RAW_CARD_REV_LEN = 2,
- REF_RAW_CARD_EXT_START = 0,
- REF_RAW_CARD_EXT_LEN = 1,
-
- // Byte 131
- REGS_USED_START = 6,
- REGS_USED_LEN = 2,
- ROWS_OF_DRAMS_START = 4,
- ROWS_OF_DRAMS_LEN = 2,
- REGISTER_TYPE_START = 0,
- REGISTER_TYPE_LEN = 4,
-
- // Byte 132
- HEAT_SPREADER_CHAR_START = 1,
- HEAT_SPREADER_CHAR_LEN = 7,
- HEAT_SPREADER_SOL_START = 0,
- HEAT_SPREADER_SOL_LEN = 1,
-
- // Byte 133
- CONTINUATION_CODES_START = 1,
- CONTINUATION_CODES_LEN = 7,
-
- // Byte 134 - whole byte taken
- // Byte 135 - whole byte taken
-
- // Byte 136
- ADDR_MAPPING_START = 7,
- ADDR_MAPPING_LEN = 1,
-
- // Byte 137
- CKE_DRIVER_START = 6,
- CKE_DRIVER_LEN = 2,
- ODT_DRIVER_START = 4,
- ODT_DRIVER_LEN = 2,
- CA_DRIVER_START = 2,
- CA_DRIVER_LEN = 2,
- CS_DRIVER_START = 0,
- CS_DRIVER_LEN = 2,
-
- // Byte 138
- YO_Y2_DRIVER_START = 6,
- YO_Y2_DRIVER_LEN = 2,
- Y1_Y3_DRIVER_START = 4,
- Y1_Y3_DRIVER_LEN = 2,
- };
-
- enum addr_mapping
- {
- STANDARD = 0,
- MIRRORED = 1,
- };
+ using fields_t = fields<DDR4, RDIMM_MODULE>;
+ fapi2::Target<fapi2::TARGET_TYPE_DIMM> iv_target;
+ std::vector<uint8_t> iv_data;
public:
- // 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 REF_RAW_CARD_REV{130, REF_RAW_CARD_REV_START, REF_RAW_CARD_REV_LEN};
- static constexpr field_t REF_RAW_CARD_EXT{130, REF_RAW_CARD_EXT_START, REF_RAW_CARD_EXT_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 ADDR_MAPPING{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};
-
// deleted default ctor
- decoder_v1_0() = delete;
+ decoder() = delete;
///
/// @brief ctor
/// @param[in] i_target dimm target
/// @param[in] i_spd_data vector DIMM SPD data
///
- decoder_v1_0(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
- const std::vector<uint8_t>& i_spd_data):
- dimm_module_decoder(i_target, i_spd_data)
- {}
+ decoder(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
+ const std::vector<uint8_t>& i_spd_data):
+ dimm_module_decoder(i_target, i_spd_data),
+ iv_target(i_target),
+ iv_data(i_spd_data)
+ {
+ static_assert( R <= rev::RDIMM_MAX, " R > rev::RDIMM_MAX");
+ }
///
/// @brief default dtor
///
- virtual ~decoder_v1_0() = default;
+ virtual ~decoder() = default;
+
+ ///
+ /// @brief Gets decoder target
+ /// @return fapi2::Target<fapi2::TARGET_TYPE_DIMM>
+ ///
+ virtual fapi2::Target<fapi2::TARGET_TYPE_DIMM> get_dimm_target() const
+ {
+ return iv_target;
+ }
+
+ ///
+ /// @brief Gets decoder SPD data
+ /// @return std::vector<uint8_t>
+ ///
+ virtual std::vector<uint8_t> get_data() const
+ {
+ return iv_data;
+ }
+
+ ///
+ /// @brief Sets decoder SPD data
+ /// @param[in] i_spd_data SPD data in a vector reference
+ ///
+ virtual void set_data(const std::vector<uint8_t>& i_spd_data)
+ {
+ iv_data = i_spd_data;
+ }
///
/// @brief Decodes module nominal height max, in mm
@@ -179,7 +121,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 48
///
- virtual fapi2::ReturnCode max_module_nominal_height(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode max_module_nominal_height(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::MODULE_NOMINAL_HEIGHT, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes front module maximum thickness max, in mm
@@ -190,7 +138,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 48
///
- virtual fapi2::ReturnCode front_module_max_thickness(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode front_module_max_thickness(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::FRONT_MODULE_THICKNESS, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes back module maximum thickness max, in mm
@@ -201,7 +155,30 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 48
///
- virtual fapi2::ReturnCode back_module_max_thickness(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode back_module_max_thickness(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::BACK_MODULE_THICKNESS, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ ///
+ /// @brief Decodes reference raw card used
+ /// @param[out] o_output encoding from SPD
+ /// @return FAPI2_RC_SUCCESS if okay
+ /// @note SPD Byte 130 (Bits 7~0)
+ /// @note Item JEDEC Standard No. 21-C
+ /// @note DDR4 SPD Document Release 2
+ /// @note Page 4.1.2.12 - 48
+ ///
+ virtual fapi2::ReturnCode reference_raw_card(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::REF_RAW_CARD, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes number of registers used on RDIMM
@@ -212,7 +189,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 50
///
- virtual fapi2::ReturnCode num_registers_used(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode num_registers_used(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::NUM_REGS_USED, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes number of rows of DRAMs on RDIMM
@@ -223,7 +206,31 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 50
///
- virtual fapi2::ReturnCode num_rows_of_drams(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode num_rows_of_drams(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::ROWS_OF_DRAMS, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+
+ }
+
+ ///
+ /// @brief Decodes register types
+ /// @param[out] o_output encoding from SPD
+ /// @return FAPI2_RC_SUCCESS if okay
+ /// @note SPD Byte 131 (Bits 7~4)
+ /// @note Item JEDEC Standard No. 21-C
+ /// @note DDR4 SPD Document Release 3
+ /// @note Page 4.1.2.12.3 - 63
+ ///
+ virtual fapi2::ReturnCode register_and_buffer_type(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::REGISTER_TYPE, R>(iv_target, iv_data, o_output)) );
+ fapi_try_exit:
+ return fapi2::current_err;
+
+ }
///
/// @brief Decodes heat spreader thermal characteristics
@@ -234,7 +241,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 51
///
- virtual fapi2::ReturnCode heat_spreader_thermal_char(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode heat_spreader_thermal_char(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::HEAT_SPREADER_CHAR, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes heat spreader solution
@@ -245,18 +258,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 51
///
- virtual fapi2::ReturnCode heat_spreader_solution(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode heat_spreader_solution(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::HEAT_SPREADER_SOL, R>(iv_target, iv_data, o_output)) );
- ///
- /// @brief Decodes number of continuation codes
- /// @param[out] o_output drive strength encoding from SPD
- /// @return FAPI2_RC_SUCCESS if okay
- /// @note SPD Byte 133 (bit 6~0)
- /// @note Item JEDEC Standard No. 21-C
- /// @note DDR4 SPD Document Release 2
- /// @note Page 4.1.2.12 - 51
- ///
- virtual fapi2::ReturnCode num_continuation_codes(uint8_t& o_output) const override;
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register manufacturer ID code
@@ -267,7 +275,28 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 51
///
- virtual fapi2::ReturnCode reg_manufacturer_id_code(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode reg_manufacturer_id_code(uint16_t& o_output) const override
+ {
+ uint8_t l_cont_codes = 0;
+ uint8_t l_last_nonzero_byte = 0;
+
+ FAPI_TRY( (mss::spd::reader<fields_t::CONTINUATION_CODES, R>(iv_target, iv_data, l_cont_codes)) );
+ FAPI_TRY( (mss::spd::reader<fields_t::LAST_NON_ZERO_BYTE, R>(iv_target, iv_data, l_last_nonzero_byte)) );
+
+ {
+ fapi2::buffer<uint16_t> l_buffer;
+ rightAlignedInsert(l_buffer, l_last_nonzero_byte, l_cont_codes);
+
+ o_output = l_buffer;
+
+ FAPI_INF("%s. Register Manufacturer ID Code: 0x%04x",
+ spd::c_str(iv_target),
+ o_output);
+ }
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register revision number
@@ -278,7 +307,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 51
///
- virtual fapi2::ReturnCode register_rev_num(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode register_rev_num(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::REGISTER_REV, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes address mapping from register to dram
@@ -289,7 +324,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 52
///
- virtual fapi2::ReturnCode register_to_dram_addr_mapping(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode register_to_dram_addr_mapping(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::ADDR_MAP_REG_TO_DRAM, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register output drive strength for CKE signal
@@ -300,7 +341,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 53
///
- virtual fapi2::ReturnCode cke_signal_output_driver(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode cke_signal_output_driver(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::CKE_DRIVER, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register output drive strength for ODT signal
@@ -311,7 +358,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 53
///
- virtual fapi2::ReturnCode odt_signal_output_driver(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode odt_signal_output_driver(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::ODT_DRIVER, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register output drive strength for command/address (CA) signal
@@ -322,7 +375,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 53
///
- virtual fapi2::ReturnCode ca_signal_output_driver(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode ca_signal_output_driver(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::CA_DRIVER, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register output drive strength for control signal (CS) signal
@@ -333,7 +392,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 53
///
- virtual fapi2::ReturnCode cs_signal_output_driver(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode cs_signal_output_driver(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::CS_DRIVER, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register output drive strength for clock (B side)
@@ -344,7 +409,13 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 53
///
- virtual fapi2::ReturnCode b_side_clk_output_driver(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode b_side_clk_output_driver(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::YO_Y2_DRIVER, R>(iv_target, iv_data, o_output)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Decodes register output drive strength for clock (A side)
@@ -355,106 +426,17 @@ class decoder_v1_0 : public dimm_module_decoder
/// @note DDR4 SPD Document Release 2
/// @note Page 4.1.2.12 - 53
///
- virtual fapi2::ReturnCode a_side_clk_output_driver(uint8_t& o_output) const override;
-
-};// decoder_v1_0
-
-///
-/// @class decoder
-/// @brief RDIMM module SPD DRAM decoder for rev 1.1
-///
-class decoder_v1_1 : public decoder_v1_0
-{
- public:
-
- // deleted default ctor
- decoder_v1_1() = delete;
-
- ///
- /// @brief ctor
- /// @param[in] i_target dimm target
- /// @param[in] i_spd_data vector DIMM SPD data
- ///
- decoder_v1_1(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
- const std::vector<uint8_t>& i_spd_data):
- decoder_v1_0(i_target, i_spd_data)
- {}
-
- ///
- /// @brief default dtor
- ///
- virtual ~decoder_v1_1() = default;
-
- ///
- /// @brief Decodes register types
- /// @param[out] o_output encoding from SPD
- /// @return FAPI2_RC_SUCCESS if okay
- /// @note SPD Byte 131 (Bits 7~4)
- /// @note Item JEDEC Standard No. 21-C
- /// @note DDR4 SPD Document Release 3
- /// @note Page 4.1.2.12.3 - 63
- ///
- virtual fapi2::ReturnCode register_and_buffer_type(uint8_t& o_output) const override;
-
- ///
- /// @brief Decodes register output drive strength for CKE signal
- /// @param[out] o_output drive strength encoding from SPD
- /// @return FAPI2_RC_SUCCESS if okay
- /// @note SPD Byte 137 (bit 1~0)
- /// @note Item JC-45-2220.01x
- /// @note Page 76
- /// @note DDR4 SPD Document Release 4
- ///
- virtual fapi2::ReturnCode cke_signal_output_driver(uint8_t& o_output) const override;
-
- ///
- /// @brief Decodes register output drive strength for ODT signal
- /// @param[out] o_output drive strength encoding from SPD
- /// @return FAPI2_RC_SUCCESS if okay
- /// @note SPD Byte 137 (bit 3~2)
- /// @note Item JC-45-2220.01x
- /// @note Page 76
- /// @note DDR4 SPD Document Release 4
- ///
- virtual fapi2::ReturnCode odt_signal_output_driver(uint8_t& o_output) const override;
-
- ///
- /// @brief Decodes register output drive strength for control signal (CS) signal
- /// @param[out] o_output drive strength encoding from SPD
- /// @return FAPI2_RC_SUCCESS if okay
- /// @note SPD Byte 137 (bit 6~7)
- /// @note Item JC-45-2220.01x
- /// @note Page 76
- /// @note DDR4 SPD Document Release 4
- ///
- virtual fapi2::ReturnCode cs_signal_output_driver(uint8_t& o_output) const override;
+ virtual fapi2::ReturnCode a_side_clk_output_driver(uint8_t& o_output) const override
+ {
+ FAPI_TRY( (mss::spd::reader<fields_t::Y1_Y3_DRIVER, R>(iv_target, iv_data, o_output)) );
- ///
- /// @brief Decodes register output drive strength for clock (B side)
- /// @param[out] o_output drive strength encoding from SPD
- /// @return FAPI2_RC_SUCCESS if okay
- /// @note SPD Byte 138 (bit 1~0)
- /// @note Item JC-45-2220.01x
- /// @note Page 76
- /// @note DDR4 SPD Document Release 4
- ///
- virtual fapi2::ReturnCode b_side_clk_output_driver(uint8_t& o_output) const override;
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
- ///
- /// @brief Decodes register output drive strength for clock (A side)
- /// @param[out] o_output drive strength encoding from SPD
- /// @return FAPI2_RC_SUCCESS if okay
- /// @note SPD Byte 138 (bit 3~2)
- /// @note Item JC-45-2220.01x
- /// @note Page 76
- /// @note DDR4 SPD Document Release 4
- ///
- virtual fapi2::ReturnCode a_side_clk_output_driver(uint8_t& o_output) const override;
-};//decoder_v1_1
+};// decoder
-}// rdimm
-}// ddr4
}// spd
}// mss
diff --git a/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_0.C b/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_0.C
deleted file mode 100644
index 021130412..000000000
--- a/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_0.C
+++ /dev/null
@@ -1,644 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_0.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2018 */
-/* [+] International Business Machines Corp. */
-/* */
-/* */
-/* Licensed under the Apache License, Version 2.0 (the "License"); */
-/* you may not use this file except in compliance with the License. */
-/* You may obtain a copy of the License at */
-/* */
-/* http://www.apache.org/licenses/LICENSE-2.0 */
-/* */
-/* Unless required by applicable law or agreed to in writing, software */
-/* distributed under the License is distributed on an "AS IS" BASIS, */
-/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
-/* implied. See the License for the specific language governing */
-/* permissions and limitations under the License. */
-/* */
-/* IBM_PROLOG_END_TAG */
-///
-/// @file rdimm_decoder.C
-/// @brief RDIMM module specific SPD decoder definitions
-///
-// *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
-
-// std lib
-#include <vector>
-
-// fapi2
-#include <fapi2.H>
-
-// mss lib
-#include <generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H>
-#include <generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H>
-#include <generic/memory/lib/spd/spd_checker.H>
-#include <generic/memory/lib/utils/c_str.H>
-#include <generic/memory/lib/utils/find.H>
-
-using fapi2::TARGET_TYPE_MCBIST;
-using fapi2::TARGET_TYPE_MCA;
-using fapi2::TARGET_TYPE_MCS;
-using fapi2::TARGET_TYPE_DIMM;
-
-
-namespace mss
-{
-namespace spd
-{
-namespace ddr4
-{
-namespace rdimm
-{
-
-/////////////////////////
-// Member Method implementation
-// For RDIMM module rev 1.0
-/////////////////////////
-
-///
-/// @brief Decodes module nominal height max, in mm
-/// @param[out] o_output height range encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 128 (Bits 4~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 48
-///
-fapi2::ReturnCode decoder_v1_0::max_module_nominal_height(uint8_t& o_output) const
-{
- const uint8_t l_field_bits = extract_spd_field<MODULE_NOMINAL_HEIGHT>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 0b11111;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- MODULE_NOMINAL_HEIGHT.iv_byte,
- l_field_bits,
- "Failed bound check for module nominal height max") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Max module nominal height: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes front module maximum thickness max, in mm
-/// @param[out] o_output encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 129 (Bits 3~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 48
-///
-fapi2::ReturnCode decoder_v1_0::front_module_max_thickness(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<FRONT_MODULE_THICKNESS>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 0b1111;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- FRONT_MODULE_THICKNESS.iv_byte,
- l_field_bits,
- "Failed bound check for front module max thickness") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Front module max thickness: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-
-}
-
-///
-/// @brief Decodes back module maximum thickness max, in mm
-/// @param[out] o_output encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 129 (Bits 7~4)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 48
-///
-fapi2::ReturnCode decoder_v1_0::back_module_max_thickness(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<BACK_MODULE_THICKNESS>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 0b1111;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- BACK_MODULE_THICKNESS.iv_byte,
- l_field_bits,
- "Failed bound check for back module max thickness") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Back module max thickness: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-
-}
-
-///
-/// @brief Decodes number of registers used on RDIMM
-/// @param[out] o_output encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 131 (Bits 1~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 50
-///
-fapi2::ReturnCode decoder_v1_0::num_registers_used(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<NUM_REGS_USED>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 0b11;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- NUM_REGS_USED.iv_byte,
- l_field_bits,
- "Failed bound check for number of registers used on RDIMM ") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Number of registers used on RDIMM : %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-
-}
-
-///
-/// @brief Decodes number of rows of DRAMs on RDIMM
-/// @param[out] o_output encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 131 (Bits 3~2)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 50
-///
-fapi2::ReturnCode decoder_v1_0::num_rows_of_drams(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<ROWS_OF_DRAMS>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 0b11;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- ROWS_OF_DRAMS.iv_byte,
- l_field_bits,
- "Failed bound check for number of rows of DRAMs on RDIMM ") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Number of rows of DRAMs on RDIMM : %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-
-}
-
-///
-/// @brief Decodes heat spreader thermal characteristics
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCEawSS if okay
-/// @note SPD Byte 132 (Bits 6~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 51
-///
-fapi2::ReturnCode decoder_v1_0::heat_spreader_thermal_char(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<HEAT_SPREADER_CHAR>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 1;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- HEAT_SPREADER_CHAR.iv_byte,
- l_field_bits,
- "Failed bound check for heat spreader thermal characteristics") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Heat spreader thermal characteristics: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes heat spreader solution
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 132 (Bit 7)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 51
-///
-fapi2::ReturnCode decoder_v1_0::heat_spreader_solution(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<HEAT_SPREADER_SOL>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 1;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- HEAT_SPREADER_SOL.iv_byte,
- l_field_bits,
- "Failed bound check for heat spreader solution") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Heat spreader solution: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-
-///
-/// @brief Decodes number of continuation codes
-/// @param[out] o_output encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 133 (bit 6~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 51
-///
-fapi2::ReturnCode decoder_v1_0::num_continuation_codes(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<CONTINUATION_CODES>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t MAX_VALID_VALUE = 10; // JEP106AS
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits <= MAX_VALID_VALUE,
- CONTINUATION_CODES.iv_byte,
- l_field_bits,
- "Failed bound check for number of continuation codes") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Number of continuation codes: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-
-}
-
-///
-/// @brief Decodes register manufacturer ID code
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 134 (bit 7~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 51
-///
-fapi2::ReturnCode decoder_v1_0::reg_manufacturer_id_code(uint8_t& o_output) const
-{
- constexpr size_t BYTE_INDEX = 134;
- uint8_t l_raw_byte = iv_spd_data[BYTE_INDEX];
-
- // Trace in the front assists w/ debug
- FAPI_INF("%s SPD data at Byte %d: 0x%llX.",
- iv_target_str_storage,
- BYTE_INDEX,
- l_raw_byte);
-
- o_output = l_raw_byte;
-
- FAPI_INF("%s. Manufacturer ID code: %d",
- iv_target_str_storage,
- o_output);
-
- return fapi2::FAPI2_RC_SUCCESS;
-}
-
-///
-/// @brief Decodes register revision number
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 135 (bit 7~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 51
-///
-fapi2::ReturnCode decoder_v1_0::register_rev_num(uint8_t& o_output) const
-{
- constexpr size_t BYTE_INDEX = 135;
- uint8_t l_raw_byte = iv_spd_data[BYTE_INDEX];
-
- // Trace in the front assists w/ debug
- FAPI_INF("%s SPD data at Byte %d: 0x%llX.",
- iv_target_str_storage,
- BYTE_INDEX,
- l_raw_byte);
-
- o_output = l_raw_byte;
-
- FAPI_INF("%s. Register revision number: %d",
- iv_target_str_storage,
- o_output);
-
- return fapi2::FAPI2_RC_SUCCESS;
-}
-
-///
-/// @brief Decodes address mapping from register to dram
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 136 (bit 0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 52
-///
-fapi2::ReturnCode decoder_v1_0::register_to_dram_addr_mapping(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<ADDR_MAPPING>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t RESERVED = 0b11;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits < RESERVED, // extract sanity check
- ADDR_MAPPING.iv_byte,
- l_field_bits,
- "Failed bound check for to register to dram addr mapping") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Address mapping from register to dram: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for CKE signal
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 137 (bit 1~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 53
-///
-fapi2::ReturnCode decoder_v1_0::cke_signal_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<CKE_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t RESERVED = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits < RESERVED, // extract sanity check
- CKE_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for CKE") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for CKE: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for ODT signal
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 137 (bit 3~2)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 53
-///
-fapi2::ReturnCode decoder_v1_0::odt_signal_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<ODT_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t RESERVED = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits < RESERVED, // extract sanity check
- ODT_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for ODT") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for ODT: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for command/address (CA) signal
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 137 (bit 5~4)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 53
-///
-fapi2::ReturnCode decoder_v1_0::ca_signal_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<CA_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t INVALID_VAL = 3;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits < INVALID_VAL, // extract sanity check
- CA_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for CA") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for CA: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for control signal (CS) signal
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 137 (bit 6~7)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 53
-///
-fapi2::ReturnCode decoder_v1_0::cs_signal_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<CS_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t RESERVED = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits < RESERVED, // extract sanity check
- CS_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for CS") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for CS: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for clock (B side)
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 138 (bit 1~0)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 53
-///
-fapi2::ReturnCode decoder_v1_0::b_side_clk_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<YO_Y2_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t RESERVED = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits < RESERVED, // extract sanity check
- YO_Y2_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for clock (Y0,Y2)") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for clock (Y0,Y2): %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for clock (A side)
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 138 (bit 3~2)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 2
-/// @note Page 4.1.2.12 - 53
-///
-fapi2::ReturnCode decoder_v1_0::a_side_clk_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<Y1_Y3_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field_Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t RESERVED = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- l_field_bits < RESERVED,
- Y1_Y3_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for clock (Y1,Y3)") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for clock (Y1,Y3): %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-}// rdimm
-}// ddr4
-}// spd
-}// mss
diff --git a/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_1.C b/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_1.C
deleted file mode 100644
index 9a6aa5446..000000000
--- a/src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_1.C
+++ /dev/null
@@ -1,268 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/import/generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4_v1_1.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2018 */
-/* [+] International Business Machines Corp. */
-/* */
-/* */
-/* Licensed under the Apache License, Version 2.0 (the "License"); */
-/* you may not use this file except in compliance with the License. */
-/* You may obtain a copy of the License at */
-/* */
-/* http://www.apache.org/licenses/LICENSE-2.0 */
-/* */
-/* Unless required by applicable law or agreed to in writing, software */
-/* distributed under the License is distributed on an "AS IS" BASIS, */
-/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
-/* implied. See the License for the specific language governing */
-/* permissions and limitations under the License. */
-/* */
-/* IBM_PROLOG_END_TAG */
-
-// std lib
-#include <vector>
-
-// fapi2
-#include <fapi2.H>
-
-// mss lib
-#include <generic/memory/lib/spd/rdimm/ddr4/rdimm_decoder_ddr4.H>
-#include <generic/memory/lib/spd/common/ddr4/spd_decoder_ddr4.H>
-#include <generic/memory/lib/spd/spd_checker.H>
-#include <generic/memory/lib/utils/c_str.H>
-#include <generic/memory/lib/utils/find.H>
-
-using fapi2::TARGET_TYPE_MCBIST;
-using fapi2::TARGET_TYPE_MCA;
-using fapi2::TARGET_TYPE_MCS;
-using fapi2::TARGET_TYPE_DIMM;
-
-
-namespace mss
-{
-namespace spd
-{
-namespace ddr4
-{
-namespace rdimm
-{
-
-/////////////////////////
-// Member Method implementation
-// For RDIMM module rev 1.1
-/////////////////////////
-
-///
-/// @brief Decodes register type
-/// @param[out] o_output encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 131 (Bits 7~4)
-/// @note Item JEDEC Standard No. 21-C
-/// @note DDR4 SPD Document Release 3
-/// @note Page 4.1.2.12.3 - 63
-///
-fapi2::ReturnCode decoder_v1_1::register_and_buffer_type(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<REGISTER_TYPE>(iv_target, iv_spd_data);
- FAPI_INF("Field Bits value: %d", l_field_bits);
-
- // This checks my extracting params returns a value within bound
- constexpr size_t RESERVED = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- (l_field_bits < RESERVED), // extract sanity check
- REGISTER_TYPE.iv_byte,
- l_field_bits,
- "Failed bounds check for Register and Data Buffer Types") );
-
- // Update output only if check passes
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Types: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-
-}
-
-///
-/// @brief Decodes register output drive strength for CKE signal
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 137 (bit 1~0)
-/// @note Item JC-45-2220.01x
-/// @note Page 76
-/// @note DDR4 SPD Document Release 4
-///
-fapi2::ReturnCode decoder_v1_1::cke_signal_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<CKE_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field Bits value: %d", l_field_bits);
-
- // This really just checks my extract gives me a valid value
- constexpr size_t MAX_VALID_VALUE = 0b11;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- (l_field_bits <= MAX_VALID_VALUE), // extract sanity check
- CKE_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for CKE") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for CKE: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for ODT signal
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 137 (bit 3~2)
-/// @note Item JC-45-2220.01x
-/// @note Page 76
-/// @note DDR4 SPD Document Release 4
-///
-fapi2::ReturnCode decoder_v1_1::odt_signal_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<ODT_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field Bits value: %d", l_field_bits);
-
- // This really just checks my extract gives me a valid value
- constexpr size_t MAX_VALID_VALUE = 0b11;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- (l_field_bits <= MAX_VALID_VALUE), // extract sanity check
- ODT_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for ODT") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for ODT: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for control signal (CS) signal
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 137 (bit 6~7)
-/// @note Item JC-45-2220.01x
-/// @note Page 76
-/// @note DDR4 SPD Document Release 4
-///
-fapi2::ReturnCode decoder_v1_1::cs_signal_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<CS_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field Bits value: %d", l_field_bits);
-
- // This really just checks my extract gives me a valid value
- constexpr size_t MAX_VALID_VALUE = 0b11;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- (l_field_bits <= MAX_VALID_VALUE), // extract sanity check
- CS_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for chip select") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for CS: %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for clock (B side)
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 138 (bit 1~0)
-/// @note Item JC-45-2220.01x
-/// @note Page 76
-/// @note DDR4 SPD Document Release 4
-///
-fapi2::ReturnCode decoder_v1_1::b_side_clk_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<YO_Y2_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field Bits value: %d", l_field_bits);
-
- // This really just checks my extract gives me a valid value
- constexpr size_t MAX_VALID_VAL = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- (l_field_bits <= MAX_VALID_VAL), // extract sanity check
- YO_Y2_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for clock (Y0,Y2)") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for clock (Y0,Y2): %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Decodes register output drive strength for clock (A side)
-/// @param[out] o_output drive strength encoding from SPD
-/// @return FAPI2_RC_SUCCESS if okay
-/// @note SPD Byte 138 (bit 3~2)
-/// @note Item JC-45-2220.01x
-/// @note Page 76
-/// @note DDR4 SPD Document Release 4
-///
-fapi2::ReturnCode decoder_v1_1::a_side_clk_output_driver(uint8_t& o_output) const
-{
- // Extracting desired bits
- const uint8_t l_field_bits = extract_spd_field<Y1_Y3_DRIVER>(iv_target, iv_spd_data);
- FAPI_DBG("Field Bits value: %d", l_field_bits);
-
- // This really just checks my extract gives me a valid value
- constexpr size_t MAX_VALID_VAL = 2;
-
- FAPI_TRY( mss::check::spd::fail_for_invalid_value(iv_target,
- (l_field_bits <= MAX_VALID_VAL), // extract sanity check
- Y1_Y3_DRIVER.iv_byte,
- l_field_bits,
- "Failed bounds check for Register Output Driver for clock (Y1,Y3)") );
-
- o_output = l_field_bits;
-
- FAPI_INF("%s. Register Output Driver for clock (Y1,Y3): %d",
- iv_target_str_storage,
- o_output);
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-}// rdimm
-}// ddr4
-}// spd
-}// mss
OpenPOWER on IntegriCloud