From a9986addb4ffeee06cb05144a11e820bdcbb27fe Mon Sep 17 00:00:00 2001 From: Prachi Gupta Date: Tue, 22 May 2018 13:11:40 -0500 Subject: call mss_volt* hwps with membufs that have same VDDR_ID For dynamic VID to work, we need to send a list of membufs that have the same VDDR_ID attribute on them to mss_volt and mss_volt_vddr_addr_offset. This commit creates a map of to group and convert membufs to fapi2. Change-Id: I37745246afe817ec41bfcfee5414aacbb23fce1e CQ:SW429838 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59200 Reviewed-by: William G. Hoffa Reviewed-by: Richard J. Knight Tested-by: Jenkins Server Reviewed-by: Thi N. Tran Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Daniel M. Crowell --- src/usr/isteps/istep07/call_mss_volt.C | 149 +++++++++++++++++++++------------ 1 file changed, 95 insertions(+), 54 deletions(-) (limited to 'src') diff --git a/src/usr/isteps/istep07/call_mss_volt.C b/src/usr/isteps/istep07/call_mss_volt.C index be4192fd5..fd63f995a 100644 --- a/src/usr/isteps/istep07/call_mss_volt.C +++ b/src/usr/isteps/istep07/call_mss_volt.C @@ -31,7 +31,7 @@ // Includes /******************************************************************************/ #include - +#include #include #include #include @@ -70,7 +70,44 @@ using namespace ISTEP_ERROR; using namespace ERRORLOG; using namespace TARGETING; +typedef std::map>> MembufTargetMap_t; +typedef std::vector VDDR_ID_vect_t; +void buildMembufLists(TargetHandleList & i_membufTargetList, + MembufTargetMap_t & o_membufFapiTargetMap, + VDDR_ID_vect_t & o_unique_vddr_ids) +{ + for (auto & l_membuf : i_membufTargetList) + { + //get VDDR_ID attribute + auto l_vddr_id = l_membuf->getAttr(); + + //convert membuf to fapi target + fapi2::Target + l_fapi_membuf (l_membuf); + + //Create a vector with the fapi target to insert in the map later. + std::vector> l_fapi_vect; + l_fapi_vect.push_back(std::move(l_fapi_membuf)); + + //insert {VDDR_ID, fapi2 membuf} in the map + //l_ret is of format std::pair + //where bool indicates whether the insertion was successful or not + auto l_ret = o_membufFapiTargetMap.insert({l_vddr_id, l_fapi_vect}); + if (l_ret.second == false) + { + //This VDDR_ID already exists in the map, we need to push + //l_fapi_membuf to the exisiting vector + l_ret.first->second.push_back(std::move(l_fapi_membuf)); + } + else + { + //insertion was successful meaning this is a new vddr id + //save it off in a vector for faster retrieval later + o_unique_vddr_ids.push_back(std::move(l_vddr_id)); + } + } +} void* call_mss_volt( void *io_pArgs ) { @@ -83,82 +120,86 @@ void* call_mss_volt( void *io_pArgs ) bool unused = false; set_eff_config_attrs_helper(DEFAULT, unused); - TargetHandleList l_membufTargetList; - getAllChips(l_membufTargetList, TYPE_MEMBUF); do { + TargetHandleList l_membufTargetList; + getAllChips(l_membufTargetList, TYPE_MEMBUF); TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_volt: %d membuf targets", l_membufTargetList.size()); if (l_membufTargetList.size() > 0) { - std::vector< fapi2::Target > - l_membufFapiTargetsList; - for(auto & l_membuf_target : l_membufTargetList) - { - fapi2::Target - l_membuf_fapi_target (l_membuf_target); + MembufTargetMap_t l_membufFapiTargetMap {}; + VDDR_ID_vect_t l_unique_vddrs {}; + buildMembufLists(l_membufTargetList, l_membufFapiTargetMap, + l_unique_vddrs); - l_membufFapiTargetsList.push_back( l_membuf_fapi_target ); - } + for (auto & l_vddr : l_unique_vddrs) + { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "Calling p9c_mss_volt on list of membuf targets"); + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "Calling p9c_mss_volt on list of membuf targets" + " with VDDR_ID=%d, list size=%d", + l_vddr, + l_membufFapiTargetMap[l_vddr].size()); - // p9c_mss_volt.C (vector of centaurs) - FAPI_INVOKE_HWP(l_err, p9c_mss_volt, l_membufFapiTargetsList); + // p9c_mss_volt.C (vector of centaurs with same VDDR_ID) + FAPI_INVOKE_HWP(l_err, p9c_mss_volt, + l_membufFapiTargetMap[l_vddr]); - // process return code - if ( l_err ) - { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR 0x%.8X: p9c_mss_volt HWP() failed", - l_err->reasonCode()); + // process return code + if ( l_err ) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "ERROR 0x%.8X: p9c_mss_volt HWP() failed", + l_err->reasonCode()); - // Create IStep error log and cross reference to error - // that occurred - l_StepError.addErrorDetails(l_err); + // Create IStep error log and cross reference to error + // that occurred + l_StepError.addErrorDetails(l_err); - // Commit Error - errlCommit( l_err, HWPF_COMP_ID ); + // Commit Error + errlCommit( l_err, HWPF_COMP_ID ); - break; + } + else + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "SUCCESS : p9c_mss_volt HWP"); + } - } - else - { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "SUCCESS : p9c_mss_volt HWP"); - } + "Calling p9c_mss_volt_vddr_offset on list of membuf " + "targets with VDDR_ID=%d, list size=%d", + l_vddr, + l_membufFapiTargetMap[l_vddr].size()); - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "Calling p9c_mss_volt_vddr_offset on list of membuf targets"); + // p9c_mss_volt_vddr_offset.C (vector of centaurs) + FAPI_INVOKE_HWP(l_err, p9c_mss_volt_vddr_offset, + l_membufFapiTargetMap[l_vddr]); - // p9c_mss_volt_vddr_offset.C (vector of centaurs) - FAPI_INVOKE_HWP(l_err, p9c_mss_volt_vddr_offset, - l_membufFapiTargetsList); + // process return code + if ( l_err ) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "ERROR 0x%.8X: p9c_mss_volt_vddr_offset HWP failed", + l_err->reasonCode()); - // process return code - if ( l_err ) - { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR 0x%.8X: p9c_mss_volt_vddr_offset HWP() failed", - l_err->reasonCode()); + // Create IStep error log and cross reference to error + // that occurred + l_StepError.addErrorDetails(l_err); - // Create IStep error log and cross reference to error - // that occurred - l_StepError.addErrorDetails(l_err); - - // Commit Error - errlCommit( l_err, HWPF_COMP_ID ); - } - else - { - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "SUCCESS : p9c_mss_volt_vddr_offset HWP"); + // Commit Error + errlCommit( l_err, HWPF_COMP_ID ); + } + else + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "SUCCESS : p9c_mss_volt_vddr_offset HWP"); + } } } -- cgit v1.2.1