diff options
3 files changed, 28 insertions, 7 deletions
diff --git a/src/import/generic/memory/lib/utils/freq/gen_mss_freq.H b/src/import/generic/memory/lib/utils/freq/gen_mss_freq.H index c1c51cd87..6ad2c7ea6 100644 --- a/src/import/generic/memory/lib/utils/freq/gen_mss_freq.H +++ b/src/import/generic/memory/lib/utils/freq/gen_mss_freq.H @@ -462,6 +462,7 @@ inline fapi2::ReturnCode supported_freqs(const fapi2::Target<TT::FREQ_TARGET_TYP std::vector<std::vector<uint32_t>> l_vpd_supported_freqs; std::vector<uint32_t> l_spd_supported_freq; std::vector<uint8_t> l_deconfigured = {0}; + std::vector<fapi2::Target<TT::PORT_TARGET_TYPE>> l_deconfigured_targets; // Retrieve system MRW, SPD, and VPD constraints FAPI_TRY( max_allowed_dimm_freq<P>(l_max_mrw_freqs.data()), "%s max_allowed_dimm_freq", mss::c_str(i_target) ); @@ -486,6 +487,7 @@ inline fapi2::ReturnCode supported_freqs(const fapi2::Target<TT::FREQ_TARGET_TYP FAPI_TRY( l_scoreboard.template resolve<P>(i_target, l_vpd_supported_freqs, l_deconfigured, + l_deconfigured_targets, o_freqs) ); FAPI_INF("%s supported freqs:", mss::c_str(i_target)); diff --git a/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H b/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H index 11256000a..91b89fc83 100644 --- a/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H +++ b/src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H @@ -308,6 +308,7 @@ class freq_scoreboard /// @param[in] i_target MCBIST target /// @param[in] i_vpd_supported_freqs vector of hardware supported freqs -- from VPD /// @param[out] o_deconfigured vector of port positions that were deconfigured by this function + /// @param[out] o_deconfigured_targets vector of port targets that were deconfigured by this function /// @param[out] o_freqs vector of frequencies supported by all ports /// @return FAPI2_RC_SUCCESS if successful /// @@ -315,6 +316,7 @@ class freq_scoreboard fapi2::ReturnCode resolve(const fapi2::Target<TT::FREQ_TARGET_TYPE>& i_target, const std::vector<std::vector<uint32_t>>& i_vpd_supported_freqs, std::vector<uint8_t>& o_deconfigured, + std::vector<fapi2::Target<TT::PORT_TARGET_TYPE>>& o_deconfigured_targets, std::vector<uint32_t>& o_freqs) { const auto l_ports = mss::find_targets<TT::PORT_TARGET_TYPE>(i_target); @@ -358,10 +360,10 @@ class freq_scoreboard FAPI_TRY(callout_no_common_freq<P>(i_target, l_common_ports > l_empty_port_count, l_port_count)); // Now find and deconfigure all ports that don't support our selected frequency - FAPI_TRY(deconfigure_ports<P>(i_target, l_ports, l_best_freq_index, o_deconfigured)); + FAPI_TRY(deconfigure_ports<P>(i_target, l_ports, l_best_freq_index, o_deconfigured, o_deconfigured_targets)); // Now find all the frequencies supported by the ports that are left over - FAPI_TRY(this->template resolve<P>(i_target, i_vpd_supported_freqs, o_deconfigured, o_freqs)); + FAPI_TRY(this->template resolve<P>(i_target, i_vpd_supported_freqs, o_deconfigured, o_deconfigured_targets, o_freqs)); #ifndef __HOSTBOOT_MODULE @@ -461,15 +463,18 @@ class freq_scoreboard /// @param[in] i_ports vector of ports /// @param[in] i_best_freq_index index corresponding to the best case frequency /// @param[out] o_deconfigured vector of deconfigured port positions + /// @param[out] o_deconfigured_targets vector of deconfigured targets /// @return FAPI2_RC_SUCCESS iff ok /// template<mss::proc_type P, typename TT = mss::frequency_traits<P>> fapi2::ReturnCode deconfigure_ports(const fapi2::Target<TT::FREQ_TARGET_TYPE>& i_target, const std::vector<fapi2::Target<TT::PORT_TARGET_TYPE>>& i_ports, const uint64_t i_best_freq_index, - std::vector<uint8_t>& o_deconfigured) + std::vector<uint8_t>& o_deconfigured, + std::vector<fapi2::Target<TT::PORT_TARGET_TYPE>>& o_deconfigured_targets) { o_deconfigured.clear(); + o_deconfigured_targets.clear(); for ( size_t l_pos = 0; l_pos < iv_num_ports; ++l_pos ) { @@ -478,7 +483,7 @@ class freq_scoreboard i_ports.end(), [l_pos]( const fapi2::Target<TT::PORT_TARGET_TYPE>& i_rhs) -> bool { - return (mss::relative_pos<TT::FREQ_TARGET_TYPE>(i_rhs) != l_pos); + return (mss::relative_pos<TT::FREQ_TARGET_TYPE>(i_rhs) == l_pos); }); // If we didn't find an port for a given position, there wasn't one configured there @@ -497,6 +502,7 @@ class freq_scoreboard auto& l_port_supported_freqs = iv_supported_port_freqs[l_pos]; o_deconfigured.push_back(l_pos); + o_deconfigured_targets.push_back(p); FAPI_ASSERT_NOEXIT( false, fapi2::MSS_PORT_DOES_NOT_SUPPORT_MAJORITY_FREQ() .set_FREQ_TARGET(i_target) diff --git a/src/import/generic/procedures/xml/error_info/generic_error.xml b/src/import/generic/procedures/xml/error_info/generic_error.xml index ea67f4551..23daa79fc 100644 --- a/src/import/generic/procedures/xml/error_info/generic_error.xml +++ b/src/import/generic/procedures/xml/error_info/generic_error.xml @@ -662,18 +662,31 @@ <description> When considering the frequencies in the MRW and the max supported frequencies based on DIMM config, the indicated port's DIMM do not support - the frequency of the majority of other ports' DIMM, so it will be deconfigured + the frequency of the majority of other ports' DIMM in the frequency domain. + DIMM on the offending port will be deconfigured so the IPL can continue. + All DIMM in the offending port's frequency domain will be marked as + Hardware Callout. </description> <ffdc>FREQ_TARGET</ffdc> <ffdc>PORT_TARGET</ffdc> <ffdc>FREQUENCY</ffdc> - <callout> + <callout> + <procedure>MEMORY_PLUGGING_ERROR</procedure> + <priority>HIGH</priority> + </callout> + <callout> <childTargets> - <parent>PORT_TARGET</parent> + <parent>FREQ_TARGET</parent> <childType>TARGET_TYPE_DIMM</childType> </childTargets> <priority>MEDIUM</priority> </callout> + <deconfigure> + <childTargets> + <parent>PORT_TARGET</parent> + <childType>TARGET_TYPE_DIMM</childType> + </childTargets> + </deconfigure> </hwpError> <hwpError> |