summaryrefslogtreecommitdiffstats
path: root/src/usr/isteps/istep07/call_mss_freq.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/isteps/istep07/call_mss_freq.C')
-rw-r--r--src/usr/isteps/istep07/call_mss_freq.C121
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.
OpenPOWER on IntegriCloud