diff options
Diffstat (limited to 'src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H')
-rw-r--r-- | src/import/generic/memory/lib/utils/freq/mss_freq_scoreboard.H | 101 |
1 files changed, 97 insertions, 4 deletions
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 1cd31adc5..104bf38ca 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 @@ -39,6 +39,7 @@ #include <vector> #include <fapi2.H> #include <generic/memory/lib/utils/freq/gen_mss_freq_traits.H> +#include <generic/memory/lib/utils/pos.H> #include <generic/memory/lib/utils/c_str.H> #include <generic/memory/lib/utils/find.H> #include <generic/memory/lib/utils/pos.H> @@ -132,7 +133,34 @@ class freq_scoreboard /// @return FAPI2_RC_SUCCESS if successful /// fapi2::ReturnCode remove_freqs_above_limit(const uint64_t i_port_pos, - const uint32_t i_freq_limit); + const uint32_t i_freq_limit) + { + FAPI_TRY( check_port_position(i_port_pos, + generic_ffdc_codes::FREQ_SCOREBOARD_REMOVE_FREQS_ABOVE_LIMIT), + "Invalid port index passed to remove_freqs_above_limit (%d)", + i_port_pos); + + { + auto& l_port_supported_freqs = iv_supported_port_freqs[i_port_pos]; + + // Can't do a ranged for loop here because we need the index to get the frequency out of iv_freq_values + for ( size_t l_index = 0; l_index < l_port_supported_freqs.size(); ++l_index ) + { + const auto l_scoreboard_freq = iv_freq_values[l_index]; + + if ( l_scoreboard_freq > i_freq_limit ) + { + FAPI_INF("Removing freq %d on port %d since it's above the limit %d", l_scoreboard_freq, i_port_pos, i_freq_limit); + l_port_supported_freqs[l_index] = false; + } + } + } + + return fapi2::FAPI2_RC_SUCCESS; + + fapi_try_exit: + return fapi2::current_err; + } /// /// @brief Remove frequencies above a limit from the scoreboard @@ -141,7 +169,30 @@ class freq_scoreboard /// @return FAPI2_RC_SUCCESS if successful /// fapi2::ReturnCode remove_freqs_above_limit(const uint64_t i_port_pos, - const std::vector<uint32_t> i_freq_limits); + const std::vector<uint32_t> i_freq_limits) + { + FAPI_TRY( check_port_position(i_port_pos, + generic_ffdc_codes::FREQ_SCOREBOARD_REMOVE_FREQS_ABOVE_LIMIT_VECTOR), + "Invalid port index passed to remove_freqs_above_limit (%d)", + i_port_pos); + + FAPI_ASSERT(i_freq_limits.size() == iv_num_ports, + fapi2::MSS_INVALID_FREQ_LIST_PASSED() + .set_SIZE(i_freq_limits.size()) + .set_EXPECTED(iv_num_ports), + "Invalid frequency list passed to remove_freqs_above_limit (size should be %d but got %d)", + iv_num_ports, i_freq_limits.size()); + + { + const auto l_freq_limit = i_freq_limits[i_port_pos]; + FAPI_TRY( this->remove_freqs_above_limit(i_port_pos, l_freq_limit) ); + } + + return fapi2::FAPI2_RC_SUCCESS; + + fapi_try_exit: + return fapi2::current_err; + } /// /// @brief Remove frequencies not on a given list from the scoreboard @@ -185,7 +236,25 @@ class freq_scoreboard /// @return FAPI2_RC_SUCCESS if successful /// fapi2::ReturnCode max_supported_freq(const uint64_t i_port_pos, - uint32_t& o_freq) const; + uint32_t& o_freq) const + { + FAPI_TRY( this->check_port_position(i_port_pos, + generic_ffdc_codes::FREQ_SCOREBOARD_MAX_SUPPORTED_FREQ), + "Invalid port index passed to max_supported_freq (%d)", + i_port_pos); + + { + std::vector<uint32_t> l_supported_freqs; + FAPI_TRY( this->supported_freqs(i_port_pos, l_supported_freqs) ); + + o_freq = l_supported_freqs.empty() ? 0 : l_supported_freqs.back(); + } + + return fapi2::FAPI2_RC_SUCCESS; + + fapi_try_exit: + return fapi2::current_err; + } /// /// @brief Return a list of supported frequencies for a given port @@ -194,7 +263,31 @@ class freq_scoreboard /// @return FAPI2_RC_SUCCESS if successful /// fapi2::ReturnCode supported_freqs(const uint64_t i_port_pos, - std::vector<uint32_t>& o_freqs) const; + std::vector<uint32_t>& o_freqs) const + { + FAPI_TRY( check_port_position(i_port_pos, + generic_ffdc_codes::FREQ_SCOREBOARD_SUPPORTED_FREQS), + "Invalid port index passed to supported_freqs (%d)", + i_port_pos); + + { + o_freqs.clear(); + auto& l_port_supported_freqs = iv_supported_port_freqs[i_port_pos]; + + for ( size_t l_index = 0; l_index < iv_freq_values.size(); ++l_index ) + { + if (l_port_supported_freqs[l_index]) + { + o_freqs.push_back(iv_freq_values[l_index]); + } + } + } + + return fapi2::FAPI2_RC_SUCCESS; + + fapi_try_exit: + return fapi2::current_err; + } /// /// @brief Resolve frequency scoreboard by deconfiguring any non-conforming ports |