From 508ddc960ec66dd9d6b312eb699589f3431dad1d Mon Sep 17 00:00:00 2001 From: "Andre A. Marin" Date: Mon, 15 Apr 2019 14:41:46 -0500 Subject: Add mem_size and misc attrs, unit tests enable Consulting w/PRD (Zane), ATTR_EFF_DIMM_RANK_CONFIGED is not required to be initialized early in the ipl flow. So we move it from pre_eff_config to eff_config. Added attr_derived_engine to set attrs derived from other attrs or hardcodes. Updated unit tests. Added attrs not set in exp_draminit implementation of eff_config Change-Id: I0bb5e1913160d2cd0224cbb8566b7548eabe46d4 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/75440 Tested-by: FSP CI Jenkins Tested-by: Jenkins Server Tested-by: HWSV CI Tested-by: Hostboot CI Reviewed-by: Mark Pizzutillo Dev-Ready: ANDRE A. MARIN Reviewed-by: STEPHEN GLANCY Reviewed-by: Jennifer A. Stofer Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/75575 Reviewed-by: Zane C. Shelley Reviewed-by: Christian R. Geddes --- .../memory/lib/data_engine/attr_engine_traits.H | 642 +++++++++++++++++---- 1 file changed, 531 insertions(+), 111 deletions(-) (limited to 'src/import/generic/memory/lib/data_engine/attr_engine_traits.H') diff --git a/src/import/generic/memory/lib/data_engine/attr_engine_traits.H b/src/import/generic/memory/lib/data_engine/attr_engine_traits.H index 1d7388f65..cc61ea602 100644 --- a/src/import/generic/memory/lib/data_engine/attr_engine_traits.H +++ b/src/import/generic/memory/lib/data_engine/attr_engine_traits.H @@ -48,6 +48,283 @@ namespace mss { +/// +/// @brief Traits for attr_engine +/// @class attrEngineTraits +/// @note attr_eff_engine_fields, PRIM_STACK_TYPE specialization +/// +template<> +struct attrEngineTraits +{ + using attr_type = fapi2::ATTR_MEM_EFF_PRIM_STACK_TYPE_Type; + using attr_integral_type = std::remove_all_extents::type; + static constexpr fapi2::TargetType TARGET_TYPE = fapi2::ATTR_MEM_EFF_PRIM_STACK_TYPE_TargetType; + static constexpr generic_ffdc_codes FFDC_CODE = SET_PRIM_STACK_TYPE; + + /// + /// @brief attribute getter + /// @param[in] i_target the fapi2 target + /// @param[out] o_setting array to populate + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) + { + return mss::attr::get_prim_stack_type(i_target, o_setting); + } + + /// + /// @brief attribute setter + /// @param[in] i_target the fapi2 target + /// @param[in] i_setting array to set + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) + { + return mss::attr::set_prim_stack_type(i_target, i_setting); + } + + /// + /// @brief Computes setting for attribute + /// @param[in] i_efd_data EFD data + /// @param[out] o_setting value we want to set attr with + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode get_value_to_set(const spd::facade& i_spd_data, + attr_integral_type& o_setting) + { + return i_spd_data.prim_sdram_signal_loading(o_setting); + } +}; + +/// +/// @brief Traits for attr_engine +/// @class attrEngineTraits +/// @note attr_eff_engine_fields, PRIM_DIE_COUNT specialization +/// +template<> +struct attrEngineTraits +{ + using attr_type = fapi2::ATTR_MEM_EFF_PRIM_DIE_COUNT_Type; + using attr_integral_type = std::remove_all_extents::type; + static constexpr fapi2::TargetType TARGET_TYPE = fapi2::ATTR_MEM_EFF_PRIM_DIE_COUNT_TargetType; + static constexpr generic_ffdc_codes FFDC_CODE = SET_PRIM_DIE_COUNT; + + /// + /// @brief attribute getter + /// @param[in] i_target the fapi2 target + /// @param[out] o_setting array to populate + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) + { + return mss::attr::get_prim_die_count(i_target, o_setting); + } + + /// + /// @brief attribute setter + /// @param[in] i_target the fapi2 target + /// @param[in] i_setting array to set + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) + { + return mss::attr::set_prim_die_count(i_target, i_setting); + } + + /// + /// @brief Computes setting for attribute + /// @param[in] i_efd_data EFD data + /// @param[out] o_setting value we want to set attr with + /// @return FAPI2_RC_SUCCESS iff okay + /// + static fapi2::ReturnCode get_value_to_set(const spd::facade& i_spd_data, + attr_integral_type& o_setting) + { + // ========================================================= + // Byte 6 maps + // Item JC-45-2220.01x + // Page 19 + // DDR4 SPD Document Release 3 + // Byte 6 (0x006): Primary SDRAM Package Type + // ========================================================= + static const std::vector > PRIM_DIE_COUNT_MAP = + { + // {key byte, number of die} + {0, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D1}, + {1, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D2}, + {2, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D3}, + {3, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D4}, + {4, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D5}, + {5, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D6}, + {6, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D7}, + {7, fapi2::ENUM_ATTR_MEM_EFF_PRIM_DIE_COUNT_D8} + }; + + const auto l_dimm = i_spd_data.get_dimm_target(); + + attr_integral_type l_decoder_val = 0; + FAPI_TRY( i_spd_data.prim_sdram_die_count(l_decoder_val) ); + + // Map SPD value to desired setting + FAPI_TRY(lookup_table_check(l_dimm, PRIM_DIE_COUNT_MAP, FFDC_CODE, l_decoder_val, o_setting)); + + fapi_try_exit: + return fapi2::current_err; + } +}; + +/// +/// @brief Traits for pre_data_engine +/// @class attrEngineTraits +/// @note attr_eff_engine_fields, DRAM_DENSITY specialization +/// +template<> +struct attrEngineTraits +{ + using attr_type = fapi2::ATTR_MEM_EFF_DRAM_DENSITY_Type; + using attr_integral_type = std::remove_all_extents::type; + static constexpr fapi2::TargetType TARGET_TYPE = fapi2::ATTR_MEM_EFF_DRAM_DENSITY_TargetType; + static constexpr generic_ffdc_codes FFDC_CODE = SET_DRAM_DENSITY; + + /// + /// @brief attribute getter + /// @param[in] i_target the attr target + /// @param[out] o_setting array to populate + /// @return FAPI2_RC_SUCCESS iff okay + /// + static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) + { + return mss::attr::get_dram_density(i_target, o_setting); + } + + /// + /// @brief attribute setter + /// @param[in] i_target the attr target + /// @param[in] i_setting array to set + /// @return FAPI2_RC_SUCCESS iff okay + /// + static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) + { + return mss::attr::set_dram_density(i_target, i_setting); + } + + /// + /// @brief Computes setting for attribute + /// @param[in] i_spd_data SPD data + /// @param[in] i_setting value we want to set attr with + /// @return FAPI2_RC_SUCCESS iff okay + /// + static fapi2::ReturnCode get_value_to_set(const spd::facade& i_spd_data, + attr_integral_type& o_setting) + { + // ========================================================= + // DDR4 SPD Document Release 4 + // Byte 2 (0x002): Key Byte / DRAM Device Type + // ========================================================= + static const std::vector< std::pair > DRAM_DENSITY_MAP = + { + // {key byte, capacity in GBs} + {4, fapi2::ENUM_ATTR_MEM_EFF_DRAM_DENSITY_4G}, + {5, fapi2::ENUM_ATTR_MEM_EFF_DRAM_DENSITY_8G}, + {6, fapi2::ENUM_ATTR_MEM_EFF_DRAM_DENSITY_16G}, + }; + + const auto l_dimm = i_spd_data.get_dimm_target(); + + attr_integral_type l_sdram_density = 0; + FAPI_TRY( i_spd_data.sdram_density(l_sdram_density), + "%s failed to get device type from SPD", spd::c_str(l_dimm) ); + + FAPI_TRY( lookup_table_check(l_dimm, DRAM_DENSITY_MAP, FFDC_CODE, l_sdram_density, o_setting), + "%s failed DRAM_DENSITY lookup check", spd::c_str(l_dimm) ); + + fapi_try_exit: + return fapi2::current_err; + } +}; + +/// +/// @brief Traits for attr_engine +/// @class attrEngineTraits +/// @note attr_engine_derived_fields, BUS_WIDTH specialization +/// +template<> +struct attrEngineTraits +{ + using attr_type = fapi2::ATTR_MEM_EFF_PRIM_BUS_WIDTH_Type; + using attr_integral_type = std::remove_all_extents::type; + static constexpr fapi2::TargetType TARGET_TYPE = fapi2::ATTR_MEM_EFF_PRIM_BUS_WIDTH_TargetType; + static constexpr generic_ffdc_codes FFDC_CODE = SET_PRIM_BUS_WIDTH; + + /// + /// @brief attribute getter + /// @param[in] i_target the fapi2 target + /// @param[out] o_setting array to populate + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) + { + return mss::attr::get_prim_bus_width(i_target, o_setting); + } + + /// + /// @brief attribute setter + /// @param[in] i_target the fapi2 target + /// @param[in] i_setting array to set + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) + { + return mss::attr::set_prim_bus_width(i_target, i_setting); + } + + /// + /// @brief Computes setting for attribute + /// @param[in] i_efd_data EFD data + /// @param[out] o_setting value we want to set attr with + /// @return FAPI2_RC_SUCCESS iff okay + + static inline fapi2::ReturnCode get_value_to_set(const spd::facade& i_spd_data, + attr_integral_type& o_setting) + { + // ========================================================= + // Byte 13 maps + // Item JC-45-2220.01x + // Page 27 + // DDR4 SPD Document Release 3 + // Byte 13 (0x00D): Module Memory Bus Width + // ========================================================= + const std::vector > BUS_WIDTH_MAP = + { + // {key byte, bus width (in bits) + {0, fapi2::ENUM_ATTR_MEM_EFF_PRIM_BUS_WIDTH_8_BITS}, + {1, fapi2::ENUM_ATTR_MEM_EFF_PRIM_BUS_WIDTH_16_BITS}, + {2, fapi2::ENUM_ATTR_MEM_EFF_PRIM_BUS_WIDTH_32_BITS}, + {3, fapi2::ENUM_ATTR_MEM_EFF_PRIM_BUS_WIDTH_64_BITS} + // All others reserved + }; + + const auto l_dimm = i_spd_data.get_dimm_target(); + + attr_integral_type l_spd_bus_width = 0; + FAPI_TRY( i_spd_data.prim_bus_width(l_spd_bus_width) ); + + // Map SPD value to desired setting + FAPI_TRY(lookup_table_check(l_dimm, BUS_WIDTH_MAP, FFDC_CODE, l_spd_bus_width, o_setting)); + + fapi_try_exit: + return fapi2::current_err; + } +}; + /// /// @brief Traits for attr_engine /// @class attrEngineTraits @@ -67,8 +344,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_dram_width(i_target, o_setting); } @@ -79,8 +356,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_dram_width(i_target, i_setting); } @@ -88,13 +365,12 @@ struct attrEngineTraits /// /// @brief Computes setting for attribute /// @param[in] i_efd_data EFD data - /// @param[in] i_setting value we want to set attr with + /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// static fapi2::ReturnCode get_value_to_set(const spd::facade& i_spd_data, attr_integral_type& o_setting) { - // ========================================================= // Byte 12 maps // Item JC-45-2220.01x @@ -113,11 +389,13 @@ struct attrEngineTraits }; // Read SPD value + const auto l_dimm = i_spd_data.get_dimm_target(); + attr_integral_type l_value = 0; FAPI_TRY( i_spd_data.device_width(l_value) ); // Map SPD value to desired setting - FAPI_TRY(lookup_table_check(i_spd_data.get_dimm_target(), DRAM_WIDTH_MAP, SET_DRAM_WIDTH, l_value, o_setting)); + FAPI_TRY(lookup_table_check(l_dimm, DRAM_WIDTH_MAP, SET_DRAM_WIDTH, l_value, o_setting)); fapi_try_exit: return fapi2::current_err; @@ -155,8 +433,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_rcv_imp_dq_dqs(i_target, o_setting); } @@ -167,8 +445,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_rcv_imp_dq_dqs(i_target, i_setting); } @@ -176,10 +454,10 @@ struct attrEngineTraits /// /// @brief Computes setting for attribute /// @param[in] i_efd_data EFD data - /// @param[in] i_setting value we want to set attr with + /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->phy_odt_impedance(o_setting); @@ -205,8 +483,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_imp_dq_dqs_pull_up(i_target, o_setting); } @@ -217,8 +495,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_imp_dq_dqs_pull_up(i_target, i_setting); } @@ -226,10 +504,10 @@ struct attrEngineTraits /// /// @brief Computes setting for attribute /// @param[in] i_efd_data EFD data - /// @param[in] i_setting value we want to set attr with + /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->phy_drive_impedance_pull_up(o_setting); @@ -255,8 +533,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_imp_dq_dqs_pull_down(i_target, o_setting); } @@ -267,8 +545,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_imp_dq_dqs_pull_down(i_target, i_setting); } @@ -276,10 +554,10 @@ struct attrEngineTraits /// /// @brief Computes setting for attribute /// @param[in] i_efd_data EFD data - /// @param[in] i_setting value we want to set attr with + /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->phy_drive_impedance_pull_down(o_setting); @@ -306,8 +584,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_slew_rate_dq_dqs(i_target, o_setting); } @@ -318,8 +596,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_slew_rate_dq_dqs(i_target, i_setting); } @@ -327,10 +605,10 @@ struct attrEngineTraits /// /// @brief Computes setting for attribute /// @param[in] i_efd_data EFD data - /// @param[in] i_setting value we want to set attr with + /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->phy_slew_rate_dq_dqs(o_setting); @@ -356,8 +634,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_imp_cmd_addr(i_target, o_setting); } @@ -368,8 +646,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_imp_cmd_addr(i_target, i_setting); } @@ -377,10 +655,10 @@ struct attrEngineTraits /// /// @brief Computes setting for attribute /// @param[in] i_efd_data EFD data - /// @param[in] i_setting value we want to set attr with + /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->atx_impedance(o_setting); @@ -406,8 +684,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_slew_rate_cmd_addr(i_target, o_setting); } @@ -418,8 +696,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_slew_rate_cmd_addr(i_target, i_setting); } @@ -427,10 +705,10 @@ struct attrEngineTraits /// /// @brief Computes setting for attribute /// @param[in] i_efd_data EFD data - /// @param[in] i_setting value we want to set attr with + /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->atx_slew_rate(o_setting); @@ -456,8 +734,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_imp_clk(i_target, o_setting); } @@ -468,8 +746,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_imp_clk(i_target, i_setting); } @@ -480,7 +758,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->ck_impedance(o_setting); @@ -506,8 +784,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_slew_rate_clk(i_target, o_setting); } @@ -518,8 +796,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_slew_rate_clk(i_target, i_setting); } @@ -530,7 +808,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->ck_slew_rate(o_setting); @@ -556,8 +834,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_rcv_imp_alert_n(i_target, o_setting); } @@ -568,8 +846,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_rcv_imp_alert_n(i_target, i_setting); } @@ -580,7 +858,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->alert_odt_impedance(o_setting); @@ -606,8 +884,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_dram_rtt_nom(i_target, o_setting); } @@ -618,8 +896,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_dram_rtt_nom(i_target, i_setting); } @@ -630,7 +908,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->dram_rtt_nom(o_setting); @@ -656,8 +934,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_dram_rtt_wr(i_target, o_setting); } @@ -668,8 +946,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_dram_rtt_wr(i_target, i_setting); } @@ -680,7 +958,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->dram_rtt_wr(o_setting); @@ -706,8 +984,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_dram_rtt_park(i_target, o_setting); } @@ -718,8 +996,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_dram_rtt_park(i_target, i_setting); } @@ -730,7 +1008,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->dram_rtt_park(o_setting); @@ -756,8 +1034,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_dram_preamble(i_target, o_setting); } @@ -768,8 +1046,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_dram_preamble(i_target, i_setting); } @@ -780,7 +1058,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { i_efd_data->write_preamble(o_setting); @@ -807,8 +1085,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_mc_drv_eq_dq_dqs(i_target, o_setting); } @@ -819,8 +1097,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_mc_drv_eq_dq_dqs(i_target, i_setting); } @@ -831,7 +1109,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->phy_equalization(o_setting); @@ -857,8 +1135,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_dram_drv_imp_dq_dqs(i_target, o_setting); } @@ -869,8 +1147,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_dram_drv_imp_dq_dqs(i_target, i_setting); } @@ -881,7 +1159,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->dram_dic(o_setting); @@ -907,8 +1185,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_vref_dq_train_range(i_target, o_setting); } @@ -919,8 +1197,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_vref_dq_train_range(i_target, i_setting); } @@ -931,7 +1209,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->wr_vref_dq_range(o_setting); @@ -957,8 +1235,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_vref_dq_train_value(i_target, o_setting); } @@ -969,8 +1247,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::set_si_vref_dq_train_value(i_target, o_setting); } @@ -981,7 +1259,7 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->wr_vref_dq_value(o_setting); @@ -1007,8 +1285,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_odt_wr(i_target, o_setting); } @@ -1019,8 +1297,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_odt_wr(i_target, i_setting); } @@ -1092,8 +1370,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_odt_rd(i_target, o_setting); } @@ -1104,8 +1382,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_odt_rd(i_target, i_setting); } @@ -1176,8 +1454,8 @@ struct attrEngineTraits /// @param[out] o_setting array to populate /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, - attr_type& o_setting) + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) { return mss::attr::get_si_geardown_mode(i_target, o_setting); } @@ -1188,8 +1466,8 @@ struct attrEngineTraits /// @param[in] i_setting array to set /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, - attr_type& i_setting) + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) { return mss::attr::set_si_geardown_mode(i_target, i_setting); } @@ -1200,13 +1478,155 @@ struct attrEngineTraits /// @param[out] o_setting value we want to set attr with /// @return FAPI2_RC_SUCCESS iff okay /// - static fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, + static inline fapi2::ReturnCode get_value_to_set(const std::shared_ptr& i_efd_data, attr_integral_type& o_setting) { return i_efd_data->geardown_during_training(o_setting); } }; +// +// Derived attributes +// +/// + +/// @brief Traits for attrEngineTraits +/// @class attrEngineTraits +/// @note attrEngineTraits, MRANKS specialization +/// +template<> +struct attrEngineTraits +{ + using attr_type = fapi2::ATTR_MEM_EFF_LOGICAL_RANKS_PER_DIMM_Type; + using attr_integral_type = std::remove_all_extents::type; + static constexpr fapi2::TargetType TARGET_TYPE = fapi2::ATTR_MEM_EFF_LOGICAL_RANKS_PER_DIMM_TargetType; + static constexpr generic_ffdc_codes FFDC_CODE = SET_LOGICAL_RANKS; + + /// + /// @brief attribute getter + /// @param[in] i_target the attr target + /// @param[out] o_setting array to populate + /// @return FAPI2_RC_SUCCESS iff okay + /// + static fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) + { + return mss::attr::get_logical_ranks_per_dimm(i_target, o_setting); + } + + /// + /// @brief attribute setter + /// @param[in] i_target the attr target + /// @param[in] i_setting array to set + /// @return FAPI2_RC_SUCCESS iff okay + /// + static fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) + { + return mss::attr::set_logical_ranks_per_dimm(i_target, i_setting); + } + + /// + /// @brief Computes setting for attribute + /// @param[in] i_spd_data SPD data + /// @param[out] o_setting value we want to set attr with + /// @return FAPI2_RC_SUCCESS iff okay + /// + static fapi2::ReturnCode get_value_to_set(const fapi2::Target& i_target, + attr_integral_type& o_setting) + { + uint8_t l_prim_stack_type = 0; + uint8_t l_master_ranks = 0; + uint8_t l_die_count = 0; + + FAPI_TRY( mss::attr::get_num_master_ranks_per_dimm(i_target, l_master_ranks) ); + FAPI_TRY( mss::attr::get_prim_die_count(i_target, l_die_count) ); + FAPI_TRY( mss::attr::get_prim_stack_type(i_target, l_prim_stack_type) ); + + { + // For single-load-stack(3DS) the logical ranks per package ends up being the same as the die count. + // For MONOLITHIC & MULTI_LOAD_STACK + // The die count isn't guaranteed to be 1 (e.g. SDP - 1 die package, DDP - 2 die package). + // Value of 1 has no meaning and is used for calculation purposes as defined by the SPD spec. + const auto l_multiplier = (l_prim_stack_type == fapi2::ENUM_ATTR_MEM_EFF_PRIM_STACK_TYPE_3DS) ? l_die_count : 1; + o_setting = (l_master_ranks * l_multiplier); + FAPI_DBG("Num Logical Ranks %d", o_setting); + } + + fapi_try_exit: + return fapi2::current_err; + } +}; + +/// +/// @brief Traits for attr_engine +/// @class attrEngineTraits +/// @note attr_engine_derived_fields, MEM_DIMM_SIZE specialization +/// +template<> +struct attrEngineTraits +{ + using attr_type = fapi2::ATTR_MEM_EFF_DIMM_SIZE_Type; + using attr_integral_type = std::remove_all_extents::type; + static constexpr fapi2::TargetType TARGET_TYPE = fapi2::ATTR_MEM_EFF_DIMM_SIZE_TargetType; + static constexpr generic_ffdc_codes FFDC_CODE = SET_DIMM_SIZE; + + /// + /// @brief attribute getter + /// @param[in] i_target the fapi2 target + /// @param[out] o_setting array to populate + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode get_attr(const fapi2::Target& i_target, + attr_type& o_setting) + { + return mss::attr::get_dimm_size(i_target, o_setting); + } + + /// + /// @brief attribute setter + /// @param[in] i_target the fapi2 target + /// @param[in] i_setting array to set + /// @return FAPI2_RC_SUCCESS iff okay + /// + static inline fapi2::ReturnCode set_attr(const fapi2::Target& i_target, + attr_type& i_setting) + { + return mss::attr::set_dimm_size(i_target, i_setting); + } + + /// + /// @brief Computes setting for attribute + /// @param[in] i_efd_data EFD data + /// @param[out] o_setting value we want to set attr with + /// @return FAPI2_RC_SUCCESS iff okay + + static inline fapi2::ReturnCode get_value_to_set(const fapi2::Target& i_target, + attr_integral_type& o_setting) + { + uint8_t l_dram_width = 0; + uint8_t l_dram_density = 0; + uint8_t l_logical_rank_per_dimm = 0; + uint8_t l_bus_width = 0; + + FAPI_TRY( mss::attr::get_dram_width(i_target, l_dram_width) ); + FAPI_TRY( mss::attr::get_dram_density(i_target, l_dram_density) ); + FAPI_TRY( mss::attr::get_logical_ranks_per_dimm(i_target, l_logical_rank_per_dimm) ); + FAPI_TRY( mss::attr::get_prim_bus_width(i_target, l_bus_width) ); + + // Calculate dimm size + // Formula from SPD Spec (seriously, they don't have parenthesis in the spec) + // Total = SDRAM Capacity / 8 * Primary Bus Width / SDRAM Width * Logical Ranks per DIMM + o_setting = (l_dram_density * l_bus_width * l_logical_rank_per_dimm) / (8 * l_dram_width); + + FAPI_DBG("DIMM size = %d => (%d * %d * %d) / (8 * %d)", + o_setting, l_dram_density, l_bus_width, l_logical_rank_per_dimm, l_dram_width); + + fapi_try_exit: + return fapi2::current_err; + } +}; + }//mss #endif -- cgit v1.2.1