summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/build/configs/simics_axone.config3
-rw-r--r--src/include/usr/isteps/istep_reasoncodes.H2
-rw-r--r--src/usr/isteps/istep07/call_mss_freq.C134
-rw-r--r--src/usr/isteps/mss/HBconfig2
-rw-r--r--src/usr/targeting/common/xmltohb/simics_AXONE.system.xml6
5 files changed, 129 insertions, 18 deletions
diff --git a/src/build/configs/simics_axone.config b/src/build/configs/simics_axone.config
index 5e4e3fe4b..0b26f13bd 100644
--- a/src/build/configs/simics_axone.config
+++ b/src/build/configs/simics_axone.config
@@ -44,3 +44,6 @@ set AXONE
# Enable Console
set CONSOLE
unset CONSOLE_OUTPUT_ERRORDISPLAY
+
+# OMIs were introduced in Axone and will be in P10 also
+set SUPPORT_OMI \ No newline at end of file
diff --git a/src/include/usr/isteps/istep_reasoncodes.H b/src/include/usr/isteps/istep_reasoncodes.H
index 5bd5fbf94..36c1e8e39 100644
--- a/src/include/usr/isteps/istep_reasoncodes.H
+++ b/src/include/usr/isteps/istep_reasoncodes.H
@@ -68,6 +68,7 @@ namespace ISTEP
MOD_MSS_SCRUB = 0x25,
MOD_CALL_UPDATE_UCD_FLASH = 0x26,
MOD_LOAD_HCODE = 0x27,
+ MOD_GET_OMI_FREQ = 0x28,
};
/**
@@ -142,6 +143,7 @@ namespace ISTEP
RC_SLAVE_CORE_WAKEUP_ERROR = ISTEP_COMP_ID | 0x4E,
RC_UCD_IMG_NOT_IN_CONTAINER = ISTEP_COMP_ID | 0x4F,
RC_MM_UNMAP_FAILED = ISTEP_COMP_ID | 0x50,
+ RC_OMI_FREQ_MISMATCH = ISTEP_COMP_ID | 0x51,
};
};
diff --git a/src/usr/isteps/istep07/call_mss_freq.C b/src/usr/isteps/istep07/call_mss_freq.C
index f6b35e688..9bec2f97b 100644
--- a/src/usr/isteps/istep07/call_mss_freq.C
+++ b/src/usr/isteps/istep07/call_mss_freq.C
@@ -72,13 +72,25 @@ using namespace ISTEP_ERROR;
using namespace ERRORLOG;
using namespace TARGETING;
+#ifdef CONFIG_AXONE
+/**
+ * @brief Look at all FREQ_OMI_MHZ attribute on all processors, make sure
+ * they are the same and return the value.
+ * @param[out] o_omiFreq the frequency of the OMI link between proc and ocmbs
+ * @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code.
+ *
+ * @note returns error if all OMIs do not have matching frequency set
+ */
+errlHndl_t getOmiFreq(TARGETING::ATTR_FREQ_OMI_MHZ_type & o_omiFreq);
+#endif
+
//
// Wrapper function to call mss_freq
//
void* call_mss_freq( void *io_pArgs )
{
IStepError l_StepError;
- errlHndl_t l_err = NULL;
+ errlHndl_t l_err = nullptr;
#ifdef CONFIG_SECUREBOOT
bool l_isMemdLoaded = false;
@@ -248,10 +260,21 @@ 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
+
+ uint32_t 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
+ uint32_t l_originalOmiFreq = 0;
+#ifdef CONFIG_AXONE
+ l_err = getOmiFreq(l_originalOmiFreq);
+ 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;
@@ -357,34 +380,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>();
+ uint32_t l_newOmiFreq = 0;
+
+ uint32_t l_newNestFreq = l_sys->getAttr<TARGETING::ATTR_FREQ_PB_MHZ>();
+#ifdef CONFIG_AXONE
+ l_err = getOmiFreq(l_newOmiFreq);
+ 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 +438,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 +455,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,7 +472,6 @@ void* call_mss_freq( void *io_pArgs )
}
}
}
- #endif
} while(0);
@@ -450,4 +502,54 @@ void* call_mss_freq( void *io_pArgs )
return l_StepError.getErrorHandle();
}
+#ifdef CONFIG_AXONE
+errlHndl_t getOmiFreq(TARGETING::ATTR_FREQ_OMI_MHZ_type & o_omiFreq)
+{
+ errlHndl_t l_err = nullptr;
+ TARGETING::TargetHandleList l_procTargetList;
+ getAllChips(l_procTargetList, TYPE_PROC);
+
+ assert( l_procTargetList.size() > 0, "getOmiFreq: Expected at least one functional processor");
+
+ o_omiFreq = l_procTargetList[0]->getAttr<TARGETING::ATTR_FREQ_OMI_MHZ>();
+ // Until we are told we need to support individual processor frequency
+ // assert that all of the processors have the same values
+ for(uint8_t i = 1; i < l_procTargetList.size(); i++)
+ {
+
+ TARGETING::ATTR_FREQ_OMI_MHZ_type l_tmpFreq =
+ l_procTargetList[i]->getAttr<TARGETING::ATTR_FREQ_OMI_MHZ>();
+
+ if(o_omiFreq != l_tmpFreq)
+ {
+ /*@
+ * @errortype ERRL_SEV_UNRECOVERABLE
+ * @moduleid MOD_GET_OMI_FREQ
+ * @reasoncode RC_OMI_FREQ_MISMATCH
+ * @userdata1[0:31] First OMI freq found
+ * @userdata1[32:63] Mismatched OMI freq found
+ * @userdata2[0:31] Huid of first proc found
+ * @userdata2[32:63] Huid of proc w/ mismatched OMI freq
+ * @devdesc Processor have mismatch OMI freq
+ * @custdesc Invalid processor frequency settings
+ */
+ l_err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
+ MOD_GET_OMI_FREQ,
+ RC_OMI_FREQ_MISMATCH,
+ TWO_UINT32_TO_UINT64(
+ TO_UINT32(o_omiFreq),
+ TO_UINT32(l_tmpFreq)),
+ TWO_UINT32_TO_UINT64(
+ get_huid(l_procTargetList[0]),
+ get_huid(l_procTargetList[i])),
+ ErrlEntry::ADD_SW_CALLOUT);
+
+ break;
+ }
+ }
+
+ return l_err;
+}
+#endif
+
}; // end namespace
diff --git a/src/usr/isteps/mss/HBconfig b/src/usr/isteps/mss/HBconfig
index f48017fe1..56334c98c 100644
--- a/src/usr/isteps/mss/HBconfig
+++ b/src/usr/isteps/mss/HBconfig
@@ -1,4 +1,4 @@
config LRDIMM_CAPABLE
default n
help
- Enable the use of LRDIMM code
+ Enable the use of LRDIMM code \ No newline at end of file
diff --git a/src/usr/targeting/common/xmltohb/simics_AXONE.system.xml b/src/usr/targeting/common/xmltohb/simics_AXONE.system.xml
index d47924115..342507e90 100644
--- a/src/usr/targeting/common/xmltohb/simics_AXONE.system.xml
+++ b/src/usr/targeting/common/xmltohb/simics_AXONE.system.xml
@@ -201,7 +201,7 @@
</attribute>
<attribute>
<id>ASYNC_NEST_FREQ_MHZ</id>
- <default>0xFFFF</default>
+ <default>2000</default>
</attribute>
<attribute>
<id>HB_SETTINGS</id>
@@ -637,6 +637,10 @@
<id>VPD_REC_NUM</id>
<default>0</default>
</attribute>
+ <attribute>
+ <id>FREQ_OMI_MHZ</id>
+ <default>25600</default>
+ </attribute>
</targetInstance>
<!-- ===================================================================== -->
OpenPOWER on IntegriCloud