From e5a493e300da10cd6fe39ecb2e614d63dd11b9fb Mon Sep 17 00:00:00 2001 From: Andre Marin Date: Wed, 27 Feb 2019 13:58:49 -0600 Subject: Add attribute engine algorithm for eff_config and pre_eff_config Change-Id: I8498c143109fa1d1a2c9ad5492476e72f51ba509 Original-Change-Id: I2c89e6da17511462afbc661680d19df18a4708f4 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/72962 Tested-by: FSP CI Jenkins Reviewed-by: Louis Stermole Tested-by: Jenkins Server Tested-by: HWSV CI Tested-by: Hostboot CI Reviewed-by: STEPHEN GLANCY Reviewed-by: Jennifer A. Stofer Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/74689 Tested-by: Jenkins OP Build CI Reviewed-by: Christian R. Geddes --- .../p9a/procedures/hwp/memory/p9a_mss_eff_config.C | 68 +++++++++++++++++++++- .../procedures/hwp/memory/p9a_mss_eff_config.mk | 2 +- .../chips/p9a/procedures/hwp/memory/p9a_mss_freq.C | 29 ++++++++- 3 files changed, 94 insertions(+), 5 deletions(-) (limited to 'src/import/chips/p9a/procedures') diff --git a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.C b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.C index cfa7b80b3..8a1e0a877 100644 --- a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.C +++ b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.C @@ -34,8 +34,14 @@ // *HWP Consumed by: FSP:HB // fapi2 +#include #include - +#include +#include +#include +#include +#include +#include /// /// @brief Configure the attributes for each controller @@ -44,5 +50,63 @@ /// fapi2::ReturnCode p9a_mss_eff_config( const fapi2::Target& i_target ) { - return fapi2::FAPI2_RC_SUCCESS; + // Workaround until DIMM level attrs work + uint8_t l_ranks[mss::exp::MAX_DIMM_PER_PORT] = {}; + + // Get EFD size - should only need to do it once + const auto l_ocmb = mss::find_target(i_target); + fapi2::MemVpdData_t l_vpd_type(fapi2::EFD); + fapi2::VPDInfo l_vpd_info(l_vpd_type); + FAPI_TRY( fapi2::getVPD(l_ocmb, l_vpd_info, nullptr) ); + + FAPI_TRY( mss::attr::get_num_master_ranks_per_dimm(i_target, l_ranks) ); + + for(const auto& dimm : mss::find_targets(i_target)) + { + uint8_t l_dimm_index = 0; + uint64_t l_freq = 0; + FAPI_TRY( mss::attr::get_freq(mss::find_target(dimm), l_freq) ); + + // Quick hack to get the index until DIMM level attrs work + FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_REL_POS, dimm, l_dimm_index) ); + + for( auto rank = 0; rank < l_ranks[l_dimm_index]; ++rank ) + { + std::shared_ptr l_efd_data; + + // Get EFD data + l_vpd_info.iv_rank = rank; + l_vpd_info.iv_omi_freq_mhz = l_freq; + std::vector l_vpd_raw (l_vpd_info.iv_size, 0); + FAPI_TRY( fapi2::getVPD(l_ocmb, l_vpd_info, l_vpd_raw.data()) ); + + // Instantiate EFD decoder + FAPI_TRY( mss::efd::factory(l_ocmb, l_vpd_raw, l_vpd_info.iv_rank, l_efd_data) ); + + // Set up SI ATTRS + FAPI_TRY( mss::attr_si_engine::set(l_efd_data) ); + } + + { + std::vector l_raw_spd; + FAPI_TRY(mss::spd::get_raw_data(dimm, l_raw_spd)); + { + // Gets the SPD facade + fapi2::ReturnCode l_rc(fapi2::FAPI2_RC_SUCCESS); + mss::spd::facade l_spd_decoder(dimm, l_raw_spd, l_rc); + + // Checks that the facade was setup correctly + FAPI_TRY( l_rc, "Failed to initialize SPD facade for %s", mss::spd::c_str(dimm) ); + + // Set up generic SPD ATTRS + FAPI_TRY( mss::attr_eff_engine::set(l_spd_decoder) ); + + // Set up explorer SPD ATTRS + FAPI_TRY( mss::attr_eff_engine::set(l_spd_decoder) ); + } + } + }// dimm + +fapi_try_exit: + return fapi2::current_err; } diff --git a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.mk b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.mk index 94114e779..65e376f98 100644 --- a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.mk +++ b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_eff_config.mk @@ -27,5 +27,5 @@ -include 00p9a_common.mk PROCEDURE=p9a_mss_eff_config -$(eval $(call ADD_MEMORY_INCDIRS,$(PROCEDURE))) +$(eval $(call ADD_P9A_MEMORY_INCDIRS,$(PROCEDURE))) $(call BUILD_PROCEDURE) diff --git a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq.C b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq.C index f0a06de0b..7591689e2 100644 --- a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq.C +++ b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_freq.C @@ -33,8 +33,11 @@ // *HWP Level: 1 // *HWP Consumed by: FSP:HB -// fapi2 #include +#include +#include +#include +#include /// /// @brief Calculate and save off DIMM frequencies @@ -43,5 +46,27 @@ /// fapi2::ReturnCode p9a_mss_freq( const fapi2::Target& i_target ) { - return fapi2::FAPI2_RC_SUCCESS; + // We will first set pre-eff_config attribes + for(const auto& d : mss::find_targets(i_target)) + { + std::vector l_raw_spd; + FAPI_TRY(mss::spd::get_raw_data(d, l_raw_spd)); + { + // Gets the SPD facade + fapi2::ReturnCode l_rc(fapi2::FAPI2_RC_SUCCESS); + mss::spd::facade l_spd_decoder(d, l_raw_spd, l_rc); + + // Checks that the facade was setup correctly + FAPI_TRY( l_rc, "Failed to initialize SPD facade for %s", mss::spd::c_str(d) ); + + FAPI_TRY( mss::attr_eff_engine::set(l_spd_decoder) ); + } + + // TK - Remove hard-code FREQ -- Should we have enums? Louis problem now + uint64_t HARDCODE_FREQ_LOUIS_REMOVE = 25600; + FAPI_TRY( mss::attr::set_freq(i_target, HARDCODE_FREQ_LOUIS_REMOVE) ); + }// dimm + +fapi_try_exit: + return fapi2::current_err; } -- cgit v1.2.1