diff options
Diffstat (limited to 'src/usr/isteps/istep07/call_mss_freq.C')
-rw-r--r-- | src/usr/isteps/istep07/call_mss_freq.C | 121 |
1 files changed, 81 insertions, 40 deletions
diff --git a/src/usr/isteps/istep07/call_mss_freq.C b/src/usr/isteps/istep07/call_mss_freq.C index c6e6ac038..5495526ee 100644 --- a/src/usr/isteps/istep07/call_mss_freq.C +++ b/src/usr/isteps/istep07/call_mss_freq.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015,2019 */ +/* Contributors Listed Below - COPYRIGHT 2015,2020 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -78,9 +78,9 @@ using namespace TARGETING; void* call_mss_freq( void *io_pArgs ) { IStepError l_StepError; - errlHndl_t l_err = NULL; + errlHndl_t l_err = nullptr; - #ifdef CONFIG_SECUREBOOT + #if (defined CONFIG_SECUREBOOT && ! defined CONFIG_AXONE) bool l_isMemdLoaded = false; #endif @@ -88,7 +88,7 @@ void* call_mss_freq( void *io_pArgs ) do { - #ifdef CONFIG_SECUREBOOT + #if (defined CONFIG_SECUREBOOT && ! defined CONFIG_AXONE) // Load MEMD so that vpd_supported_freqs can use it. l_err = loadSecureSection(PNOR::MEMD); if (l_err) @@ -197,30 +197,30 @@ void* call_mss_freq( void *io_pArgs ) #ifdef CONFIG_AXONE else if(l_procModel == TARGETING::MODEL_AXONE) { - TARGETING::TargetHandleList l_memportTargetList; - getAllChiplets(l_memportTargetList, TYPE_MEM_PORT); + TARGETING::TargetHandleList l_procTargList; + getAllChips(l_procTargList, TYPE_PROC); - for (const auto & l_memport_target : l_memportTargetList) + for (const auto & l_proc_target : l_procTargList) { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "p9a_mss_freq HWP target HUID %.8x", - TARGETING::get_huid(l_memport_target)); + TARGETING::get_huid(l_proc_target)); // call the HWP with each target ( if parallel, spin off a task ) - fapi2::Target <fapi2::TARGET_TYPE_MEM_PORT> l_fapi_memport_target - (l_memport_target); + fapi2::Target <fapi2::TARGET_TYPE_PROC_CHIP> l_fapi_proc_target + (l_proc_target); - FAPI_INVOKE_HWP(l_err, p9a_mss_freq, l_fapi_memport_target); + FAPI_INVOKE_HWP(l_err, p9a_mss_freq, l_fapi_proc_target); // process return code. if ( l_err ) { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "ERROR 0x%.8X: p9a_mss_freq HWP on target HUID %.8x", - l_err->reasonCode(), TARGETING::get_huid(l_memport_target) ); + l_err->reasonCode(), TARGETING::get_huid(l_proc_target) ); // capture the target data in the elog - ErrlUserDetailsTarget(l_memport_target).addToLog( l_err ); + ErrlUserDetailsTarget(l_proc_target).addToLog( l_err ); // Create IStep error log and cross reference to error that occurred l_StepError.addErrorDetails( l_err ); @@ -248,13 +248,25 @@ void* call_mss_freq( void *io_pArgs ) // allow it to change here TARGETING::Target * l_sys = nullptr; TARGETING::targetService().getTopLevelTarget( l_sys ); - // TODO RTC: 207596 Get nest boot freq for OMIs - #ifndef CONFIG_AXONE_BRING_UP - uint32_t l_originalNest = Util::getBootNestFreq(); - #endif + + TARGETING::ATTR_FREQ_PB_MHZ_type l_originalNestFreq = Util::getBootNestFreq(); + + // Omi Freq is only used in P9a and beyond, to limit #ifdef + // craziness below just leave it at 0 so it never changes + TARGETING::ATTR_FREQ_OMI_MHZ_type l_originalOmiFreq = 0; +#ifdef CONFIG_AXONE + TARGETING::ATTR_OMI_PLL_VCO_type l_originalOmiVco = 0; // unused but needed for func call + l_err = fapi2::platAttrSvc::getOmiFreqAndVco(l_originalOmiFreq, l_originalOmiVco); + if(l_err) + { + l_StepError.addErrorDetails( l_err ); + errlCommit( l_err, ISTEP_COMP_ID ); + break; + } +#endif // Read MC_SYNC_MODE from SBE itself and set the attribute - uint8_t l_bootSyncMode = 0; + TARGETING::ATTR_MC_SYNC_MODE_type l_bootSyncMode = 0; l_err = SBE::getBootMcSyncMode( l_bootSyncMode ); if( l_err ) { @@ -318,23 +330,23 @@ void* call_mss_freq( void *io_pArgs ) #ifdef CONFIG_AXONE else if(l_procModel == TARGETING::MODEL_AXONE) { - TARGETING::TargetHandleList l_mcTargetList; - getAllChiplets(l_mcTargetList, TYPE_MC); - for (const auto & l_mc_target : l_mcTargetList) + TARGETING::TargetHandleList l_procTargetList; + getAllChips(l_procTargetList, TYPE_PROC); + for (const auto & l_proc_target : l_procTargetList) { // call the HWP with each target ( if parallel, spin off a task ) - fapi2::Target <fapi2::TARGET_TYPE_MC> l_fapi_mc_target(l_mc_target); + fapi2::Target <fapi2::TARGET_TYPE_PROC_CHIP> l_fapi_proc_target(l_proc_target); TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "START : running p9a_mss_freq_system HWP on target 0x%.08X", TARGETING::get_huid(l_mc_target));; + "START : running p9a_mss_freq_system HWP on target 0x%.08X", TARGETING::get_huid(l_proc_target));; - FAPI_INVOKE_HWP(l_err, p9a_mss_freq_system, l_fapi_mc_target); + FAPI_INVOKE_HWP(l_err, p9a_mss_freq_system, l_proc_target); // process return code. if ( l_err ) { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR: p9a_mss_freq_system HWP while running on mc target 0x%.08X", TARGETING::get_huid(l_mc_target));; + "ERROR: p9a_mss_freq_system HWP while running on mc target 0x%.08X", TARGETING::get_huid(l_proc_target));; - ERRORLOG::ErrlUserDetailsTarget(l_mc_target).addToLog(l_err); + ERRORLOG::ErrlUserDetailsTarget(l_proc_target).addToLog(l_err); // Create IStep error log and cross reference to error that occurred l_StepError.addErrorDetails( l_err ); @@ -345,7 +357,7 @@ void* call_mss_freq( void *io_pArgs ) else { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "SUCCESS : p9a_mss_freq_system HWP on target 0x%.08X", TARGETING::get_huid(l_mc_target));; + "SUCCESS : p9a_mss_freq_system HWP on target 0x%.08X", TARGETING::get_huid(l_proc_target));; } } } @@ -357,34 +369,55 @@ void* call_mss_freq( void *io_pArgs ) break; } - // TODO RTC: 207596 Get nest boot freq for OMIs - #ifndef CONFIG_AXONE_BRING_UP // Get latest MC_SYNC_MODE and FREQ_PB_MHZ - uint8_t l_mcSyncMode = l_masterProc->getAttr<TARGETING::ATTR_MC_SYNC_MODE>(); - uint32_t l_newNest = l_sys->getAttr<TARGETING::ATTR_FREQ_PB_MHZ>(); + TARGETING::ATTR_MC_SYNC_MODE_type l_mcSyncMode = l_masterProc->getAttr<TARGETING::ATTR_MC_SYNC_MODE>(); + TARGETING::ATTR_FREQ_OMI_MHZ_type l_newOmiFreq = 0; + TARGETING::ATTR_FREQ_PB_MHZ_type l_newNestFreq = l_sys->getAttr<TARGETING::ATTR_FREQ_PB_MHZ>(); +#ifdef CONFIG_AXONE + TARGETING::ATTR_OMI_PLL_VCO_type l_newOmiVco = 0; // unused but needed for func call + l_err = fapi2::platAttrSvc::getOmiFreqAndVco(l_newOmiFreq, l_newOmiVco); + if(l_err) + { + l_StepError.addErrorDetails( l_err ); + errlCommit( l_err, ISTEP_COMP_ID ); + break; + } +#endif //Trigger sbe update if the nest frequency changed. - if( (l_newNest != l_originalNest) || (l_mcSyncMode != l_bootSyncMode) ) + if( (l_newNestFreq != l_originalNestFreq) + || (l_mcSyncMode != l_bootSyncMode) + || (l_newOmiFreq != l_originalOmiFreq) + ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "The nest frequency or sync mode changed!" " Original Nest: %d New Nest: %d" - " Original syncMode: %d New syncMode: %d", - l_originalNest, l_newNest, l_bootSyncMode, l_mcSyncMode ); + " Original syncMode: %d New syncMode: %d" + " Original Omi : %d New Omi : %d" + , l_originalNestFreq, l_newNestFreq, l_bootSyncMode, l_mcSyncMode + , l_originalOmiFreq, l_newOmiFreq + ); if(l_sys->getAttr<TARGETING::ATTR_IS_MPIPL_HB>() == true) { TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "Error: SBE update detected in MPIPL"); + // It is highly unlikely nest frequency will change + // in Axone systems but OMI freq might. Its is impossible + // for OMI freq to change in Nimbus/Cumulus systems. So + // we will display Nest freq in error for Nimbus/Cumulus and + // display OMI freq for Axone. + /*@ * @errortype * @moduleid MOD_SBE_PERFORM_UPDATE_CHECK * @reasoncode RC_SBE_UPDATE_IN_MPIPL * @userdata1[0:31] original mc sync mode * @userdata1[32:63] new mc sync mode - * @userdata2[0:31] original nest frequency - * @userdata2[32:63] new nest frequency + * @userdata2[0:31] original (nest p9 | omi p9a+) frequency + * @userdata2[32:63] new (nest p9 | omi p9a+) frequency * @devdesc SBE cannot be reset during MPIPL * @custdesc Illegal action during boot */ @@ -394,8 +427,16 @@ void* call_mss_freq( void *io_pArgs ) TWO_UINT32_TO_UINT64( TO_UINT32(l_bootSyncMode), TO_UINT32(l_mcSyncMode)), +#ifndef CONFIG_AXONE + TWO_UINT32_TO_UINT64( + l_originalNestFreq, + l_newNestFreq)); +#else TWO_UINT32_TO_UINT64( - l_originalNest, l_newNest)); + l_originalOmiFreq, + l_newOmiFreq)); +#endif + l_err->collectTrace("ISTEPS_TRACE"); l_StepError.addErrorDetails( l_err ); errlCommit( l_err, ISTEP_COMP_ID ); @@ -403,8 +444,9 @@ void* call_mss_freq( void *io_pArgs ) else { TARGETING::setFrequencyAttributes(l_sys, - l_newNest); + l_newNestFreq); l_err = SBE::updateProcessorSbeSeeproms(); + if( l_err ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, @@ -419,11 +461,10 @@ void* call_mss_freq( void *io_pArgs ) } } } - #endif } while(0); - #ifdef CONFIG_SECUREBOOT + #if (defined CONFIG_SECUREBOOT && ! defined CONFIG_AXONE) if(l_isMemdLoaded) { // Should not have any uncommitted errors at this point. |