From d08b01ec1695d8bda1f60c50e90c6e91b404f243 Mon Sep 17 00:00:00 2001 From: Andre Marin Date: Wed, 2 Mar 2016 12:52:07 -0600 Subject: Modify freq & dep. files. Add cas latency & unit tests Change-Id: I205bf48e54fb3c8f19f973f58f8ec1d4c7345a23 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/22632 Tested-by: PPE CI Tested-by: Jenkins Server Reviewed-by: Brian R. Silver Tested-by: Hostboot CI Reviewed-by: JACOB L. HARVEY Reviewed-by: STEPHEN GLANCY Reviewed-by: Louis Stermole Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/22634 Tested-by: FSP CI Jenkins Reviewed-by: Daniel M. Crowell --- .../p9/procedures/hwp/memory/lib/spd/spd_decoder.C | 171 ++++++++++++++++----- .../p9/procedures/hwp/memory/lib/spd/spd_decoder.H | 12 +- 2 files changed, 138 insertions(+), 45 deletions(-) (limited to 'src/import/chips/p9/procedures/hwp/memory/lib/spd') diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_decoder.C b/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_decoder.C index a7eef6466..666b4c84c 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_decoder.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/spd/spd_decoder.C @@ -544,14 +544,15 @@ fapi2::ReturnCode base_module_type(const fapi2::Target& i_targ // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); - FAPI_DBG("Field_Bits value: %d", l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); - FAPI_TRY( mss::check::spd:: - fail_for_invalid_value(i_target, - mss::find_value_from_key(BASE_MODULE_TYPE_MAP, l_field_bits, o_value), - BYTE_INDEX, - l_field_bits, - "Failed check on Base Module Type") ); + bool found_key = find_value_from_key(BASE_MODULE_TYPE_MAP, l_field_bits, o_value); + + FAPI_TRY( check::spd::fail_for_invalid_value(i_target, + found_key, + BYTE_INDEX, + l_field_bits, + "Failed check on Base Module Type") ); FAPI_DBG("%s. Base Module Type: %d", mss::c_str(i_target), @@ -577,9 +578,12 @@ fapi2::ReturnCode factory(const fapi2::Target& i_target uint8_t l_additions_rev = 0; // Get dimm type & revision levels - FAPI_TRY(base_module_type(i_target, i_spd_data, l_dimm_type)); - FAPI_TRY(rev_encoding_level(i_target, i_spd_data, l_encoding_rev)); - FAPI_TRY(rev_additions_level(i_target, i_spd_data, l_additions_rev)); + FAPI_TRY( base_module_type(i_target, i_spd_data, l_dimm_type), + "Failed to find base module type" ); + FAPI_TRY( rev_encoding_level(i_target, i_spd_data, l_encoding_rev), + "Failed to find encoding level" ); + FAPI_TRY( rev_additions_level(i_target, i_spd_data, l_additions_rev), + "Failed to find additons level" ); // Get decoder object needed for current dimm type and spd rev switch(l_dimm_type) @@ -597,40 +601,38 @@ fapi2::ReturnCode factory(const fapi2::Target& i_target { case 0: case 1: + // Rev 1.0 or Rev 1.1 o_fact_obj = std::make_shared(); break; default: - FAPI_TRY( mss::check::spd:: - invalid_factory_sel(i_target, - l_dimm_type, - l_encoding_rev, - l_additions_rev, - "Additions Level Unsupported!") ); + FAPI_TRY( check::spd::invalid_factory_sel(i_target, + l_dimm_type, + l_encoding_rev, + l_additions_rev, + "Additions Level Unsupported!") ); break; }//end additions break; default: - FAPI_TRY( mss::check::spd:: - invalid_factory_sel(i_target, - l_dimm_type, - l_encoding_rev, - l_additions_rev, - "Encoding Level Unsupported!") ); + FAPI_TRY( check::spd::invalid_factory_sel(i_target, + l_dimm_type, + l_encoding_rev, + l_additions_rev, + "Encoding Level Unsupported!") ); break; }// end encodings break; default: - FAPI_TRY( mss::check::spd:: - invalid_factory_sel(i_target, - l_dimm_type, - l_encoding_rev, - l_additions_rev, - "DIMM Type Unsupported!") ); + FAPI_TRY( check::spd::invalid_factory_sel(i_target, + l_dimm_type, + l_encoding_rev, + l_additions_rev, + "DIMM Type Unsupported!") ); break; } // end dimm type @@ -645,21 +647,25 @@ fapi_try_exit: /// @brief Creates factory object & SPD data caches /// @param[in] i_target controller target /// @param[out] o_factory_caches map of factory objects with a dimm pos. key -/// @return fapi2::ReturnCode +/// @return FAPI2_RC_SUCCESS if okay +/// @note This specialization is suited for creating a cache with platform +/// SPD data. /// +template<> fapi2::ReturnCode populate_decoder_caches( const fapi2::Target& i_target, - std::map >& o_factory_caches) + std::map >& o_factory_caches, + const std::shared_ptr& i_pDecoder) { - size_t l_spd_size = 0; - std::shared_ptr l_pDecoder; + std::shared_ptr l_pDecoder(i_pDecoder); for( const auto& l_mca : i_target.getChildren() ) { for( const auto& l_dimm : l_mca.getChildren() ) { + size_t l_spd_size = 0; + // Retrieve SPD size FAPI_TRY( getSPD(l_dimm, nullptr, l_spd_size) ); - { // Retrieve SPD data uint8_t* l_spd_data = new uint8_t[l_spd_size]; @@ -671,18 +677,43 @@ fapi2::ReturnCode populate_decoder_caches( const fapi2::Target& // Destructor for shared_ptr calls delete, has undefined behavior // So we use a default destruction policy for array types that uses delete[] // If F/W doesn't support this we can include a custom delete in lieu of default_delete - l_pDecoder->iv_spd_data = std::shared_ptr(l_spd_data, std::default_delete()); - + l_pDecoder->iv_spd_data = std::shared_ptr( l_spd_data, + std::default_delete() ); // Populate spd caches maps based on dimm pos o_factory_caches.emplace(std::make_pair(mss::pos(l_dimm), l_pDecoder)); } - } - } + }// end dimm + }// end mca + fapi_try_exit: return fapi2::current_err; } + +/// +/// @brief Creates factory object & SPD data caches +/// @param[in] i_target the dimm target +/// @param[out] o_factory_caches map of factory objects with a dimm pos. key +/// @return FAPI2_RC_SUCCESS if okay +/// @note This specialization is suited for creating a cache with custom +/// SPD data. +/// +template<> +fapi2::ReturnCode populate_decoder_caches( const fapi2::Target& i_target, + std::map >& o_factory_caches, + const std::shared_ptr& i_pDecoder) +{ + std::shared_ptr l_pDecoder(i_pDecoder); + + // Custom decoder provided (usually done for testing) + // Populate custom spd caches maps based internal dimm pos + o_factory_caches.emplace(std::make_pair( mss::pos(i_target), l_pDecoder) ); + + // TK - else what do we want here + return fapi2::FAPI2_RC_SUCCESS; +} + ///////////////////////// // Member Method implementation ///////////////////////// @@ -957,6 +988,8 @@ fapi2::ReturnCode decoder::sdram_density(const fapi2::Target& // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + // Check to assure SPD DRAM capacity (map) wont be at invalid values FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, @@ -1006,6 +1039,8 @@ fapi2::ReturnCode decoder::banks(const fapi2::Target& i_target // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + // Check to assure SPD DRAM capacity (map) wont be at invalid values FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, @@ -1054,6 +1089,8 @@ fapi2::ReturnCode decoder::bank_groups(const fapi2::Target& i_ // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + // Check to assure SPD DRAM capacity (map) wont be at invalid values FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, @@ -1102,6 +1139,8 @@ fapi2::ReturnCode decoder::column_address_bits(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + // Check to assure SPD DRAM capacity (map) wont be at invalid values FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, @@ -1150,6 +1189,8 @@ fapi2::ReturnCode decoder::row_address_bits(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + // Check to assure SPD DRAM capacity (map) wont be at invalid values FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, @@ -1183,7 +1224,7 @@ fapi2::ReturnCode decoder::prim_sdram_signal_loading(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(PRIM_SIGNAL_LOADING_MAP, l_field_bits, o_value), @@ -1230,7 +1273,7 @@ fapi2::ReturnCode decoder::prim_sdram_die_count(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(PRIM_DIE_COUNT_MAP, l_field_bits, o_value), @@ -1277,7 +1322,7 @@ fapi2::ReturnCode decoder::prim_sdram_package_type(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(PRIM_PACKAGE_TYPE_MAP, l_field_bits, o_value), @@ -1341,6 +1388,8 @@ fapi2::ReturnCode decoder::maximum_activate_count(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(MAC_MAP, l_field_bits, o_value), @@ -1388,6 +1437,8 @@ fapi2::ReturnCode decoder::maximum_activate_window_multiplier(const fapi2::Targe // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(TMAW_MAP, l_field_bits, o_value), @@ -1435,6 +1486,8 @@ fapi2::ReturnCode decoder::soft_post_package_repair(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(SOFT_PPR_MAP, l_field_bits, o_value), @@ -1482,6 +1535,8 @@ fapi2::ReturnCode decoder::post_package_repair(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(PPR_MAP, l_field_bits, o_value), @@ -1530,6 +1585,8 @@ fapi2::ReturnCode decoder::sec_sdram_signal_loading(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(SEC_SIGNAL_LOADING_MAP, l_field_bits, o_value), @@ -1579,6 +1636,8 @@ fapi2::ReturnCode decoder::sec_dram_density_ratio(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, l_field_bits != UNDEFINED, @@ -1627,6 +1686,8 @@ fapi2::ReturnCode decoder::sec_sdram_die_count(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(SEC_DIE_COUNT_MAP, l_field_bits, o_value), @@ -1674,6 +1735,8 @@ fapi2::ReturnCode decoder::sec_sdram_package_type(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(SEC_PACKAGE_TYPE_MAP, l_field_bits, o_value), @@ -1722,6 +1785,8 @@ fapi2::ReturnCode decoder::operable_nominal_voltage(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(OPERABLE_MAP, l_field_bits, o_value), @@ -1769,6 +1834,8 @@ fapi2::ReturnCode decoder::endurant_nominal_voltage(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(ENDURANT_MAP, l_field_bits, o_value), @@ -1816,6 +1883,8 @@ fapi2::ReturnCode decoder::device_width(const fapi2::Target& i // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(DEVICE_WIDTH_MAP, l_field_bits, o_value), @@ -1864,6 +1933,8 @@ fapi2::ReturnCode decoder::num_package_ranks_per_dimm(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(NUM_PACKAGE_RANKS_MAP, l_field_bits, o_value), @@ -1912,6 +1983,8 @@ fapi2::ReturnCode decoder::rank_mix(const fapi2::Target& i_tar // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, (l_field_bits < INVALID_VALUE), @@ -1961,6 +2034,8 @@ fapi2::ReturnCode decoder::prim_bus_width(const fapi2::Target& // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(BUS_WIDTH_MAP, l_field_bits, o_value), @@ -2007,6 +2082,8 @@ fapi2::ReturnCode decoder::bus_width_extension(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(BUS_WIDTH_EXT_MAP, l_field_bits, o_value), @@ -2056,6 +2133,8 @@ fapi2::ReturnCode decoder::thermal_sensor(const fapi2::Target& // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, l_field_bits < INVALID_VALUE, @@ -2105,6 +2184,8 @@ fapi2::ReturnCode decoder::extended_base_module_type(const fapi2::Target(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + // Currently reserved to 0b000 FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, @@ -2155,6 +2236,8 @@ fapi2::ReturnCode decoder::fine_timebase(const fapi2::Target& // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(FINE_TIMEBASE_MAP, l_field_bits, o_value), @@ -2202,6 +2285,8 @@ fapi2::ReturnCode decoder::medium_timebase(const fapi2::Target // Extracting desired bits l_spd_buffer.extractToRight(l_field_bits); + FAPI_DBG("Field Bits value: %d", l_field_bits); + FAPI_TRY( mss::check::spd:: fail_for_invalid_value(i_target, mss::find_value_from_key(MEDIUM_TIMEBASE_MAP, l_field_bits, o_value), @@ -2259,6 +2344,9 @@ fapi2::ReturnCode decoder::min_cycle_time(const fapi2::Target& i_target /// /// @brief Creates factory object & SPD data caches -/// @param[in] i_target controller target +/// @param[in] i_target the fapi2 target /// @param[out] o_factory_caches map of factory objects with a dimm pos key -/// @return fapi2::ReturnCode +/// @return FAPI2_RC_SUCCESS if okay /// -fapi2::ReturnCode populate_decoder_caches(const fapi2::Target& i_target, - std::map >& o_factory_caches); +template +fapi2::ReturnCode populate_decoder_caches(const fapi2::Target& i_target, + std::map >& o_factory_caches, + const std::shared_ptr& i_pDecoder = nullptr); }// spd -- cgit v1.2.1