diff options
Diffstat (limited to 'src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq_system.C')
-rw-r--r-- | src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq_system.C | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq_system.C b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq_system.C index cc23976d8..adddd1ca2 100644 --- a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq_system.C +++ b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq_system.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2018 */ +/* Contributors Listed Below - COPYRIGHT 2018,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -35,13 +35,59 @@ // fapi2 #include <p9a_mss_freq_system.H> +#include <lib/freq/axone_sync.H> +#include <generic/memory/lib/utils/find.H> +#include <generic/memory/lib/utils/count_dimm.H> +extern "C" +{ /// /// @brief Matches OMI freq with DDR freq -/// @param[in] i_target controller (e.g. MC) +/// @param[in] i_target PROC_CHIP target /// @return FAPI2_RC_SUCCESS iff ok /// -fapi2::ReturnCode p9a_mss_freq_system( const fapi2::Target<fapi2::TARGET_TYPE_MC>& i_target ) -{ - return fapi2::FAPI2_RC_SUCCESS; -} + fapi2::ReturnCode p9a_mss_freq_system( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target ) + { + const auto& l_ports = mss::find_targets<fapi2::TARGET_TYPE_MEM_PORT>(i_target); + + // If there are no DIMM we don't need to bother. In fact, we can't as we didn't setup + // attributes for the PHY, etc. If there is even one DIMM on this proc, + // we do the right thing. + if (mss::count_dimm(l_ports) == 0) + { + FAPI_INF("... skipping freq_system - no DIMM ..."); + return fapi2::FAPI2_RC_SUCCESS; + } + + std::map< fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT>, uint64_t > l_freq_map; + uint32_t l_omi_freq = 0; + uint32_t l_selected_omi_freq = 0; + mss::speed_equality l_equal_dimm_speed; + + // Get OMI freq + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_FREQ_OMI_MHZ, i_target, l_omi_freq) ); + + FAPI_INF("Retrieved omi freq %d", l_omi_freq); + + // Populate dimm speed map + FAPI_TRY( mss::dimm_speed_map(l_ports, l_freq_map, l_equal_dimm_speed), + "Failed to get dimm speed mapping" ); + + FAPI_INF("Dimm speed for all OCMBs are the same : %s", + uint8_t(l_equal_dimm_speed) ? "true" : "false"); + + // Select OMI freq, or check in the case of Cronus + FAPI_TRY( mss::select_omi_freq(l_freq_map, + l_equal_dimm_speed, + l_omi_freq, + l_selected_omi_freq) ); + + // Set attributes. + FAPI_INF("%s: Setting recommended OMI frequency in ATTR_FREQ_OMI_MHZ to %d", mss::c_str(i_target), l_selected_omi_freq); + FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_FREQ_OMI_MHZ, i_target, l_selected_omi_freq) ); + + fapi_try_exit: + return fapi2::current_err; + } + +} //extern "C" |