summaryrefslogtreecommitdiffstats
path: root/src/usr/sbe/sbe_update.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/sbe/sbe_update.C')
-rw-r--r--src/usr/sbe/sbe_update.C519
1 files changed, 91 insertions, 428 deletions
diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
index 627c87013..46ecc8a03 100644
--- a/src/usr/sbe/sbe_update.C
+++ b/src/usr/sbe/sbe_update.C
@@ -55,15 +55,11 @@
#include "sbe_resolve_sides.H"
// fapi support
-#include <fapi.H>
-#include <fapiHwpExecutor.H>
-#include <hwpf/plat/fapiPlatHwpInvoker.H>
-#include <hwpf/plat/fapiPlatTrace.H>
+#include <fapi2.H>
+#include <fapi2/plat_hwp_invoker.H>
//Procedures
-#include <p8_xip_customize.H>
-#include <sbe_xip_image.h>
-#include <p8_image_help_base.H>
+#include <p9_xip_customize.H>
// ----------------------------------------------
// Trace definitions
@@ -76,7 +72,6 @@ TRAC_INIT( & g_trac_sbe, SBE_COMP_NAME, KILOBYTE );
//#define TRACUCOMP(args...) TRACFCOMP(args)
#define TRACUCOMP(args...)
-
// ----------------------------------------
// Global Variables for MBOX Ipl Query
static bool g_mbox_query_done = false;
@@ -90,17 +85,6 @@ using namespace TARGETING;
namespace SBE
{
- enum {
- SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE,
- RING_BUF1_VADDR = FIXED_SEEPROM_WORK_SPACE + SBE_IMG_VADDR,
- RING_BUF2_VADDR = RING_BUF1_VADDR + FIXED_RING_BUF_SIZE,
- //NOTE: recycling the same memory space for different
- //steps in the process.
- SBE_ECC_IMG_VADDR = RING_BUF1_VADDR,
- SBE_ECC_IMG_MAX_SIZE = VMM_VADDR_SBE_UPDATE_END - SBE_ECC_IMG_VADDR,
- };
-
-/////////////////////////////////////////////////////////////////////
errlHndl_t updateProcessorSbeSeeproms(sbeUpdateCheckType i_check_type)
{
errlHndl_t err = NULL;
@@ -209,7 +193,7 @@ namespace SBE
g_mbox_query_done = false;
g_mbox_query_result = false;
- // Create VMM space for p8_xip_customize() procedure
+ // Create VMM space for p9_xip_customize() procedure
err = createSbeImageVmmSpace();
if (err)
{
@@ -272,7 +256,7 @@ namespace SBE
TRACUCOMP( g_trac_sbe, "updateProcessorSbeSeeproms(): "
"Main Loop: tgt=0x%X, i=%d",
- TARGETING::get_huid(sbeState.target), i)
+ TARGETING::get_huid(sbeState.target), i);
// Check to see if current target is master processor
if ( sbeState.target == masterProcChipTargetHandle)
@@ -713,7 +697,8 @@ namespace SBE
// it includes a SBE Header
if (pnorInfo.sha512perEC)
{
- TRACFCOMP(g_trac_sbe,INFO_MRK"findSBEInPnor: sha512perEC Found in %s", pnorInfo.name);
+ TRACFCOMP(g_trac_sbe,INFO_MRK"findSBEInPnor: sha512perEC "
+ "Found in %s", pnorInfo.name);
// Advance PNOR pointer 4k to move it past header page to the
// start of the non-customized SBE image
o_imgPtr = reinterpret_cast<void*>
@@ -751,14 +736,10 @@ namespace SBE
void* io_imgPtr,
size_t& o_actImgSize)
{
+ // @TODO RTC:158044 Code removed after earlier review comment may still
+ // be needed. Use Story 158044 to replace.
errlHndl_t err = NULL;
- fapi::ReturnCode rc_fapi = fapi::FAPI_RC_SUCCESS;
- uint32_t coreMask = 0x0000FFFF;
- size_t maxCores = P8_MAX_EX_PER_PROC;
- int coreCount = 0;
- uint32_t procIOMask = 0;
uint32_t tmpImgSize = static_cast<uint32_t>(i_maxImgSize);
- bool procedure_success = false;
TRACUCOMP( g_trac_sbe,
ENTER_MRK"procCustomizeSbeImg(): uid=0x%X, i_sbePnorPtr= "
@@ -769,360 +750,46 @@ namespace SBE
do{
// cast OUR type of target to a FAPI type of target.
- const fapi::Target
- l_fapiTarg(fapi::TARGET_TYPE_PROC_CHIP,
- (const_cast<TARGETING::Target*>(i_target)));
-
- // NOTE: The p8_xip_customize_procedure uses SBE_IMAGE_OFFSET
- // attribute for HBB address value. Purpsely leaving this
- // attribute as-is for now and will do the check for HBB address
- // later.
-
- // The p8_xip_customize() procedure tries to include as much core
- // information as possible, but is limited by SBE Image size
- // constraints.
- // First, maximize core mask for the target
- // Then loop on the procedure call, where the loop is designed to
- // remove the number of cores passed into p8_xip_customize() until
- // an image can be created successfully.
-
- // Maximize Core mask for this target
- err = selectBestCores(i_target,
- maxCores,
- coreMask);
- if(err)
- {
- TRACFCOMP( g_trac_sbe, ERR_MRK"procCustomizeSbeImg() - "
- "selectBestCores() failed rc=0x%X. "
- "MaxCores=0x%.8X. HUID=0x%X. Aborting "
- "Customization of SBE Image",
- err->reasonCode(), maxCores,
- TARGETING::get_huid(i_target));
- break;
- }
-
- // setup loop parameters
- coreCount = __builtin_popcount(coreMask);
- procIOMask = coreMask;
-
- while( coreCount >= 0 )
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>
+ l_fapiTarg(i_target);
+
+ FAPI_INVOKE_HWP( err,
+ p9_xip_customize,
+ l_fapiTarg,
+ i_sbePnorPtr, //image in
+ tmpImgSize,
+ 0, //IPL
+ (void*)RING_BUF1_VADDR,
+ (uint32_t)FIXED_RING_BUF_SIZE,
+ (void*)RING_BUF2_VADDR,
+ (uint32_t)FIXED_RING_BUF_SIZE );
+
+ if ( err )
{
+ TRACFCOMP(g_trac_sbe,
+ ERR_MRK"procCustomizeSbeImg() - "
+ "p9_xip_customize HWP failed rc=0x%X. "
+ "HUID=0x%X. Aborting Customization of SBE Image",
+ err->reasonCode(),
+ TARGETING::get_huid(i_target));
- FAPI_EXEC_HWP( rc_fapi,
- p8_xip_customize,
- l_fapiTarg,
- i_sbePnorPtr, //image in
- io_imgPtr, //image out
- tmpImgSize,
- 0, //IPL
- 0, //HB/IPL
- (void*)RING_BUF1_VADDR,
- (uint32_t)FIXED_RING_BUF_SIZE,
- (void*)RING_BUF2_VADDR,
- (uint32_t)FIXED_RING_BUF_SIZE,
- procIOMask);
-
- // Check the return code
- if ( !rc_fapi )
- {
- // Procedure was successful
- procedure_success = true;
-
- o_actImgSize = static_cast<size_t>(tmpImgSize);
-
- TRACUCOMP( g_trac_sbe, "procCustomizeSbeImg(): "
- "p8_xip_customize success=%d, procIOMask=0x%X "
- "o_actImgSize=0x%X, rc_fapi=0x%X",
- procedure_success, procIOMask, o_actImgSize,
- uint32_t(rc_fapi));
-
- // exit loop
- break;
- }
- else
- {
- // Look for a specific return code
- if ( static_cast<uint32_t>(rc_fapi) ==
- fapi::RC_PROC_XIPC_OVERFLOW_BEFORE_REACHING_MINIMUM_EXS
- )
- {
- // This is a specific return code from p8_xip_customize
- // where the cores sent in couldn't fit, but possibly
- // a different procIOMask would work
-
- TRACFCOMP( g_trac_sbe,
- ERR_MRK"procCustomizeSbeImg(): FAPI_EXEC_HWP("
- "p8_xip_customize) returned rc=0x%X, "
- "XIPC_OVERFLOW_BEFORE_REACHING_MINIMUM_EXS-Retry "
- "MaxCores=0x%.8X. HUID=0x%X. coreMask=0x%.8X, "
- "procIOMask=0x%.8X. coreCount=%d",
- uint32_t(rc_fapi), maxCores,
- TARGETING::get_huid(i_target),
- coreMask, procIOMask, coreCount);
-
- // Setup for next loop - update coreMask
- err = selectBestCores(i_target,
- --coreCount,
- procIOMask);
-
- if ( err )
- {
- TRACFCOMP(g_trac_sbe,
- ERR_MRK"procCustomizeSbeImg() - "
- "selectBestCores() failed rc=0x%X. "
- "coreCount=0x%.8X. HUID=0x%X. Aborting "
- "Customization of SBE Image",
- err->reasonCode(), coreCount,
- TARGETING::get_huid(i_target));
-
- // break from while loop
- break;
- }
-
- TRACFCOMP( g_trac_sbe, "procCustomizeSbeImg(): for "
- "next loop: procIOMask=0x%.8X, coreMask="
- "0x%.8X, coreCount=%d",
- procIOMask, coreMask, coreCount);
-
- // No break - keep looping
- }
- else
- {
- // Unexpected return code - create err and fail
- TRACFCOMP( g_trac_sbe,
- ERR_MRK"procCustomizeSbeImg(): FAPI_EXEC_HWP("
- "p8_xip_customize) failed with rc=0x%X, "
- "MaxCores=0x%X. HUID=0x%X. coreMask=0x%.8X, "
- "procIOMask=0x%.8X. coreCount=%d. Create "
- "err and break loop",
- uint32_t(rc_fapi), maxCores,
- TARGETING::get_huid(i_target),
- coreMask, procIOMask, coreCount);
-
- err = fapiRcToErrl(rc_fapi);
-
- ERRORLOG::ErrlUserDetailsTarget(i_target,
- "Proc Target")
- .addToLog(err);
- err->collectTrace(SBE_COMP_NAME, 256);
-
- // break from while loop
- break;
- }
- }
- } // end of while loop
-
-
- if(err)
- {
- // There was a previous error, so break here
+ // There was an error, so break here
break;
}
- if ( procedure_success == false )
- {
- // No err, but exit from while loop before successful
- TRACFCOMP( g_trac_sbe, ERR_MRK"procCustomizeSbeImg() - "
- "Failure to successfully complete p8_xip_customize()"
- ". HUID=0x%X, rc=0x%X, coreCount=%d, coreMask=0x%.8X"
- " procIOMask=0x%.8X, maxCores=0x%X",
- TARGETING::get_huid(i_target), uint32_t(rc_fapi),
- coreCount, coreMask, procIOMask, maxCores);
- /*@
- * @errortype
- * @moduleid SBE_CUSTOMIZE_IMG
- * @reasoncode SBE_P8_XIP_CUSTOMIZE_UNSUCCESSFUL
- * @userdata1[0:31] procIOMask in/out parameter
- * @userdata1[32:63] rc of procedure
- * @userdata2[0:31] coreMask of target
- * @userdata2[32:63] coreCount - updated on the loops
- * @devdesc Unsuccessful in creating Customized SBE Image
- * @custdesc A problem occurred while updating processor
- * boot code.
- */
- err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
- SBE_CUSTOMIZE_IMG,
- SBE_P8_XIP_CUSTOMIZE_UNSUCCESSFUL,
- TWO_UINT32_TO_UINT64(procIOMask,
- uint32_t(rc_fapi)),
- TWO_UINT32_TO_UINT64(coreMask,
- coreCount));
-
- ErrlUserDetailsTarget(i_target
- ).addToLog(err);
- err->collectTrace("FAPI", 256);
- err->collectTrace(SBE_COMP_NAME, 256);
- err->addProcedureCallout( HWAS::EPUB_PRC_HB_CODE,
- HWAS::SRCI_PRIORITY_HIGH );
- }
+ o_actImgSize = static_cast<size_t>(tmpImgSize);
}while(0);
TRACUCOMP( g_trac_sbe,
EXIT_MRK"procCustomizeSbeImg(): io_imgPtr=%p, "
- "o_actImgSize=0x%X, rc_fapi=0x%X, procedure_success=%d",
- io_imgPtr, o_actImgSize, uint32_t(rc_fapi),
- procedure_success );
+ "o_actImgSize=0x%X, RC=0x%X",
+ io_imgPtr, o_actImgSize, ERRL_GETRC_SAFE(err) );
return err;
}
/////////////////////////////////////////////////////////////////////
- errlHndl_t selectBestCores(TARGETING::Target* i_target,
- size_t i_maxExs,
- uint32_t& o_exMask)
- {
- TRACUCOMP( g_trac_sbe,
- ENTER_MRK"selectBestCores(i_maxCores=0x%.8X)",
- i_maxExs);
-
- errlHndl_t err = NULL;
- uint32_t manGuardExs = 0x00000000;
- uint32_t remainingExs = 0x00000000;
- uint32_t exCount = 0;
- uint32_t deconfigByEid = 0;
-
- o_exMask = 0x00000000;
-
- do{
-
- // Special case: if i_maxExs == 0 don't loop through EXs
- if (unlikely(i_maxExs == 0 ))
- {
- break;
- }
-
- // find all EX chiplets of the proc
- TARGETING::TargetHandleList l_exTargetList;
- TARGETING::getChildChiplets( l_exTargetList,
- i_target,
- TARGETING::TYPE_EX,
- false); // return all
-
- //Sort through cores
- for ( TargetHandleList::const_iterator
- l_iterEX = l_exTargetList.begin();
- l_iterEX != l_exTargetList.end();
- ++l_iterEX )
- {
- // make a local copy of the EX target
- const TARGETING::Target* l_ex_target = *l_iterEX;
-
- if( !(l_ex_target->
- getAttr<TARGETING::ATTR_HWAS_STATE>().present) )
- {
- // not present, so skip and continue
- continue;
- }
-
-
- uint8_t chipUnit = l_ex_target->
- getAttr<TARGETING::ATTR_CHIP_UNIT>();
-
- if(l_ex_target->
- getAttr<TARGETING::ATTR_HWAS_STATE>().functional)
- {
- o_exMask |= (0x00008000 >> chipUnit);
- exCount++;
- }
- else
- {
- //If non-functional due to FCO or Manual gard,
- //add it to list of exs to include if
- //more are needed
-
- deconfigByEid = l_ex_target->
- getAttr<TARGETING::ATTR_HWAS_STATE>().
- deconfiguredByEid;
- if(
- // FCO
- (deconfigByEid ==
- HWAS::DeconfigGard::DECONFIGURED_BY_FIELD_CORE_OVERRIDE)
- || // Manual GARD
- (deconfigByEid ==
- HWAS::DeconfigGard::DECONFIGURED_BY_MANUAL_GARD)
- )
- {
- manGuardExs |= (0x00008000 >> chipUnit);
- }
- // Add it to the 'remaining' list in case
- // more are needed
- else
- {
- remainingExs |= (0x00008000 >> chipUnit);
- }
-
- }
- } // end ex target loop
-
- if(exCount == i_maxExs)
- {
- //We've found the exact amount, break out of function
- break;
- }
-
- else if(exCount > i_maxExs)
- {
- //We have too many, so need to trim
- o_exMask = trimBitMask(o_exMask,
- i_maxExs);
- break;
- }
-
- else
- {
- // We need to add 'other' cores
- TRACUCOMP( g_trac_sbe,INFO_MRK"selectBestCores: non-functional "
- "cores needed for bit mask: exCount=%d, i_maxExs=%d,"
- " o_exMask=0x%.8X, manGuardExs=0x%.8X, "
- "remainingExs=0x%.8X",
- exCount, i_maxExs, o_exMask, manGuardExs,
- remainingExs );
- }
-
- // Add more 'good' exs.
- manGuardExs = trimBitMask(manGuardExs,
- i_maxExs-exCount);
- o_exMask |= manGuardExs;
- exCount = __builtin_popcount(o_exMask);
- TRACUCOMP( g_trac_sbe,INFO_MRK"selectBestCores: trimBitMask "
- "manGuardExs=0x%.8X", manGuardExs);
-
- if(exCount >= i_maxExs)
- {
- //We've found enough, break out of function
- break;
- }
-
- // If we still need more, add 'remaining' exs
- // Get Target Service
- // System target check done earlier, so no assert check necessary
- TargetService& tS = targetService();
- TARGETING::Target* sys = NULL;
- (void) tS.getTopLevelTarget( sys );
-
- uint32_t min_exs = sys->getAttr<ATTR_SBE_IMAGE_MINIMUM_VALID_EXS>();
- if ( exCount < min_exs )
- {
- remainingExs = trimBitMask(remainingExs,
- min_exs-exCount);
- o_exMask |= remainingExs;
- TRACUCOMP( g_trac_sbe,INFO_MRK"selectBestCores: trimBitMask "
- "remainingExs=0x%.8X, min_exs=%d",
- remainingExs, min_exs);
- }
-
- }while(0);
-
- TRACUCOMP( g_trac_sbe,
- EXIT_MRK"selectBestCores(o_exMask=0x%.8X)",
- o_exMask);
-
- return err;
- }
-
-
-/////////////////////////////////////////////////////////////////////
errlHndl_t getSetMVPDVersion(TARGETING::Target* i_target,
opType_t i_op,
mvpdSbKeyword_t& io_sb_keyword)
@@ -1621,7 +1288,6 @@ namespace SBE
uint8_t * tmp_data_ECC = static_cast<uint8_t*>(
malloc(sbeInfoSize_ECC));
-
do{
/***********************************************/
@@ -1670,8 +1336,7 @@ namespace SBE
eccStatus, o_info.struct_version, o_info.data_crc);
- if ( ( o_info.struct_version == 1 ) ||
- o_info.struct_version == 2 )
+ if ( STRUCT_VERSION_CHECK(o_info.struct_version) )
{
// Supported Versions - set size variable to remove ECC
sbeInfoSize = SBE_SEEPROM_STRUCT_SIZES[o_info.struct_version];
@@ -1695,16 +1360,15 @@ namespace SBE
reinterpret_cast<uint8_t*>(&o_info),
sbeInfoSize);
- TRACUCOMP( g_trac_sbe, "getSeepromSideVersion(): eccStatus=%d, "
- "sizeof o_info/sI=%d, sI_ECC=%d",
- eccStatus, sbeInfoSize, sbeInfoSize_ECC);
+ TRACFCOMP( g_trac_sbe, "getSeepromSideVersion(): eccStatus=%d, "
+ "sizeof o_info/sI=%d, sI_ECC=%d, origin golden=%i",
+ eccStatus, sbeInfoSize, sbeInfoSize_ECC, o_info.origin);
// Handle Uncorrectable ECC - no error log:
// clear data and set o_seeprom_ver_ECC_fail=true
if ( eccStatus == PNOR::ECC::UNCORRECTABLE )
{
-
- TRACFCOMP( g_trac_sbe,ERR_MRK"getSeepromSideVersion() - ECC "
+ TRACFCOMP( g_trac_sbe, ERR_MRK"getSeepromSideVersion() - ECC "
"ERROR: Handled. eccStatus=%d, side=%d, sizeof "
"o_info/sI=%d, sI_ECC=%d",
eccStatus, i_seepromSide, sbeInfoSize,
@@ -1780,11 +1444,12 @@ namespace SBE
/*************************************************************/
// Create Invalid Version struct (which is always 8-byte aligned)
- for ( uint8_t i = 0; i < (sbeInfoSize)/8; i++ )
+ uint8_t* sbeInfoEnd = sbeInfo_data + sbeInfoSize;
+ for (uint64_t* p = reinterpret_cast<uint64_t*>(sbeInfo_data);
+ p < reinterpret_cast<uint64_t*>(sbeInfoEnd);
+ p++)
{
- memcpy(&sbeInfo_data[i*8],
- &SBE_SEEPROM_STRUCT_INVALID,
- sizeof(uint64_t));
+ *p = SBE_SEEPROM_STRUCT_INVALID;
}
// Inject ECC to Data
@@ -2170,7 +1835,7 @@ namespace SBE
// Check if in simics
if ( ( io_sbeState.seeprom_0_ver.struct_version ==
- SBE_SEEPROM_STRUCT_SIMICS_VERSION )
+ STRUCT_VERSION_SIMICS )
&& ( Util::isSimicsRunning() )
)
{
@@ -2220,7 +1885,7 @@ namespace SBE
// Check if in simics
if ( ( io_sbeState.seeprom_1_ver.struct_version ==
- SBE_SEEPROM_STRUCT_SIMICS_VERSION )
+ STRUCT_VERSION_SIMICS )
&& ( Util::isSimicsRunning() )
)
{
@@ -2334,10 +1999,11 @@ namespace SBE
memset(&(io_sbeState.new_seeprom_ver),
0x0,
sizeof(sbeSeepromVersionInfo_t));
-
+ // the above memset also has the side effect of setting the
+ // origin field to WORKING_SIDE which is the default
io_sbeState.new_seeprom_ver.struct_version =
- SBE_SEEPROM_STRUCT_VERSION;
+ STRUCT_VERSION_LATEST;
memcpy( &(io_sbeState.new_seeprom_ver.image_version),
&(io_sbeState.pnorVersion),
@@ -2538,7 +2204,7 @@ namespace SBE
"NOT Booting READ_ONLY SEEPROM. Check for update"
" on cur side=%d ",
TARGETING::get_huid(io_sbeState.target),
- io_sbeState.cur_seeprom_side)
+ io_sbeState.cur_seeprom_side);
// Check for clean vs. dirty only on cur side
if ( i_system_situation & SITUATION_CUR_IS_DIRTY )
@@ -2995,6 +2661,24 @@ namespace SBE
}
/////////////////////////////////////////////////////////////////////
+ void setNestFreqAttributes(uint32_t i_nestFreq)
+ {
+ // @TODO RTC:138226 need interface, but content may change
+
+ // Call targeting function to update NEST_FREQ
+ TargetService& tS = targetService();
+ TARGETING::Target* sys = NULL;
+ (void) tS.getTopLevelTarget( sys );
+ assert(sys, "setNestFreqAttributes() system target is NULL");
+
+ TRACFCOMP(g_trac_sbe, "setNestFreqAttributes(): "
+ "UPDATE_NEST_FREQ to %d ",
+ i_nestFreq);
+
+ TARGETING::setFrequencyAttributes(sys, i_nestFreq);
+ }
+
+/////////////////////////////////////////////////////////////////////
errlHndl_t performUpdateActions(sbeTargetState_t& io_sbeState)
{
TRACUCOMP( g_trac_sbe,
@@ -3016,19 +2700,8 @@ namespace SBE
// This can only be set with Golden/READ-ONLY Seeprom situation
if (l_actions & UPDATE_NEST_FREQ)
{
- // Call targeting function to update NEST_FREQ
- TargetService& tS = targetService();
- TARGETING::Target* sys = NULL;
- (void) tS.getTopLevelTarget( sys );
- assert(sys, "performUpdateActions() system target is NULL");
-
- TRACFCOMP( g_trac_sbe, "performUpdateActions(): "
- "UPDATE_NEST_FREQ to %d ",
- io_sbeState.mproc_nest_freq_mhz);
-
- TARGETING::setFrequencyAttributes(
- sys,
- io_sbeState.mproc_nest_freq_mhz);
+ // update nest frequency attributes
+ setNestFreqAttributes(io_sbeState.mproc_nest_freq_mhz);
// This opeation only done by itself and does not need
// an informational error log
@@ -3164,29 +2837,6 @@ namespace SBE
/////////////////////////////////////////////////////////////////////
- uint32_t trimBitMask(uint32_t i_mask,
- size_t i_maxBits)
- {
- TRACDCOMP( g_trac_sbe,
- ENTER_MRK"trimBitMask(i_mask=0x%.8X, i_maxBits=0x%.8X)",
- i_mask, i_maxBits);
- uint32_t retMask = i_mask;
-
- while(__builtin_popcount(retMask) > static_cast<int32_t>(i_maxBits))
- {
- retMask ^= (0x80000000 >>
- static_cast<uint32_t>(__builtin_clz(retMask)));
- }
-
- TRACDCOMP( g_trac_sbe,
- EXIT_MRK"trimBitMask(): retMask=0x%.8X",
- retMask);
-
- return retMask;
- }
-
-
-/////////////////////////////////////////////////////////////////////
errlHndl_t createSbeImageVmmSpace(void)
{
@@ -4089,7 +3739,8 @@ namespace SBE
o_mismatch = false;
// Check Seeprom
- if ( i_struct_version == 2 )
+ if ( STRUCT_VERSION_CHECK(i_struct_version) &&
+ i_seeprom_nest_freq != 0 )
{
// Only version that tracks the nest freq when the image was
// customized
@@ -4117,7 +3768,7 @@ namespace SBE
else
{
- // Either old version (like 1), unitialized, simics, corrupted, etc
+ // Either uninitialized, simics, corrupted, etc
// Assume SBE image created with the module's default frequency
if ( g_current_nest_freq == i_default_nest_freq )
{
@@ -4155,10 +3806,10 @@ namespace SBE
errlHndl_t checkNestFreqSettings(sbeTargetState_t& io_sbeState)
{
TRACDCOMP( g_trac_sbe,
- ENTER_MRK"checkNestFreqSettings");
+ ENTER_MRK"checkNestFreqSettings(): HUID:0x%08X",
+ TARGETING::get_huid(io_sbeState.target));
errlHndl_t err = NULL;
-
uint32_t default_nest_freq = 0;
do{
@@ -4167,13 +3818,21 @@ namespace SBE
io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch = false;
io_sbeState.seeprom_1_ver_Nest_Freq_Mismatch = false;
- // Get DEFAULT_PROC_MODULE_NEST_FREQ_MHZ attribute
+ // Get MRW DEFAULT_PROC_MODULE_NEST_FREQ_MHZ attribute
+ // @TODO RTC:138226 "We need to investigate if we can avoid needing
+ // this hack in P9"
default_nest_freq = io_sbeState.target->getAttr<
TARGETING::ATTR_DEFAULT_PROC_MODULE_NEST_FREQ_MHZ>();
- TRACUCOMP( g_trac_sbe,"checkNestFreqSettings(): ATTR_NEST_FREQ_MHZ "
+ TRACUCOMP( g_trac_sbe,"checkNestFreqSettings(): ATTR_NEST_FREQ_MHZ"
"=%d, ATTR_DEFAULT_PROC_MODULE_NEST_FREQ_MHZ=%d",
g_current_nest_freq, default_nest_freq);
+ TRACUCOMP( g_trac_sbe,"checkNestFreqSettings(): "
+ "seeprom0 ver=%d freq=%d seeprom1 ver=%d freq=%d",
+ io_sbeState.seeprom_0_ver.struct_version,
+ io_sbeState.seeprom_0_ver.nest_freq_mhz,
+ io_sbeState.seeprom_1_ver.struct_version,
+ io_sbeState.seeprom_1_ver.nest_freq_mhz);
// Check Seeprom 0
checkSeepromNestFreq(io_sbeState.target,
@@ -4210,7 +3869,9 @@ namespace SBE
if (tmp_cur_side == SBE_SEEPROM0)
{
- if ( io_sbeState.seeprom_0_ver.struct_version == 2 )
+ if ( STRUCT_VERSION_CHECK(
+ io_sbeState.seeprom_0_ver.struct_version) &&
+ io_sbeState.seeprom_0_ver.nest_freq_mhz != 0 )
{
io_sbeState.mproc_nest_freq_mhz =
io_sbeState.seeprom_0_ver.nest_freq_mhz;
@@ -4223,7 +3884,9 @@ namespace SBE
}
else if ( tmp_cur_side == SBE_SEEPROM1 )
{
- if ( io_sbeState.seeprom_1_ver.struct_version == 2 )
+ if ( STRUCT_VERSION_CHECK(
+ io_sbeState.seeprom_1_ver.struct_version) &&
+ io_sbeState.seeprom_1_ver.nest_freq_mhz != 0 )
{
io_sbeState.mproc_nest_freq_mhz =
io_sbeState.seeprom_1_ver.nest_freq_mhz;
OpenPOWER on IntegriCloud