diff --git a/openpower/package/hostboot/hostboot-0004-Downgrade-OCC-Config-Data-Version-if-no-FIR-Master.patch b/openpower/package/hostboot/hostboot-0004-Downgrade-OCC-Config-Data-Version-if-no-FIR-Master.patch
deleted file mode 100644
index 4cda4f5..0000000
--- a/openpower/package/hostboot/hostboot-0004-Downgrade-OCC-Config-Data-Version-if-no-FIR-Master.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 93266f96f39f038fc8ad396a5df316c07980f4bf Mon Sep 17 00:00:00 2001
-From: Dan Crowell <dcrowell@us.ibm.com>
-Date: Sat, 28 Feb 2015 11:54:47 -0600
-Subject: [PATCH 3/4] Downgrade OCC Config Data Version if no FIR Master
-
-Change-Id: Idc48298a9c3068da2216172da474ebff93eb3839
-(cherry picked from commit f84f34cc5628d9e7d7d55d0e95462b3fe22d80d5)
----
- src/include/usr/hwpf/hwp/occ/occ_common.H |    2 ++
- src/usr/hwpf/hwp/occ/occ_common.C         |    3 +++
- 2 files changed, 5 insertions(+), 0 deletions(-)
-
-diff --git a/src/include/usr/hwpf/hwp/occ/occ_common.H b/src/include/usr/hwpf/hwp/occ/occ_common.H
-index ca7ab39..7ddb302 100644
---- a/src/include/usr/hwpf/hwp/occ/occ_common.H
-+++ b/src/include/usr/hwpf/hwp/occ/occ_common.H
-@@ -58,6 +58,8 @@ namespace HBOCC
-     enum
-     {
-         OccHostDataVersion = 3,
-+        PRE_FIR_MASTER_VERSION = 2,
-+
-         OCC_LIDID = 0x81e00430,
-         OCC_IBSCOM_RANGE_IN_MB = MEGABYTE,
- 
-diff --git a/src/usr/hwpf/hwp/occ/occ_common.C b/src/usr/hwpf/hwp/occ/occ_common.C
-index 98e6382..0373727 100644
---- a/src/usr/hwpf/hwp/occ/occ_common.C
-+++ b/src/usr/hwpf/hwp/occ/occ_common.C
-@@ -170,6 +170,9 @@ namespace HBOCC
-         }
- #else
-         config_data->firMaster = 0;
-+        //force to an older version so we can support
-+        // older levels of OCC
-+        config_data->version = PRE_FIR_MASTER_VERSION;
- #endif
- 
-         TRACUCOMP( g_fapiTd,
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0006-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch b/openpower/package/hostboot/hostboot-0004-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0006-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch
rename to openpower/package/hostboot/hostboot-0004-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch
diff --git a/openpower/package/hostboot/hostboot-0008-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch b/openpower/package/hostboot/hostboot-0005-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
similarity index 86%
rename from openpower/package/hostboot/hostboot-0008-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
rename to openpower/package/hostboot/hostboot-0005-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
index 05ea39a..43b5c43 100644
--- a/openpower/package/hostboot/hostboot-0008-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
+++ b/openpower/package/hostboot/hostboot-0005-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
@@ -1,7 +1,7 @@
-From de6b906bd93e0928cd5464418091268aa7a5ac78 Mon Sep 17 00:00:00 2001
+From e02245750b63a6b892ee48f1422309c8dd4f0c4f Mon Sep 17 00:00:00 2001
 From: Corey Swenson <cswenson@us.ibm.com>
 Date: Fri, 27 Feb 2015 09:45:47 -0600
-Subject: [PATCH 1/3] Disable SPD writes - workaround for DRAM repairs error
+Subject: [PATCH 2/4] Disable SPD writes - workaround for DRAM repairs error
 
 Change-Id: Ic5fac400abff8fef004268dfbdf33fa6ecdded1c
 (cherry picked from commit 1bc5bb42be8e81b525993e9b5dcf08fe684bade4)
diff --git a/openpower/package/hostboot/hostboot-0005-Watchdog-timer-increase-to-7-minutes.patch b/openpower/package/hostboot/hostboot-0005-Watchdog-timer-increase-to-7-minutes.patch
deleted file mode 100644
index 321a067..0000000
--- a/openpower/package/hostboot/hostboot-0005-Watchdog-timer-increase-to-7-minutes.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 55b61605f1a58885e77d6737bfe36f957417a991 Mon Sep 17 00:00:00 2001
-From: Andrew Geissler <andrewg@us.ibm.com>
-Date: Wed, 25 Feb 2015 13:09:48 -0600
-Subject: [PATCH 1/2] Increase watchdog timout to 7.5 minutes
-
-Change-Id: I46070784c303e8135075bc5d36e17a2593ee494c
-RTC: 124676
----
- src/include/usr/ipmi/ipmiwatchdog.H |    7 +++++--
- 1 files changed, 5 insertions(+), 2 deletions(-)
-
-diff --git a/src/include/usr/ipmi/ipmiwatchdog.H b/src/include/usr/ipmi/ipmiwatchdog.H
-index f23b771..2296cc4 100644
---- a/src/include/usr/ipmi/ipmiwatchdog.H
-+++ b/src/include/usr/ipmi/ipmiwatchdog.H
-@@ -43,12 +43,15 @@ namespace IPMIWATCHDOG
- // Globals/Constants
- /******************************************************************************/
- /**
-- * @brief the default watchdog countdown setting it to 120 seconds.
-+ * @brief the default watchdog countdown setting it to 450 seconds.a
-+ *
-+ * Total time on 16x16GB on Habanero was 170s so double and add
-+ * some padding for max config 32 way Habanero.
-  *
-  * @TODO RTC:124499 revisit after performace improvments
-  *
-  */
--const uint16_t  DEFAULT_WATCHDOG_COUNTDOWN = 120;
-+const uint16_t  DEFAULT_WATCHDOG_COUNTDOWN = 450;
- 
- /**
-  * @brief the default watchdog countdown for transition between hostboot
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0006-Runtime-fixes-for-IPMI.patch b/openpower/package/hostboot/hostboot-0006-Runtime-fixes-for-IPMI.patch
new file mode 100644
index 0000000..011dae7
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0006-Runtime-fixes-for-IPMI.patch
@@ -0,0 +1,70 @@
+From 94cd1249c46be945efa92f09c41e27bfaacc9405 Mon Sep 17 00:00:00 2001
+From: Dan Crowell <dcrowell@us.ibm.com>
+Date: Sun, 1 Mar 2015 12:32:24 -0600
+Subject: [PATCH 1/4] Runtime fixes for IPMI
+
+-initialize trace buffer in IPMI runtime code
+-fix buffer mixup
+-fix netfn format for opal call
+
+Change-Id: I612431f81d40f1698b585353da9c245adf1447e1
+(cherry picked from commit f4998cabf6ff541de0624532a5fa46bdf96419d1)
+---
+ src/usr/ipmi/runtime/rt_ipmirp.C |   12 ++++++++----
+ 1 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/src/usr/ipmi/runtime/rt_ipmirp.C b/src/usr/ipmi/runtime/rt_ipmirp.C
+index f99723a..846e068 100644
+--- a/src/usr/ipmi/runtime/rt_ipmirp.C
++++ b/src/usr/ipmi/runtime/rt_ipmirp.C
+@@ -49,6 +49,8 @@
+ #include <runtime/interface.h>
+ 
+ trace_desc_t * g_trac_ipmi;
++TRAC_INIT(&g_trac_ipmi, IPMI_COMP_NAME, 6*KILOBYTE, TRACE::BUFFER_SLOW);
++
+ #define IPMI_TRAC(printf_string,args...) \
+     TRACFCOMP(g_trac_ipmi,"rt: "printf_string,##args)
+ 
+@@ -89,8 +91,9 @@ namespace IPMI
+         // if the buffer is too large this is a programming error.
+         assert(io_len <= max_buffer());
+ 
++        uint8_t netfn = i_cmd.first >> 2; //remove embedded LUN
+         IPMI_TRAC("calling sync %x:%x  len=%d",
+-            i_cmd.first, i_cmd.second, io_len);
++            netfn, i_cmd.second, io_len);
+ 
+         if(g_hostInterfaces && g_hostInterfaces->ipmi_msg)
+         {
+@@ -98,7 +101,7 @@ namespace IPMI
+             uint8_t *l_data = new uint8_t[l_len];
+ 
+             rc = g_hostInterfaces->ipmi_msg(
+-                        i_cmd.first, i_cmd.second,
++                        netfn, i_cmd.second,
+                         io_data, io_len,
+                         l_data, &l_len);
+ 
+@@ -124,7 +127,7 @@ namespace IPMI
+                             IPMI::MOD_IPMIRT,
+                             IPMI::RC_INVALID_SENDRECV,
+                             TWO_UINT32_TO_UINT64(rc,
+-                                TWO_UINT16_TO_UINT32(i_cmd.first, i_cmd.second)),
++                                TWO_UINT16_TO_UINT32(netfn, i_cmd.second)),
+                             io_len,
+                             true);
+                 err->collectTrace(IPMI_COMP_NAME);
+@@ -135,7 +138,8 @@ namespace IPMI
+             else
+             {
+                 // clean up the memory for the caller
+-                o_completion_code = static_cast<IPMI::completion_code>(io_data[0]);
++                o_completion_code =
++                  static_cast<IPMI::completion_code>(l_data[0]);
+ 
+                 // now need to create the buffer to return
+                 io_len = l_len - 1; // get rid of the completion_code
+-- 
+1.7.4.1
+
diff --git a/openpower/package/hostboot/hostboot-0007-Assert-called-when-trying-to-deconfigure-a-DIMM.patch b/openpower/package/hostboot/hostboot-0007-Assert-called-when-trying-to-deconfigure-a-DIMM.patch
deleted file mode 100644
index f3d6ff6..0000000
--- a/openpower/package/hostboot/hostboot-0007-Assert-called-when-trying-to-deconfigure-a-DIMM.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 5a3e8e0e91dfee9f7f6b1e31f07789e2c2788e21 Mon Sep 17 00:00:00 2001
-From: Richard J. Knight <rjknight@us.ibm.com>
-Date: Fri, 27 Feb 2015 19:45:56 -0600
-Subject: [PATCH 2/3] Assert called when trying to deconfigure a DIMM
-
-    -Remove assert call from default path. Assert
-     should not be called for targets without status
-     sensors. Path should be a no-op.
-
-Change-Id: Id1aa002ea3d79cf24b5c123cbd92647257d12093
-RTC:124846
-(cherry picked from commit eadb8a16b0f04ce10169091263297f3dc4372c9c)
----
- src/usr/ipmi/ipmisensor.C |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/src/usr/ipmi/ipmisensor.C b/src/usr/ipmi/ipmisensor.C
-index e5b4e64..a62e084 100644
---- a/src/usr/ipmi/ipmisensor.C
-+++ b/src/usr/ipmi/ipmisensor.C
-@@ -640,7 +640,7 @@ namespace SENSOR
-                 break;
- 
-             default:
--                assert(0, "No status sensor associated with target type 0x%x",
-+                TRACFCOMP(g_trac_ipmi,"INF>>No status sensor associated with target type 0x%x",
-                          i_target->getAttr<TARGETING::ATTR_TYPE>());
-                 break;
-         }
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0007-Update-DIMM_TEMP-Sensor-Enum.patch b/openpower/package/hostboot/hostboot-0007-Update-DIMM_TEMP-Sensor-Enum.patch
new file mode 100644
index 0000000..63ceb6e
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0007-Update-DIMM_TEMP-Sensor-Enum.patch
@@ -0,0 +1,28 @@
+From e929e3bdbabad39c4c21ed220b0be7078afe0ef7 Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Sun, 1 Mar 2015 18:38:45 -0600
+Subject: [PATCH 3/4] Update DIMM_TEMP Sensor Enum
+
+Change-Id: Ia850e56b85f13b4b421525541f547bde03cb4cbc
+RTC:124867
+(cherry picked from commit e9ad83fc6a2f0cc32826291c20d731337ba76f42)
+---
+ .../common/xmltohb/attribute_types_hb.xml          |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
+index 74fb492..3c00c33 100644
+--- a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
++++ b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
+@@ -917,7 +917,7 @@
+     </enumerator>
+     <enumerator>
+         <name>DIMM_TEMP</name>
+-        <value>0x01C0</value>
++        <value>0x0120</value>
+     </enumerator>
+     <enumerator>
+         <name>CORE_TEMP</name>
+-- 
+1.7.4.1
+
diff --git a/openpower/package/hostboot/hostboot-0009-GOLDEN-SBE-Update-Support-Reconcile-SBE-images-and-P.patch b/openpower/package/hostboot/hostboot-0009-GOLDEN-SBE-Update-Support-Reconcile-SBE-images-and-P.patch
deleted file mode 100644
index 94e4c49..0000000
--- a/openpower/package/hostboot/hostboot-0009-GOLDEN-SBE-Update-Support-Reconcile-SBE-images-and-P.patch
+++ /dev/null
@@ -1,2028 +0,0 @@
-From 842770c162544b35609528b205d7c015454593fa Mon Sep 17 00:00:00 2001
-From: Mike Baiocchi <baiocchi@us.ibm.com>
-Date: Tue, 17 Feb 2015 13:07:13 -0600
-Subject: [PATCH 4/7] GOLDEN SBE Update Support - Reconcile SBE images and PNOR sides
-
-This code adds a new function at istep 6 to reconcile the two
-SBE Seeproms with the PNOR side and mode (ie, 2-sided, golden, etc).
-It also updates what happens in istep 9 in SBE_UPDATE_INDEPENDENT
-mode.
-
-Change-Id: If71ca52338a179b8cf38cfa336d9790737844715
-RTC: 120734
-(cherry picked from commit fe9afa4e7a3b0eb0e9ae16abb943039aacf34e09)
----
- src/include/usr/sbe/sbeif.H            |   13 +-
- src/include/usr/sbe/sbereasoncodes.H   |   10 +-
- src/usr/hwpf/hwp/slave_sbe/slave_sbe.C |   12 +
- src/usr/sbe/HBconfig                   |    6 +-
- src/usr/sbe/makefile                   |    5 +-
- src/usr/sbe/sbe_resolve_sides.C        | 1363 ++++++++++++++++++++++++++++++++
- src/usr/sbe/sbe_resolve_sides.H        |  259 ++++++
- src/usr/sbe/sbe_update.C               |  124 +++-
- 8 files changed, 1753 insertions(+), 39 deletions(-)
- create mode 100644 src/usr/sbe/sbe_resolve_sides.C
- create mode 100644 src/usr/sbe/sbe_resolve_sides.H
-
-diff --git a/src/include/usr/sbe/sbeif.H b/src/include/usr/sbe/sbeif.H
-index 8706e91..9cf20c6 100644
---- a/src/include/usr/sbe/sbeif.H
-+++ b/src/include/usr/sbe/sbeif.H
-@@ -5,7 +5,9 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* COPYRIGHT International Business Machines Corp. 2013,2014              */
-+/* Contributors Listed Below - COPYRIGHT 2013,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.       */
-@@ -66,6 +68,15 @@ namespace SBE
-      */
-     errlHndl_t updateProcessorSbeSeeproms();
- 
-+    /**
-+     * @brief Iterates through all the functional processors and resolves
-+     *        the Hostboot Base Addresses (HBB) in each SBE Image and performs
-+     *        any necessary operations related to GOLDEN side support.
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t resolveProcessorSbeSeeproms();
-+
- 
- } //end namespace SBE
- 
-diff --git a/src/include/usr/sbe/sbereasoncodes.H b/src/include/usr/sbe/sbereasoncodes.H
-index a09bb68..effb69e 100644
---- a/src/include/usr/sbe/sbereasoncodes.H
-+++ b/src/include/usr/sbe/sbereasoncodes.H
-@@ -5,7 +5,9 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* COPYRIGHT International Business Machines Corp. 2013,2014              */
-+/* Contributors Listed Below - COPYRIGHT 2013,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.       */
-@@ -54,6 +56,10 @@ enum sbeModuleId
-     SBE_CUSTOMIZE_IMG                   = 0x0B,
-     SBE_PERFORM_UPDATE_ACTIONS          = 0x0C,
-     SBE_MASTER_VERSION_COMPARE          = 0x0D,
-+    SBE_RESOLVE_HBB_ADDR                = 0x0E,
-+    SBE_READ_SBE_IMAGE                  = 0x0F,
-+    SBE_WRITE_SBE_IMAGE                 = 0x10,
-+    SBE_GET_SBE_IMAGE_SIZE              = 0x11,
- };
- 
- /**
-@@ -91,6 +97,8 @@ enum sbeReasonCode
-     SBE_MISCOMPARE_WITH_MASTER_VERSION  = SBE_COMP_ID | 0x13,
-     SBE_ERROR_ON_UPDATE                 = SBE_COMP_ID | 0x14,
-     SBE_MASTER_VERSION_DOWNLEVEL        = SBE_COMP_ID | 0x15,
-+    SBE_IMAGE_GET_SET_SCALAR_FAIL       = SBE_COMP_ID | 0x16,
-+
- };
- 
- };  // end SBE
-diff --git a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-index 49225a4..fe568e2 100644
---- a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-+++ b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-@@ -175,6 +175,18 @@ void* call_host_slave_sbe_config(void *io_pArgs)
- 
-         }
-     }
-+
-+    // Resolve the side characteristics of the Processor SBE Seeproms
-+    errlHndl_t err = SBE::resolveProcessorSbeSeeproms();
-+    if ( err )
-+    {
-+        // Create IStep error log and cross reference error that occurred
-+        l_stepError.addErrorDetails( err );
-+
-+        // Commit Error
-+        errlCommit( err, HWPF_COMP_ID );
-+    }
-+
-     TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
-                "call_host_slave_sbe_config exit" );
- 
-diff --git a/src/usr/sbe/HBconfig b/src/usr/sbe/HBconfig
-index 0fa2441..fd2a8d0 100644
---- a/src/usr/sbe/HBconfig
-+++ b/src/usr/sbe/HBconfig
-@@ -20,9 +20,9 @@ config SBE_UPDATE_INDEPENDENT
-     depends on !SBE_UPDATE_SEQUENTIAL && !SBE_UPDATE_SIMULTANEOUS
-     help
-         If an update is necessary, and if the "current" SBE SEEPROM of this
--        IPL is not the 'GOLDEN' SBE SEEPROM, then only the current SBE SEEPROM
--        will be updated.  After the update a re-IPL request will be issued.
--        The other SBE SEEPROM, whether 'GOLDEN' or not, will not be updated.
-+        IPL is not pointing at PNOR's 'GOLDEN' side, then only the current SBE
-+        SEEPROM will be updated.  After the update a re-IPL request will be
-+        issued. The other SBE SEEPROM will not be updated.
- 
- config NO_SBE_UPDATES
-     default n
-diff --git a/src/usr/sbe/makefile b/src/usr/sbe/makefile
-index 06159ff..c45206e 100644
---- a/src/usr/sbe/makefile
-+++ b/src/usr/sbe/makefile
-@@ -5,7 +5,9 @@
- #
- # OpenPOWER HostBoot Project
- #
--# COPYRIGHT International Business Machines Corp. 2013,2014
-+# Contributors Listed Below - COPYRIGHT 2013,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.
-@@ -36,6 +38,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/include
- EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build
- 
- OBJS += sbe_update.o
-+OBJS += sbe_resolve_sides.o
- 
- SUBDIRS += test.d
- 
-diff --git a/src/usr/sbe/sbe_resolve_sides.C b/src/usr/sbe/sbe_resolve_sides.C
-new file mode 100644
-index 0000000..df9958d
---- /dev/null
-+++ b/src/usr/sbe/sbe_resolve_sides.C
-@@ -0,0 +1,1363 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/sbe/sbe_resolve_sides.C $                             */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 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.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+
-+#include <trace/interface.H>
-+#include <errl/errlentry.H>
-+#include <errl/errlmanager.H>
-+#include <errl/errludtarget.H>
-+#include <errl/errlreasoncodes.H>
-+#include <errl/hberrltypes.H>
-+#include <targeting/common/predicates/predicatectm.H>
-+#include <targeting/common/utilFilter.H>
-+#include <targeting/common/targetservice.H>
-+#include <util/misc.H>
-+#include <pnor/pnorif.H>
-+#include <pnor/ecc.H>
-+#include <devicefw/driverif.H>
-+#include <sys/mm.h>
-+#include <sys/misc.h>
-+#include <hwas/common/deconfigGard.H>
-+#include <initservice/initserviceif.H>
-+#include <config.h>
-+#include <ipmi/ipmiwatchdog.H>
-+#include <ipmi/ipmisensor.H>
-+#include <sbe/sbeif.H>
-+#include <sbe/sbereasoncodes.H>
-+#include "sbe_resolve_sides.H"
-+#include "sbe_update.H"
-+
-+//  fapi support
-+#include    <fapi.H>
-+#include    <fapiHwpExecutor.H>
-+#include    <hwpf/plat/fapiPlatHwpInvoker.H>
-+#include    <hwpf/plat/fapiPlatTrace.H>
-+
-+//Procedures
-+#include <p8_xip_customize.H>
-+#include <sbe_xip_image.h>
-+#include <p8_image_help_base.H>
-+
-+// ----------------------------------------------
-+// Trace definitions
-+// ----------------------------------------------
-+extern trace_desc_t* g_trac_sbe;
-+
-+// ------------------------
-+// Macros for unit testing
-+//#define TRACUCOMP(args...)  TRACFCOMP(args)
-+#define TRACUCOMP(args...)
-+
-+
-+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,
-+        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 resolveProcessorSbeSeeproms()
-+{
-+    errlHndl_t err = NULL;
-+    errlHndl_t err_cleanup = NULL;
-+    sbeResolveState_t sideState;
-+    bool l_cleanupVmmSpace = false;
-+    bool l_restartNeeded   = false;
-+
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"resolveProcessorSbeSeeproms()" );
-+
-+    do{
-+
-+#ifdef CONFIG_NO_SBE_UPDATES
-+        TRACFCOMP( g_trac_sbe, INFO_MRK"resolveProcessorSbeSeeproms() -  "
-+                   "SBE updates not configured");
-+        break;
-+#endif
-+
-+#ifdef CONFIG_SBE_UPDATE_SIMULTANEOUS
-+        TRACFCOMP( g_trac_sbe, INFO_MRK"resolveProcessorSbeSeeproms() - "
-+                   "Do Nothing in SBE_UPDATE_SIMULTANEOUS mode");
-+        break;
-+#endif
-+
-+#ifdef CONFIG_SBE_UPDATE_SEQUENTIAL
-+        // Check if FSP-services are enabled and if we're running in simics
-+        if ( !INITSERVICE::spBaseServicesEnabled() &&
-+             !Util::isSimicsRunning() )
-+        {
-+            assert (false, "resolveProcessorSbeSeeproms() - "
-+                    "SBE_UPDATE_SEQUENTIAL mode, but FSP-services are not "
-+                    "enabled - Invalid Configuration");
-+        }
-+        else
-+        {
-+            TRACUCOMP( g_trac_sbe, INFO_MRK"resolveProcessorSbeSeeproms() - "
-+                       "Do Nothing in SBE_UPDATE_INDEPENDENT mode with FSP-"
-+                       "services enabled or running in simics");
-+             break;
-+        }
-+#endif
-+
-+        // Get Target Service, and the system target.
-+        TargetService& tS = targetService();
-+        TARGETING::Target* sys = NULL;
-+        (void) tS.getTopLevelTarget( sys );
-+        assert(sys, "resolveProcessorSbeSeeproms() system target is NULL");
-+
-+
-+        //Make sure procedure constants keep within expected range.
-+        assert((FIXED_SEEPROM_WORK_SPACE <= VMM_SBE_UPDATE_SIZE/2),
-+               "resolveProcessorSbeSeeproms() FIXED_SEEPROM_WORK_SPACE "
-+               "too large");
-+        assert((FIXED_RING_BUF_SIZE <= VMM_SBE_UPDATE_SIZE/4),
-+               "resolveProcessorSbeSeeproms() FIXED_RING_BUF_SIZE too "
-+               "large");
-+
-+        // Create VMM space for p8_xip_customize() procedure
-+        err = createSbeImageVmmSpace();
-+        if (err)
-+        {
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"resolveProcessorSbeSeeproms: "
-+                       "createSbeImageVmmSpace() Failed. ",
-+                       "rc=0x%.4X", err->reasonCode() );
-+
-+            break;
-+        }
-+        else
-+        {
-+            // Make sure cleanup gets called
-+            l_cleanupVmmSpace = true;
-+        }
-+
-+        /*****************************************************************/
-+        /*  Iterate over all the functional processors and do for each:  */
-+        /*****************************************************************/
-+        TARGETING::TargetHandleList procList;
-+        TARGETING::getAllChips(procList,
-+                               TARGETING::TYPE_PROC,
-+                               true); // true: return functional targets
-+
-+        if( ( 0 == procList.size() ) ||
-+            ( NULL == procList[0] ) )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"resolveProcessorSbeSeeproms() - "
-+                       "No functional processors Found!" );
-+            break;
-+        }
-+
-+        for(uint32_t i=0; i<procList.size(); i++)
-+        {
-+            /***********************************************/
-+            /*  Get Side This Processor did/will boot from */
-+            /***********************************************/
-+            memset(&sideState, 0, sizeof(sideState));
-+            sideState.tgt = procList[i];
-+
-+            err = getSideState(sideState);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "resolveProcessorSbeSeeproms: Error returned "
-+                           "from getSideState() "
-+                           "rc=0x%.4X, Target UID=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(sideState.tgt));
-+                // Don't break - handle error at the end of the loop
-+            }
-+
-+
-+            /**********************************************/
-+            /*  Determine the necessary actions           */
-+            /**********************************************/
-+            // Skip if we got an error previously
-+            if ( err == NULL )
-+            {
-+                err = getSideActions(sideState);
-+                if (err)
-+                {
-+                    TRACFCOMP( g_trac_sbe,
-+                               INFO_MRK"resolveProcessorSbeSeeproms: "
-+                               "getSideActions() Failed "
-+                               "rc=0x%.4X, Target UID=0x%X",
-+                               err->reasonCode(),
-+                               TARGETING::get_huid(sideState.tgt));
-+
-+                    // Don't break - handle error at the end of the loop,
-+                }
-+            }
-+
-+            /**********************************************/
-+            /*  Perform the necessary actions             */
-+            /**********************************************/
-+            // Skip if we got an error previously
-+            if ( err == NULL )
-+            {
-+                err = performSideActions(sideState);
-+                if (err)
-+                {
-+                    TRACFCOMP( g_trac_sbe,
-+                               INFO_MRK"resolveProcessorSbeSeeproms: "
-+                               "performSideActions() Failed "
-+                               "rc=0x%.4X, Target UID=0x%X",
-+                               err->reasonCode(),
-+                               TARGETING::get_huid(sideState.tgt));
-+
-+                    // Don't break - handle error at the end of the loop,
-+                }
-+                else
-+                {
-+                    // Target updated without failure, so set IPL_RESTART
-+                    // flag, if necessary
-+                    if (sideState.actions & REIPL)
-+                    {
-+                       l_restartNeeded   = true;
-+                    }
-+                }
-+            }
-+
-+            /**********************************************/
-+            /*  Handle Errors                             */
-+            /**********************************************/
-+
-+            if ( err )
-+            {
-+                // Something failed for this target.
-+
-+                // Commit the error here and move on to the next target,
-+                // or if no targets left, will just continue the IPL
-+                TRACFCOMP( g_trac_sbe,
-+                           INFO_MRK"resolveProcessorSbeSeeproms: "
-+                           "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                           "plid=0x%.8X for Target UID=0x%X, but "
-+                           "continuing procedure",
-+                           err->reasonCode(),
-+                           err->eid(),
-+                           err->plid(),
-+                           TARGETING::get_huid(sideState.tgt));
-+                errlCommit( err, SBE_COMP_ID );
-+            }
-+
-+
-+        } //end of Target for loop collecting each target's SBE State
-+
-+
-+        /**************************************************************/
-+        /*  Perform System Operation                                  */
-+        /**************************************************************/
-+        // Restart IPL if SBE Update requires it
-+        if ( l_restartNeeded == true )
-+        {
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"resolveProcessorSbeSeeprom: Restart "
-+                       "Needed (%d).",
-+                       l_restartNeeded);
-+
-+#ifdef CONFIG_BMC_IPMI
-+                sbePreShutdownIpmiCalls();
-+#endif
-+
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"resolveProcessorSbeSeeproms: Calling "
-+                       "INITSERVICE::doShutdown() with "
-+                       "SBE_UPDATE_REQUEST_REIPL = 0x%X",
-+                       SBE_UPDATE_REQUEST_REIPL );
-+            INITSERVICE::doShutdown(SBE_UPDATE_REQUEST_REIPL);
-+        }
-+
-+    }while(0);
-+
-+
-+    // Cleanup VMM Workspace
-+    if ( l_cleanupVmmSpace == true )
-+    {
-+        err_cleanup = cleanupSbeImageVmmSpace();
-+        if ( err_cleanup != NULL )
-+        {
-+
-+            if ( err != NULL )
-+            {
-+                // 2 error logs, so commit the cleanup log here
-+                TRACFCOMP( g_trac_sbe,
-+                           ERR_MRK"resolveProcessorSbeSeeproms: Previous "
-+                           "error (rc=0x%X) before cleanupSbeImageVmmSpace"
-+                           "() failed.  Committing cleanup error (rc=0x%X) "
-+                           "and returning original error",
-+                           err->reasonCode(), err_cleanup->reasonCode()  );
-+
-+                 errlCommit( err_cleanup, SBE_COMP_ID );
-+            }
-+            else
-+            {
-+                // no previous error, so returning cleanup error
-+                TRACFCOMP( g_trac_sbe,
-+                           ERR_MRK"resolveProcessorSbeSeeproms: "
-+                           "cleanupSbeImageVmmSpace() failed.",
-+                           "rc=0x%.4X", err_cleanup->reasonCode() );
-+                err = err_cleanup;
-+            }
-+        }
-+    }
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"resolveProcessorSbeSeeproms()" );
-+
-+    return err;
-+}
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t getSideState(sbeResolveState_t& io_sideState)
-+{
-+    errlHndl_t err = NULL;
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"getSideState()" );
-+
-+    do{
-+
-+        /***********************************************/
-+        /*  Get Side This Processor did/will boot from */
-+        /***********************************************/
-+        PNOR::sbeSeepromSide_t tmp_cur_side = PNOR::SBE_SEEPROM_INVALID;
-+        err = PNOR::getSbeBootSeeprom(io_sideState.tgt, tmp_cur_side);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK
-+                       "resolveProcessorSbeSeeproms() - Error returned "
-+                       "from PNOR::getSbeBootSeeprom() "
-+                       "rc=0x%.4X, Target UID=0x%X",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(io_sideState.tgt));
-+            break;
-+        }
-+
-+        io_sideState.cur_side = tmp_cur_side;
-+
-+        io_sideState.alt_side = (tmp_cur_side == PNOR::SBE_SEEPROM0)
-+                                 ? PNOR::SBE_SEEPROM1 : PNOR::SBE_SEEPROM0;
-+
-+        /**********************************************/
-+        /*  Get PNOR Side Information                 */
-+        /**********************************************/
-+        PNOR::SideId tmp_side = PNOR::WORKING;
-+        PNOR::SideInfo_t tmp_side_info;
-+        err = PNOR::getSideInfo (tmp_side, tmp_side_info);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK
-+                       "resolveProcessorSbeSeeproms() - Error returned "
-+                       "from PNOR::getSideInfo() "
-+                       "rc=0x%.4X, Target UID=0x%X",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(io_sideState.tgt));
-+            break;
-+        }
-+
-+        io_sideState.pnor_sideId       = tmp_side_info.id;
-+        io_sideState.pnor_side         = tmp_side_info.side;
-+        io_sideState.pnor_isGolden     = tmp_side_info.isGolden;
-+        io_sideState.pnor_hasOtherSide = tmp_side_info.hasOtherSide;
-+
-+    }while(0);
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"getSideState(): cur/alt=%d/%d. Side-%c(%d): "
-+               "isGolden=%d, hasOtherSide=%d",
-+               io_sideState.cur_side, io_sideState.alt_side,
-+               io_sideState.pnor_side, io_sideState.pnor_sideId,
-+               io_sideState.pnor_isGolden, io_sideState.pnor_hasOtherSide );
-+
-+    return err;
-+}
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t getSideActions(sbeResolveState_t& io_sideState)
-+{
-+    errlHndl_t err = NULL;
-+    uint32_t l_actions = NO_ACTIONS;
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"getSideActions()" );
-+
-+    do{
-+
-+        // Check if PNOR is running from its GOLDEN side
-+        if ( io_sideState.pnor_isGolden == true )
-+        {
-+
-+            // If Booting From Seeprom that is pointing to PNOR's GOLDEN Side
-+            // and is possibly the READ_ONLY_SEEPROM - No Re-IPL
-+            if ( io_sideState.cur_side == READ_ONLY_SEEPROM )
-+            {
-+                l_actions |= COPY_READ_ONLY_TO_WORKING;
-+                io_sideState.update_side = io_sideState.alt_side;
-+#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+                // Need info from PNOR's non-working side for update side
-+                l_actions |= USE_PNOR_ALT_SIDE;
-+                TRACUCOMP( g_trac_sbe, "getSideActions(): Asking for "
-+                           "USE_PNOR_ALT_SIDE: actions=0x%X", l_actions);
-+#endif
-+            }
-+            else
-+            {
-+                // non-READ_ONLY_SEEPROM is pointing to PNOR's GOLDEN side
-+                // This requires an update and re-IPL (Possibly Genesis Mode)
-+                l_actions |= COPY_READ_ONLY_TO_WORKING;
-+                l_actions |= REIPL;
-+                io_sideState.update_side = io_sideState.cur_side;
-+
-+#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+                // Need info from PNOR's non-working side for update side
-+                l_actions |= USE_PNOR_ALT_SIDE;
-+                TRACUCOMP( g_trac_sbe, "getSideActions(): Asking for "
-+                           "USE_PNOR_ALT_SIDE: actions=0x%X", l_actions);
-+#endif
-+
-+            }
-+        }
-+
-+        // Even though READ_ONLY_SEEPROM is not pointing to PNOR's GOLDEN side,
-+        // treat like it is if there is only 1 side (ie, Palmetto configuration)
-+        else if (  ( io_sideState.pnor_hasOtherSide == false ) &&
-+                   ( io_sideState.cur_side == READ_ONLY_SEEPROM ) )
-+        {
-+            l_actions |= COPY_READ_ONLY_TO_WORKING;
-+            io_sideState.update_side = io_sideState.alt_side;
-+        }
-+
-+        else // current Seeprom not pointing to PNOR's GOLDEN side
-+        {
-+            l_actions |= CHECK_WORKING_HBB;
-+            io_sideState.update_side = io_sideState.cur_side;
-+            // REIPL action will be determined later
-+        }
-+
-+        io_sideState.actions = l_actions;
-+
-+        TRACUCOMP( g_trac_sbe, "getSideActions() Tgt=0x%X: "
-+                   "pnor_isGolden/hasOtherSide=%d/%d, actions=0x%.8X, "
-+                   "Update Side=0x%X, cur=%d",
-+                   TARGETING::get_huid(io_sideState.tgt),
-+                   io_sideState.pnor_isGolden, io_sideState.pnor_hasOtherSide,
-+                   io_sideState.actions,
-+                   io_sideState.update_side,
-+                   io_sideState.cur_side);
-+
-+    }while(0);
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"getSideActions()" );
-+
-+    return err;
-+}
-+
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t performSideActions(sbeResolveState_t& io_sideState)
-+{
-+    errlHndl_t err = NULL;
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"performSideActions()" );
-+
-+    bool updateForHBB = false;
-+    size_t image_size = 0;
-+    sbeSeepromVersionInfo_t image_version;
-+
-+    do{
-+        if ( io_sideState.actions & COPY_READ_ONLY_TO_WORKING )
-+        {
-+            // Copy READ_ONLY SBE Seeprom Image to Memory
-+            err = readSbeImage(io_sideState.tgt,
-+                               reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                               READ_ONLY_SEEPROM,
-+                               image_size,
-+                               image_version);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "getSetSbeImage() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X, image_size=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions, image_size);
-+                break;
-+            }
-+        }
-+
-+        if ( io_sideState.actions & CHECK_WORKING_HBB )
-+        {
-+
-+            // Copy current SBE Seeprom Image to Memory
-+            // NOTE: Seprate section from above because of possible future
-+            // improvement to use MBPD SB Keyword bit to keep track of HBB
-+
-+            err = readSbeImage(io_sideState.tgt,
-+                                 reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                 io_sideState.update_side,
-+                                 image_size,
-+                                 image_version);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "getSetSbeImage() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X, image_size=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions, image_size);
-+                break;
-+            }
-+
-+        }
-+
-+
-+        if ( ( io_sideState.actions & COPY_READ_ONLY_TO_WORKING ) ||
-+             ( io_sideState.actions & CHECK_WORKING_HBB ) )
-+        {
-+            // verify HBB
-+            PNOR::SideId pnor_side = PNOR::WORKING;
-+
-+#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+            // In certain situations need info from Alternate PNOR
-+            if ( io_sideState.actions & USE_PNOR_ALT_SIDE)
-+            {
-+                pnor_side = PNOR::ALTERNATE;
-+            }
-+#endif
-+
-+
-+
-+            err = resolveImageHBBaddr(io_sideState.tgt,
-+                                      reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                      io_sideState.update_side,
-+                                      pnor_side,
-+                                      updateForHBB);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "resolveImageHBBaddr() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions);
-+                break;
-+            }
-+
-+            // Since HBB was updated, we need to re-IPL if not booting on
-+            // READ_ONLY seeprom
-+            if ( ( updateForHBB == true ) &&
-+                 ( io_sideState.cur_side != READ_ONLY_SEEPROM ) )
-+            {
-+                io_sideState.actions |= REIPL;
-+                TRACUCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: resolveImageHBBaddr returned "
-+                           "updateForHBB=%d, and not on READ_ONLY_SEEPROM so "
-+                           "REIPL (actions=0x%X)",
-+                           updateForHBB, io_sideState.actions);
-+            }
-+        }
-+
-+        if ( ( io_sideState.actions & COPY_READ_ONLY_TO_WORKING ) ||
-+             ( updateForHBB == true ) )
-+        {
-+            //  Write Seeprom Image from memory to Seeprom
-+            err = writeSbeImage(io_sideState.tgt,
-+                                reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                io_sideState.update_side,
-+                                image_size,
-+                                image_version);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "getSetSbeImage() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions);
-+                break;
-+            }
-+        }
-+
-+    }while(0);
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"performSideActions()" );
-+
-+    return err;
-+}
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t readSbeImage(TARGETING::Target* i_target,
-+                        void* o_imgPtr,
-+                        PNOR::sbeSeepromSide_t i_side,
-+                        size_t& o_image_size,
-+                        sbeSeepromVersionInfo_t& o_image_version)
-+{
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"readSbeImage(): tgt=0x%X, i_side=%d "
-+               "o_imgPtr=%p, o_image_size=0x%X",
-+               TARGETING::get_huid(i_target), i_side, o_imgPtr, o_image_size);
-+
-+    errlHndl_t err = NULL;
-+    int64_t rc = 0;
-+    PNOR::ECC::eccStatus eccStatus = PNOR::ECC::CLEAN;
-+    EEPROM::eeprom_chip_types_t l_seeprom = sbe_side_sync[i_side];
-+    size_t image_size_ECC = 0;
-+
-+    // Need to ensure that io_imgPtr is at SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
-+    // since we need to use the VMM_VADDR_SBE_UPDATE space
-+    assert ( o_imgPtr == reinterpret_cast<void*>(SBE_IMG_VADDR),
-+             "getSetSbeImage() - o_imgPtr is not at SBE_IMG_VADDR");
-+
-+    do{
-+
-+        // Clear out back half of page block to use as temp space
-+        // for ECC injected SBE Image.
-+        rc = mm_remove_pages(RELEASE,
-+                             reinterpret_cast<void*>
-+                             (SBE_ECC_IMG_VADDR),
-+                             SBE_ECC_IMG_MAX_SIZE);
-+        if( rc )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"getSetSbeImage() - Error "
-+                           "from mm_remove_pages : rc=%d,  HUID=0x%.8X.",
-+                           rc, TARGETING::get_huid(i_target) );
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_READ_SBE_IMAGE
-+             * @reasoncode   SBE_REMOVE_PAGES_FOR_EC
-+             * @userdata1    Requested Address
-+             * @userdata2    rc from mm_remove_pages
-+             * @devdesc      updateProcessorSbeSeeproms> mm_remove_pages
-+             *               RELEASE failed
-+             * @custdesc     A problem occurred while updating processor
-+             *               boot code.
-+             */
-+            err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
-+                                SBE_READ_SBE_IMAGE,
-+                                SBE_REMOVE_PAGES_FOR_EC,
-+                                TO_UINT64(SBE_ECC_IMG_VADDR),
-+                                TO_UINT64(rc),
-+                                true /*Add HB SW Callout*/ );
-+
-+            //Target isn't directly related to fail, but could be useful
-+            // to see how far we got before failing.
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+            err->collectTrace(SBE_COMP_NAME);
-+            break;
-+        }
-+
-+        /*****************************************/
-+        /*  Get Image Size                       */
-+        /*****************************************/
-+        err = getSbeImageSize(i_target,
-+                              o_imgPtr,
-+                              i_side,
-+                              o_image_size);
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: - Error from "
-+                       "getSbeImageSize(): rc=0x%.4X, side=%d, HUID=0x%.8X.",
-+                       err->reasonCode(),
-+                       i_side, TARGETING::get_huid(i_target));
-+            break;
-+        }
-+
-+
-+        /*****************************************/
-+        /*  Do Actual Read                       */
-+        /*****************************************/
-+        image_size_ECC = ALIGN_8((o_image_size*9)/8);
-+
-+        assert(image_size_ECC <= SBE_ECC_IMG_MAX_SIZE,
-+               "getSetSbeImage() SBE Image with ECC too large");
-+
-+        // Read image to memory space
-+        err = DeviceFW::deviceOp(
-+                          DeviceFW::READ,
-+                          i_target,
-+                          reinterpret_cast<void*>
-+                            (SBE_ECC_IMG_VADDR),
-+                          image_size_ECC,
-+                          DEVICE_EEPROM_ADDRESS(
-+                                        l_seeprom,
-+                                        SBE_IMAGE_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: - Error "
-+                       "from EEPROM op: rc=0x%.4X, seeprom=%d (side=%d). "
-+                       "HUID=0x%.8X. SBE_VADDR=0x%.16X, ECC_VADDR=0x%.16X, "
-+                       "size=0x%.8X, eccSize=0x%.8X, EEPROM offset=0x%X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target),
-+                       SBE_IMG_VADDR, SBE_ECC_IMG_VADDR, o_image_size,
-+                       image_size_ECC, SBE_IMAGE_SEEPROM_ADDRESS);
-+            break;
-+        }
-+
-+        /*****************************************/
-+        /*  Remove ECC From Image                */
-+        /*****************************************/
-+
-+        // Clear destination
-+        memset( o_imgPtr, 0, MAX_SEEPROM_IMAGE_SIZE );
-+
-+        // Remove ECC
-+        eccStatus = PNOR::ECC::removeECC(reinterpret_cast<uint8_t*>
-+                                             (SBE_ECC_IMG_VADDR),
-+                                         reinterpret_cast<uint8_t*>
-+                                             (o_imgPtr),
-+                                         image_size_ECC);
-+
-+        // Fail if uncorrectable ECC
-+        if ( eccStatus == PNOR::ECC::UNCORRECTABLE )
-+        {
-+            // There is an ECC issue with this SEEPROM
-+
-+            TRACFCOMP( g_trac_sbe,ERR_MRK"readSbeImage: ECC Error "
-+                       "On SBE Image Read eccStatus=%d sI=%d, sI_ECC="
-+                       "%d, HUID=0x%.8X, Seeprom %d (side=%d)",
-+                       eccStatus, o_image_size, image_size_ECC,
-+                       TARGETING::get_huid(i_target),
-+                       l_seeprom, i_side );
-+
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_READ_SBE_IMAGE
-+             * @reasoncode   SBE_ECC_FAIL
-+             * @userdata1[0:15]     ECC Status
-+             * @userdata1[16:31]    SEEPROM Side
-+             * @userdata1[32:63]    Target HUID
-+             * @userdata2[0:31]     Size - No Ecc
-+             * @userdata2[32:63]    Size - ECC
-+             * @devdesc      ECC Fail Reading SBE Image
-+             */
-+            err = new ErrlEntry(ERRL_SEV_PREDICTIVE,
-+                                SBE_READ_SBE_IMAGE,
-+                                SBE_ECC_FAIL,
-+                                TWO_UINT32_TO_UINT64(
-+                                     ( (eccStatus << 16 ) |
-+                                       l_seeprom ),
-+                                     TARGETING::get_huid(i_target)),
-+                                TWO_UINT32_TO_UINT64(o_image_size,
-+                                                     image_size_ECC));
-+
-+            err->collectTrace(SBE_COMP_NAME);
-+
-+            err->addPartCallout(
-+                                 i_target,
-+                                 HWAS::SBE_SEEPROM_PART_TYPE,
-+                                 HWAS::SRCI_PRIORITY_HIGH,
-+                                 HWAS::NO_DECONFIG,
-+                                 HWAS::GARD_NULL );
-+
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+
-+            break;
-+
-+        } // ECC check
-+
-+
-+        // Read out SBE Version Info
-+        bool seeprom_ver_ECC_fail = false;
-+        err = getSeepromSideVersion(i_target,
-+                                    l_seeprom,
-+                                    o_image_version,
-+                                    seeprom_ver_ECC_fail);
-+
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: - Error "
-+                       "from getSeepromSideVersion: rc=0x%.4X, seeprom=%d "
-+                       "(side=%d). HUID=0x%.8X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target));
-+            break;
-+        }
-+
-+        else if (seeprom_ver_ECC_fail == true)
-+        {
-+            // For now, any issues will be addressed in SBE Update
-+            // later in the IPL
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: ECC fail=%d "
-+                       "Reading Seeprom Version seeprom=%d "
-+                       "(side=%d). HUID=0x%.8X",
-+                       seeprom_ver_ECC_fail, l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target));
-+        }
-+
-+        TRACDBIN(g_trac_sbe, "readSbeImage: SBE Info Version",
-+                 reinterpret_cast<uint8_t*>(&o_image_version),
-+                 sizeof(o_image_version));
-+
-+    }while(0);
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"readSbeImage() - eccStatus=%d, "
-+               "size=0x%X, size_ECC=0x%X",
-+               eccStatus, o_image_size, image_size_ECC);
-+
-+
-+    return err;
-+}
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t writeSbeImage(TARGETING::Target* i_target,
-+                          void* i_imgPtr,
-+                          PNOR::sbeSeepromSide_t i_side,
-+                          size_t i_image_size,
-+                          sbeSeepromVersionInfo_t& io_version)
-+
-+{
-+    TRACFCOMP( g_trac_sbe,
-+               ENTER_MRK"writeSbeImage(): tgt=0x%X, i_side=%d "
-+               "i_imgPtr=%p, i_image_size=0x%X",
-+               TARGETING::get_huid(i_target), i_side, i_imgPtr, i_image_size);
-+
-+    errlHndl_t err = NULL;
-+    int64_t rc = 0;
-+    EEPROM::eeprom_chip_types_t l_seeprom = sbe_side_sync[i_side];
-+    size_t image_size_ECC = 0;
-+
-+    // For Version Information
-+    size_t sbeInfoSize = sizeof(sbeSeepromVersionInfo_t);
-+    size_t sbeInfoSize_ECC = (sbeInfoSize*9)/8;
-+
-+    uint8_t * sbeInfo_data_ECC = static_cast<uint8_t*>
-+                                            (malloc(sbeInfoSize_ECC));
-+
-+
-+    // Need to ensure that io_imgPtr is at SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
-+    // since we need to use the VMM_VADDR_SBE_UPDATE space
-+    assert ( i_imgPtr == reinterpret_cast<void*>(SBE_IMG_VADDR),
-+             "writeSbeImage() - io_imgPtr is not at SBE_IMG_VADDR");
-+
-+    do{
-+
-+        // Clear out back half of page block to use as temp space
-+        // for ECC injected SBE Image.
-+        rc = mm_remove_pages(RELEASE,
-+                             reinterpret_cast<void*>
-+                             (SBE_ECC_IMG_VADDR),
-+                             SBE_ECC_IMG_MAX_SIZE);
-+        if( rc )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"writeSbeImage() - Error "
-+                       "from mm_remove_pages : rc=%d,  HUID=0x%.8X.",
-+                       rc, TARGETING::get_huid(i_target) );
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_WRITE_SBE_IMAGE
-+             * @reasoncode   SBE_REMOVE_PAGES_FOR_EC
-+             * @userdata1    Requested Address
-+             * @userdata2    rc from mm_remove_pages
-+             * @devdesc      updateProcessorSbeSeeproms> mm_remove_pages
-+             *               RELEASE failed
-+             * @custdesc     A problem occurred while updating processor
-+             *               boot code.
-+             */
-+
-+            err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
-+                                SBE_WRITE_SBE_IMAGE,
-+                                SBE_REMOVE_PAGES_FOR_EC,
-+                                TO_UINT64(SBE_ECC_IMG_VADDR),
-+                                TO_UINT64(rc),
-+                                true /*Add HB SW Callout*/ );
-+
-+            //Target isn't directly related to fail, but could be useful
-+            //to see how far we got before failing.
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+            err->collectTrace(SBE_COMP_NAME);
-+            break;
-+        }
-+
-+        // Inject ECC
-+        PNOR::ECC::injectECC(reinterpret_cast<uint8_t*>(i_imgPtr),
-+                             ALIGN_8(i_image_size),
-+                             reinterpret_cast<uint8_t*>
-+                                 (SBE_ECC_IMG_VADDR));
-+
-+        /*****************************************/
-+        /*  Do Actual Write of Image             */
-+        /*****************************************/
-+        image_size_ECC = ALIGN_8((i_image_size*9)/8);
-+
-+        assert(image_size_ECC <= SBE_ECC_IMG_MAX_SIZE,
-+               "writeSbeImage() SBE Image with ECC too large");
-+
-+        err = deviceWrite(i_target,
-+                          reinterpret_cast<void*>
-+                            (SBE_ECC_IMG_VADDR),
-+                          image_size_ECC,
-+                          DEVICE_EEPROM_ADDRESS(
-+                                        l_seeprom,
-+                                        SBE_IMAGE_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"writeSbeImage: - Error "
-+                       "from EEPROM op: rc=0x%.4X, seeprom=%d (side=%d). "
-+                       "HUID=0x%.8X. SBE_VADDR=0x%.16X, ECC_VADDR=0x%.16X, "
-+                       "size=0x%.8X, eccSize=0x%.8X, EEPROM offset=0x%X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target),
-+                       SBE_IMG_VADDR, SBE_ECC_IMG_VADDR, i_image_size,
-+                       image_size_ECC, SBE_IMAGE_SEEPROM_ADDRESS);
-+            break;
-+        }
-+
-+        /********************************************/
-+        /*  Do Actual Write of Version Information  */
-+        /********************************************/
-+
-+        // Update the image crc in the version information
-+        uint32_t image_crc = Util::crc32_calc(i_imgPtr, i_image_size);
-+
-+        memcpy( &(io_version.data_crc),
-+                &image_crc,
-+                sizeof(image_crc));
-+
-+       TRACDBIN( g_trac_sbe, "writeSbeImage: Version no ECC",
-+                 reinterpret_cast<uint8_t*>(&io_version), sizeof(io_version));
-+
-+        // Inject ECC
-+        memset( sbeInfo_data_ECC, 0, sbeInfoSize_ECC);
-+        PNOR::ECC::injectECC(reinterpret_cast<uint8_t*>(&io_version),
-+                             sbeInfoSize, sbeInfo_data_ECC);
-+
-+        TRACDBIN( g_trac_sbe, "writeSbeImage: Version with ECC",
-+                  sbeInfo_data_ECC, sbeInfoSize_ECC);
-+
-+        err = deviceWrite( i_target,
-+                           sbeInfo_data_ECC,
-+                           sbeInfoSize_ECC,
-+                           DEVICE_EEPROM_ADDRESS(
-+                                             l_seeprom,
-+                                             SBE_VERSION_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"writeSbeImage: - Error "
-+                       "Writing SBE Version Info: rc=0x%.4X, "
-+                       "HUID=0x%.8X, seeprom=%d, side=%d",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(i_target), l_seeprom, i_side);
-+            break;
-+        }
-+
-+    }while(0);
-+
-+    // Free allocated memory
-+    free(sbeInfo_data_ECC);
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"writeSetSbeImage()" );
-+
-+    return err;
-+}
-+
-+
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t getSbeImageSize(TARGETING::Target* i_target,
-+                               void* i_imgPtr,
-+                               PNOR::sbeSeepromSide_t i_side,
-+                               size_t& o_image_size)
-+{
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"geSbeImageSize(): tgt=0x%X, i_side=%d "
-+               "i_imgPtr=%p, o_image_size=0x%X",
-+               TARGETING::get_huid(i_target), i_side, i_imgPtr, o_image_size);
-+
-+    errlHndl_t err = NULL;
-+    PNOR::ECC::eccStatus eccStatus = PNOR::ECC::CLEAN;
-+    EEPROM::eeprom_chip_types_t l_seeprom = sbe_side_sync[i_side];
-+    size_t image_size_ECC = 0;
-+
-+    // Need to ensure that i_imgPtr is at SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
-+    // since we need to use the VMM_VADDR_SBE_UPDATE space
-+
-+    assert ( i_imgPtr == reinterpret_cast<void*>(SBE_IMG_VADDR),
-+             "getSbeImageSize() - i_imgPtr is not at SBE_IMG_VADDR");
-+
-+    do{
-+        // Need to read the SbeXipHeader of the image to determine size
-+        // of the image to read out.
-+        // Using io_imgPtr space. First read our header+ECC from SBE
-+        // Seeprom and then use space after that to put header without ECC
-+
-+
-+        size_t hdr_size = ALIGN_8(sizeof(SbeXipHeader));
-+        size_t hdr_size_ECC = (hdr_size * 9)/8;
-+
-+        uint8_t* hdr_ptr = reinterpret_cast<uint8_t*>(i_imgPtr) + hdr_size_ECC;
-+
-+        memset( i_imgPtr, 0, hdr_size_ECC + hdr_size );
-+
-+        TRACUCOMP( g_trac_sbe, INFO_MRK"getSetSbeImage() Reading "
-+                   "SbeXipHeader for Target 0x%X, Seeprom %d "
-+                   "(side=%d), size_ECC=0x%X (size=0x%X)",
-+                   TARGETING::get_huid(i_target),
-+                   l_seeprom, i_side, hdr_size_ECC, hdr_size );
-+
-+        err = DeviceFW::deviceOp( DeviceFW::READ,
-+                                  i_target,
-+                                  i_imgPtr,
-+                                  hdr_size_ECC,
-+                                  DEVICE_EEPROM_ADDRESS(
-+                                                l_seeprom,
-+                                                SBE_IMAGE_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeImageSize: - Error "
-+                       "Reading SbeXipHeader: rc=0x%.4X, seeprom=%d (side=%d). "
-+                       "HUID=0x%.8X. size=0x%.8X, EEPROM offset=0x%X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target), sizeof(SbeXipHeader),
-+                       SBE_IMAGE_SEEPROM_ADDRESS);
-+            break;
-+        }
-+
-+
-+        TRACDBIN( g_trac_sbe,
-+                 "Data with ECC read from Seeprom",
-+                 i_imgPtr,
-+                 hdr_size_ECC );
-+
-+        // Remove ECC
-+        eccStatus = PNOR::ECC::removeECC(
-+                                     reinterpret_cast<uint8_t*>(i_imgPtr),
-+                                     hdr_ptr,
-+                                     hdr_size);
-+
-+        // Fail if uncorrectable ECC
-+        if ( eccStatus == PNOR::ECC::UNCORRECTABLE )
-+        {
-+            TRACFCOMP( g_trac_sbe,ERR_MRK"getSbeImageSize: ECC Error "
-+                       "On SBE Image Read eccStatus=%d sI=%d, sI_ECC="
-+                       "%d, HUID=0x%.8X, Seeprom %d (side=%d)",
-+                       eccStatus, o_image_size, image_size_ECC,
-+                       TARGETING::get_huid(i_target),
-+                       l_seeprom, i_side );
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_GET_SBE_IMAGE_SIZE
-+             * @reasoncode   SBE_ECC_FAIL
-+             * @userdata1[0:15]     ECC Status
-+             * @userdata1[16:31]    SEEPROM Side
-+             * @userdata1[32:63]    Target HUID
-+             * @userdata2[0:31]     Size - No Ecc
-+             * @userdata2[32:63]    Size - ECC
-+             * @devdesc      ECC Fail Reading SBE Image
-+             */
-+            err = new ErrlEntry(ERRL_SEV_PREDICTIVE,
-+                                SBE_GET_SBE_IMAGE_SIZE,
-+                                SBE_ECC_FAIL,
-+                                TWO_UINT32_TO_UINT64(
-+                                              ( (eccStatus << 16 ) |
-+                                                 l_seeprom ),
-+                                              TARGETING::get_huid(i_target)),
-+                                TWO_UINT32_TO_UINT64(o_image_size,
-+                                                     image_size_ECC));
-+            err->collectTrace(SBE_COMP_NAME);
-+            err->addPartCallout(
-+                                i_target,
-+                                HWAS::SBE_SEEPROM_PART_TYPE,
-+                                HWAS::SRCI_PRIORITY_HIGH,
-+                                HWAS::NO_DECONFIG,
-+                                HWAS::GARD_NULL );
-+
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+
-+            break;
-+        }
-+
-+        TRACDBIN( g_trac_sbe,
-+                  "Data without ECC read from Seeprom",
-+                  hdr_ptr,
-+                  hdr_size );
-+
-+        o_image_size = (((SbeXipHeader*)hdr_ptr)->iv_imageSize);
-+
-+    }while(0);
-+
-+    TRACFCOMP( g_trac_sbe,
-+               EXIT_MRK"getSbeImageSize(): o_image_size=0x%X", o_image_size );
-+
-+    return err;
-+}
-+
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t resolveImageHBBaddr(TARGETING::Target* i_target,
-+                               void* io_imgPtr,
-+                               PNOR::sbeSeepromSide_t i_side,
-+                               PNOR::SideId  i_pnorSideId,
-+                               bool& o_imageWasUpdated )
-+{
-+    errlHndl_t err = NULL;
-+    uint64_t data = 0;
-+    int rc = 0;
-+    bool rc_fail_on_get = false; // 1=get failed, 0=set failed
-+
-+    o_imageWasUpdated = false;
-+
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"resolveImageHBBaddr() - tgt=0x%X, i_side=%d, "
-+               "i_pnorSideId=%d",
-+               TARGETING::get_huid(i_target), i_side, i_pnorSideId);
-+
-+    do{
-+
-+        // Get info from PNOR
-+        PNOR::SideInfo_t pnor_side_info;
-+        err = PNOR::getSideInfo (i_pnorSideId, pnor_side_info);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK
-+                       "resolveImageHBBaddr() - Error returned "
-+                       "from PNOR::getSideInfo() rc=0x%.4X, Target UID=0x%X "
-+                       "i_pnorSideId",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(i_target), i_pnorSideId);
-+            break;
-+        }
-+
-+
-+        // Only Need to Check/Update if PNOR has Other Side
-+        // and Seeprom isn't pointing at PNOR's GOLDEN side
-+        if ( (  pnor_side_info.hasOtherSide == true ) &&
-+             (  pnor_side_info.isGolden == false ) )
-+        {
-+
-+            // Read the MMIO offset associated with the HBB address
-+            // from the image
-+            rc = sbe_xip_get_scalar( io_imgPtr,
-+                                     "standalone_mbox2_value",
-+                                     &data);
-+            if ( rc != 0 )
-+            {
-+                rc_fail_on_get = true; // get failed
-+
-+                TRACFCOMP( g_trac_sbe, ERR_MRK"resolveImageHBBaddr() - "
-+                           "sbe_xip_get_scalar() failed rc = 0x%X (%d)",
-+                           rc, rc_fail_on_get);
-+                break;
-+            }
-+
-+            if ( pnor_side_info.hbbMmioOffset == data )
-+            {
-+                TRACUCOMP( g_trac_sbe, "resolveImageHBBaddr: Image has MMIO "
-+                           "offset = 0x%X that matches PNOR MMIO="
-+                           "0x%X for HBB Address=0x%X",
-+                           data, pnor_side_info.hbbMmioOffset,
-+                           pnor_side_info.hbbAddress);
-+            }
-+            else
-+            {
-+                TRACFCOMP( g_trac_sbe, "resolveImageHBBaddr: Image has MMIO "
-+                           "offset = 0x%X does NOT match PNOR MMIO="
-+                           "0x%X for HBB Address=0x%X. Updating Image",
-+                           data, pnor_side_info.hbbMmioOffset,
-+                           pnor_side_info.hbbAddress);
-+
-+                TRACDBIN (g_trac_sbe, "resolveImageHBBaddr: data", &data, 8 );
-+
-+                TRACDBIN (g_trac_sbe, "resolveImageHBBaddr: hbbMmioOffset",
-+                          &pnor_side_info.hbbMmioOffset, 8 );
-+                TRACDBIN (g_trac_sbe, "resolveImageHBBaddr: hbbAddress",
-+                          &pnor_side_info.hbbAddress, 8);
-+
-+                rc = sbe_xip_set_scalar( io_imgPtr, "standalone_mbox2_value",
-+                                         pnor_side_info.hbbMmioOffset);
-+
-+                if ( rc != 0 )
-+                {
-+                    rc_fail_on_get = false; // set failed
-+
-+                    TRACFCOMP( g_trac_sbe, ERR_MRK"resolveImageHBBaddr() - "
-+                               "sbe_xip_set_scalar() failed rc = 0x%X (%d)",
-+                               rc, rc_fail_on_get);
-+                    break;
-+                }
-+                o_imageWasUpdated = true;
-+            }
-+
-+        }
-+        else
-+        {
-+              // pnor_side_info.hasOtherSide is false
-+              TRACUCOMP( g_trac_sbe, "resolveImageHBBaddr: PNOR only has "
-+                         "1 side - No Update Required");
-+        }
-+
-+    }while(0);
-+
-+
-+    if ( ( err == NULL ) && ( rc != 0) )
-+    {
-+        // We failed on get/set cmd above (already traced)
-+
-+        /*@
-+         * @errortype
-+         * @moduleid     SBE_RESOLVE_HBB_ADDR
-+         * @reasoncode   SBE_IMAGE_GET_SET_SCALAR_FAIL
-+         * @userdata1    Return Code of failed operation
-+         * @userdata2    True/False if Get (true) or Set (false) Op failed
-+         * @devdesc      sbe_xip_get/set_scalar() failed when accessing the
-+                         HBB Address MMIO offset in 'standalone_mbox2_value'
-+         * @custdesc     A problem occurred while updating processor
-+         *               boot code.
-+         */
-+        err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
-+                            SBE_RESOLVE_HBB_ADDR,
-+                            SBE_IMAGE_GET_SET_SCALAR_FAIL,
-+                            TO_UINT64(rc),
-+                            TO_UINT64(rc_fail_on_get),
-+                            true /*Add HB SW Callout*/ );
-+
-+        err->collectTrace(SBE_COMP_NAME);
-+    }
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"resolveImageHBBaddr() - o_imageWasUpdated = %d",
-+               o_imageWasUpdated);
-+
-+    return err;
-+}
-+
-+#ifdef CONFIG_BMC_IPMI
-+/////////////////////////////////////////////////////////////////////
-+void sbePreShutdownIpmiCalls( void )
-+{
-+    errlHndl_t err = NULL;
-+
-+    TRACFCOMP( g_trac_sbe, ENTER_MRK"sbePreShutdownIpmiCalls");
-+
-+    do{
-+        uint16_t count = 0;
-+        SENSOR::RebootCountSensor l_sensor;
-+
-+        // Read reboot count sensor
-+        err = l_sensor.getRebootCount(count);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe,
-+                       ERR_MRK"sbePreShutdownIpmiCalls: "
-+                       "FAIL Reading Reboot Sensor Count. "
-+                       "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                       "plid=0x%.8X, but continuing shutdown",
-+                       err->reasonCode(),
-+                       err->eid(),
-+                       err->plid());
-+            err->collectTrace(SBE_COMP_NAME);
-+            errlCommit( err, SBE_COMP_ID );
-+
-+            // No Break - Still Do Watchdog Timer Call
-+        }
-+        else
-+        {
-+            // Increment Reboot Count Sensor
-+            count++;
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"sbePreShutdownIpmiCalls: "
-+                       "Writing Reboot Sensor Count=%d", count);
-+
-+            err = l_sensor.setRebootCount( count );
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe,
-+                           ERR_MRK"sbePreShutdownIpmiCalls: "
-+                           "FAIL Writing Reboot Sensor Count to %d. "
-+                           "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                           "plid=0x%.8X, but continuing shutdown",
-+                           count,
-+                           err->reasonCode(),
-+                           err->eid(),
-+                           err->plid());
-+                err->collectTrace(SBE_COMP_NAME);
-+                errlCommit( err, SBE_COMP_ID );
-+
-+                // No Break - Still Do Watchdog Timer Call
-+            }
-+        }
-+
-+        // @todo RTC 124679 - Remove Once BMC Monitors Shutdown Attention
-+        // Set Watchdog Timer To 10 seconds
-+        const uint16_t SET_WD_TIMER_10_SECS = 10;
-+        TRACFCOMP( g_trac_sbe,"sbePreShutdownIpmiCalls: "
-+                   "Set Watch Dog Timer To %d Seconds",
-+                   SET_WD_TIMER_10_SECS);
-+
-+        err = IPMIWATCHDOG::setWatchDogTimer(SET_WD_TIMER_10_SECS);
-+        if(err)
-+        {
-+               TRACFCOMP( g_trac_sbe,
-+                          ERR_MRK"sbePreShutdownIpmiCalls: "
-+                          "FAIL Setting Watch Dog Timer to %d seconds. "
-+                          "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                          "plid=0x%.8X, but continuing shutdown",
-+                          SET_WD_TIMER_10_SECS,
-+                          err->reasonCode(),
-+                          err->eid(),
-+                          err->plid());
-+
-+                err->collectTrace(SBE_COMP_NAME);
-+                errlCommit(err, SBE_COMP_ID );
-+         }
-+
-+    }while(0);
-+
-+    TRACFCOMP( g_trac_sbe, EXIT_MRK"sbePreShutdownIpmiCalls");
-+
-+    return;
-+}
-+#endif // CONFIG_BMC_IPMI
-+
-+
-+} //end SBE Namespace
-diff --git a/src/usr/sbe/sbe_resolve_sides.H b/src/usr/sbe/sbe_resolve_sides.H
-new file mode 100644
-index 0000000..42f727a
---- /dev/null
-+++ b/src/usr/sbe/sbe_resolve_sides.H
-@@ -0,0 +1,259 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/sbe/sbe_resolve_sides.H $                             */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 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.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+#ifndef __SBE_SBE_RESOLVE_SIDES_H
-+#define __SBE_SBE_RESOLVE_SIDES_H
-+
-+
-+#include <stdint.h>
-+#include <builtins.h>
-+#include <errl/errlentry.H>
-+#include <pnor/pnorif.H>
-+#include <util/align.H>
-+#include <vmmconst.h>
-+#include <targeting/common/targetservice.H>
-+#include <i2c/eepromif.H>
-+#include "sbe_update.H"
-+
-+namespace SBE
-+{
-+    /******************************************/
-+    /*  Constants                             */
-+    /******************************************/
-+
-+    // This seeprom is a candidate to be READ_ONLY (ie, not updated)
-+    const PNOR::sbeSeepromSide_t READ_ONLY_SEEPROM = PNOR::SBE_SEEPROM1;
-+
-+    // Used to keep SBE Seeproms in sync with EEPROM::eeprom_chip_types_t
-+    const EEPROM::eeprom_chip_types_t sbe_side_sync[2] =
-+                                      { EEPROM::SBE_PRIMARY,
-+                                        EEPROM::SBE_BACKUP };
-+
-+    /******************************************/
-+    /*  Enums                                 */
-+    /******************************************/
-+
-+    // Actions can be combined
-+    enum
-+    {
-+        NO_ACTIONS             = 0x00000000,
-+        REIPL                  = 0x00000001,
-+
-+        // Use PNOR::ALTERNATE SideId for HBB Address info
-+        USE_PNOR_ALT_SIDE      = 0x00000002,
-+
-+        // NOTE: These next 2 values are mutually exclusive
-+        CHECK_WORKING_HBB         = 0x00000010,
-+        COPY_READ_ONLY_TO_WORKING = 0x00000020,
-+    };
-+
-+    /******************************************/
-+    /*  Structs                               */
-+    /******************************************/
-+    struct sbeResolveState_t
-+    {
-+
-+        // Target Information
-+        TARGETING::Target*       tgt;
-+
-+        PNOR::sbeSeepromSide_t   cur_side;    // aka 'booted' side
-+        PNOR::sbeSeepromSide_t   alt_side;    // non-booted/non-cur side
-+        PNOR::sbeSeepromSide_t   update_side; // side to be updated
-+
-+        // Info from PNOR
-+        PNOR::SideId pnor_sideId;
-+        char pnor_side;          /**< name of the side either A or B */
-+        bool pnor_isGolden;      /**< True if side is golden */
-+        bool pnor_hasOtherSide;  /**< True if a valid alternate side exists*/
-+
-+        uint32_t actions;
-+
-+        // Constructor to default certain values
-+        sbeResolveState_t() :
-+          tgt(NULL), cur_side(PNOR::SBE_SEEPROM_INVALID),
-+          alt_side(PNOR::SBE_SEEPROM_INVALID),
-+          update_side(PNOR::SBE_SEEPROM_INVALID),
-+          pnor_sideId(PNOR::WORKING),
-+          pnor_side(NULL),
-+          pnor_isGolden(false), pnor_hasOtherSide(false),
-+          actions(NO_ACTIONS)
-+        {}
-+
-+    };
-+
-+
-+    /******************************************/
-+    /*  Functions -- High Level Functions     */
-+    /******************************************/
-+
-+    /**
-+     * @brief Collects SBE Side Information for a specifc target
-+     *
-+     * @param[io/out] io_sideState   Struct containing SBE State of the target
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t getSideState(sbeResolveState_t& io_sideState);
-+
-+    /**
-+     * @brief Analyze and Determine Update Actions for a specific target
-+     *
-+     * @param[io/out] io_sideState   Struct containing SBE State of the target
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t getSideActions(sbeResolveState_t& io_sideState);
-+
-+    /**
-+     * @brief Performs the Update Actions for a specific target
-+     *
-+     * @param[io/out] io_sideState   Struct containing SBE State of the target
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t performSideActions(sbeResolveState_t& io_sideState);
-+
-+
-+
-+    /******************************************/
-+    /*  Functions -- System Access            */
-+    /******************************************/
-+
-+
-+    /**
-+     * @brief Read SBE Image from SBE Seeprom
-+     *
-+     * @param[in] i_target   Target processor
-+     *
-+     * @param[out] o_imgPtr    Pointer to SBE image in memory
-+     *                         Memory for this pointer is expected to be
-+     *                         pre-alloacted
-+     *                         NOTE:  ECC is handled internally in this
-+     *                         function. io_imgPtr points to non-ECC image
-+     *
-+     * @param[in] i_side          Seeprom Side to access
-+     *
-+     * @param[in] o_image_size    The size of the image (non-ECC)
-+     *
-+     * @param[in] o_version       SBE Version struct from seeprom (non-ECC)
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t readSbeImage(TARGETING::Target* i_target,
-+                              void* o_imgPtr,
-+                              PNOR::sbeSeepromSide_t i_side,
-+                              size_t& o_image_size,
-+                              sbeSeepromVersionInfo_t& o_version);
-+
-+    /**
-+     * @brief Write SBE Image from SBE Seeprom
-+     *
-+     * @param[in] i_target   Target processor
-+     *
-+     * @param[in] i_imgPtr    Pointer to SBE image in memory
-+     *                        Memory for this pointer is expected to be
-+     *                        pre-alloacted
-+     *                        NOTE:  ECC is handled internally in this function
-+     *                        i_imgPtr points to non-ECC image
-+     *
-+     * @param[in] i_side        Seeprom Side to access
-+     *
-+     * @param[in] i_image_size  Size of image to write (non-ECC)
-+     *
-+     * @param[in] io_version    SBE Version struct to write (non-ECC)
-+     *                          NOTE: data_crc updated in this function
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t writeSbeImage(TARGETING::Target* i_target,
-+                             void* i_imgPtr,
-+                             PNOR::sbeSeepromSide_t i_side,
-+                             size_t i_image_size,
-+                             sbeSeepromVersionInfo_t& io_version);
-+
-+
-+    /**
-+     * @brief Read SBE Image Header from SBE Seeprom and gets the
-+     *        Image size from the heaser
-+     *
-+     * @param[in] i_target   Target processor
-+     *
-+     * @param[out] i_imgPtr    Pointer to pre-allocated memory to be used
-+     *                         for different operations
-+     *
-+     * @param[in] i_side          Seeprom Side to access
-+     *
-+     * @param[in] o_image_size    The size of the image (non-ECC)
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t getSbeImageSize(TARGETING::Target* i_target,
-+                               void* i_imgPtr,
-+                               PNOR::sbeSeepromSide_t i_side,
-+                               size_t& o_image_size);
-+
-+
-+
-+
-+    /******************************************/
-+    /*  Functions -- Helper Functions         */
-+    /******************************************/
-+
-+    /**
-+     * @brief Check and Update (if necessary) the HBB Address MMIO offset
-+     *        in a customized SBE Image for the current Processor
-+     *
-+     * @param[in] i_target      Target processor to customize
-+     *
-+     * @param[in/out] io_imgPtr    Pointer to SBE image in memory
-+     *                          Memory for this pointer is expected to be
-+     *                          pre-alloacted
-+     *
-+     * @param[in] i_side          Seeprom Side to access
-+     *
-+     * @param[in] i_pnorSideId    PNOR side to get information for
-+     *
-+     * @param[out] o_imageWasUpdated  Set to true if Image was updated;
-+     *                                otherwise false
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t resolveImageHBBaddr(TARGETING::Target* i_target,
-+                                   void* io_imgPtr,
-+                                   PNOR::sbeSeepromSide_t i_side,
-+                                   PNOR::SideId i_pnorSideId,
-+                                   bool& o_imageWasUpdated);
-+
-+#ifdef CONFIG_BMC_IPMI
-+    /**
-+     * @brief Performs any necessary IPMI calls before shutting down the system
-+     *
-+     * @return void       Any generated Error Logs will be commited before the
-+     *                    function returns
-+     */
-+    void sbePreShutdownIpmiCalls( void );
-+#endif
-+
-+} //end namespace SBE
-+#endif
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index 97a0484..562798b 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -50,6 +50,7 @@
- #include <sbe/sbeif.H>
- #include <sbe/sbereasoncodes.H>
- #include "sbe_update.H"
-+#include "sbe_resolve_sides.H"
- 
- //  fapi support
- #include    <fapi.H>
-@@ -112,6 +113,25 @@ namespace SBE
- 
-         do{
- 
-+#ifdef CONFIG_NO_SBE_UPDATES
-+            TRACFCOMP( g_trac_sbe, INFO_MRK"updateProcessorSbeSeeproms() - "
-+                       "SBE updates not configured");
-+            break;
-+#endif
-+
-+#ifdef CONFIG_SBE_UPDATE_SEQUENTIAL
-+            // Check if FSP-services are enabled and if we're running in simics
-+            if ( !INITSERVICE::spBaseServicesEnabled() &&
-+                 !Util::isSimicsRunning() )
-+            {
-+                assert (false, "resolveProcessorSbeSeeproms() - "
-+                        "SBE_UPDATE_SEQUENTIAL mode, but FSP-services are not "
-+                        "enabled - Invalid Configuration");
-+            }
-+            // else - continue on
-+#endif
-+
-+
-             // Get Target Service, and the system target.
-             TargetService& tS = targetService();
-             TARGETING::Target* sys = NULL;
-@@ -204,11 +224,6 @@ namespace SBE
-                  err = NULL;
-             }
- 
--#ifdef CONFIG_NO_SBE_UPDATES
--            TRACFCOMP( g_trac_sbe, INFO_MRK"updateProcessorSbeSeeproms() - "
--                       "SBE updates not configured");
--            break;
--#endif
- 
-             for(uint32_t i=0; i<procList.size(); i++)
-             {
-@@ -277,7 +292,6 @@ namespace SBE
-                 /**********************************************/
-                 if ((err == NULL) && (sbeState.update_actions & DO_UPDATE))
-                 {
--
-                     err = performUpdateActions(sbeState);
-                     if (err)
-                     {
-@@ -328,7 +342,6 @@ namespace SBE
- 
-             } //end of Target for loop collecting each target's SBE State
- 
--
-             /**************************************************************/
-             /*  Perform System Operation                                  */
-             /**************************************************************/
-@@ -355,7 +368,7 @@ namespace SBE
-                 }
- 
- #ifdef CONFIG_BMC_IPMI
--                // @todo RTC 120734 reset system's reboot count via IPMI sensor
-+                sbePreShutdownIpmiCalls();
- #endif
- 
-                 TRACFCOMP( g_trac_sbe,
-@@ -685,14 +698,15 @@ namespace SBE
- 
-         do{
- 
--            // @todo RTC 120734 - before customizing, ensure correct HBB address
--            // is set in the necessary attribute
--
-             // 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
-@@ -871,7 +885,6 @@ namespace SBE
-                                           HWAS::SRCI_PRIORITY_HIGH );
-             }
- 
--
-         }while(0);
- 
-         TRACUCOMP( g_trac_sbe,
-@@ -1715,6 +1728,26 @@ namespace SBE
-             // The Customized Image For This Target Still Resides In
-             // The SBE Update VMM Space: SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
- 
-+#ifdef CONFIG_SBE_UPDATE_INDEPENDENT
-+            // Ensure HBB address value in the customized image is correct
-+            // for this side
-+            bool imageWasUpdated=false;
-+            err = resolveImageHBBaddr ( io_sbeState.target,
-+                                        reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                        ((io_sbeState.seeprom_side_to_update ==
-+                                         EEPROM::SBE_PRIMARY ) ?
-+                                            PNOR::SBE_SEEPROM0 :
-+                                            PNOR::SBE_SEEPROM1  ),
-+                                        PNOR::WORKING,
-+                                        imageWasUpdated );
-+
-+            if (imageWasUpdated == true )
-+            {
-+                TRACUCOMP( g_trac_sbe, ERR_MRK"updateSeepromSide() - "
-+                           "HBB Address's MMIO Offset Updated in Image");
-+            }
-+
-+#endif
- 
-             // Inject ECC
-             // clear out back half of page block to use as temp space
-@@ -1941,7 +1974,6 @@ namespace SBE
-                            io_sbeState.seeprom_0_ver.data_crc, isSimics_check);
-             }
- 
--
-             /**************************************************************/
-             /*  Compare SEEPROM 1 with PNOR and Customized Image CRC --   */
-             /*  -- dirty or clean?                                        */
-@@ -2153,22 +2185,55 @@ namespace SBE
- #ifdef CONFIG_SBE_UPDATE_INDEPENDENT
- 
-             // The 2 SBE SEEPROMs are independent of each other
--            // Determine if PNOR is 1- or 2-sided and if there is a
--            // GOLDEN boot involved
-+            // 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);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "SBE Update() - Error returned from "
-+                           "PNOR::getSideInfo() rc=0x%.4X, Target UID=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sbeState.target));
-+                break;
-+            }
- 
--#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+            TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: PNOR Info: "
-+                       "side-%c, sideId=0x%X, isGolden=%d, hasOtherSide=%d",
-+                       TARGETING::get_huid(io_sbeState.target),
-+                       pnor_side_info.side, pnor_side_info.id,
-+                       pnor_side_info.isGolden, pnor_side_info.hasOtherSide);
- 
--            // @todo RTC 120734 - ask PNOR if we are in "GOLDEN" mode,
--            // which would mean that we are booting off the the GOLDEN
--            // SBE SEEPROM which corresponds to the GOLDEN side of PNOR
--/*
--            if (true)
-+            if ( pnor_side_info.isGolden == true )
-             {
-                 // If true, nothing to do (covered in istep 6 function)
-                 l_actions = CLEAR_ACTIONS;
- 
-                 TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "Booting GOLDEN SBE SEEPROM in PNOR 2-sided Mode. "
-+                           "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)",
-+                           TARGETING::get_huid(io_sbeState.target),
-+                           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;
-+
-+                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)",
-                            TARGETING::get_huid(io_sbeState.target),
-@@ -2179,22 +2244,14 @@ namespace SBE
-             }
-             else // proceed to update this side
-             {
-+                // proceed to update this side
-                 TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "NOT Booting GOLDEN SBE SEEPROM in PNOR 2-sided "
--                           "mode. Checking for update on cur side=%d ",
-+                           "NOT Booting READ_ONLY SEEPROM. Check for update "
-+                           "on cur side=%d ",
-                            TARGETING::get_huid(io_sbeState.target),
-                            io_sbeState.cur_seeprom_side)
-             }
--*/
--#else
- 
--            // @todo RTC 120734 - check this assumption
--            // Assume that we're only checking/updating the current side
--            TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                       "PNOR 1-sided so only check for update on cur side=%d",
--                       TARGETING::get_huid(io_sbeState.target),
--                       io_sbeState.cur_seeprom_side);
--#endif
- 
-             // Check for clean vs. dirty only on cur side
-             if ( i_system_situation & SITUATION_CUR_IS_DIRTY )
-@@ -2203,6 +2260,7 @@ namespace SBE
-                 l_actions |= IPL_RESTART;
-                 l_actions |= DO_UPDATE;
-                 l_actions |= UPDATE_SBE;
-+                l_actions |= UPDATE_MVPD; // even though flags byte not updated
- 
-                 // Set Update side to cur
-                 io_sbeState.seeprom_side_to_update =
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0010-Mark-Centaurs-as-present-functionl-on-IPL.patch b/openpower/package/hostboot/hostboot-0010-Mark-Centaurs-as-present-functionl-on-IPL.patch
deleted file mode 100644
index 9d9ff0f..0000000
--- a/openpower/package/hostboot/hostboot-0010-Mark-Centaurs-as-present-functionl-on-IPL.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From d569d04ce1b7451af590465e1befab0ae3634ccf Mon Sep 17 00:00:00 2001
-From: Richard J. Knight <rjknight@us.ibm.com>
-Date: Fri, 27 Feb 2015 22:13:21 -0600
-Subject: [PATCH 5/7] Mark Centaurs as present/functionl on IPL
-
-    -Update Centaur status sensor after discove targets is called
-     to initialize the Centaur Func sensors on the BMC
-
-Change-Id: I28b1047b50b690b97a20093721467f45455c5217
-RTC:124846
-(cherry picked from commit dd9502f744de8c09425d677570825699a979128f)
----
- src/usr/ipmi/ipmisensor.C |   15 ++++++++++++---
- 1 files changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/src/usr/ipmi/ipmisensor.C b/src/usr/ipmi/ipmisensor.C
-index fba66a6..4b5b478 100644
---- a/src/usr/ipmi/ipmisensor.C
-+++ b/src/usr/ipmi/ipmisensor.C
-@@ -894,14 +894,19 @@ namespace SENSOR
-         // get all targets of the passed in type, functional or not
-         switch( i_type )
-         {
--            case TARGETING::TYPE_PROC:
--                getAllChips( l_tList, TARGETING::TYPE_PROC, false );
--                break;
- 
-             case TARGETING::TYPE_DIMM:
-                 getAllLogicalCards( l_tList, TARGETING::TYPE_DIMM, false );
-                 break;
- 
-+            case TARGETING::TYPE_MEMBUF:
-+                getAllChips( l_tList, TARGETING::TYPE_MEMBUF, false );
-+                break;
-+
-+            case TARGETING::TYPE_PROC:
-+                getAllChips( l_tList, TARGETING::TYPE_PROC, false );
-+                break;
-+
-             case TARGETING::TYPE_CORE:
-                 getAllChiplets( l_tList, TARGETING::TYPE_CORE, false);
-                 break;
-@@ -1024,6 +1029,10 @@ namespace SENSOR
- 
-     void updateBMCSensorStatus()
-     {
-+
-+        // send status of all MEMBUF targets
-+        updateBMCSensorStatus(TARGETING::TYPE_MEMBUF);
-+
-         // send status of all DIMM targets
-         updateBMCSensorStatus(TARGETING::TYPE_DIMM);
- 
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0011-Update-Shutdown-Path-for-SBE-Updates.patch b/openpower/package/hostboot/hostboot-0011-Update-Shutdown-Path-for-SBE-Updates.patch
deleted file mode 100644
index dc80e92..0000000
--- a/openpower/package/hostboot/hostboot-0011-Update-Shutdown-Path-for-SBE-Updates.patch
+++ /dev/null
@@ -1,158 +0,0 @@
-From c8c9edd25a04a8ff1974fd75e27a3b24b71030fc Mon Sep 17 00:00:00 2001
-From: Mike Baiocchi <baiocchi@us.ibm.com>
-Date: Fri, 27 Feb 2015 13:55:34 -0600
-Subject: [PATCH 6/7] Update Shutdown Path for SBE Updates
-
-This change will do the following:
--- Flush out a console message to alert the user that the system is
-   shutting down to perform a SBE Update.
--- Set the watchdog timer to 15 seconds before shutting down.
--- Set the watchdog timer to NO_ACTIONS such that the boot count
-   sensor will handle the re-IPL.
-
-Change-Id: I3e8ca07030e50a56cd8bafc514bab036e3fdab96
-RTC: 120734
-(cherry picked from commit 20163b32e98f40e9346863e5954184958acc9af5)
----
- src/include/usr/ipmi/ipmiwatchdog.H |    1 +
- src/usr/sbe/sbe_resolve_sides.C     |   33 +++++++++++++++++++++++++--------
- src/usr/sbe/sbe_resolve_sides.H     |    4 ++++
- src/usr/sbe/sbe_update.C            |   14 ++++++++++++++
- 4 files changed, 44 insertions(+), 8 deletions(-)
-
-diff --git a/src/include/usr/ipmi/ipmiwatchdog.H b/src/include/usr/ipmi/ipmiwatchdog.H
-index f23b771..62840ce 100644
---- a/src/include/usr/ipmi/ipmiwatchdog.H
-+++ b/src/include/usr/ipmi/ipmiwatchdog.H
-@@ -79,6 +79,7 @@ enum TIMER_USE
-  */
- enum TIMER_ACTIONS
- {
-+    NO_ACTIONS              =   0x00, // all bits
-     PRE_TIMEOUT_INT_SMI     =   0x10, // bit 4
-     PRE_TIMEOUT_INT_NMI     =   0x20, // bit 5
-     PRE_TIMEOUT_INT_MSG     =   0x30, // bits 4 & 5
-diff --git a/src/usr/sbe/sbe_resolve_sides.C b/src/usr/sbe/sbe_resolve_sides.C
-index df9958d..90217b6 100644
---- a/src/usr/sbe/sbe_resolve_sides.C
-+++ b/src/usr/sbe/sbe_resolve_sides.C
-@@ -40,6 +40,7 @@
- #include <sys/misc.h>
- #include <hwas/common/deconfigGard.H>
- #include <initservice/initserviceif.H>
-+#include <console/consoleif.H>
- #include <config.h>
- #include <ipmi/ipmiwatchdog.H>
- #include <ipmi/ipmisensor.H>
-@@ -285,7 +286,20 @@ errlHndl_t resolveProcessorSbeSeeproms()
-                        l_restartNeeded);
- 
- #ifdef CONFIG_BMC_IPMI
--                sbePreShutdownIpmiCalls();
-+            sbePreShutdownIpmiCalls();
-+#endif
-+
-+#ifdef CONFIG_CONSOLE
-+  #ifdef CONFIG_BMC_IPMI
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down In %d "
-+                              "Seconds To Perform SBE Update\n",
-+                              SET_WD_TIMER_IN_SECS);
-+  #else
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down To "
-+                              "Perform SBE Update\n");
-+  #endif
-+
-+            CONSOLE::flush();
- #endif
- 
-             TRACFCOMP( g_trac_sbe,
-@@ -1276,7 +1290,6 @@ errlHndl_t resolveImageHBBaddr(TARGETING::Target* i_target,
- void sbePreShutdownIpmiCalls( void )
- {
-     errlHndl_t err = NULL;
--
-     TRACFCOMP( g_trac_sbe, ENTER_MRK"sbePreShutdownIpmiCalls");
- 
-     do{
-@@ -1328,13 +1341,17 @@ void sbePreShutdownIpmiCalls( void )
-         }
- 
-         // @todo RTC 124679 - Remove Once BMC Monitors Shutdown Attention
--        // Set Watchdog Timer To 10 seconds
--        const uint16_t SET_WD_TIMER_10_SECS = 10;
-+        // Set Watchdog Timer before calling doShutdown()
-         TRACFCOMP( g_trac_sbe,"sbePreShutdownIpmiCalls: "
-                    "Set Watch Dog Timer To %d Seconds",
--                   SET_WD_TIMER_10_SECS);
--
--        err = IPMIWATCHDOG::setWatchDogTimer(SET_WD_TIMER_10_SECS);
-+                   SET_WD_TIMER_IN_SECS);
-+
-+        err = IPMIWATCHDOG::setWatchDogTimer(
-+                               SET_WD_TIMER_IN_SECS,  // new time
-+                               static_cast<uint8_t>
-+                                          (IPMIWATCHDOG::DO_NOT_STOP |
-+                                           IPMIWATCHDOG::BIOS_FRB2), // default
-+                               IPMIWATCHDOG::NO_ACTIONS); // boot count reset
-         if(err)
-         {
-                TRACFCOMP( g_trac_sbe,
-@@ -1342,7 +1359,7 @@ void sbePreShutdownIpmiCalls( void )
-                           "FAIL Setting Watch Dog Timer to %d seconds. "
-                           "Committing Error Log rc=0x%.4X eid=0x%.8X "
-                           "plid=0x%.8X, but continuing shutdown",
--                          SET_WD_TIMER_10_SECS,
-+                          SET_WD_TIMER_IN_SECS,
-                           err->reasonCode(),
-                           err->eid(),
-                           err->plid());
-diff --git a/src/usr/sbe/sbe_resolve_sides.H b/src/usr/sbe/sbe_resolve_sides.H
-index 42f727a..d7c1f7c 100644
---- a/src/usr/sbe/sbe_resolve_sides.H
-+++ b/src/usr/sbe/sbe_resolve_sides.H
-@@ -50,6 +50,10 @@ namespace SBE
-                                       { EEPROM::SBE_PRIMARY,
-                                         EEPROM::SBE_BACKUP };
- 
-+    // @todo RTC 124679 - Remove Once BMC Monitors Shutdown Attention
-+    // Set Watchdog Timer To 15 seconds before calling doShutdown()
-+    const uint16_t SET_WD_TIMER_IN_SECS = 15;
-+
-     /******************************************/
-     /*  Enums                                 */
-     /******************************************/
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index 562798b..a20c1a8 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -46,6 +46,7 @@
- #include <sys/msg.h>
- #include <hwas/common/deconfigGard.H>
- #include <initservice/initserviceif.H>
-+#include <console/consoleif.H>
- #include <config.h>
- #include <sbe/sbeif.H>
- #include <sbe/sbereasoncodes.H>
-@@ -371,6 +372,19 @@ namespace SBE
-                 sbePreShutdownIpmiCalls();
- #endif
- 
-+#ifdef CONFIG_CONSOLE
-+  #ifdef CONFIG_BMC_IPMI
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down In %d "
-+                              "Seconds To Perform SBE Update\n",
-+                              SET_WD_TIMER_IN_SECS);
-+  #else
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down To "
-+                              "Perform SBE Update\n");
-+  #endif
-+
-+            CONSOLE::flush();
-+#endif
-+
-                 TRACFCOMP( g_trac_sbe,
-                            INFO_MRK"updateProcessorSbeSeeproms(): Calling "
-                            "INITSERVICE::doShutdown() with "
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index 9c39190..d3b76fa 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= a91a8f7b3d35490845272e839e372329114df7a4
+HOSTBOOT_VERSION ?= 3593853a4323d9ec7de1ad6502e22b3e66af03ae
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0
