op-build update Sep 19th
Updated versions: hostboot, palmetto-xml, habanero-xml, and
firestone-xml.
Removed redundant patches.
Tested on palmetto, habanero, and firestone HW. Garrison build only
diff --git a/openpower/package/firestone-xml/firestone.mk b/openpower/package/firestone-xml/firestone.mk
index 3c85118..799f197 100644
--- a/openpower/package/firestone-xml/firestone.mk
+++ b/openpower/package/firestone-xml/firestone.mk
@@ -4,7 +4,7 @@
#
################################################################################
-FIRESTONE_XML_VERSION ?= 9163bac79c29546ff567d958914b52ac308ea4c2
+FIRESTONE_XML_VERSION ?= 999c54ee587df9139d5dfed45983f338fc80da65
FIRESTONE_XML_SITE ?= $(call github,open-power,firestone-xml,$(FIRESTONE_XML_VERSION))
FIRESTONE_XML_LICENSE = Apache-2.0
diff --git a/openpower/package/habanero-xml/habanero-xml.mk b/openpower/package/habanero-xml/habanero-xml.mk
index 095ffd0..a862044 100644
--- a/openpower/package/habanero-xml/habanero-xml.mk
+++ b/openpower/package/habanero-xml/habanero-xml.mk
@@ -4,7 +4,7 @@
#
################################################################################
-HABANERO_XML_VERSION ?= f73630d727dcae2496c3f69e47b6b83ff96aab0f
+HABANERO_XML_VERSION ?= a71550e65d7377d2aa5d50c21369c80409ee4edd
HABANERO_XML_SITE ?= $(call github,open-power,habanero-xml,$(HABANERO_XML_VERSION))
HABANERO_XML_LICENSE = Apache-2.0
diff --git a/openpower/package/hostboot/hostboot-0004-SBE-update-support-for-adjusted-nest-freq.patch b/openpower/package/hostboot/hostboot-0004-SBE-update-support-for-adjusted-nest-freq.patch
deleted file mode 100644
index b937bf0..0000000
--- a/openpower/package/hostboot/hostboot-0004-SBE-update-support-for-adjusted-nest-freq.patch
+++ /dev/null
@@ -1,1376 +0,0 @@
-From da7ff638a6ca5c5588bf8cecc00e335d8ea92c91 Mon Sep 17 00:00:00 2001
-From: Andres Lugo-Reyes <aalugore@us.ibm.com>
-Date: Mon, 24 Aug 2015 16:45:40 -0500
-Subject: [PATCH] SBE Update Support for Adjusted Nest Frequency
-
-This commit adds a check in istep 8.1 to see if the SBE Seeproms are
-programmed with the same NEST_FREQ_MHZ attribute value that the system is
-currently running at. If necessary, it will update the SBE Seeproms in this
-step which might result in a re-IPL.
-
-Change-Id: I1dca7196cd02a2704a238665b73b522c9e103936
-RTC:133406
-Depends-on:I9bba92f55f1b67ff4a15d79113f19d39272ec72d
-Backport: release-fips840
----
- src/include/usr/isteps/istep08list.H | 2 +
- src/include/usr/sbe/sbeif.H | 19 +-
- .../hwpf/hwp/activate_powerbus/activate_powerbus.C | 5 +-
- .../edi_ei_initialization/edi_ei_initialization.C | 37 +-
- src/usr/hwpf/hwp/slave_sbe/slave_sbe.C | 11 +-
- src/usr/sbe/sbe_update.C | 640 ++++++++++++++++-----
- src/usr/sbe/sbe_update.H | 57 +-
- src/usr/sbe/test/sbeupdatetest.H | 4 +-
- src/usr/targeting/common/genHwsvMrwXml.pl | 19 +
- .../targeting/common/xmltohb/attribute_types.xml | 18 +
- src/usr/targeting/common/xmltohb/target_types.xml | 12 +
- 11 files changed, 668 insertions(+), 156 deletions(-)
-
-diff --git a/src/include/usr/isteps/istep08list.H b/src/include/usr/isteps/istep08list.H
-index 9496539..0a721c6 100644
---- a/src/include/usr/isteps/istep08list.H
-+++ b/src/include/usr/isteps/istep08list.H
-@@ -120,6 +120,8 @@ const DepModInfo g_istep08Dependancies = {
- DEP_LIB(libnest_chiplets.so),
- DEP_LIB(libsecure_boot.so),
- DEP_LIB(libslave_sbe.so),
-+ DEP_LIB(libsbe.so),
-+ DEP_LIB(libbuild_winkle_images.so),
- NULL
- }
- };
-diff --git a/src/include/usr/sbe/sbeif.H b/src/include/usr/sbe/sbeif.H
-index 9cf20c6..b00e01f 100644
---- a/src/include/usr/sbe/sbeif.H
-+++ b/src/include/usr/sbe/sbeif.H
-@@ -59,14 +59,31 @@ namespace SBE
- size_t& o_imgSize,
- sbe_image_version_t* o_version = NULL);
-
-+ /**
-+ * @enum sbeUpdateCheckType
-+ *
-+ * @brief Determines what types of checks are performed on the SBE Seeproms
-+ * to determine if an update is necessary.
-+ *
-+ */
-+ enum sbeUpdateCheckType
-+ {
-+ SBE_UPDATE_CHECK_ALL = 0x00,
-+ SBE_UPDATE_ONLY_CHECK_NEST_FREQ = 0x01
-+ };
-
- /**
- * @brief Iterates through all the functional processors and updates
- * the SBE Image in a SEEPROM, if necessary.
- *
-+ * @param[in] i_check_type Indicates what types of checks are performed
-+ * on the SBE Seeproms to determine if an update
-+ * is necessary.
-+ *
- * @return errlHndl_t Error log handle on failure.
- */
-- errlHndl_t updateProcessorSbeSeeproms();
-+ errlHndl_t updateProcessorSbeSeeproms(
-+ sbeUpdateCheckType i_check_type = SBE_UPDATE_CHECK_ALL);
-
- /**
- * @brief Iterates through all the functional processors and resolves
-diff --git a/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C b/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C
-index 4cb1d3a..642b539 100644
---- a/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C
-+++ b/src/usr/hwpf/hwp/activate_powerbus/activate_powerbus.C
-@@ -347,9 +347,12 @@ void * call_host_slave_sbe_update( void * io_pArgs )
- do
- {
-
-+ // Slave processors should now use Host I2C Access Method
-+ I2C::i2cSetAccessMode( I2C::I2C_SET_ACCESS_MODE_PROC_HOST );
-+
- // Reset I2C devices before trying to access the SBE SEEPROMs
- // Any error returned should not fail istep
-- l_errl = I2C::i2cResetActiveMasters( I2C::I2C_PROC_HOST );
-+ l_errl = I2C::i2cResetActiveMasters( I2C::I2C_PROC_ALL );
- if (l_errl)
- {
- // Commit error and keep going
-diff --git a/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C b/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C
-index ae02ad8..e1ab17d 100644
---- a/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C
-+++ b/src/usr/hwpf/hwp/edi_ei_initialization/edi_ei_initialization.C
-@@ -5,7 +5,9 @@
- /* */
- /* OpenPOWER HostBoot Project */
- /* */
--/* COPYRIGHT International Business Machines Corp. 2012,2014 */
-+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
-+/* [+] International Business Machines Corp. */
-+/* */
- /* */
- /* Licensed under the Apache License, Version 2.0 (the "License"); */
- /* you may not use this file except in compliance with the License. */
-@@ -53,6 +55,8 @@
- #include <hwas/common/deconfigGard.H>
- #include <hwas/common/hwasCommon.H>
-
-+#include <sbe/sbeif.H>
-+
- // targeting support
- #include <targeting/common/commontargeting.H>
- #include <targeting/common/utilFilter.H>
-@@ -102,6 +106,35 @@ void* call_fabric_erepair( void *io_pArgs )
- errlHndl_t l_errl = NULL;
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_fabric_erepair entry" );
-
-+ do {
-+
-+ // Check if the system can support multiple nest frequencies
-+ // and if so, see if an SBE Update is required
-+ TARGETING::Target* l_sys = NULL;
-+ targetService().getTopLevelTarget(l_sys);
-+ assert( l_sys != NULL, "call_fabric_erepair: sys target is NULL" );
-+ MRW_NEST_CAPABLE_FREQUENCIES_SYS l_mrw_nest_capable;
-+ l_mrw_nest_capable =
-+ l_sys->getAttr<ATTR_MRW_NEST_CAPABLE_FREQUENCIES_SYS>();
-+ if ( l_mrw_nest_capable ==
-+ MRW_NEST_CAPABLE_FREQUENCIES_SYS_2000_MHZ_OR_2400_MHZ )
-+ {
-+ // Call to check Processor SBE SEEPROM Images against NEST_FREQ_MHZ
-+ // attributes and make any necessary updates
-+ l_errl = SBE::updateProcessorSbeSeeproms(
-+ SBE::SBE_UPDATE_ONLY_CHECK_NEST_FREQ);
-+
-+ if (l_errl)
-+ {
-+ // Create IStep error log and cross reference error that occurred
-+ l_StepError.addErrorDetails( l_errl );
-+ // Commit error
-+ errlCommit( l_errl, HWPF_COMP_ID );
-+ break;
-+ }
-+
-+ }
-+
- std::vector<uint8_t> l_endp1_txFaillanes;
- std::vector<uint8_t> l_endp1_rxFaillanes;
- std::vector<uint8_t> l_endp2_txFaillanes;
-@@ -278,6 +311,8 @@ void* call_fabric_erepair( void *io_pArgs )
- } // end for l_PbusConnections
- } // end for MaxBusSet
-
-+ } while (0);
-+
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_fabric_erepair exit" );
-
- return l_StepError.getErrorHandle();
-diff --git a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-index c74402d..9493144 100644
---- a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-+++ b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-@@ -194,6 +194,7 @@ void* call_host_slave_sbe_config(void *io_pArgs)
- errlCommit( err, HWPF_COMP_ID );
- }
-
-+
- TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "call_host_slave_sbe_config exit" );
-
-@@ -616,16 +617,6 @@ void* call_proc_check_slave_sbe_seeprom_complete( void *io_pArgs )
-
- } // endfor
-
-- // Slave processors should now use Host I2C Access Method
-- I2C::i2cSetAccessMode( I2C::I2C_SET_ACCESS_MODE_PROC_HOST );
--
-- // Reset the Processor's I2C Masters
-- l_errl = I2C::i2cResetActiveMasters(I2C::I2C_PROC_ALL);
-- if (l_errl)
-- {
-- // Commit error
-- errlCommit( l_errl, HWPF_COMP_ID );
-- }
-
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "call_proc_check_slave_sbe_seeprom_complete exit");
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index 28e42fc..1faad63 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -34,6 +34,7 @@
- #include <targeting/common/predicates/predicatectm.H>
- #include <targeting/common/utilFilter.H>
- #include <targeting/common/targetservice.H>
-+#include <targeting/common/target.H>
- #include <util/align.H>
- #include <util/crc32.H>
- #include <util/misc.H>
-@@ -82,13 +83,13 @@ static bool g_mbox_query_done = false;
- static bool g_mbox_query_result = false;
- static bool g_istep_mode = false;
- static bool g_update_both_sides = false;
-+static uint32_t g_current_nest_freq = 0;
-
- using namespace ERRORLOG;
- using namespace TARGETING;
-
- namespace SBE
- {
--
- enum {
- SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE,
- RING_BUF1_VADDR = FIXED_SEEPROM_WORK_SPACE + SBE_IMG_VADDR,
-@@ -100,7 +101,7 @@ namespace SBE
- };
-
- /////////////////////////////////////////////////////////////////////
-- errlHndl_t updateProcessorSbeSeeproms()
-+ errlHndl_t updateProcessorSbeSeeproms(sbeUpdateCheckType i_check_type)
- {
- errlHndl_t err = NULL;
- errlHndl_t err_cleanup = NULL;
-@@ -111,7 +112,8 @@ namespace SBE
- bool l_restartNeeded = false;
-
- TRACUCOMP( g_trac_sbe,
-- ENTER_MRK"updateProcessorSbeSeeproms()" );
-+ ENTER_MRK"updateProcessorSbeSeeproms(): i_check_type=%d",
-+ i_check_type);
-
- do{
-
-@@ -171,6 +173,10 @@ namespace SBE
- g_update_both_sides = true;
- }
-
-+ // Collect ATTR_NEST_FREQ_MHZ for reference later
-+ g_current_nest_freq = sys->getAttr<ATTR_NEST_FREQ_MHZ>();
-+
-+
- //Make sure procedure constants keep within expected range.
- assert((FIXED_SEEPROM_WORK_SPACE <= VMM_SBE_UPDATE_SIZE/2),
- "updateProcessorSbeSeeproms() FIXED_SEEPROM_WORK_SPACE "
-@@ -261,7 +267,8 @@ namespace SBE
- sbeState.target_is_master = false;
- }
-
-- err = getSbeInfoState(sbeState);
-+ err = getSbeInfoState(sbeState,
-+ i_check_type);
-
- if (err)
- {
-@@ -273,15 +280,29 @@ namespace SBE
- TARGETING::get_huid(sbeState.target));
-
- // Don't break - handle error at the end of the loop
--
- }
-
-
-+ // Continue if we're just doing the nest freq check and don't
-+ // have a mismatch
-+ if ( ( i_check_type == SBE_UPDATE_ONLY_CHECK_NEST_FREQ ) &&
-+ ( sbeState.seeprom_0_ver_Nest_Freq_Mismatch == false ) &&
-+ ( sbeState.seeprom_1_ver_Nest_Freq_Mismatch == false ) )
-+ {
-+ TRACFCOMP( g_trac_sbe,
-+ INFO_MRK"updateProcessorSbeSeeproms(): "
-+ "Only looking for Nest Freq Mismatch and "
-+ "none found for Target UID=0x%X",
-+ TARGETING::get_huid(sbeState.target));
-+
-+ sbeState.update_actions = CLEAR_ACTIONS;
-+ }
-+
- /**********************************************/
- /* Determine update actions for this target */
- /**********************************************/
- // Skip if we got an error collecting SBE Info State
-- if ( err == NULL )
-+ else if ( err == NULL )
- {
- err = getTargetUpdateActions(sbeState);
- if (err)
-@@ -295,6 +316,7 @@ namespace SBE
-
- // Don't break - handle error at the end of the loop,
- }
-+
- }
-
- /**********************************************/
-@@ -406,15 +428,19 @@ namespace SBE
- /* Deconfigure any Processors that have a Version different */
- /* from the Master Processor's Version */
- /************************************************************/
-- err = masterVersionCompare(sbeStates_vector);
--
-- if ( err )
-+ // skip if we're only checking for NEST_FREQ mismatch
-+ if ( i_check_type != SBE_UPDATE_ONLY_CHECK_NEST_FREQ )
- {
-- // Something failed on the check
-- TRACFCOMP( g_trac_sbe,
-- INFO_MRK"updateProcessorSbeSeeproms(): Call to "
-- "masterVersionCompare() failed rc=0x%.4X",
-- err->reasonCode());
-+ err = masterVersionCompare(sbeStates_vector);
-+
-+ if ( err )
-+ {
-+ // Something failed on the check
-+ TRACFCOMP( g_trac_sbe,
-+ INFO_MRK"updateProcessorSbeSeeproms(): Call to "
-+ "masterVersionCompare() failed rc=0x%.4X",
-+ err->reasonCode());
-+ }
- }
-
- }while(0);
-@@ -451,7 +477,6 @@ namespace SBE
- }
- }
-
--
- TRACUCOMP( g_trac_sbe,
- EXIT_MRK"updateProcessorSbeSeeproms()" );
-
-@@ -865,6 +890,7 @@ namespace SBE
- }
- } // end of while loop
-
-+
- if(err)
- {
- // There was a previous error, so break here
-@@ -1312,14 +1338,16 @@ namespace SBE
- }while(0);
-
- TRACFCOMP( g_trac_sbe,
-- EXIT_MRK"getSbeBootSeeprom(): o_bootSide=0x%X (reg=0x%X)",
-- o_bootSide, scomData );
-+ EXIT_MRK"getSbeBootSeeprom(): o_bootSide=0x%X (reg=0x%X, "
-+ "tgt=0x%X)",
-+ o_bootSide, scomData, TARGETING::get_huid(i_target) );
-
- return err;
- }
-
- /////////////////////////////////////////////////////////////////////
-- errlHndl_t getSbeInfoState(sbeTargetState_t& io_sbeState)
-+ errlHndl_t getSbeInfoState(sbeTargetState_t& io_sbeState,
-+ sbeUpdateCheckType& i_check_type)
- {
-
- TRACUCOMP( g_trac_sbe,
-@@ -1328,6 +1356,7 @@ namespace SBE
-
-
- errlHndl_t err = NULL;
-+ bool skip_customization = false;
-
- do{
-
-@@ -1338,6 +1367,74 @@ namespace SBE
-
-
- /*******************************************/
-+ /* Get SEEPROM A SBE Version Information */
-+ /*******************************************/
-+ err = getSeepromSideVersion(io_sbeState.target,
-+ EEPROM::SBE_PRIMARY,
-+ io_sbeState.seeprom_0_ver,
-+ io_sbeState.seeprom_0_ver_ECC_fail);
-+
-+ if(err)
-+ {
-+ TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeInfoState() - Error "
-+ "getting SBE Information from SEEPROM A (0x%X)",
-+ EEPROM::SBE_PRIMARY);
-+ break;
-+ }
-+
-+ TRACDBIN(g_trac_sbe, "getSbeInfoState-spA",
-+ &(io_sbeState.seeprom_0_ver),
-+ sizeof(sbeSeepromVersionInfo_t));
-+
-+
-+ /*******************************************/
-+ /* Get SEEPROM B SBE Version Information */
-+ /*******************************************/
-+ err = getSeepromSideVersion(io_sbeState.target,
-+ EEPROM::SBE_BACKUP,
-+ io_sbeState.seeprom_1_ver,
-+ io_sbeState.seeprom_1_ver_ECC_fail);
-+
-+ if(err)
-+ {
-+ TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeInfoState() - Error "
-+ "getting SBE Information from SEEPROM B (0x%X)",
-+ EEPROM::SBE_BACKUP);
-+ break;
-+ }
-+
-+ TRACDBIN(g_trac_sbe, "getSbeInfoState-spB",
-+ &(io_sbeState.seeprom_1_ver),
-+ sizeof(sbeSeepromVersionInfo_t));
-+
-+
-+ // Check NEST_FREQ settings
-+ err = checkNestFreqSettings(io_sbeState);
-+
-+ if (err)
-+ {
-+ TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeInfoState() - "
-+ "Error returned from checkNestFreqSettings() ");
-+ break;
-+ }
-+ else if ((i_check_type == SBE_UPDATE_ONLY_CHECK_NEST_FREQ) &&
-+ (io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch == false) &&
-+ (io_sbeState.seeprom_1_ver_Nest_Freq_Mismatch == false))
-+ {
-+ TRACFCOMP( g_trac_sbe,
-+ INFO_MRK"getSbeInfoState(): "
-+ "Only looking for Nest Freq Mismatch and "
-+ "none found for Target UID=0x%X. Skipping "
-+ "SBE customization",
-+ TARGETING::get_huid(io_sbeState.target));
-+
-+ // Skipping SBE customization, but still need other info like
-+ // MVPD in the case another processor requires a re-IPL
-+ skip_customization = true;
-+ }
-+
-+
-+ /*******************************************/
- /* Get PNOR SBE Version Information */
- /*******************************************/
- void* sbePnorPtr = NULL;
-@@ -1367,12 +1464,15 @@ namespace SBE
- /* Calculate CRC of the image */
- /*******************************************/
- size_t sbeImgSize = 0;
-- err = procCustomizeSbeImg(io_sbeState.target,
-+ if ( skip_customization == false )
-+ {
-+ err = procCustomizeSbeImg(io_sbeState.target,
- sbePnorPtr, //SBE vaddr in PNOR
- FIXED_SEEPROM_WORK_SPACE, //max size
- reinterpret_cast<void*>
- (SBE_IMG_VADDR), //destination
- sbeImgSize);
-+ }
-
- if(err)
- {
-@@ -1421,47 +1521,6 @@ namespace SBE
- }
-
-
-- /*******************************************/
-- /* Get SEEPROM A SBE Version Information */
-- /*******************************************/
-- err = getSeepromSideVersion(io_sbeState.target,
-- EEPROM::SBE_PRIMARY,
-- io_sbeState.seeprom_0_ver,
-- io_sbeState.seeprom_0_ver_ECC_fail);
--
-- if(err)
-- {
-- TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeInfoState() - Error "
-- "getting SBE Information from SEEPROM A (0x%X)",
-- EEPROM::SBE_PRIMARY);
-- break;
-- }
--
-- TRACDBIN(g_trac_sbe, "getSbeInfoState-spA",
-- &(io_sbeState.seeprom_0_ver),
-- sizeof(sbeSeepromVersionInfo_t));
--
-- /*******************************************/
-- /* Get SEEPROM B SBE Version Information */
-- /*******************************************/
-- err = getSeepromSideVersion(io_sbeState.target,
-- EEPROM::SBE_BACKUP,
-- io_sbeState.seeprom_1_ver,
-- io_sbeState.seeprom_1_ver_ECC_fail);
--
-- if(err)
-- {
-- TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeInfoState() - Error "
-- "getting SBE Information from SEEPROM B (0x%X)",
-- EEPROM::SBE_BACKUP);
-- break;
-- }
--
--
-- TRACDBIN(g_trac_sbe, "getSbeInfoState-spB",
-- &(io_sbeState.seeprom_1_ver),
-- sizeof(sbeSeepromVersionInfo_t));
--
- /***********************************************/
- /* Determine which SEEPROM System Booted On */
- /***********************************************/
-@@ -1525,7 +1584,6 @@ namespace SBE
- sbeSeepromVersionInfo_t& o_info,
- bool& o_seeprom_ver_ECC_fail)
- {
--
- TRACUCOMP( g_trac_sbe,
- ENTER_MRK"getSeepromSideVersion(): HUID=0x%.8X, side:%d",
- TARGETING::get_huid(i_target), i_seepromSide);
-@@ -1534,22 +1592,21 @@ namespace SBE
- PNOR::ECC::eccStatus eccStatus = PNOR::ECC::CLEAN;
- o_seeprom_ver_ECC_fail = false;
-
-- size_t sbeInfoSize_ECC = (sizeof(sbeSeepromVersionInfo_t)*9)/8;
-- size_t sbeInfoSize_ECC_aligned = ALIGN_8(sbeInfoSize_ECC);
--
-- // Create data buffer of larger size
-- // NOTE: EEPROM read will fill in smaller, unaligned size
-+ // Set these variables to the read out the max struct size
-+ // Supported version 1 is a subset of supported version 2
-+ size_t sbeInfoSize = sizeof(sbeSeepromVersionInfo_t);
-+ size_t sbeInfoSize_ECC = (sbeInfoSize*9)/8;
- uint8_t * tmp_data_ECC = static_cast<uint8_t*>(
-- malloc(sbeInfoSize_ECC_aligned));
-+ malloc(sbeInfoSize_ECC));
-
-- do{
-
-- /*******************************************/
-- /* Read SBE Version SBE Version Information */
-- /*******************************************/
-+ do{
-
-+ /***********************************************/
-+ /* Read SBE Version SBE Version Information */
-+ /***********************************************/
- // Clear Buffer
-- memset( tmp_data_ECC, 0, sbeInfoSize_ECC_aligned );
-+ memset( tmp_data_ECC, 0, sbeInfoSize_ECC );
-
- //Read SBE Versions
- err = deviceRead( i_target,
-@@ -1568,43 +1625,68 @@ namespace SBE
- }
-
- TRACDBIN(g_trac_sbe,
-- "getSeepromSideVersion()- tmp_data_ECC (not-aligned)",
-+ "getSeepromSideVersion()- tmp_data_ECC",
- tmp_data_ECC,
- sbeInfoSize_ECC);
-
-- TRACDBIN(g_trac_sbe,
-- "getSeepromSideVersion()- tmp_data_ECC (aligned)",
-- tmp_data_ECC,
-- sbeInfoSize_ECC_aligned);
--
-
- // Clear destination
- memset( &o_info, 0, sizeof(o_info) );
-
-
-+
-+ // Initially only look at the first 8-Bytes which should include
-+ // the struct version value
- // Remove ECC
- eccStatus = PNOR::ECC::removeECC(
- tmp_data_ECC,
- reinterpret_cast<uint8_t*>(&o_info),
-- sizeof(o_info));
-+ 8);
-+
-+ TRACUCOMP( g_trac_sbe, "getSeepromSideVersion(): First 8-Bytes: "
-+ "eccStatus=%d, version=0x%X, data_crc=0x%X",
-+ eccStatus, o_info.struct_version, o_info.data_crc);
-+
-+
-+ if ( ( o_info.struct_version == 1 ) ||
-+ o_info.struct_version == 2 )
-+ {
-+ // Supported Versions - set size variable to remove ECC
-+ sbeInfoSize = SBE_SEEPROM_STRUCT_SIZES[o_info.struct_version];
-+ sbeInfoSize_ECC = (sbeInfoSize*9)/8;
-+
-+ }
-+ else
-+ {
-+ // Unsupported versions - ignoring any ECC errors
-+ TRACFCOMP( g_trac_sbe, "getSeepromSideVersion(): Unsupported "
-+ "Struct Version=0x%X, ignoring any eccStatus=%d",
-+ o_info.struct_version, eccStatus);
-+ break;
-+ }
-+
-+
-+ // Remove ECC for full SBE Version struct
-+ eccStatus = PNOR::ECC::CLEAN;
-+ eccStatus = PNOR::ECC::removeECC(
-+ tmp_data_ECC,
-+ reinterpret_cast<uint8_t*>(&o_info),
-+ sbeInfoSize);
-
- TRACUCOMP( g_trac_sbe, "getSeepromSideVersion(): eccStatus=%d, "
-- "sizeof o_info=%d, sI_ECC=%d, sI_ECC_aligned=%d",
-- eccStatus, sizeof(o_info), sbeInfoSize_ECC,
-- sbeInfoSize_ECC_aligned);
-+ "sizeof o_info/sI=%d, sI_ECC=%d",
-+ eccStatus, sbeInfoSize, sbeInfoSize_ECC);
-
- // Handle Uncorrectable ECC - no error log:
- // clear data and set o_seeprom_ver_ECC_fail=true
-- // -- unless SIM version found: than just ignore
-- if ( (eccStatus == PNOR::ECC::UNCORRECTABLE) &&
-- (o_info.struct_version != SBE_SEEPROM_STRUCT_SIMICS_VERSION) )
-+ if ( eccStatus == PNOR::ECC::UNCORRECTABLE )
- {
-
- TRACFCOMP( g_trac_sbe,ERR_MRK"getSeepromSideVersion() - ECC "
- "ERROR: Handled. eccStatus=%d, side=%d, sizeof "
-- "o_info=%d, sI_ECC=%d, sI_ECC_aligned=%d",
-- eccStatus, i_seepromSide, sizeof(o_info),
-- sbeInfoSize_ECC, sbeInfoSize_ECC_aligned);
-+ "o_info/sI=%d, sI_ECC=%d",
-+ eccStatus, i_seepromSide, sbeInfoSize,
-+ sbeInfoSize_ECC);
-
- memset( &o_info, 0, sizeof(o_info));
- o_seeprom_ver_ECC_fail = true;
-@@ -2065,17 +2147,21 @@ namespace SBE
- isSimics_check = true;
- }
-
-- if ( (pnor_check_dirty || crc_check_dirty )
-+ if ( ( pnor_check_dirty ||
-+ crc_check_dirty ||
-+ io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch )
- && !isSimics_check )
- {
- seeprom_0_isDirty = true;
- TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: Seeprom0 "
- "dirty: pnor=%d, crc=%d (custom=0x%X/s0=0x%X), "
-- "isSimics=%d",
-+ "nest_freq=%d, isSimics=%d",
- TARGETING::get_huid(io_sbeState.target),
- pnor_check_dirty, crc_check_dirty,
- io_sbeState.customizedImage_crc,
-- io_sbeState.seeprom_0_ver.data_crc, isSimics_check);
-+ io_sbeState.seeprom_0_ver.data_crc,
-+ io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch,
-+ isSimics_check);
- }
-
- /**************************************************************/
-@@ -2111,17 +2197,21 @@ namespace SBE
- isSimics_check = true;
- }
-
-- if ( (pnor_check_dirty || crc_check_dirty )
-+ if ( (pnor_check_dirty ||
-+ crc_check_dirty ||
-+ io_sbeState.seeprom_1_ver_Nest_Freq_Mismatch )
- && !isSimics_check )
- {
- seeprom_1_isDirty = true;
- TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: Seeprom1 "
- "dirty: pnor=%d, crc=%d (custom=0x%X/s1=0x%X), "
-- "isSimics=%d",
-+ "nest_freq=%d, isSimics=%d",
- TARGETING::get_huid(io_sbeState.target),
- pnor_check_dirty, crc_check_dirty,
- io_sbeState.customizedImage_crc,
-- io_sbeState.seeprom_1_ver.data_crc, isSimics_check);
-+ io_sbeState.seeprom_1_ver.data_crc,
-+ io_sbeState.seeprom_1_ver_Nest_Freq_Mismatch,
-+ isSimics_check);
- }
-
-
-@@ -2158,11 +2248,15 @@ namespace SBE
- {
- current_side_isDirty = seeprom_0_isDirty;
- alt_side_isDirty = seeprom_1_isDirty;
-+ io_sbeState.cur_seeprom_ver_Nest_Freq_Mismatch =
-+ io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch;
- }
- else
- {
- current_side_isDirty = seeprom_1_isDirty;
- alt_side_isDirty = seeprom_0_isDirty;
-+ io_sbeState.cur_seeprom_ver_Nest_Freq_Mismatch =
-+ io_sbeState.seeprom_1_ver_Nest_Freq_Mismatch;
- }
-
- // Set system_situation - bits defined in sbe_update.H
-@@ -2204,7 +2298,8 @@ namespace SBE
- /**************************************************************/
- /* Setup new SBE Image Version Info, if necessary */
- /**************************************************************/
-- if ( io_sbeState.update_actions & UPDATE_SBE )
-+ if ( ( io_sbeState.update_actions & UPDATE_SBE ) ||
-+ ( io_sbeState.update_actions & UPDATE_NEST_FREQ ) )
- {
- memset(&(io_sbeState.new_seeprom_ver),
- 0x0,
-@@ -2222,6 +2317,19 @@ namespace SBE
- &(io_sbeState.customizedImage_crc),
- sizeof(io_sbeState.new_seeprom_ver.data_crc));
-
-+ if ( io_sbeState.update_actions & UPDATE_SBE )
-+ {
-+ io_sbeState.new_seeprom_ver.nest_freq_mhz =
-+ g_current_nest_freq;
-+ }
-+ else
-+ {
-+ // UPDATE_NEST_FREQ: set the nest freq to what the
-+ // current SBE Seeprom booted from
-+ io_sbeState.new_seeprom_ver.nest_freq_mhz =
-+ io_sbeState.mproc_nest_freq_mhz;
-+ }
-+
- // If there was an ECC fail on either SEEPROM, do a read-back
- // Check when writing this information to the SEEPROM
- io_sbeState.new_readBack_check = (
-@@ -2299,7 +2407,6 @@ namespace SBE
- // The 2 SBE SEEPROMs are independent of each other
- // Determine if PNOR is 1- or 2-sided and if the current
- // Seeprom is pointing at PNOR's GOLDEN side
--
- PNOR::SideId tmp_side = PNOR::WORKING;
- PNOR::SideInfo_t pnor_side_info;
- err = PNOR::getSideInfo (tmp_side, pnor_side_info);
-@@ -2322,10 +2429,30 @@ namespace SBE
-
- if ( pnor_side_info.isGolden == true )
- {
-- // If true, nothing to do (covered in istep 6 function)
-- l_actions = CLEAR_ACTIONS;
-+ // Check for NEST_FREQ mismatch
-+ if ( ( io_sbeState.target_is_master == true ) &&
-+ ( io_sbeState.cur_seeprom_ver_Nest_Freq_Mismatch
-+ == true ) )
-+ {
-+ l_actions |= DO_UPDATE;
-+ l_actions |= UPDATE_NEST_FREQ;
-
-- TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+ TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+ "Booting Master Proc READ_ONLY SEEPROM pointing at "
-+ "PNOR's GOLDEN side and NEST_FREQ mismatch. Update "
-+ "NEST_FREQ. Continue IPL. "
-+ "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-+ TARGETING::get_huid(io_sbeState.target),
-+ i_system_situation, l_actions,
-+ io_sbeState.mvpdSbKeyword.flags);
-+ }
-+
-+ else
-+ {
-+ // Nothing to do (covered in istep 6 function)
-+ l_actions = CLEAR_ACTIONS;
-+
-+ TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
- "Booting READ_ONLY SEEPROM pointing at PNOR's "
- "GOLDEN side. No updates for cur side=%d. Continue "
- "IPL. (sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-@@ -2333,19 +2460,38 @@ namespace SBE
- io_sbeState.cur_seeprom_side,
- i_system_situation, l_actions,
- io_sbeState.mvpdSbKeyword.flags);
-- break;
-+ }
- }
--
- else if ( ( pnor_side_info.hasOtherSide == false ) &&
- ( io_sbeState.cur_seeprom_side == READ_ONLY_SEEPROM ) )
- {
-- // Even though current seeprom is not pointing at PNOR's
-- // GOLDEN side, treat like READ_ONLY if booting from
-- // READ_ONLY seeprom and and PNOR does not have another side
-- // - No Update (ie, Palmetto configuration)
-- l_actions = CLEAR_ACTIONS;
-+ // Check for NEST_FREQ mismatch
-+ if ( ( io_sbeState.target_is_master == true ) &&
-+ ( io_sbeState.cur_seeprom_ver_Nest_Freq_Mismatch
-+ == true ) )
-+ {
-+ l_actions |= DO_UPDATE;
-+ l_actions |= UPDATE_NEST_FREQ;
-
-- TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+ TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+ "Treating cur of Master Proc like READ_ONLY SBE "
-+ "SEEPROM and NEST_FREQ mismatch. Update "
-+ "NEST_FREQ. Continue IPL. "
-+ "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-+ TARGETING::get_huid(io_sbeState.target),
-+ i_system_situation, l_actions,
-+ io_sbeState.mvpdSbKeyword.flags);
-+ }
-+ else
-+ {
-+
-+ // Even though current seeprom is not pointing at PNOR's
-+ // GOLDEN side, treat like READ_ONLY if booting from
-+ // READ_ONLY seeprom and PNOR does not have another side
-+ // - No Update (ie, Palmetto configuration)
-+ l_actions = CLEAR_ACTIONS;
-+
-+ TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
- "Treating cur like READ_ONLY SBE SEEPROM. "
- "No updates for cur side=%d. Continue IPL. "
- "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-@@ -2353,7 +2499,7 @@ namespace SBE
- io_sbeState.cur_seeprom_side,
- i_system_situation, l_actions,
- io_sbeState.mvpdSbKeyword.flags);
-- break;
-+ }
- }
- else // proceed to update this side
- {
-@@ -2363,44 +2509,43 @@ namespace SBE
- " on cur side=%d ",
- TARGETING::get_huid(io_sbeState.target),
- io_sbeState.cur_seeprom_side)
-- }
--
-
-- // Check for clean vs. dirty only on cur side
-- if ( i_system_situation & SITUATION_CUR_IS_DIRTY )
-- {
-- // Update cur side and re-ipl
-- l_actions |= IPL_RESTART;
-- l_actions |= DO_UPDATE;
-- l_actions |= UPDATE_SBE;
-- //even though flags byte not updated
-- l_actions |= UPDATE_MVPD;
-+ // Check for clean vs. dirty only on cur side
-+ if ( i_system_situation & SITUATION_CUR_IS_DIRTY )
-+ {
-+ // Update cur side and re-ipl
-+ l_actions |= IPL_RESTART;
-+ l_actions |= DO_UPDATE;
-+ l_actions |= UPDATE_SBE;
-+ //even though flags byte not updated
-+ l_actions |= UPDATE_MVPD;
-
-- // Set Update side to cur
-- io_sbeState.seeprom_side_to_update =
-+ // Set Update side to cur
-+ io_sbeState.seeprom_side_to_update =
- ( io_sbeState.cur_seeprom_side ==
- SBE_SEEPROM0 )
- ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP;
-
-- TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-- "cur side (%d) dirty. Update cur. Re-IPL. "
-- "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-- TARGETING::get_huid(io_sbeState.target),
-- io_sbeState.cur_seeprom_side,
-- i_system_situation, l_actions,
-- io_sbeState.mvpdSbKeyword.flags);
-- }
-- else
-- {
-- // Cur side clean - No Updates - Continue IPL
-- l_actions = CLEAR_ACTIONS;
-+ TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+ "cur side (%d) dirty. Update cur. Re-IPL. "
-+ "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-+ TARGETING::get_huid(io_sbeState.target),
-+ io_sbeState.cur_seeprom_side,
-+ i_system_situation, l_actions,
-+ io_sbeState.mvpdSbKeyword.flags);
-+ }
-+ else
-+ {
-+ // Cur side clean - No Updates - Continue IPL
-+ l_actions = CLEAR_ACTIONS;
-
-- TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-- "cur side (%d) clean-no updates. "
-- "Continue IPL. (sit=0x%.2X, act=0x%.8X)",
-- TARGETING::get_huid(io_sbeState.target),
-- io_sbeState.cur_seeprom_side,
-- i_system_situation, l_actions);
-+ TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+ "cur side (%d) clean-no updates. "
-+ "Continue IPL. (sit=0x%.2X, act=0x%.8X)",
-+ TARGETING::get_huid(io_sbeState.target),
-+ io_sbeState.cur_seeprom_side,
-+ i_system_situation, l_actions);
-+ }
- }
- }
- #elif CONFIG_SBE_UPDATE_SIMULTANEOUS
-@@ -2835,6 +2980,32 @@ namespace SBE
- do{
-
- /**************************************************************/
-+ /* Update NEST_FREQ, if necessary */
-+ /**************************************************************/
-+#ifdef CONFIG_SBE_UPDATE_INDEPENDENT
-+ // 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);
-+
-+ // This opeation only done by itself and does not need
-+ // an informational error log
-+ break;
-+ }
-+#endif
-+ /**************************************************************/
- /* Update SEEPROM, if necessary */
- /**************************************************************/
- if (l_actions & UPDATE_SBE)
-@@ -3806,4 +3977,195 @@ namespace SBE
- }
-
-
-+
-+/////////////////////////////////////////////////////////////////////
-+ void checkSeepromNestFreq(TARGETING::Target* i_tgt,
-+ uint32_t i_default_nest_freq,
-+ uint32_t i_struct_version,
-+ uint32_t i_seeprom_nest_freq,
-+ size_t i_seeprom_num,
-+ bool & o_mismatch)
-+ {
-+ TRACUCOMP( g_trac_sbe,
-+ ENTER_MRK"checkSeepromNestFreq: tgt=0x%X current_freq=%d, "
-+ "default_freq=%d, version=0x%X, i_seeprom_nest_freq=%d, "
-+ "seeprom_num=%d",
-+ TARGETING::get_huid(i_tgt), g_current_nest_freq,
-+ i_default_nest_freq, i_struct_version,
-+ i_seeprom_nest_freq, i_seeprom_num);
-+
-+ o_mismatch = false;
-+
-+ // Check Seeprom
-+ if ( i_struct_version == 2 )
-+ {
-+ // Only version that tracks the nest freq when the image was
-+ // customized
-+ if ( g_current_nest_freq == i_seeprom_nest_freq )
-+ {
-+ TRACUCOMP( g_trac_sbe,"checkSeepromNestFreq: tgt=0x%X: "
-+ "Seeprom%d: ver%d found and current "
-+ "nest_freq(%d) and image nest_freq(%d) match",
-+ TARGETING::get_huid(i_tgt),
-+ i_seeprom_num, i_struct_version,
-+ g_current_nest_freq,
-+ i_seeprom_nest_freq);
-+ }
-+ else
-+ {
-+ o_mismatch = true;
-+ TRACFCOMP( g_trac_sbe,"checkSeepromNestFreq: tgt=0x%X: "
-+ "Seeprom%d: ver%d found and current "
-+ "nest_freq(%d) and image nest_freq(%d) DO NOT match",
-+ TARGETING::get_huid(i_tgt),
-+ i_seeprom_num, i_struct_version,
-+ g_current_nest_freq, i_seeprom_nest_freq);
-+ }
-+ }
-+
-+ else
-+ {
-+ // Either old version (like 1), unitialized, simics, corrupted, etc
-+ // Assume SBE image created with the module's default frequency
-+ if ( g_current_nest_freq == i_default_nest_freq )
-+ {
-+ TRACUCOMP( g_trac_sbe,"checkSeepromNestFreq: tgt=0x%X: "
-+ "Seeprom%d: ver=0x%X found and current "
-+ "nest_freq(%d) and default nest_freq(%d) match",
-+ TARGETING::get_huid(i_tgt),
-+ i_seeprom_num, i_struct_version,
-+ g_current_nest_freq, i_default_nest_freq);
-+ }
-+ else
-+ {
-+ o_mismatch = true;
-+ TRACFCOMP( g_trac_sbe,"checkSeepromNestFreq: tgt=0x%X: "
-+ "Seeprom%d: ver=0x%X found and current "
-+ "nest_freq(%d) and default nest_freq(%d) "
-+ "DO NOT match. ",
-+ TARGETING::get_huid(i_tgt),
-+ i_seeprom_num, i_struct_version,
-+ g_current_nest_freq, i_default_nest_freq);
-+ }
-+
-+ }
-+
-+ TRACUCOMP( g_trac_sbe,
-+ EXIT_MRK"checkSeepromNestFreq: tgt=0x%X "
-+ "Seeprom%d: return o_mismatch=%d",
-+ TARGETING::get_huid(i_tgt), i_seeprom_num, o_mismatch);
-+
-+ return;
-+ }
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+ errlHndl_t checkNestFreqSettings(sbeTargetState_t& io_sbeState)
-+ {
-+ TRACDCOMP( g_trac_sbe,
-+ ENTER_MRK"checkNestFreqSettings");
-+
-+ errlHndl_t err = NULL;
-+
-+ uint32_t default_nest_freq = 0;
-+
-+ do{
-+
-+ // Set defaults
-+ 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
-+ default_nest_freq = io_sbeState.target->getAttr<
-+ TARGETING::ATTR_DEFAULT_PROC_MODULE_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);
-+
-+ // Check Seeprom 0
-+ checkSeepromNestFreq(io_sbeState.target,
-+ default_nest_freq,
-+ io_sbeState.seeprom_0_ver.struct_version,
-+ io_sbeState.seeprom_0_ver.nest_freq_mhz,
-+ 0,
-+ io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch);
-+
-+ // Check Seeprom 1
-+ checkSeepromNestFreq(io_sbeState.target,
-+ default_nest_freq,
-+ io_sbeState.seeprom_1_ver.struct_version,
-+ io_sbeState.seeprom_1_ver.nest_freq_mhz,
-+ 1,
-+ io_sbeState.seeprom_1_ver_Nest_Freq_Mismatch);
-+
-+ // Set the frequency at which the master processor booted from
-+ if ( io_sbeState.target_is_master == true )
-+ {
-+ //Get Current (boot) Side
-+ sbeSeepromSide_t tmp_cur_side = SBE_SEEPROM_INVALID;
-+ err = getSbeBootSeeprom(io_sbeState.target, tmp_cur_side);
-+ if(err)
-+ {
-+ TRACFCOMP( g_trac_sbe, ERR_MRK"checkNestFreqSettings() - "
-+ "Error returned from getSbeBootSeeprom()");
-+
-+ // Assume it was default frequency for this module
-+ io_sbeState.mproc_nest_freq_mhz = default_nest_freq;
-+
-+ break;
-+ }
-+
-+ if (tmp_cur_side == SBE_SEEPROM0)
-+ {
-+ if ( io_sbeState.seeprom_0_ver.struct_version == 2 )
-+ {
-+ io_sbeState.mproc_nest_freq_mhz =
-+ io_sbeState.seeprom_0_ver.nest_freq_mhz;
-+ }
-+ else
-+ {
-+ // Assume it was default frequency for this module
-+ io_sbeState.mproc_nest_freq_mhz = default_nest_freq;
-+ }
-+ }
-+ else if ( io_sbeState.cur_seeprom_side == SBE_SEEPROM1)
-+ {
-+ if ( io_sbeState.seeprom_1_ver.struct_version == 2 )
-+ {
-+ io_sbeState.mproc_nest_freq_mhz =
-+ io_sbeState.seeprom_1_ver.nest_freq_mhz;
-+ }
-+ else
-+ {
-+ // Assume it was default frequency for this module
-+ io_sbeState.mproc_nest_freq_mhz = default_nest_freq;
-+ }
-+ }
-+ else
-+ {
-+ // Assume it was default frequency for this module
-+ io_sbeState.mproc_nest_freq_mhz = default_nest_freq;
-+ }
-+
-+ }
-+
-+ TRACUCOMP( g_trac_sbe,"checkNestFreqSettings(): s0-mismatch=%d, "
-+ "s1-mismatch=%d, mproc_nest_freq_mhz=%d",
-+ io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch,
-+ io_sbeState.seeprom_0_ver_Nest_Freq_Mismatch,
-+ io_sbeState.mproc_nest_freq_mhz);
-+
-+ }while(0);
-+
-+
-+ TRACDCOMP( g_trac_sbe,
-+ EXIT_MRK"checkNestFreqSettings");
-+
-+ return err;
-+
-+ }
-+
-+
-+
- } //end SBE Namespace
-diff --git a/src/usr/sbe/sbe_update.H b/src/usr/sbe/sbe_update.H
-index 1d4b208..f13e9b1 100644
---- a/src/usr/sbe/sbe_update.H
-+++ b/src/usr/sbe/sbe_update.H
-@@ -44,9 +44,21 @@ namespace SBE
- const size_t SBE_MVPD_SHORT_IMAGE_VERSION_SIZE = 20;
-
- // Version of Struct stored in SEEPROM
-- const uint32_t SBE_SEEPROM_STRUCT_VERSION = 0x00000001;
-+ const uint32_t SBE_SEEPROM_STRUCT_VERSION = 0x00000002;
- const uint32_t SBE_SEEPROM_STRUCT_SIMICS_VERSION = 0x5A5A5A5A;
-
-+ // Number of versions supported
-+ const uint8_t SBE_SEEPROM_STRUCT_MAX_VERSIONS = 0x03;
-+
-+ // Size of supported versions - must be 8-byte aligned
-+ const size_t SBE_SEEPROM_STRUCT_SIZES[SBE_SEEPROM_STRUCT_MAX_VERSIONS] =
-+ {
-+ 0, // ver0: uninitialized - no size
-+ 72, // ver1: size of struct is 72 bytes
-+ 80, // ver2: size of struct is 80 bytes
-+ };
-+
-+
- // Constant written to SBE SEEPROM version struct to invalidate the
- // struct and the image - 'INVALID\0'
- const uint64_t SBE_SEEPROM_STRUCT_INVALID = 0x494E56414C494400;
-@@ -126,6 +138,7 @@ namespace SBE
- MVPD_UPDATE_COMPLETE = 0x00000008,
- UPDATE_SBE = 0x00000010,
- SBE_UPDATE_COMPLETE = 0x00000020,
-+ UPDATE_NEST_FREQ = 0x00000100,
- UNSUPPORTED_SITUATION = 0x80000000,
- };
-
-@@ -138,18 +151,25 @@ namespace SBE
- *
- * NOTE: For ECC purposes, this must be 8-byte aligned,
- * so pad data if necessary
-- * struct_version 1: size = 4+64+4 = 72 (aligned)
-+ * struct_version 1: size = 4+4+64 = 72 (aligned)
-+ * struct_version 2: size = 4+4+64+4+4 = 80 (aligned)
- */
- struct sbeSeepromVersionInfo_t
- {
-+ // The first 64-bits will be read out to check for struct_version
- uint32_t struct_version;
- uint32_t data_crc;
- uint8_t image_version[SBE_IMAGE_VERSION_SIZE];
-+
-+ // New parameters for version 2: nest_freq_mhz and uin32_t/reserved
-+ uint32_t nest_freq_mhz;
-+ uint32_t reserved; // reserved; added for alignment
- } PACKED;
-
- // This line forces a compile fail if struct is NOT 8-byte-alaigned
- CPPASSERT(0 == (sizeof(sbeSeepromVersionInfo_t) % 8));
-
-+
- /**
- * @brief Struct of individual SBE entry in SBE and SBEC
- * Table of Contents in PNOR partitions
-@@ -208,6 +228,11 @@ namespace SBE
- bool seeprom_0_ver_ECC_fail;
- bool seeprom_1_ver_ECC_fail;
-
-+ bool seeprom_0_ver_Nest_Freq_Mismatch;
-+ bool seeprom_1_ver_Nest_Freq_Mismatch;
-+ bool cur_seeprom_ver_Nest_Freq_Mismatch;
-+ uint32_t mproc_nest_freq_mhz;
-+
- sbeSeepromSide_t cur_seeprom_side; // aka 'booted' side
- sbeSeepromSide_t alt_seeprom_side;
- sbeSeepromSide_t permanent_seeprom_side;
-@@ -231,6 +256,10 @@ namespace SBE
- sbeTargetState_t() :
- target(NULL), target_is_master(false), ec(0x0),
- seeprom_0_ver_ECC_fail(false), seeprom_1_ver_ECC_fail(false),
-+ seeprom_0_ver_Nest_Freq_Mismatch(false),
-+ seeprom_1_ver_Nest_Freq_Mismatch(false),
-+ cur_seeprom_ver_Nest_Freq_Mismatch(false),
-+ mproc_nest_freq_mhz(0x0),
- customizedImage_size(0x0), customizedImage_crc(0x0),
- new_readBack_check(false),
- err_plid(0x0), err_eid(0x0), err_rc(0x0)
-@@ -248,9 +277,13 @@ namespace SBE
- *
- * @param[io/out] io_sbeState Struct containing SBE State of the target
- *
-+ * @param[io/out] i_check_type Determines if an early check should be run
-+ * before collecting all of the information.
-+ *
- * @return errlHndl_t Error log handle on failure.
- */
-- errlHndl_t getSbeInfoState(sbeTargetState_t& io_sbeState);
-+ errlHndl_t getSbeInfoState(sbeTargetState_t& io_sbeState,
-+ sbeUpdateCheckType& i_check_type);
-
- /**
- * @brief Analyze and Determine Update Actions for a specific target
-@@ -501,5 +534,23 @@ namespace SBE
- size_t i_maxBits);
-
-
-+ /**
-+ * @brief Checks the Nest Frequency value stored in the the version struct
-+ * and compares it ot the NEST_FREQ_MHZ attribute of the system
-+ *
-+ * @param[io/out] io_sbeState Struct containing SBE State of the target
-+ * and is updated based on the situation
-+ *
-+ * @pre seeprom_0_ver and seeprom_1_ver have been filled in
-+ *
-+ * @post seeprom_0_ver_Nest_Freq_Mismatch,
-+ * seeprom_1_ver_Nest_Freq_Mismatch, and nest_freq_check_complete
-+ * are set.
-+ *
-+ * @return errlHndl_t Error log handle on failure.
-+ */
-+ errlHndl_t checkNestFreqSettings(sbeTargetState_t& io_sbeState);
-+
-+
- } //end namespace SBE
- #endif
-diff --git a/src/usr/sbe/test/sbeupdatetest.H b/src/usr/sbe/test/sbeupdatetest.H
-index c5a3dd5..bbdeb1e 100644
---- a/src/usr/sbe/test/sbeupdatetest.H
-+++ b/src/usr/sbe/test/sbeupdatetest.H
-@@ -444,9 +444,11 @@ class SBEUpdateTest: public CxxTest::TestSuite
- // set bad ec just for comparison to local_ec later
- sbeState.ec = 0xFF;
-
-+ // send input part to perform all checks
-+ sbeUpdateCheckType i_check_type = SBE_UPDATE_CHECK_ALL;
-
- total++;
-- err = getSbeInfoState(sbeState);
-+ err = getSbeInfoState(sbeState, i_check_type);
- if(err)
- {
- fails++;
-diff --git a/src/usr/targeting/common/genHwsvMrwXml.pl b/src/usr/targeting/common/genHwsvMrwXml.pl
-index a720c44..18746cc 100755
---- a/src/usr/targeting/common/genHwsvMrwXml.pl
-+++ b/src/usr/targeting/common/genHwsvMrwXml.pl
-@@ -2352,6 +2352,25 @@ sub generate_sys
- ";
- }
-
-+ # Tuletas can now support multiple nest frequencies
-+ if ($sysname =~ /tuleta/)
-+ {
-+ print "
-+ <attribute><id>MRW_NEST_CAPABLE_FREQUENCIES_SYS</id>
-+ <default>2000_MHZ_OR_2400_MHZ</default>
-+ </attribute>
-+";
-+ }
-+ else
-+ {
-+ print "
-+ <attribute><id>MRW_NEST_CAPABLE_FREQUENCIES_SYS</id>
-+ <default>UNSUPPORTED_FREQ</default>
-+ </attribute>
-+";
-+ }
-+
-+
- if( $haveFSPs == 0 )
- {
- generate_apss_adc_config()
-diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml
-index 22467ea..05497fd 100644
---- a/src/usr/targeting/common/xmltohb/attribute_types.xml
-+++ b/src/usr/targeting/common/xmltohb/attribute_types.xml
-@@ -16600,5 +16600,23 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
- <macro>DIRECT</macro>
- </hwpfToHbAttrMap>
- </attribute>
-+<attribute>
-+ <id>DEFAULT_PROC_MODULE_NEST_FREQ_MHZ</id>
-+ <description>
-+ Default Nest frequency in MHz for Processor Modules
-+ Default to 2000 MHz for Murano-based Modules
-+ Default to 2400 MHz for Venice- and Naples-based Modules
-+ </description>
-+ <simpleType>
-+ <uint32_t>
-+ <default>2000</default>
-+ </uint32_t>
-+ </simpleType>
-+ <persistency>non-volatile</persistency>
-+ <readable/>
-+</attribute>
-+
-+
-+
-
- </attributes>
-diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
-index 0b45bb0..9475cc4 100644
---- a/src/usr/targeting/common/xmltohb/target_types.xml
-+++ b/src/usr/targeting/common/xmltohb/target_types.xml
-@@ -666,6 +666,10 @@
- <id>PROC_PCIE_REFCLOCK_ENABLE</id>
- <default>0xE0</default>
- </attribute>
-+ <attribute>
-+ <id>DEFAULT_PROC_MODULE_NEST_FREQ_MHZ</id>
-+ <default>2400</default>
-+ </attribute>
- </targetType>
-
- <targetType>
-@@ -691,6 +695,10 @@
- <id>PROC_PCIE_REFCLOCK_ENABLE</id>
- <default>0xE0</default>
- </attribute>
-+ <attribute>
-+ <id>DEFAULT_PROC_MODULE_NEST_FREQ_MHZ</id>
-+ <default>2000</default>
-+ </attribute>
- </targetType>
-
- <targetType>
-@@ -716,6 +724,10 @@
- <id>PROC_PCIE_REFCLOCK_ENABLE</id>
- <default>0xF0</default>
- </attribute>
-+ <attribute>
-+ <id>DEFAULT_PROC_MODULE_NEST_FREQ_MHZ</id>
-+ <default>2400</default>
-+ </attribute>
- </targetType>
-
- <targetType>
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0005-Function-to-set-nest-freq-based-off-dimms.patch b/openpower/package/hostboot/hostboot-0005-Function-to-set-nest-freq-based-off-dimms.patch
deleted file mode 100644
index d64991a..0000000
--- a/openpower/package/hostboot/hostboot-0005-Function-to-set-nest-freq-based-off-dimms.patch
+++ /dev/null
@@ -1,937 +0,0 @@
-From 8afc07837b303e5621ba28fed8a070eba633475d Mon Sep 17 00:00:00 2001
-From: aalugore <aalugore@us.ibm.com>
-Date: Mon, 24 Aug 2015 13:42:24 -0500
-Subject: [PATCH] Function to set Nest Frequency based off DIMM memory
- capability
-
--Needed for 32x32GB DIMM support
--Finds max capable frequency of system and all present DIMMs
- and deconfigures any DIMM that cannot run at desired frequency
--If necessary, Sets Nest Freq and triggers SBE update
-
-Change-Id: I9bba92f55f1b67ff4a15d79113f19d39272ec72d
-RTC:122884
-Depends-on:I1dca7196cd02a2704a238665b73b522c9e103936
----
- src/include/usr/hwpf/hwpf_reasoncodes.H | 4 +-
- src/include/usr/isteps/istep12list.H | 4 +-
- src/include/usr/sbe/sbeif.H | 16 +
- src/include/usr/targeting/common/target.H | 11 +
- src/include/util/algorithm.H | 18 +-
- src/include/util/align.H | 17 +-
- src/usr/hwpf/hwp/mc_config/mc_config.C | 437 ++++++++++++++++++++-
- src/usr/hwpf/hwp/memory_attributes.xml | 12 +-
- src/usr/hwpf/plat/fapiPlatUtil.C | 2 +-
- src/usr/sbe/sbe_update.C | 62 +++
- src/usr/targeting/common/target.C | 47 +++
- .../targeting/common/xmltohb/attribute_types.xml | 10 +-
- 12 files changed, 608 insertions(+), 32 deletions(-)
-
-diff --git a/src/include/usr/hwpf/hwpf_reasoncodes.H b/src/include/usr/hwpf/hwpf_reasoncodes.H
-index e1a00da..ea326c1 100644
---- a/src/include/usr/hwpf/hwpf_reasoncodes.H
-+++ b/src/include/usr/hwpf/hwpf_reasoncodes.H
-@@ -80,7 +80,9 @@ namespace fapi
- MOD_PLAT_MVPD_GET_VLTG_BUCKET_ATTR = 0x26,
- MOD_PLAT_ATTR_SVC_CEN_DQ_TO_DIMM_CONN_DQ = 0x27,
- MOD_PLAT_ATTR_SVC_GET_MEM_ATTR_DATA = 0x28,
--
-+ MOD_GET_WOF_FREQ_UPLIFT_SELECTED = 0x29,
-+ MOD_SET_NEST_FREQ = 0x2A,
-+ MOD_FIND_MAX_DMI_SPD = 0x2B,
- };
-
- /**
-diff --git a/src/include/usr/isteps/istep12list.H b/src/include/usr/isteps/istep12list.H
-index 2e724f2..f668733 100644
---- a/src/include/usr/isteps/istep12list.H
-+++ b/src/include/usr/isteps/istep12list.H
-@@ -5,7 +5,7 @@
- /* */
- /* OpenPOWER HostBoot Project */
- /* */
--/* Contributors Listed Below - COPYRIGHT 2012,2014 */
-+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
- /* [+] Google Inc. */
- /* [+] International Business Machines Corp. */
- /* */
-@@ -105,6 +105,8 @@ const DepModInfo g_istep12Dependancies = {
- #ifndef CONFIG_VPO_COMPILE
- DEP_LIB(libmc_config.so),
- #endif
-+ DEP_LIB(libsbe.so),
-+ DEP_LIB(libbuild_winkle_images.so),
- NULL
- }
- };
-diff --git a/src/include/usr/sbe/sbeif.H b/src/include/usr/sbe/sbeif.H
-index b00e01f..ff397ca 100644
---- a/src/include/usr/sbe/sbeif.H
-+++ b/src/include/usr/sbe/sbeif.H
-@@ -94,6 +94,22 @@ namespace SBE
- */
- errlHndl_t resolveProcessorSbeSeeproms();
-
-+ /**
-+ * @brief Determines whether we are on the Golden side or not
-+ *
-+ * @param[out] o_isGolden boolean, True if we are on Golden side, False
-+ * otherwise.
-+ *
-+ * @return errlHndl_t Error log handle on failure.
-+ *
-+ * NOTE: -Golden Side means we booted from the Golden Seeprom pointing
-+ * at the Golden side of PNOR.
-+ * -Using master processor to make this determination.
-+ */
-+
-+ errlHndl_t isGoldenSide( bool & o_isGolden );
-+
-+
-
- } //end namespace SBE
-
-diff --git a/src/include/usr/targeting/common/target.H b/src/include/usr/targeting/common/target.H
-index 25e7be6..bf5b7da 100644
---- a/src/include/usr/targeting/common/target.H
-+++ b/src/include/usr/targeting/common/target.H
-@@ -672,6 +672,17 @@ const char* Target::getAttrAsString() const
- return attrToString<A>(l_attrValue);
- }
-
-+// Function to set various frequency related attributes
-+/**
-+ * @brief - sets various attributes directly related to the nest frequency.
-+ *
-+ * @param[in] i_sys - top level system target to set attributes for
-+ * @param[in] i_newNestFreq - the new nest frequency to base all the attributes
-+ * off of.
-+ */
-+void setFrequencyAttributes(Target * i_sys, uint32_t i_newNestFreq);
-+
-+
- // WARNING: The following #include imports any platform specific template
- // specializations for getAttr and tryGetAttr
- #include <targeting/adapters/targetadapter.H>
-diff --git a/src/include/util/algorithm.H b/src/include/util/algorithm.H
-index 54baa02..dac0f47 100644
---- a/src/include/util/algorithm.H
-+++ b/src/include/util/algorithm.H
-@@ -5,7 +5,9 @@
- /* */
- /* OpenPOWER HostBoot Project */
- /* */
--/* COPYRIGHT International Business Machines Corp. 2012,2014 */
-+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
-+/* [+] International Business Machines Corp. */
-+/* */
- /* */
- /* Licensed under the Apache License, Version 2.0 (the "License"); */
- /* you may not use this file except in compliance with the License. */
-@@ -52,6 +54,20 @@ namespace Util
- static const T value = (a > b) ? a : b;
- };
-
-+ /**
-+ * @brief - utility function that determines if a given number is
-+ * power of 2.
-+ *
-+ * @param[in] i_num - given number.
-+ *
-+ * @return bool - True if the number is a power of 2, False otherwise.
-+ */
-+ template <typename T>
-+ bool isPow2(T i_num)
-+ {
-+ return (!(i_num & (i_num-1)));
-+ }
-+
- };
- };
- #endif
-diff --git a/src/include/util/align.H b/src/include/util/align.H
-index e0132b2..10a8369 100644
---- a/src/include/util/align.H
-+++ b/src/include/util/align.H
-@@ -51,18 +51,7 @@
- #define ALIGN_MEGABYTE(u) (ALIGN_X(u,MEGABYTE))
- #define ALIGN_MEGABYTE_DOWN(u) (ALIGN_DOWN_X(u,MEGABYTE))
-
--// Returns a number that is aligned to the next highest power of 2 number of
--// pages for the given buffer.
--#define ALIGN_TO_NEXT_POWER_OF_TWO_PAGES(b) ({\
-- unsigned int v = ALIGN_PAGE(b)/PAGE_SIZE;\
-- v--;\
-- v |= v >> 1;\
-- v |= v >> 2;\
-- v |= v >> 4;\
-- v |= v >> 8;\
-- v |= v >> 16;\
-- v++;\
-- v * PAGE_SIZE;\
-- })
--
-+// Return a number rounded to the next power of two.
-+#define ALIGN_POW2(u) ((u&(u-1)) ? 1 << (64 - __builtin_clzl(u)) : u)
-+#define ALIGN_POW2_DOWN(u) (u ? 1 << (63 - __builtin_clzl(u)) : 0)
- #endif
-diff --git a/src/usr/hwpf/hwp/mc_config/mc_config.C b/src/usr/hwpf/hwp/mc_config/mc_config.C
-index b2bc2f1..f29ee7c 100644
---- a/src/usr/hwpf/hwp/mc_config/mc_config.C
-+++ b/src/usr/hwpf/hwp/mc_config/mc_config.C
-@@ -44,16 +44,19 @@
-
- #include <trace/interface.H>
- #include <initservice/taskargs.H>
-+#include <initservice/initserviceif.H>
- #include <errl/errlentry.H>
-
- #include <hwpisteperror.H>
-+#include <hwpf/hwpf_reasoncodes.H>
- #include <errl/errludtarget.H>
-
- #include <initservice/isteps_trace.H>
--
-+#include <sbe/sbeif.H>
- // targeting support
- #include <targeting/common/commontargeting.H>
- #include <targeting/common/utilFilter.H>
-+#include <attributetraits.H>
-
- // fapi support
- #include <fapi.H>
-@@ -79,6 +82,8 @@
- #include "mss_volt/mss_volt_dimm_count.H"
-
- #include <config.h>
-+#include <util/align.H>
-+#include <util/algorithm.H>
-
- namespace MC_CONFIG
- {
-@@ -129,7 +134,8 @@ void set_eff_config_attrs_helper( const EFF_CONFIG_ATTRIBUTES_BASE i_base,
- // Get Node Target
- TARGETING::Target* sysTgt = NULL;
- TARGETING::targetService().getTopLevelTarget(sysTgt);
-- assert(sysTgt != NULL,"System target was NULL.");
-+ assert(sysTgt != NULL,"set_eff_config_attrs_helper: "
-+ "System target was NULL.");
-
- TARGETING::TargetHandleList l_nodeList;
-
-@@ -467,7 +473,8 @@ errlHndl_t setMemoryVoltageDomainOffsetVoltage()
-
- TARGETING::Target* pSysTarget = NULL;
- TARGETING::targetService().getTopLevelTarget(pSysTarget);
-- assert(pSysTarget != NULL,"System target was NULL.");
-+ assert(pSysTarget != NULL,"setMemoryVoltageDomainOffsetVoltage: "
-+ "System target was NULL.");
-
- typename AttributeTraits< OFFSET_DISABLEMENT_ATTR >::Type
- disableOffsetVoltage =
-@@ -717,13 +724,16 @@ void call_mss_volt_hwp (std::vector<TARGETING::ATTR_VMEM_ID_type>& i_VmemList,
- l_membufFapiTargets.push_back( l_membuf_fapi_target );
- }
- }
-+
-+ TRACDCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "Calling mss_volt_hwp...");
- FAPI_INVOKE_HWP(l_err, mss_volt_hwp, l_membufFapiTargets);
-
- // process return code.
- if ( l_err )
- {
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
-- "ERROR 0x%.8X: mss_volt_dimm_count HWP( ) ",
-+ "ERROR 0x%.8X: mss_volt HWP( ) ",
- l_err->reasonCode());
-
- // Create IStep error log and cross reference to error that occurred
-@@ -872,7 +882,411 @@ void* call_mss_volt( void *io_pArgs )
-
- return l_StepError.getErrorHandle();
- }
-+/**
-+ * @brief - this utility function takes in the frequency in
-+ * ATTR_MRW_NEST_CAPABLE_FREQUENCIES_SYS and returns the corresponding
-+ * dmi bus speed from ATTR_MSS_NEST_CAPABLE_FREQUENCIES
-+ *
-+ * @param[in] i_freq - the input frequency
-+ * @param[in/out] io_speed - the corresponding dmi bus speed
-+ */
-+void sysFreq_to_dmiSpeed(ATTR_MRW_NEST_CAPABLE_FREQUENCIES_SYS_type i_freq,
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type & io_speed)
-+{
-+ switch(i_freq)
-+ {
-+ case TARGETING::MRW_NEST_CAPABLE_FREQUENCIES_SYS_UNSUPPORTED_FREQ:
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Unsupported nest freq!");
-+ io_speed = 0;
-+ break;
-+ case TARGETING::MRW_NEST_CAPABLE_FREQUENCIES_SYS_2000_MHZ:
-+ io_speed=fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_8_0G;
-+ break;
-+ case TARGETING::MRW_NEST_CAPABLE_FREQUENCIES_SYS_2400_MHZ:
-+ io_speed=fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_9_6G;
-+ break;
-+ case TARGETING::MRW_NEST_CAPABLE_FREQUENCIES_SYS_2000_MHZ_OR_2400_MHZ:
-+ io_speed=fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_8_0G_OR_9_6G;
-+ break;
-+ default:
-+ io_speed = 0;
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Invalid nest freq!");
-+ }
-+}
-
-+/**
-+ * @brief - this utility function takes in the dmi bus speed enumeration
-+ * value as described in MSS_NEST_CAPABLE_FREQUENCIES and outputs
-+ * the actual corresponding nest frequency in MHz supported by the
-+ * given dmi bus speed.
-+ *
-+ * @param[in] i_speed - the input dmi bus speed
-+ * @param[in/out] io_freq - the corresponding frequency in MHz
-+ *
-+ */
-+void dmiSpeed_to_sysFreq(ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type i_speed,
-+ ATTR_NEST_FREQ_MHZ_type & io_freq)
-+{
-+ switch(i_speed)
-+ {
-+ case fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_8_0G:
-+ io_freq = 2000;
-+ break;
-+ case fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_9_6G:
-+ io_freq = 2400;
-+ break;
-+ default:
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "Invalid dmi speed!");
-+ io_freq = 0;
-+ }
-+}
-+
-+
-+
-+//
-+// calloutChildDimms
-+//
-+void calloutChildDimms(errlHndl_t & io_errl, const TARGETING::Target * i_membuf)
-+{
-+ TargetHandleList l_dimmList;
-+
-+ // Get child dimms
-+ getChildAffinityTargets( l_dimmList,
-+ i_membuf,
-+ CLASS_NA,
-+ TYPE_DIMM );
-+
-+ if( !l_dimmList.empty())
-+ {
-+ // iterate over the DIMMs and call them out
-+ TargetHandleList::iterator l_iter = l_dimmList.begin();
-+
-+ for(;l_iter != l_dimmList.end(); ++l_iter)
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "Calling out DIMM Target huid = %x",
-+ get_huid(*l_iter));
-+
-+ io_errl->addHwCallout( *l_iter,
-+ HWAS::SRCI_PRIORITY_MED,
-+ HWAS::DELAYED_DECONFIG,
-+ HWAS::GARD_NULL );
-+ }
-+ }
-+ else
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "No child DIMMs found!");
-+ }
-+}
-+
-+
-+// TODO RTC 135720 - Support for mixed DIMM configuration with 32GB DIMMs.
-+
-+/**
-+ * @brief - Recursive utility function for finding the max dmi
-+ * bus speed to run at based on the nest dmi bus speed
-+ * and the membuf's dmi bus speed
-+ *
-+ * @param[in] i_iter - Iterator over the list of membufs.
-+ * @param[in] i_membufs - Pointer to the list of membufs.
-+ * @param[in/out] io_currentMaxSpeed - The speed to run at will be returned here
-+ * @param[in] i_capableNestDmiBusSpeed - The nest capable dmi bus speed.
-+ */
-+void findMaxSpdAndDeconfigIncompatible(TargetHandleList::iterator i_iter,
-+ TargetHandleList * i_membufs,
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type & io_currentMaxSpeed,
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type i_capableNestDmiBusSpeed )
-+{
-+ do
-+ {
-+ // Base Case: If we are at the end of the membuf list return
-+ if(i_iter == i_membufs->end())
-+ {
-+ // find the left most bit of the max speed found. This bit
-+ // represents the highest dmi bus speed setting we can support
-+ // across the nest and all membufs and the speed we will boot with.
-+ io_currentMaxSpeed = ALIGN_POW2_DOWN(io_currentMaxSpeed);
-+ break;
-+ }
-+
-+ // Get the current membuf's dmi bus speed
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type l_currentMembufSpd =
-+ (*i_iter)->getAttr<TARGETING::ATTR_MSS_NEST_CAPABLE_FREQUENCIES>();
-+
-+ // update current max speed.
-+ // Max is restricted by nest capable dmi bus speed
-+ if(((l_currentMembufSpd & i_capableNestDmiBusSpeed) != 0) &&
-+ (l_currentMembufSpd > io_currentMaxSpeed))
-+ {
-+ io_currentMaxSpeed = l_currentMembufSpd;
-+ }
-+
-+ //Save the current membuf for when we come back from recursive call.
-+ TARGETING::Target * l_currentMembuf = (*i_iter);
-+
-+ // Recursive call to go down the list of membufs and find the max
-+ // capable dmi speed across the nest and membufs.
-+ findMaxSpdAndDeconfigIncompatible(++i_iter,
-+ i_membufs,
-+ io_currentMaxSpeed,
-+ i_capableNestDmiBusSpeed );
-+
-+ // deconfigure any membufs with incompatible
-+ // speeds on the way up the stack
-+ if((l_currentMembufSpd & io_currentMaxSpeed) == 0)
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "Deconfiguring Membuf Huid: %X, membuf speed: %d",
-+ TARGETING::get_huid(l_currentMembuf),
-+ l_currentMembufSpd);
-+ // Membuf has incompatible frequency. Deconfigure it.
-+ /*@
-+ * @errortype
-+ * @moduleid MOD_FIND_MAX_DMI_SPD
-+ * @reasoncode RC_INVALID_FREQ
-+ * @userdata1 HUID of membuf
-+ * @userdata2 [0:7] membuf frequency enumeration value
-+ * @userdata2 [8:15] dmi bus speed enumeration value
-+ * @devdesc Invalid nest frequency found for given membuf
-+ * @custdesc Invalid memory configuration
-+ */
-+ errlHndl_t l_err = new ERRORLOG::ErrlEntry(
-+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-+ fapi::MOD_FIND_MAX_DMI_SPD,
-+ fapi::RC_INVALID_FREQ,
-+ TARGETING::get_huid(l_currentMembuf),
-+ TO_UINT64(TWO_UINT8_TO_UINT16
-+ (l_currentMembufSpd,
-+ i_capableNestDmiBusSpeed)));
-+
-+ l_err->addHwCallout(l_currentMembuf, HWAS::SRCI_PRIORITY_HIGH,
-+ HWAS::DELAYED_DECONFIG,
-+ HWAS::GARD_NULL );
-+ l_err->addProcedureCallout(
-+ HWAS::EPUB_PRC_MEMORY_PLUGGING_ERROR,
-+ HWAS::SRCI_PRIORITY_HIGH );
-+
-+
-+ // add hw callouts for current membuf child DIMMs
-+ calloutChildDimms( l_err, l_currentMembuf );
-+
-+ errlCommit( l_err, HWPF_COMP_ID );
-+ l_err = NULL;
-+ }
-+ }while( 0 );
-+}
-+
-+
-+//
-+// setNestBasedOffDimms
-+//
-+errlHndl_t setNestBasedOffDimms()
-+{
-+ TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, ENTER_MRK"mc_config::setNestBasedOffDimms()");
-+ errlHndl_t l_err = NULL;
-+ bool l_isGoldenSide = false;
-+ ATTR_MRW_NEST_CAPABLE_FREQUENCIES_SYS_type l_capableNestFreq =
-+ MRW_NEST_CAPABLE_FREQUENCIES_SYS_UNSUPPORTED_FREQ;
-+
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type l_selectedBootSpeed =
-+ fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_NONE;
-+
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type l_capableNestDmiBusSpeed =
-+ fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_NONE;
-+
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type l_compatibleSpeed =
-+ fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_NONE;
-+
-+ ATTR_NEST_FREQ_MHZ_type l_maxFreqMhz = 0;
-+
-+ l_isGoldenSide = false;
-+
-+ do
-+ {
-+ // First, get the systems capable nest frequency. If 0, then stick with
-+ // already set nest frequency
-+ TARGETING::Target * l_sys = NULL;
-+ targetService().getTopLevelTarget(l_sys);
-+
-+ uint32_t l_currentSysNestFreq =
-+ l_sys->getAttr<TARGETING::ATTR_NEST_FREQ_MHZ>();
-+
-+ // Check to see if we booted from the Golden side
-+ l_err = SBE::isGoldenSide(l_isGoldenSide);
-+
-+ if(l_err)
-+ {
-+ // Error getting Golden side. Proceeding as if booting from safe Golden side
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ ERR_MRK"setNestBasedOffDimms::isGoldenSide returned an error");
-+ errlCommit( l_err, HWPF_COMP_ID );
-+ l_isGoldenSide = true;
-+ }
-+
-+ if(!l_isGoldenSide)
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ INFO_MRK"Booting from normal side. use "
-+ "MRW_NEST_CAPABLE_FREQUENCIES_SYS to calculate best freq "
-+ "across membufs");
-+ l_capableNestFreq = l_sys->getAttr
-+ <ATTR_MRW_NEST_CAPABLE_FREQUENCIES_SYS>();
-+ }
-+ else
-+ {
-+ // We booted using the Golden Side. Use NEST_FREQ_MHZ
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ INFO_MRK"Booting from Golden Side. Use default NEST_FREQ"
-+ "to calculate best freq across membufs");
-+ if(l_currentSysNestFreq == 2000)
-+ {
-+ l_capableNestFreq =
-+ TARGETING::MRW_NEST_CAPABLE_FREQUENCIES_SYS_2000_MHZ;
-+ }
-+ else if( l_currentSysNestFreq == 2400 )
-+ {
-+ l_capableNestFreq =
-+ TARGETING::MRW_NEST_CAPABLE_FREQUENCIES_SYS_2400_MHZ;
-+ }
-+ else
-+ {
-+ l_capableNestFreq =
-+ TARGETING::MRW_NEST_CAPABLE_FREQUENCIES_SYS_UNSUPPORTED_FREQ;
-+ }
-+
-+ }
-+
-+ // convert the frequency to its corresponding dmi bus speed
-+ sysFreq_to_dmiSpeed( l_capableNestFreq, l_capableNestDmiBusSpeed );
-+
-+ if(!l_capableNestDmiBusSpeed)
-+ {
-+ // Unknown frequency was given to sysFreq_to_dmiSpeed
-+ // break out of function and proceed with value already in
-+ // ATTR_NEST_FREQ_MHZ
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Invalid dmi speed. Proceeding with default value in NEST_FREQ_MHZ.");
-+ break;
-+ }
-+
-+ // Get a list of all the membufs
-+ TargetHandleList l_membufs;
-+ TARGETING::getAllChips(l_membufs, TYPE_MEMBUF);
-+ TargetHandleList::iterator l_iter = l_membufs.begin();
-+
-+
-+ // If the nest capable dmi bus speed can only support one setting,
-+ // that speed is the speed we want to boot with.
-+ // Deconfigure all membufs with incompatible speeds
-+ if(Util::Algorithm::isPow2(l_capableNestDmiBusSpeed))
-+ {
-+ // We are forced to boot with the nest freq.
-+ // Save boot freq for later.
-+ l_selectedBootSpeed = l_capableNestDmiBusSpeed;
-+
-+
-+ ATTR_MSS_NEST_CAPABLE_FREQUENCIES_type l_membufDmiBusSpeed = 0;
-+ for(;l_iter != l_membufs.end(); ++l_iter )
-+ {
-+ l_membufDmiBusSpeed = (*l_iter)->getAttr
-+ <TARGETING::ATTR_MSS_NEST_CAPABLE_FREQUENCIES>();
-+
-+ // if the intersection of the membuf's and nest's dmi speed
-+ // is zero, the membuf is incompatible with the nest and must be
-+ // deconfigured.
-+ l_compatibleSpeed = l_membufDmiBusSpeed &
-+ l_capableNestDmiBusSpeed;
-+
-+ if(l_compatibleSpeed ==
-+ fapi::ENUM_ATTR_MSS_NEST_CAPABLE_FREQUENCIES_NONE )
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "Deconfiguring Membuf Huid: %X, membuf speed: %d",
-+ TARGETING::get_huid(*l_iter),
-+ l_membufDmiBusSpeed);
-+ // Membuf has incompatible frequency. Deconfigure it.
-+ /*@
-+ * @errortype
-+ * @moduleid MOD_SET_NEST_FREQ
-+ * @reasoncode RC_INVALID_FREQ
-+ * @userdata1 HUID of membuf
-+ * @userdata2 [0:7] membuf frequency enumeration value
-+ * @userdata2 [8:15] dmi bus speed enumeration value
-+ * @devdesc Invalid nest found for given membuf
-+ * @custdesc Invalid memory configuration
-+ */
-+ l_err = new ERRORLOG::ErrlEntry(
-+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-+ fapi::MOD_SET_NEST_FREQ,
-+ fapi::RC_INVALID_FREQ,
-+ TARGETING::get_huid(*l_iter),
-+ TO_UINT64(TWO_UINT8_TO_UINT16
-+ (l_membufDmiBusSpeed,
-+ l_capableNestDmiBusSpeed)));
-+
-+ l_err->addHwCallout(*l_iter, HWAS::SRCI_PRIORITY_HIGH,
-+ HWAS::DELAYED_DECONFIG,
-+ HWAS::GARD_NULL );
-+
-+
-+ // add hw callouts for current membufs child DIMMs
-+ calloutChildDimms( l_err, *l_iter);
-+
-+ errlCommit( l_err, HWPF_COMP_ID );
-+ l_err = NULL;
-+ continue;
-+ }
-+
-+ } // end for-loop
-+
-+ }
-+ else
-+ {
-+ // The nest supports multiple frequencies. Find the max dmi bus
-+ // speed shared by the nest and at least 1 membuf and boot with that
-+ // speed.
-+ findMaxSpdAndDeconfigIncompatible(l_iter,
-+ &l_membufs,
-+ l_selectedBootSpeed,
-+ l_capableNestDmiBusSpeed);
-+
-+ }
-+
-+ //Convert the selected boot speed to frequency
-+ dmiSpeed_to_sysFreq(l_selectedBootSpeed, l_maxFreqMhz);
-+
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "The max supported frequency across the processor and all dimms "
-+ "is %d", l_maxFreqMhz );
-+
-+ if( l_maxFreqMhz == l_currentSysNestFreq)
-+ {
-+ //do nothing. go with current Nest freq, break.
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "Nest did not need to change. Proceeding with default NEST_FREQ");
-+ break;
-+ }
-+ else
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "DIMM config determined NEST_FREQ needs to be changed to %d",
-+ l_maxFreqMhz );
-+ //set all the attributes and trigger an sbe update
-+ TARGETING::setFrequencyAttributes(l_sys, l_maxFreqMhz);
-+ //trigger sbe update so we can update all the frequency attributes
-+ l_err = SBE::updateProcessorSbeSeeproms(
-+ SBE::SBE_UPDATE_ONLY_CHECK_NEST_FREQ);
-+
-+ if( l_err )
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ "Error triggering sbe update.");
-+ }
-+ }
-+ }while( 0 );
-+
-+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "setNestBasedOffDimms exit" );
-+ return l_err;
-+}
- //
- // Wrapper function to call mss_freq
- //
-@@ -931,6 +1345,21 @@ void* call_mss_freq( void *io_pArgs )
- }
- } // End memBuf loop
-
-+ if(! INITSERVICE::spBaseServicesEnabled() )
-+ {
-+ //set nest frequency based off present membufs
-+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
-+ INFO_MRK"Setting Nest Frequency based off Membuf capability.");
-+ l_err = setNestBasedOffDimms();
-+
-+ if( l_err )
-+ {
-+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
-+ ERR_MRK"Error: call_mss_freq()::setNestBasedOffDimms()");
-+ l_StepError.addErrorDetails(l_err);
-+ }
-+ }
-+
- TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_mss_freq exit" );
-
- return l_StepError.getErrorHandle();
-diff --git a/src/usr/hwpf/hwp/memory_attributes.xml b/src/usr/hwpf/hwp/memory_attributes.xml
-index b4059a2..df3a2ef 100644
---- a/src/usr/hwpf/hwp/memory_attributes.xml
-+++ b/src/usr/hwpf/hwp/memory_attributes.xml
-@@ -1,7 +1,7 @@
- <!-- IBM_PROLOG_BEGIN_TAG -->
- <!-- This is an automatically generated prolog. -->
- <!-- -->
--<!-- $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/centaur/working/procedures/xml/attribute_info/memory_attributes.xml,v $ -->
-+<!-- $Source: src/usr/hwpf/hwp/memory_attributes.xml $ -->
- <!-- -->
- <!-- OpenPOWER HostBoot Project -->
- <!-- -->
-@@ -23,7 +23,7 @@
- <!-- -->
- <!-- IBM_PROLOG_END_TAG -->
- <attributes>
--<!-- $Id: memory_attributes.xml,v 1.159 2015/09/09 18:10:53 thi Exp $ -->
-+<!-- $Id: memory_attributes.xml,v 1.159AL_custom 2014/11/18 17:35:29 aalugore Exp $ -->
- <!-- DO NOT EDIT THIS FILE DIRECTLY PLEASE UPDATE THE ODS FILE AND FOLLOW THE INSTRUCTION TAB -->
- <!-- PLEASE SEE MARK BELLOWS (BELLOWS.IBM.COM) OR OTHERS ON MEMORY TEAM FOR HELP -->
- <!-- *********************************************************************** -->
-@@ -108,7 +108,7 @@ Set by: PLL settings written by Dave Cadigan</description>
- <odmChangeable/>
- <persistRuntime/>
- </attribute>
--
-+
- <attribute>
- <id>ATTR_MSS_DIMM_MFG_ID_CODE</id>
- <targetType>TARGET_TYPE_MBA_CHIPLET</targetType>
-@@ -3051,8 +3051,8 @@ Will be set at an MBA level with one policy to be used</description>
- <writeable/>
- <odmVisable/>
- <odmChangeable/>
-- <enum>8_0G = 1, 9_6G = 2</enum>
--</attribute>
-+ <enum>NONE = 0, 8_0G = 1, 9_6G = 2, 8_0G_OR_9_6G = 3</enum>
-+</attribute>
-
- <attribute>
- <id>ATTR_MRW_STRICT_MBA_PLUG_RULE_CHECKING</id>
-@@ -3425,7 +3425,7 @@ Will be set at an MBA level with one policy to be used</description>
- <valueType>uint32</valueType>
- <platInit/>
- <odmVisable/>
--</attribute>
-+</attribute>
-
- <attribute>
- <id>ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP</id>
-diff --git a/src/usr/hwpf/plat/fapiPlatUtil.C b/src/usr/hwpf/plat/fapiPlatUtil.C
-index d03b670..269c36f 100644
---- a/src/usr/hwpf/plat/fapiPlatUtil.C
-+++ b/src/usr/hwpf/plat/fapiPlatUtil.C
-@@ -334,7 +334,7 @@ void* fapiPlatMalloc(size_t s)
- {
- if (s > PAGE_SIZE)
- {
-- s = ALIGN_TO_NEXT_POWER_OF_TWO_PAGES(s);
-+ s = PAGE_SIZE * ALIGN_POW2(ALIGN_PAGE(s) / PAGE_SIZE);
- }
- return malloc(s);
- }
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index 1faad63..237838f 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -3976,6 +3976,68 @@ namespace SBE
-
- }
-
-+/////////////////////////////////////////////////////////////////////
-+ errlHndl_t isGoldenSide( bool & o_isGolden )
-+ {
-+ errlHndl_t l_errl = NULL;
-+ o_isGolden = false;
-+
-+#ifndef CONFIG_SBE_UPDATE_SEQUENTIAL
-+ do
-+ {
-+ // Get the master processor
-+ TARGETING::Target * l_masterProc = NULL;
-+ TARGETING::targetService().masterProcChipTargetHandle(l_masterProc);
-+ assert( l_masterProc != NULL );
-+
-+ sbeSeepromSide_t l_currentSide = SBE_SEEPROM_INVALID;
-+
-+ // Get Seeprom side
-+ l_errl = getSbeBootSeeprom(l_masterProc, l_currentSide);
-+
-+ if( l_errl )
-+ {
-+ TRACFCOMP( g_trac_sbe, ERR_MRK
-+ "isGoldenSide() - Error returned "
-+ "from getSbeBootSeeprom() "
-+ "rc=0x%.4X, Target UID=0x%X",
-+ l_errl->reasonCode(),
-+ TARGETING::get_huid(l_masterProc));
-+ break;
-+ }
-+
-+ //Get PNOR Side
-+ PNOR::SideId l_pnorSide = PNOR::WORKING;
-+ PNOR::SideInfo_t l_sideInfo;
-+
-+ l_errl = PNOR::getSideInfo( l_pnorSide, l_sideInfo );
-+
-+ if( l_errl )
-+ {
-+ TRACFCOMP(g_trac_sbe, ERR_MRK
-+ "isGoldenSide() - Error returned "
-+ "from PNOR::getSideInfo() "
-+ "rc=0x%.4X, Target UID=0x%X",
-+ l_errl->reasonCode(),
-+ TARGETING::get_huid( l_masterProc ));
-+ break;
-+ }
-+
-+ // SBE_SEEPROM1 by itself does not imply golden side.
-+ // cross reference sbe side with pnor side to make sure.
-+ if(( l_currentSide == SBE_SEEPROM1 ) &&
-+ (( l_sideInfo.isGolden ) || (l_sideInfo.hasOtherSide == false )))
-+ {
-+ TRACUCOMP(g_trac_sbe, INFO_MRK
-+ "sbe_update.C::isGoldenSide() - "
-+ "Booted from Golden side!");
-+ o_isGolden = true;
-+ }
-+
-+ }while( 0 );
-+#endif
-+ return l_errl;
-+ }
-
-
- /////////////////////////////////////////////////////////////////////
-diff --git a/src/usr/targeting/common/target.C b/src/usr/targeting/common/target.C
-index 2248283..559fd4e 100644
---- a/src/usr/targeting/common/target.C
-+++ b/src/usr/targeting/common/target.C
-@@ -645,6 +645,53 @@ bool Target::uninstallWriteAttributeCallback()
- #undef TARG_FN
- }
-
-+
-+//******************************************************************************
-+// setFrequencyAttributes
-+//******************************************************************************
-+void setFrequencyAttributes(Target * i_sys, uint32_t i_newNestFreq)
-+{
-+
-+ // Calculate the new value for PIB_I2C_NEST_PLL using old freq attributes.
-+ uint32_t l_oldPll = i_sys->getAttr<TARGETING::ATTR_PIB_I2C_NEST_PLL>();
-+ uint32_t l_oldNestFreq = i_sys->getAttr<TARGETING::ATTR_NEST_FREQ_MHZ>();
-+ uint32_t l_newPll = (i_newNestFreq * l_oldPll)/l_oldNestFreq;
-+
-+ //NEST_FREQ
-+ i_sys->setAttr<TARGETING::ATTR_NEST_FREQ_MHZ>(i_newNestFreq);
-+ TRACFCOMP(g_trac_targeting,
-+ "ATTR_NEST_FREQ_MHZ getting set from %d to %d",
-+ l_oldNestFreq,
-+ i_newNestFreq );
-+
-+ //FREQ_X
-+ uint32_t l_freqX = i_newNestFreq * 2;
-+ i_sys->setAttr<TARGETING::ATTR_FREQ_X>(l_freqX);
-+ TRACFCOMP(g_trac_targeting,
-+ "ATTR_FREQ_X getting set to from %d to %d",
-+ l_oldNestFreq*2,
-+ l_freqX );
-+
-+ //FREQ_PB
-+ uint32_t l_freqPb = i_newNestFreq;
-+ i_sys->setAttr<TARGETING::ATTR_FREQ_PB>(l_freqPb);
-+ TRACFCOMP(g_trac_targeting,
-+ "ATTR_FREQ_PB getting set from %d to %d",
-+ l_oldNestFreq,
-+ l_freqPb );
-+
-+ //PIB_I2C_NEST_PLL
-+ i_sys->setAttr<TARGETING::ATTR_PIB_I2C_NEST_PLL>(l_newPll);
-+ TRACFCOMP(g_trac_targeting,
-+ "ATTR_PIB_I2C_NEST_PLL getting set from %x to %x",
-+ l_oldPll,
-+ l_newPll);
-+
-+ return;
-+}
-+
-+
-+
- //******************************************************************************
- // Attribute Tanks
- //******************************************************************************
-diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml
-index 05497fd..88041b4 100644
---- a/src/usr/targeting/common/xmltohb/attribute_types.xml
-+++ b/src/usr/targeting/common/xmltohb/attribute_types.xml
-@@ -2049,6 +2049,7 @@
- <simpleType><uint32_t></uint32_t></simpleType>
- <persistency>non-volatile</persistency>
- <readable/>
-+ <writeable/>
- <hwpfToHbAttrMap>
- <id>ATTR_FREQ_PB</id>
- <macro>DIRECT</macro>
-@@ -2083,6 +2084,7 @@
- <simpleType><uint32_t></uint32_t></simpleType>
- <persistency>non-volatile</persistency>
- <readable/>
-+ <writeable/>
- <hwpfToHbAttrMap>
- <id>ATTR_FREQ_X</id>
- <macro>DIRECT</macro>
-@@ -6103,7 +6105,7 @@ firmware notes: Used as override attribute for pstate procedure
- <default>2000</default>
- </uint32_t>
- </simpleType>
-- <persistency>volatile</persistency>
-+ <persistency>non-volatile</persistency>
- <readable/>
- <writeable/>
- <hwpfToHbAttrMap>
-@@ -15666,7 +15668,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
-
- <attribute>
- <id>MRW_VMEM_REGULATOR_POWER_LIMIT_PER_DIMM_ADJ_ENABLE</id>
-- <description>Machine Readable Workbook enablement of the HWP code to adjust
-+ <description>Machine Readable Workbook enablement of the HWP code to adjust
- the VMEM regulator power limit based on number of installed DIMMs.
- </description>
- <simpleType>
-@@ -15702,7 +15704,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
-
- <attribute>
- <id>MRW_VMEM_REGULATOR_MEMORY_POWER_LIMIT_PER_DIMM</id>
-- <description>Machine Readable Workbook VMEM regulator power limit per CDIMM
-+ <description>Machine Readable Workbook VMEM regulator power limit per CDIMM
- assuming a full configuration. Units in cW.
- </description>
- <simpleType>
-@@ -15741,7 +15743,7 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
-
- <attribute>
- <id>MRW_NEST_CAPABLE_FREQUENCIES_SYS</id>
-- <description>The NEST frequencies that the system can support. This is a bit-wise value that represents which of the possible nest frequencies are supported : 2.0GHz, 2.4GHz, or both.
-+ <description>The NEST frequencies that the system can support. This is a bit-wise value that represents which of the possible nest frequencies are supported. : 2.0GHz, 2.4GHz, or both. New frequencies should be added in ascending order.
- </description>
- <simpleType>
- <enumeration>
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index aa15197..b1816c5 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
#
################################################################################
-HOSTBOOT_VERSION ?= a67ea7384ec6c326cfe553ee235b13eb434adee7
+HOSTBOOT_VERSION ?= 731725c50fbf662ca9d7e964e7f93529a04e87f0
HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
HOSTBOOT_LICENSE = Apache-2.0
diff --git a/openpower/package/palmetto-xml/palmetto-xml.mk b/openpower/package/palmetto-xml/palmetto-xml.mk
index 771574b..bcdee08 100644
--- a/openpower/package/palmetto-xml/palmetto-xml.mk
+++ b/openpower/package/palmetto-xml/palmetto-xml.mk
@@ -4,7 +4,7 @@
#
################################################################################
-PALMETTO_XML_VERSION = 92fe7abe1ab5cb328390762e3437e39f3a812839
+PALMETTO_XML_VERSION = 8ce36f33a1b4f3467488a57bba733c16bfc161f8
PALMETTO_XML_SITE = $(call github,open-power,palmetto-xml,$(PALMETTO_XML_VERSION))
PALMETTO_XML_LICENSE = Apache-2.0