From e96dafcc304c86c03efcfd4ce82ed502f0e8acaa Mon Sep 17 00:00:00 2001 From: Jacob Harvey Date: Thu, 9 Feb 2017 15:19:14 -0600 Subject: [PATCH] Adding in register_type to RDIMM decoder Change-Id: I5ceafb44c9a528fc476b0e6f2858d48712f52744 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36245 Tested-by: Jenkins Server Tested-by: Hostboot CI Reviewed-by: Brian R. Silver Reviewed-by: STEPHEN GLANCY Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36470 Reviewed-by: Hostboot Team Tested-by: FSP CI Jenkins Tested-by: Jenkins OP Build CI Reviewed-by: Daniel M. Crowell --- .../hwp/memory/lib/spd/rdimm/rdimm_decoder.H | 15 +++++- .../memory/lib/spd/rdimm/rdimm_decoder_v1_1.C | 47 +++++++++++++++++-- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder.H b/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder.H index 63a87f93c6a..ac208e53c34 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -78,6 +78,8 @@ class rdimm_decoder_v1_0 : public dimm_module_decoder 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, @@ -355,6 +357,17 @@ class rdimm_decoder_v1_1 : public rdimm_decoder_v1_0 /// virtual ~rdimm_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) override; + /// /// @brief Decodes register output drive strength for CKE signal /// @param[out] o_output drive strength encoding from SPD diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder_v1_1.C b/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder_v1_1.C index 39f6529e3ef..3c080240360 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder_v1_1.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/spd/rdimm/rdimm_decoder_v1_1.C @@ -52,6 +52,43 @@ namespace spd // 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 rdimm_decoder_v1_1::register_and_buffer_type(uint8_t& o_output) +{ + constexpr size_t BYTE = 131; + // Extracting desired bits + uint8_t l_field_bits = extract_spd_field(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 + 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", + mss::c_str(iv_target), + 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 @@ -73,7 +110,7 @@ fapi2::ReturnCode rdimm_decoder_v1_1::cke_signal_output_driver(uint8_t& o_output 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 + (l_field_bits <= MAX_VALID_VALUE), // extract sanity check BYTE, l_field_bits, "Failed bounds check for Register Output Driver for CKE") ); @@ -109,7 +146,7 @@ fapi2::ReturnCode rdimm_decoder_v1_1::odt_signal_output_driver(uint8_t& o_output 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 + (l_field_bits <= MAX_VALID_VALUE), // extract sanity check BYTE, l_field_bits, "Failed bounds check for Register Output Driver for ODT") ); @@ -145,7 +182,7 @@ fapi2::ReturnCode rdimm_decoder_v1_1::cs_signal_output_driver(uint8_t& o_output) 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 + (l_field_bits <= MAX_VALID_VALUE), // extract sanity check BYTE, l_field_bits, "Failed bounds check for Register Output Driver for chip select") ); @@ -181,7 +218,7 @@ fapi2::ReturnCode rdimm_decoder_v1_1::b_side_clk_output_driver(uint8_t& o_output 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 + (l_field_bits <= MAX_VALID_VAL), // extract sanity check BYTE, l_field_bits, "Failed bounds check for Register Output Driver for clock (Y0,Y2)") ); @@ -217,7 +254,7 @@ fapi2::ReturnCode rdimm_decoder_v1_1::a_side_clk_output_driver(uint8_t& o_output 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 + (l_field_bits <= MAX_VALID_VAL), // extract sanity check BYTE, l_field_bits, "Failed bounds check for Register Output Driver for clock (Y1,Y3)") );