Merge pull request #75 from geissonator/master

Remove merged patches and add ipmi runtime fix and dimm sensor fix
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