diff --git a/openpower/package/hostboot/hostboot-0006-Runtime-fixes-for-IPMI.patch b/openpower/package/hostboot/hostboot-0006-Runtime-fixes-for-IPMI.patch
deleted file mode 100644
index 011dae7..0000000
--- a/openpower/package/hostboot/hostboot-0006-Runtime-fixes-for-IPMI.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-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-0006-sbe-pnor.patch b/openpower/package/hostboot/hostboot-0006-sbe-pnor.patch
new file mode 100644
index 0000000..cbf25e1
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0006-sbe-pnor.patch
@@ -0,0 +1,28 @@
+From 961d01024912ce7b0547095d38921bdd61ae8cd8 Mon Sep 17 00:00:00 2001
+From: Brian Horton <brianh@linux.ibm.com>
+Date: Wed, 11 Mar 2015 10:14:31 -0500
+Subject: [PATCH] fix SBE/PNOR merge issues
+
+Change-Id: I74752dbfa50fc78be66a9f185a7c6bc4d31732cd
+---
+ src/usr/sbe/sbe_update.C |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
+index a559229..5ac4909 100644
+--- a/src/usr/sbe/sbe_update.C
++++ b/src/usr/sbe/sbe_update.C
+@@ -1791,8 +1791,8 @@ namespace SBE
+                                         reinterpret_cast<void*>(SBE_IMG_VADDR),
+                                         ((io_sbeState.seeprom_side_to_update ==
+                                          EEPROM::SBE_PRIMARY ) ?
+-                                            PNOR::SBE_SEEPROM0 :
+-                                            PNOR::SBE_SEEPROM1  ),
++                                            SBE_SEEPROM0 :
++                                            SBE_SEEPROM1  ),
+                                         PNOR::WORKING,
+                                         imageWasUpdated );
+ 
+-- 
+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
deleted file mode 100644
index 63ceb6e..0000000
--- a/openpower/package/hostboot/hostboot-0007-Update-DIMM_TEMP-Sensor-Enum.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-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-0008-mss-thermal-init-SW297647.patch b/openpower/package/hostboot/hostboot-0007-mss-thermal-init-SW297647_and_undo.patch
similarity index 67%
rename from openpower/package/hostboot/hostboot-0008-mss-thermal-init-SW297647.patch
rename to openpower/package/hostboot/hostboot-0007-mss-thermal-init-SW297647_and_undo.patch
index 5ed49f8..f6eafe5 100644
--- a/openpower/package/hostboot/hostboot-0008-mss-thermal-init-SW297647.patch
+++ b/openpower/package/hostboot/hostboot-0007-mss-thermal-init-SW297647_and_undo.patch
@@ -1,35 +1,38 @@
-From 1b7b2c8af560b71aa1dcddb4e8075047a1321d1e Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Wed, 4 Mar 2015 13:25:30 -0600
+From 430bf7d7b8194bf7789db053999464390e143fdc Mon Sep 17 00:00:00 2001
+From: Brian Horton <brianh@linux.ibm.com>
+Date: Wed, 11 Mar 2015 16:13:11 -0500
 Subject: [PATCH] mss thermal patch from Mike Pradik
 
-Change-Id: I0980f7b996a854f92c0ffad39eb32758539df91e
+AND undeo 1.18 attribute change
+
+Change-Id: I0c3e9d126077fb18bb771909631e0491da4b5f99
 ---
- .../mss_thermal_init/mss_thermal_init.C            | 23 ++++++++++++++++++----
- 1 file changed, 19 insertions(+), 4 deletions(-)
+ .../mss_thermal_init/mss_thermal_init.C            |   26 ++++++++++++++++----
+ 1 files changed, 21 insertions(+), 5 deletions(-)
 
 diff --git a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
-index aa217c6..2e6600f 100644
+index e09f47f..dc21852 100644
 --- a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
 +++ b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
 @@ -22,7 +22,7 @@
  /* permissions and limitations under the License.                         */
  /*                                                                        */
  /* IBM_PROLOG_END_TAG                                                     */
--// $Id: mss_thermal_init.C,v 1.18 2015/01/23 17:54:09 dcrowell Exp $
-+// $Id: mss_thermal_init.C,v 1.18b CHANGED IN OPENPOWER PATCH maploetz Exp $
+-// $Id: mss_thermal_init.C,v 1.19 2015/02/12 23:23:56 pardeik Exp $
++// $Id: mss_thermal_init.C,v 1.18c CHANGED IN OPENPOWER PATCH brianh   Exp $
  // $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/centaur/working/procedures/ipl/fapi/mss_thermal_init.C,v $
  //------------------------------------------------------------------------------
  // *! (C) Copyright International Business Machines Corp. 2011
-@@ -49,6 +49,7 @@
+@@ -49,6 +49,8 @@
  //------------------------------------------------------------------------------
  // Version:|  Author: |  Date:  | Comment:
  //---------|----------|---------|-----------------------------------------------
++//   1.18v | brianhk  |11-MAR-15| undo 1.18 change
 +//   1.18u | pardeik  |03-MAR-15| user version to be like v1.20
+ //   1.18  | pardeik  |12-FEB-15| change ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP to
+ //                              | a centaur target (was system)
  //   1.17  | pardeik  |19-NOV-14| Use MRW attribute for SC address map for ISDIMMs
- //   1.16  | pardeik  |06-FEB-14| removed string in trace statement
- //   1.15  | pardeik  |24-FEB-14| added support for ATTR_MRW_CDIMM_SPARE_I2C_TEMP_SENSOR_ENABLE
-@@ -158,6 +159,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+@@ -160,6 +162,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
        const uint8_t I2C_BUS_ENCODE_PRIMARY = 0;
        const uint8_t I2C_BUS_ENCODE_SECONDARY = 8;
        const uint8_t MAX_NUM_DIMM_SENSORS = 8;
@@ -37,7 +40,7 @@
  
        // Variable declaration
        uint8_t l_dimm_ranks_array[l_NUM_MBAS][l_NUM_PORTS][l_NUM_DIMMS];	// Number of ranks for each configured DIMM in each MBA
-@@ -247,6 +249,19 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+@@ -249,6 +252,19 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
            l_custom_dimm[i] = fapi::ENUM_ATTR_EFF_CUSTOM_DIMM_NO;
        }
  
@@ -57,7 +60,16 @@
        for (uint8_t mba_index = 0; mba_index < l_target_mba_array.size(); mba_index++){
           l_rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS, &l_target_mba_array[mba_index], l_mba_pos);
  	 if (l_rc) return l_rc;
-@@ -397,9 +412,9 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+@@ -279,7 +295,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+       else
+       {
+ 	  // sensor cache address map for non custom dimm temperature sensors (which i2c bus and i2c address they are)
+-	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, &i_target, l_dimm_sensor_cache_addr_map);
++	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, NULL, l_dimm_sensor_cache_addr_map);
+ 	  if (l_rc) return l_rc;
+       }
+ 
+@@ -399,9 +415,9 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
  
  	  l_cdimm_number_dimm_temp_sensors = 0;
  	  // cycle through both primary and secondary i2c busses, determine i2c address and enable bits
@@ -69,7 +81,7 @@
  	      {
  		  if (k == 0)
  		  {
-@@ -490,7 +505,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+@@ -492,7 +508,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
           // Iterate through the num_ranks array to determine what DIMMs are plugged
  	 // Enable sensor monitoring for each plugged DIMM
           uint32_t l_iterator = 0;
@@ -79,5 +91,5 @@
  	       l_ecmd_rc |= l_data_scac_enable.setBit(l_iterator);
  	    }
 -- 
-1.8.2.2
+1.7.4.1
 
diff --git a/openpower/package/hostboot/hostboot-0009-Sel-instead-of-eSel.patch b/openpower/package/hostboot/hostboot-0009-Sel-instead-of-eSel.patch
deleted file mode 100644
index 6b4c82d..0000000
--- a/openpower/package/hostboot/hostboot-0009-Sel-instead-of-eSel.patch
+++ /dev/null
@@ -1,201 +0,0 @@
-From 03029acd024ac886296f8ed0cbc711d9b81b26da Mon Sep 17 00:00:00 2001
-From: Brian Horton <brianh@linux.ibm.com>
-Date: Mon, 2 Mar 2015 12:12:28 -0600
-Subject: [PATCH] change error log to SEL processing
-
-for hostboot runtime, do not send eSEL (AMI bug)
-for hostboot ipl, send down SEL following eSEL
-
-Change-Id: I86ee9766e27548c3f7f72fbdbfd76c8a8be7da73
-RTC: 124971
----
- src/include/usr/ipmi/ipmisel.H    | 18 ++++++++++--
- src/usr/errl/errlmanager_common.C |  4 ++-
- src/usr/ipmi/ipmisel.C            | 61 ++++++++++++++++++++++++++++++++-------
- 3 files changed, 70 insertions(+), 13 deletions(-)
-
-diff --git a/src/include/usr/ipmi/ipmisel.H b/src/include/usr/ipmi/ipmisel.H
-index de2dd32..91e3651 100644
---- a/src/include/usr/ipmi/ipmisel.H
-+++ b/src/include/usr/ipmi/ipmisel.H
-@@ -65,11 +65,13 @@ namespace IPMISEL
-      * @param[in] size of eSEL data
-      * @param[in] eid of errorlog for this eSEL (for ack)
-      * @param[in] event_dir_type for this eSEL
-+     * @param[in] event_offset for this eSEL
-      * @param[in] sensorType that caused the error/eSEL
-      * @param[in] sensorNumber that caused the error/eSEL
-      */
-     void sendESEL(uint8_t* i_eselData, uint32_t i_dataSize,
--                  uint32_t i_eid, uint8_t i_eventDirType,
-+                  uint32_t i_eid,
-+                  uint8_t i_eventDirType, uint8_t i_eventOffset,
-                   uint8_t i_sensorType, uint8_t i_sensorNumber);
- 
-     // per IPMI Spec, section 32.1 SEL Event Records
-@@ -85,6 +87,7 @@ namespace IPMISEL
-         format_ipmi_version_2_0 = 0x04,
-     };
- 
-+    // event_type, per section 42.1 of the IPMI spec
-     enum sel_event_dir_type
-     {
-         event_unspecified       = 0x00,
-@@ -93,11 +96,22 @@ namespace IPMISEL
-         event_predictive        = 0x04,
-         event_limit             = 0x05,
-         event_permformance      = 0x06,
-+        event_transition        = 0x07,
-+        event_OEM               = 0x70,
-     };
- 
-     enum sel_event_data
-     {
--        event_data1_ami         = 0xAA,
-+        event_data1_ami                         = 0xAA,
-+        event_data1_trans_to_ok                 = 0x00,
-+        event_data1_trans_to_noncrit_from_ok    = 0x01,
-+        event_data1_trans_to_crit_from_less     = 0x02,
-+        event_data1_trans_to_non_recv_from_less = 0x03,
-+        event_data1_trans_to_non_crit_from_more = 0x04,
-+        event_data1_trans_to_crit_from_non_r    = 0x05,
-+        event_data1_trans_to_non_recoverable    = 0x06,
-+        event_data1_trans_monitor               = 0x07,
-+        event_data1_trans_informational         = 0x08,
-     };
- 
-     enum sel_generator_id
-diff --git a/src/usr/errl/errlmanager_common.C b/src/usr/errl/errlmanager_common.C
-index a64ed3b..6c68818 100644
---- a/src/usr/errl/errlmanager_common.C
-+++ b/src/usr/errl/errlmanager_common.C
-@@ -135,7 +135,9 @@ void ErrlManager::sendErrLogToBmc(errlHndl_t &io_err)
-                 "sendErrLogToBmc: sensor %.2x/%.2x, size %d",
-                 l_sensorType, l_sensorNumber, l_pelSize);
-         IPMISEL::sendESEL(l_pelData, l_pelSize,
--                            io_err->eid(), IPMISEL::event_unspecified,
-+                            io_err->eid(),
-+                            IPMISEL::event_transition,
-+                            IPMISEL::event_data1_trans_to_non_recoverable,
-                             l_sensorType, l_sensorNumber);
- 
-         // free the buffer
-diff --git a/src/usr/ipmi/ipmisel.C b/src/usr/ipmi/ipmisel.C
-index c05c60f..49dcee6 100644
---- a/src/usr/ipmi/ipmisel.C
-+++ b/src/usr/ipmi/ipmisel.C
-@@ -82,7 +82,8 @@ enum esel_retry
- namespace IPMISEL
- {
- void sendESEL(uint8_t* i_eselData, uint32_t i_dataSize,
--              uint32_t i_eid, uint8_t i_eventDirType,
-+              uint32_t i_eid,
-+              uint8_t i_eventDirType, uint8_t i_eventOffset,
-               uint8_t i_sensorType, uint8_t i_sensorNumber)
- {
-     IPMI_TRAC(ENTER_MRK "sendESEL()");
-@@ -100,13 +101,13 @@ void sendESEL(uint8_t* i_eselData, uint32_t i_dataSize,
- 
-     // create the sel record of information
-     selRecord l_sel;
--    l_sel.record_type = record_type_ami_esel;
-+    l_sel.record_type = record_type_system_event;
-     l_sel.generator_id = generator_id_ami;
-     l_sel.evm_format_version = format_ipmi_version_2_0;
-     l_sel.sensor_type = i_sensorType;
-     l_sel.sensor_number = i_sensorNumber;
-     l_sel.event_dir_type = i_eventDirType;
--    l_sel.event_data1 = event_data1_ami;
-+    l_sel.event_data1 = i_eventOffset;
- 
-     eselInitData *eselData =
-         new eselInitData(&l_sel, i_eselData, i_dataSize);
-@@ -216,13 +217,16 @@ void send_esel(eselInitData * i_data,
- {
-     IPMI_TRAC(ENTER_MRK "send_esel");
-     uint8_t* data = NULL;
--    const size_t l_eSELlen = i_data->dataSize;
- 
-     size_t len = 0;
--    uint8_t reserveID[2] = {0,0};
-     uint8_t esel_recordID[2] = {0,0};
-+    uint8_t sel_recordID[2] = {0,0};
- 
-+#ifndef __HOSTBOOT_RUNTIME
-+// TODO RTC: 124972 take this out when runtime supports the eSEL
-     do{
-+        const size_t l_eSELlen = i_data->dataSize;
-+        uint8_t reserveID[2] = {0,0};
-         // we need to send down the extended sel data (eSEL), which is
-         // longer than the protocol buffer, so we need to do a reservation and
-         // call the AMI partial_add_esel command multiple times
-@@ -258,6 +262,9 @@ void send_esel(eselInitData * i_data,
-         // copy in the SEL event record data
-         memcpy(&data[PARTIAL_ADD_ESEL_REQ], i_data->eSel,
-                 sizeof(selRecord));
-+        // update to make this what AMI eSEL wants
-+        data[PARTIAL_ADD_ESEL_REQ + offsetof(selRecord,record_type)] = record_type_ami_esel;
-+        data[PARTIAL_ADD_ESEL_REQ + offsetof(selRecord,event_data1)] = event_data1_ami;
- 
-         o_cc = IPMI::CC_UNKBAD;
-         TRACFBIN( g_trac_ipmi, INFO_MRK"1st partial_add_esel:", data, len);
-@@ -338,17 +345,51 @@ void send_esel(eselInitData * i_data,
-             // BMC returns the recordID, it's always the same (unless
-             // there's a major BMC bug...)
-             storeReserveRecord(esel_recordID,data);
-+        } // while eSELindex
-+    }while(0);
-+#endif
-+
-+    // if eSEL wasn't created due to an error, we don't want to continue
-+    if(o_err == NULL)
-+    {
-+        // if the eSEL wasn't created due to a bad completion code, we will
-+        // still try to send down a SEL that we create, which will contain
-+        // the eSEL recordID (if it was successful)
-+        delete [] data;
-+        len = sizeof(IPMISEL::selRecord);
-+        data = new uint8_t[len];
-+
-+        // copy in the SEL event record data
-+        memcpy(data, i_data->eSel, sizeof(IPMISEL::selRecord));
-+        // copy the eSEL recordID (if it was created) into the extra data area
-+        data[offsetof(selRecord,event_data2)] = esel_recordID[1];
-+        data[offsetof(selRecord,event_data3)] = esel_recordID[0];
-+
-+        // use local cc so that we don't corrupt the esel from above
-+        IPMI::completion_code l_cc = IPMI::CC_UNKBAD;
-+        TRACFBIN( g_trac_ipmi, INFO_MRK"add_sel:", data, len);
-+        o_err = IPMI::sendrecv(IPMI::add_sel(),l_cc,len,data);
-+        if(o_err)
-+        {
-+            IPMI_TRAC(ERR_MRK "error from add_sel");
-         }
--        if(o_err || (o_cc != IPMI::CC_OK))
-+        else if (l_cc != IPMI::CC_OK)
-         {
--            break;
-+            IPMI_TRAC(ERR_MRK "failed add_sel, l_cc %02x", l_cc);
-         }
--    }while(0);
-+        else
-+        {
-+            // if CC_OK, then len = 2 and data contains the recordID of the new SEL
-+            storeReserveRecord(sel_recordID,data);
-+        }
-+    }
- 
-     delete[] data;
- 
--    IPMI_TRAC(EXIT_MRK "send_esel (o_err %.8X, o_cc x%.2x, recID=x%x%x)",
--        o_err ? o_err->plid() : NULL, o_cc, esel_recordID[1], esel_recordID[0]);
-+    IPMI_TRAC(EXIT_MRK
-+        "send_esel o_err=%.8X, o_cc=x%.2x, sel recID=x%x%x, esel recID=x%x%x",
-+        o_err ? o_err->plid() : NULL, o_cc, sel_recordID[1], sel_recordID[0],
-+        esel_recordID[1], esel_recordID[0]);
- 
-     return;
- } // send_esel
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0010-Reset-occ-when-fails-to-activate.patch b/openpower/package/hostboot/hostboot-0010-Reset-occ-when-fails-to-activate.patch
deleted file mode 100644
index 4b666b0..0000000
--- a/openpower/package/hostboot/hostboot-0010-Reset-occ-when-fails-to-activate.patch
+++ /dev/null
@@ -1,301 +0,0 @@
-From 98fc2914b15e89c2324c1636af62225c653e45f9 Mon Sep 17 00:00:00 2001
-From: Doug Gilbert <dgilbert@us.ibm.com>
-Date: Tue, 3 Mar 2015 16:00:29 -0600
-Subject: [PATCH] HTMGT add attempt to reset OCC when OCC Activate fails
-
-Change-Id: I964d2b68216c3ddabae73ce3b851bbc468ec96a7
-RTC: 123180
----
- src/include/usr/htmgt/htmgt_reasoncodes.H |   1 +
- src/usr/htmgt/htmgt.C                     | 123 ++++++++++++++++++------------
- src/usr/htmgt/htmgt_activate.C            |   9 +++
- src/usr/htmgt/htmgt_occ.C                 |  32 +++++++-
- src/usr/htmgt/htmgt_occ.H                 |   1 +
- 5 files changed, 116 insertions(+), 50 deletions(-)
-
-diff --git a/src/include/usr/htmgt/htmgt_reasoncodes.H b/src/include/usr/htmgt/htmgt_reasoncodes.H
-index ade192d..6fe269d 100644
---- a/src/include/usr/htmgt/htmgt_reasoncodes.H
-+++ b/src/include/usr/htmgt/htmgt_reasoncodes.H
-@@ -48,6 +48,7 @@ namespace HTMGT
-         HTMGT_MOD_CHECK_OCC_RSP         = 0x92,
-         HTMGT_MOD_PARSE_OCC_RSP         = 0x94,
-         HTMGT_MOD_HANLDE_OCC_EXCEPTION  = 0xE0,
-+        HTMGT_MOD_ENABLE_OCC_ACTUATION  = 0xE1,
-     };
- 
-     enum htmgtReasonCode
-diff --git a/src/usr/htmgt/htmgt.C b/src/usr/htmgt/htmgt.C
-index aff2500..a2f556f 100644
---- a/src/usr/htmgt/htmgt.C
-+++ b/src/usr/htmgt/htmgt.C
-@@ -184,42 +184,30 @@ namespace HTMGT
- 
-         if (NULL != l_err)
-         {
--            TMGT_ERR("OCCs not all active.  System will stay in safe mode");
-+            TMGT_ERR("OCCs not all active.  Attempting OCC Reset");
-             TMGT_CONSOLE("OCCs are not active (rc=0x%04X). "
--                         "System will remain in safe mode",
-+                         "Attempting OCC Reset",
-                          l_err->reasonCode());
--            TMGT_INF("Calling HBOCC::stopAllOCCs");
--            errlHndl_t err2 = HBOCC::stopAllOCCs();
-+            TMGT_INF("Calling resetOccs");
-+            errlHndl_t err2 = OccManager::resetOccs(NULL);
-             if(err2)
-             {
--                TMGT_ERR("stopAllOCCs() failed with 0x%04X",
-+                TMGT_ERR("OccManager:;resetOccs failed with 0x%04X",
-                          err2->reasonCode());
--                ERRORLOG::errlCommit(err2, HTMGT_COMP_ID);
--            }
--
--            // Update error log to unrecoverable and set SRC
--            // to indicate the system will remain in safe mode
--            /*@
--             * @errortype
--             * @reasoncode      HTMGT_RC_OCC_CRIT_FAILURE
--             * @moduleid        HTMGT_MOD_LOAD_START_STATUS
--             * @userdata1[0:7]  load/start completed
--             * @devdesc         OCCs did not all reach active state,
--             *                  system will be in Safe Mode
--             */
--            bldErrLog(l_err, HTMGT_MOD_LOAD_START_STATUS,
--                      HTMGT_RC_OCC_CRIT_FAILURE,
--                      i_startCompleted, 0, 0, 1,
--                      ERRORLOG::ERRL_SEV_UNRECOVERABLE);
- 
--            // Add level 2 support callout
--            l_err->addProcedureCallout(HWAS::EPUB_PRC_LVL_SUPP,
--                                       HWAS::SRCI_PRIORITY_MED);
--            // Add HB firmware callout
--            l_err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
--                                       HWAS::SRCI_PRIORITY_MED);
-+                // Set original error log  as unrecoverable and commit
-+                l_err->setSev(ERRORLOG::ERRL_SEV_UNRECOVERABLE);
-+                ERRORLOG::errlCommit(l_err, HTMGT_COMP_ID);
- 
--            ERRORLOG::errlCommit(l_err, HTMGT_COMP_ID);
-+                // Commit occReset error
-+                ERRORLOG::errlCommit(err2, HTMGT_COMP_ID);
-+            }
-+            else
-+            {
-+                // retry worked - commit original error as informational
-+                l_err->setSev(ERRORLOG::ERRL_SEV_INFORMATIONAL);
-+                ERRORLOG::errlCommit(l_err, HTMGT_COMP_ID);
-+            }
-         }
- 
-     } // end processOccStartStatus()
-@@ -229,6 +217,19 @@ namespace HTMGT
-     // Notify HTMGT that an OCC has an error to report
-     void processOccError(TARGETING::Target * i_procTarget)
-     {
-+        TARGETING::Target* sys = NULL;
-+        TARGETING::targetService().getTopLevelTarget(sys);
-+        uint8_t safeMode = 0;
-+
-+        // If the system is in safemode then can't talk to OCCs -
-+        // ignore call to processOccError
-+        if(sys &&
-+           sys->tryGetAttr<TARGETING::ATTR_HTMGT_SAFEMODE>(safeMode) &&
-+           safeMode)
-+        {
-+            return;
-+        }
-+
-         bool polledOneOcc = false;
-         OccManager::buildOccs();
- 
-@@ -347,29 +348,57 @@ namespace HTMGT
-     // Set the OCC state
-     errlHndl_t enableOccActuation(bool i_occActivation)
-     {
--        occStateId targetState = OCC_STATE_ACTIVE;
--        if (false == i_occActivation)
--        {
--            targetState = OCC_STATE_OBSERVATION;
--        }
-+        errlHndl_t l_err = NULL;
-+        TARGETING::Target* sys = NULL;
-+
-+        TARGETING::targetService().getTopLevelTarget(sys);
-+        uint8_t safeMode = 0;
- 
--        // Set state for all OCCs
--        errlHndl_t l_err = OccManager::setOccState(targetState);
--        if (NULL == l_err)
-+        // If the system is in safemode then can't talk to OCCs -
-+        // ignore call to enableOccActuation
-+        if(sys &&
-+           sys->tryGetAttr<TARGETING::ATTR_HTMGT_SAFEMODE>(safeMode) &&
-+           safeMode)
-         {
--            TMGT_INF("enableOccActuation: OCC states updated to 0x%02X",
--                     targetState);
-+            /*@
-+             * @errortype
-+             * @reasoncode      HTMGT_RC_OCC_CRIT_FAILURE
-+             * @moduleid        HTMGT_MOD_ENABLE_OCC_ACTUATION
-+             * @userdata1[0:7]  OCC activate [1==true][0==false]
-+             * @devdesc         Invalid operation when OCCs are in safemode
-+             */
-+            bldErrLog(l_err,
-+                      HTMGT_MOD_ENABLE_OCC_ACTUATION,
-+                      HTMGT_RC_OCC_CRIT_FAILURE,
-+                      i_occActivation, 0, 0, 1,
-+                      ERRORLOG::ERRL_SEV_UNRECOVERABLE);
-         }
--
--        if (OccManager::occNeedsReset())
-+        else
-         {
--            TMGT_ERR("enableOccActuation(): OCCs need to be reset");
--            // Don't pass failed target as OCC should have already
--            // been marked as failed during the poll.
--            errlHndl_t err2 = OccManager::resetOccs(NULL);
--            if(err2)
-+            occStateId targetState = OCC_STATE_ACTIVE;
-+            if (false == i_occActivation)
-             {
--                ERRORLOG::errlCommit(err2, HTMGT_COMP_ID);
-+                targetState = OCC_STATE_OBSERVATION;
-+            }
-+
-+            // Set state for all OCCs
-+            l_err = OccManager::setOccState(targetState);
-+            if (NULL == l_err)
-+            {
-+                TMGT_INF("enableOccActuation: OCC states updated to 0x%02X",
-+                         targetState);
-+            }
-+
-+            if (OccManager::occNeedsReset())
-+            {
-+                TMGT_ERR("enableOccActuation(): OCCs need to be reset");
-+                // Don't pass failed target as OCC should have already
-+                // been marked as failed during the poll.
-+                errlHndl_t err2 = OccManager::resetOccs(NULL);
-+                if(err2)
-+                {
-+                    ERRORLOG::errlCommit(err2, HTMGT_COMP_ID);
-+                }
-             }
-         }
- 
-diff --git a/src/usr/htmgt/htmgt_activate.C b/src/usr/htmgt/htmgt_activate.C
-index 7f54d6d..4cb46f0 100644
---- a/src/usr/htmgt/htmgt_activate.C
-+++ b/src/usr/htmgt/htmgt_activate.C
-@@ -39,6 +39,7 @@
- 
- #include <ipmi/ipmisensor.H>
- #include <sys/time.h>
-+#include <console/consoleif.H>
- 
- using namespace TARGETING;
- 
-@@ -163,6 +164,14 @@ namespace HTMGT
-             l_err = occ->ipmiSensor(i_activate);
-             if( l_err )
-             {
-+                TMGT_ERR("setOccActiveSensors failed. (OCC%d state:%d)",
-+                         occ->getInstance(),
-+                         i_activate);
-+
-+                TMGT_CONSOLE("setOccActiveSensors failed. (OCC%d state:%d)",
-+                         occ->getInstance(),
-+                         i_activate);
-+
-                 ERRORLOG::errlCommit(l_err, HTMGT_COMP_ID);
-             }
-         }
-diff --git a/src/usr/htmgt/htmgt_occ.C b/src/usr/htmgt/htmgt_occ.C
-index 8a539f4..bd95987 100644
---- a/src/usr/htmgt/htmgt_occ.C
-+++ b/src/usr/htmgt/htmgt_occ.C
-@@ -248,7 +248,8 @@ namespace HTMGT
-     OccManager::OccManager()
-         :iv_occMaster(NULL),
-         iv_state(OCC_STATE_UNKNOWN),
--        iv_targetState(OCC_STATE_ACTIVE)
-+        iv_targetState(OCC_STATE_ACTIVE),
-+        iv_resetCount(0)
-     {
-     }
- 
-@@ -590,6 +591,19 @@ namespace HTMGT
-             ERRORLOG::errlCommit(err, HTMGT_COMP_ID);
-         }
- 
-+        if(NULL == i_failedOccTarget)
-+        {
-+            ++iv_resetCount; // increment system reset count
-+
-+            TMGT_INF("resetOCCs: Incrementing system OCC reset count to %d",
-+                     iv_resetCount);
-+
-+            if(iv_resetCount > OCC_RESET_COUNT_THRESHOLD)
-+            {
-+                atThreshold = true;
-+            }
-+        }
-+
-         for(occList_t::const_iterator occ = iv_occArray.begin();
-             occ != iv_occArray.end();
-             ++occ)
-@@ -663,7 +677,7 @@ namespace HTMGT
-              */
-             bldErrLog(err,
-                       HTMTG_MOD_OCC_RESET,
--                      HTMGT_RC_OCC_RESET_THREHOLD,
-+                      HTMGT_RC_OCC_CRIT_FAILURE,
-                       0, 0, 0, 0,
-                       ERRORLOG::ERRL_SEV_UNRECOVERABLE);
-         }
-@@ -673,6 +687,13 @@ namespace HTMGT
-         {
-             err->setSev(ERRORLOG::ERRL_SEV_UNRECOVERABLE);
- 
-+            // Add level 2 support callout
-+            err->addProcedureCallout(HWAS::EPUB_PRC_LVL_SUPP,
-+                                     HWAS::SRCI_PRIORITY_MED);
-+            // Add HB firmware callout
-+            err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
-+                                     HWAS::SRCI_PRIORITY_MED);
-+
-             TARGETING::Target* sys = NULL;
-             TARGETING::targetService().getTopLevelTarget(sys);
-             uint8_t safeMode = 1;
-@@ -683,8 +704,13 @@ namespace HTMGT
-                sys->setAttr<TARGETING::ATTR_HTMGT_SAFEMODE>(safeMode);
-             }
- 
--            TMGT_ERR("_resetOccs: Safe Mode RC: 0x%04X (OCC%d)",
-+            TMGT_ERR("_resetOccs: Safe Mode (RC: 0x%04X OCC%d)",
-                      cv_safeReturnCode, cv_safeOccInstance);
-+
-+            TMGT_CONSOLE("OCCs are not active. The system will remain in "
-+                         "safe mode (RC: 0x%04x  for OCC%d)",
-+                         cv_safeReturnCode,
-+                         cv_safeOccInstance);
-         }
- 
-         return err;
-diff --git a/src/usr/htmgt/htmgt_occ.H b/src/usr/htmgt/htmgt_occ.H
-index dec19b8..5ac545a 100644
---- a/src/usr/htmgt/htmgt_occ.H
-+++ b/src/usr/htmgt/htmgt_occ.H
-@@ -507,6 +507,7 @@ namespace HTMGT
-             occList_t               iv_occArray;
-             occStateId              iv_state;
-             occStateId              iv_targetState;
-+            uint8_t                 iv_resetCount;
- 
-             /**
-              * @brief SRC that caused system to enter safe mode
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0011-eRepair-MBVPD-size-check-for-CDIMM-and-ISDIMM.patch b/openpower/package/hostboot/hostboot-0011-eRepair-MBVPD-size-check-for-CDIMM-and-ISDIMM.patch
deleted file mode 100644
index 55c94f0..0000000
--- a/openpower/package/hostboot/hostboot-0011-eRepair-MBVPD-size-check-for-CDIMM-and-ISDIMM.patch
+++ /dev/null
@@ -1,504 +0,0 @@
-From 403b5b351e0ee82fa0b7147ea924b455384cf39d Mon Sep 17 00:00:00 2001
-From: Bilicon Patil <bilpatil@in.ibm.com>
-Date: Fri, 5 Dec 2014 07:25:24 -0600
-Subject: [PATCH 2/6] eRepair MBVPD size check for CDIMM and ISDIMM
-
-The eRepair VPD size for DMI Bus is bigger in systems with ISDIMMs because
-the VPD accounts for all the Centaurs. The current check in the code is
-for each Centaur which is applicable for systems with CDIMMs.
-
-The fix also includes a change to do restore of eRepair records noted
-in the VPD when the system had a non-fips830 driver.
-
-Change-Id: Ibaaf98c5be3e26474ee0eede6081f506f4bb7ec3
-RTC: 119532
-Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/14727
-Tested-by: Jenkins Server
-Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-Reviewed-by: Prem Shanker Jha <premjha2@in.ibm.com>
-Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
-(cherry picked from commit db9b6fed621390d10459834300924e0fafd6fa04)
----
- .../hwp/bus_training/erepairGetFailedLanesHwp.C    |  194 +++++++++++++++-----
- .../hwp/bus_training/erepairSetFailedLanesHwp.C    |   73 +++++++-
- 2 files changed, 215 insertions(+), 52 deletions(-)
-
-diff --git a/src/usr/hwpf/hwp/bus_training/erepairGetFailedLanesHwp.C b/src/usr/hwpf/hwp/bus_training/erepairGetFailedLanesHwp.C
-index a4db160..33ec195 100644
---- a/src/usr/hwpf/hwp/bus_training/erepairGetFailedLanesHwp.C
-+++ b/src/usr/hwpf/hwp/bus_training/erepairGetFailedLanesHwp.C
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2013,2014                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
- /*                                                                        */
-@@ -38,6 +38,8 @@
- 
- #include <erepairGetFailedLanesHwp.H>
- 
-+using namespace EREPAIR;
-+
- extern "C"
- {
- 
-@@ -62,10 +64,10 @@ extern "C"
-  *
-  * @return ReturnCode
-  */
--fapi::ReturnCode retrieveRepairData(const fapi::Target      &i_tgtHandle,
--                                    EREPAIR::erepairVpdType i_vpdType,
--                                    std::vector<uint8_t>    &o_txFailLanes,
--                                    std::vector<uint8_t>    &o_rxFailLanes);
-+fapi::ReturnCode retrieveRepairData(const fapi::Target    &i_tgtHandle,
-+                                    erepairVpdType        i_vpdType,
-+                                    std::vector<uint8_t>  &o_txFailLanes,
-+                                    std::vector<uint8_t>  &o_rxFailLanes);
- 
- /**
-  * @brief Function called by the FW Team HWP that parses the data read from
-@@ -92,15 +94,25 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-                                       std::vector<uint8_t> &o_rxFailLanes);
- 
- 
-+/**
-+ * @brief Function to check if the system has Custom DIMM type (CDIMM).
-+ *        Attribute ATTR_EFF_CUSTOM_DIMM is read to determine the type.
-+ * @param[in] i_tgtHandle   Reference to X-Bus or A-Bus or MCS target
-+ * @param[o]  o_customDimm  Return value - ENUM_ATTR_EFF_CUSTOM_DIMM_NO
-+ *                                      or ENUM_ATTR_EFF_CUSTOM_DIMM_YES
-+ * @return ReturnCode
-+ */
-+fapi::ReturnCode getDimmType(const fapi::Target &i_tgtHandle,
-+                             uint8_t &o_customDimm);
-+
- /******************************************************************************
-  * Accessor HWP
-  *****************************************************************************/
- 
--fapi::ReturnCode erepairGetFailedLanesHwp(
--                                         const fapi::Target      &i_tgtHandle,
--                                         EREPAIR::erepairVpdType i_vpdType,
--                                         std::vector<uint8_t>    &o_txFailLanes,
--                                         std::vector<uint8_t>    &o_rxFailLanes)
-+fapi::ReturnCode erepairGetFailedLanesHwp(const fapi::Target  &i_tgtHandle,
-+                                          erepairVpdType       i_vpdType,
-+                                          std::vector<uint8_t> &o_txFailLanes,
-+                                          std::vector<uint8_t> &o_rxFailLanes)
- {
-     fapi::ReturnCode l_rc;
-     fapi::Target     l_processorTgt;
-@@ -147,15 +159,16 @@ fapi::ReturnCode erepairGetFailedLanesHwp(
-     return l_rc;
- }
- 
--fapi::ReturnCode retrieveRepairData(const fapi::Target      &i_tgtHandle,
--                                    EREPAIR::erepairVpdType i_vpdType,
--                                    std::vector<uint8_t>    &o_txFailLanes,
--                                    std::vector<uint8_t>    &o_rxFailLanes)
-+fapi::ReturnCode retrieveRepairData(const fapi::Target   &i_tgtHandle,
-+                                    erepairVpdType       i_vpdType,
-+                                    std::vector<uint8_t> &o_txFailLanes,
-+                                    std::vector<uint8_t> &o_rxFailLanes)
- {
-     fapi::ReturnCode l_rc;
-     uint8_t          *l_retBuf = NULL;
-     uint32_t         l_bufSize = 0;
-     fapi::Target     l_procTarget;
-+    uint8_t          l_customDimm;
- 
-     FAPI_DBG(">> retrieveRepairData");
- 
-@@ -165,7 +178,7 @@ fapi::ReturnCode retrieveRepairData(const fapi::Target      &i_tgtHandle,
-         {
-             fapi::MBvpdRecord l_vpdRecord = fapi::MBVPD_RECORD_VEIR;
- 
--            if(i_vpdType == EREPAIR::EREPAIR_VPD_MNFG)
-+            if(i_vpdType == EREPAIR_VPD_MNFG)
-             {
-                 l_vpdRecord = fapi::MBVPD_RECORD_MER0;
-             }
-@@ -184,12 +197,34 @@ fapi::ReturnCode retrieveRepairData(const fapi::Target      &i_tgtHandle,
-                 break;
-             }
- 
--            if((l_bufSize == 0) ||
--               ((i_vpdType == EREPAIR::EREPAIR_VPD_FIELD) &&
--                (l_bufSize > EREPAIR::EREPAIR_MEM_FIELD_VPD_SIZE_PER_CENTAUR))||
--               ((i_vpdType == EREPAIR::EREPAIR_VPD_MNFG) &&
--                (l_bufSize > EREPAIR::EREPAIR_MEM_MNFG_VPD_SIZE_PER_CENTAUR)))
-+            // Check whether we have Memory on a CDIMM
-+            l_rc = getDimmType(i_tgtHandle, l_customDimm);
-+
-+            if(l_rc)
-+            {
-+                FAPI_ERR("Error (0x%x) during DIMM type check",
-+                        static_cast<uint32_t> (l_rc));
-+                break;
-+            }
-+
-+            if(l_customDimm == fapi::ENUM_ATTR_SPD_CUSTOM_YES)
-             {
-+                if((l_bufSize == 0) ||
-+                   ((i_vpdType == EREPAIR_VPD_FIELD) &&
-+                    (l_bufSize > EREPAIR_MEM_FIELD_VPD_SIZE_PER_CENTAUR)) ||
-+                   ((i_vpdType == EREPAIR_VPD_MNFG) &&
-+                    (l_bufSize > EREPAIR_MEM_MNFG_VPD_SIZE_PER_CENTAUR)))
-+                {
-+                    FAPI_SET_HWP_ERROR(l_rc,
-+                                       RC_ACCESSOR_HWP_INVALID_MEM_VPD_SIZE);
-+                    break;
-+                }
-+            }
-+            else if(l_bufSize == 0)
-+            {
-+                // TODO RTC: 119531. Add upper bound checking for l_bufSize
-+                // This size check will depend on whether the Lane eRepair data
-+                // is stored on the Planar VPD or on the Riser card VPD.
-                 FAPI_SET_HWP_ERROR(l_rc, RC_ACCESSOR_HWP_INVALID_MEM_VPD_SIZE);
-                 break;
-             }
-@@ -230,7 +265,7 @@ fapi::ReturnCode retrieveRepairData(const fapi::Target      &i_tgtHandle,
- 
-             fapi::MvpdRecord l_vpdRecord = fapi::MVPD_RECORD_VWML;
- 
--            if(i_vpdType == EREPAIR::EREPAIR_VPD_MNFG)
-+            if(i_vpdType == EREPAIR_VPD_MNFG)
-             {
-                 l_vpdRecord = fapi::MVPD_RECORD_MER0;
-             }
-@@ -250,10 +285,10 @@ fapi::ReturnCode retrieveRepairData(const fapi::Target      &i_tgtHandle,
-             }
- 
-             if((l_bufSize == 0) ||
--               ((i_vpdType == EREPAIR::EREPAIR_VPD_FIELD) &&
--                (l_bufSize > EREPAIR::EREPAIR_P8_MODULE_VPD_FIELD_SIZE)) ||
--               ((i_vpdType == EREPAIR::EREPAIR_VPD_MNFG) &&
--                (l_bufSize > EREPAIR::EREPAIR_P8_MODULE_VPD_MNFG_SIZE)))
-+               ((i_vpdType == EREPAIR_VPD_FIELD) &&
-+                (l_bufSize > EREPAIR_P8_MODULE_VPD_FIELD_SIZE)) ||
-+               ((i_vpdType == EREPAIR_VPD_MNFG) &&
-+                (l_bufSize > EREPAIR_P8_MODULE_VPD_MNFG_SIZE)))
-             {
-                 FAPI_SET_HWP_ERROR(l_rc,
-                                    RC_ACCESSOR_HWP_INVALID_FABRIC_VPD_SIZE);
-@@ -323,6 +358,7 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-     fapi::Target     l_mcsTarget;
-     fapi::Target     l_tgtHandle;
-     fapi::ReturnCode l_rc;
-+    uint8_t          l_customDimm;
-     fapi::ATTR_CHIP_UNIT_POS_Type l_busNum;
- 
-     FAPI_DBG(">> determineRepairLanes");
-@@ -394,21 +430,18 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-                 l_fabricBus->interface = (l_temp & 0x0F);
- #endif
- 
--                // Check if we have the correct Processor ID
--                if(l_chipPosition != l_fabricBus->device.processor_id)
--                {
--                    continue;
--                }
-+                // We do not need the check of processor ID because
-+                // a MVPD read is specific to a Processor
- 
-                 // Check if we have the matching the Fabric Bus types
-                 if((l_tgtType == fapi::TARGET_TYPE_ABUS_ENDPOINT) &&
--                   (l_fabricBus->type != EREPAIR::PROCESSOR_EDI))
-+                   (l_fabricBus->type != PROCESSOR_EDI))
-                 {
-                     continue;
-                 }
- 
-                 if((l_tgtType == fapi::TARGET_TYPE_XBUS_ENDPOINT) &&
--                   (l_fabricBus->type != EREPAIR::PROCESSOR_EI4))
-+                   (l_fabricBus->type != PROCESSOR_EI4))
-                 {
-                     continue;
-                 }
-@@ -428,17 +461,17 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-                 }
- 
-                 // Check if we have valid fail lane numbers
--                if(l_fabricBus->failBit == EREPAIR::INVALID_FAIL_LANE_NUMBER)
-+                if(l_fabricBus->failBit == INVALID_FAIL_LANE_NUMBER)
-                 {
-                     continue;
-                 }
- 
-                 // Copy the fail lane numbers in the vectors
--                if(l_fabricBus->interface == EREPAIR::PBUS_DRIVER)
-+                if(l_fabricBus->interface == PBUS_DRIVER)
-                 {
-                     o_txFailLanes.push_back(l_fabricBus->failBit);
-                 }
--                else if(l_fabricBus->interface == EREPAIR::PBUS_RECEIVER)
-+                else if(l_fabricBus->interface == PBUS_RECEIVER)
-                 {
-                     o_rxFailLanes.push_back(l_fabricBus->failBit);
-                 }
-@@ -468,6 +501,19 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-                 l_tgtHandle = l_mcsTarget;
-             }
- 
-+            if(l_tgtType == fapi::TARGET_TYPE_MEMBUF_CHIP)
-+            {
-+                // Check whether we have Memory on a CDIMM
-+                l_rc = getDimmType(i_tgtHandle, l_customDimm);
-+
-+                if(l_rc)
-+                {
-+                    FAPI_ERR("Error (0x%x) during DIMM type check",
-+                            static_cast<uint32_t> (l_rc));
-+                    break;
-+                }
-+            }
-+
-             // Read Power bus eRepair data and get the failed lane numbers
-             for(l_loop = 0;
-                 l_loop < l_numRepairs;
-@@ -491,14 +537,20 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-                 l_memBus->interface = (l_temp & 0x0F);
- #endif
- 
--                // Check if we have the correct Processor/Centaur ID
--                if(l_chipPosition != l_memBus->device.proc_centaur_id)
-+                // Check if we have the correct Centaur ID
-+                // NOTE: We do not prefer to make the check of Centaur ID if the
-+                // system is known to have CDIMMs. This check is applicable
-+                // only for systems with ISDIMM because in the ISDIMM systems
-+                // the Lane eRepair data for multiple Centaurs is maintained in
-+                // a common VPD.
-+                if((l_customDimm != fapi::ENUM_ATTR_SPD_CUSTOM_YES) &&
-+                   (l_chipPosition != l_memBus->device.proc_centaur_id))
-                 {
-                     continue;
-                 }
- 
-                 // Check if we have the matching the Memory Bus types
--                if(l_memBus->type != EREPAIR::MEMORY_EDI)
-+                if(l_memBus->type != MEMORY_EDI)
-                 {
-                     continue;
-                 }
-@@ -518,7 +570,7 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-                 }
- 
-                 // Check if we have valid fail lane numbers
--                if(l_memBus->failBit == EREPAIR::INVALID_FAIL_LANE_NUMBER)
-+                if(l_memBus->failBit == INVALID_FAIL_LANE_NUMBER)
-                 {
-                     continue;
-                 }
-@@ -526,22 +578,22 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
-                 // Copy the fail lane numbers in the vectors
-                 if(l_tgtType == fapi::TARGET_TYPE_MCS_CHIPLET)
-                 {
--                   if(l_memBus->interface == EREPAIR::DMI_MCS_DRIVE)
-+                   if(l_memBus->interface == DMI_MCS_DRIVE)
-                    {
-                        o_txFailLanes.push_back(l_memBus->failBit);
-                    }
--                   else if(l_memBus->interface == EREPAIR::DMI_MCS_RECEIVE)
-+                   else if(l_memBus->interface == DMI_MCS_RECEIVE)
-                    {
-                        o_rxFailLanes.push_back(l_memBus->failBit);
-                    }
-                 }
-                 else if(l_tgtType == fapi::TARGET_TYPE_MEMBUF_CHIP)
-                 {
--                   if(l_memBus->interface == EREPAIR::DMI_MEMBUF_DRIVE)
-+                   if(l_memBus->interface == DMI_MEMBUF_DRIVE)
-                    {
-                        o_txFailLanes.push_back(l_memBus->failBit);
-                    }
--                   else if(l_memBus->interface == EREPAIR::DMI_MEMBUF_RECEIVE)
-+                   else if(l_memBus->interface == DMI_MEMBUF_RECEIVE)
-                    {
-                        o_rxFailLanes.push_back(l_memBus->failBit);
-                    }
-@@ -551,10 +603,64 @@ fapi::ReturnCode determineRepairLanes(const fapi::Target   &i_tgtHandle,
- 
-     }while(0);
- 
--    FAPI_INF("<< No.of Fail Lanes: tx: %d, rx: %d",
-+    FAPI_INF("<< No.of Fail Lanes: tx: %zd, rx: %zd",
-               o_txFailLanes.size(), o_rxFailLanes.size());
- 
-     return(l_rc);
- }
- 
-+fapi::ReturnCode getDimmType(const fapi::Target &i_tgtHandle,
-+                             uint8_t &o_customDimm)
-+{
-+    fapi::ReturnCode          l_rc;
-+    std::vector<fapi::Target> l_mbaChiplets;
-+    fapi::Target              l_mbaTarget;
-+
-+    do
-+    {
-+        // Get the connected MBA chiplet and determine whether we have CDIMM
-+        l_rc = fapiGetChildChiplets(i_tgtHandle,
-+                                    fapi::TARGET_TYPE_MBA_CHIPLET,
-+                                    l_mbaChiplets,
-+                                    fapi::TARGET_STATE_FUNCTIONAL);
-+        if(l_rc || (0 == l_mbaChiplets.size()))
-+        {
-+            FAPI_ERR("Error (0x%x) during get child MBA targets",
-+                    static_cast<uint32_t> (l_rc));
-+            break;
-+        }
-+
-+        l_mbaTarget = l_mbaChiplets[0];
-+        std::vector<fapi::Target> l_target_dimm_array;
-+
-+        l_rc =  fapiGetAssociatedDimms(l_mbaTarget, l_target_dimm_array);
-+
-+        if(l_rc)
-+        {
-+            FAPI_ERR("Error (0x%x), from fapiGetAssociatedDimms",
-+                    static_cast<uint32_t>(l_rc));
-+            break;
-+        }
-+
-+        if(0 != l_target_dimm_array.size())
-+        {
-+            l_rc = FAPI_ATTR_GET(ATTR_SPD_CUSTOM,
-+                    &l_target_dimm_array[0],
-+                    o_customDimm);
-+            if(l_rc)
-+            {
-+                FAPI_ERR("Error (0x%x), from FAPI_ATTR_GET",
-+                        static_cast<uint32_t>(l_rc));
-+                break;
-+            }
-+        }
-+        else
-+        {
-+            o_customDimm = fapi::ENUM_ATTR_SPD_CUSTOM_NO;
-+        }
-+    }while(0);
-+
-+    return l_rc;
-+}
-+
- }// endof extern "C"
-diff --git a/src/usr/hwpf/hwp/bus_training/erepairSetFailedLanesHwp.C b/src/usr/hwpf/hwp/bus_training/erepairSetFailedLanesHwp.C
-index a59d9e5..b0724f9 100755
---- a/src/usr/hwpf/hwp/bus_training/erepairSetFailedLanesHwp.C
-+++ b/src/usr/hwpf/hwp/bus_training/erepairSetFailedLanesHwp.C
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2013,2014                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
- /*                                                                        */
-@@ -173,6 +173,9 @@ ReturnCode writeRepairDataToVPD(const Target               &i_tgtHandle,
-     uint8_t    *l_retBuf = NULL;
-     uint32_t   l_bufSize = 0;
-     Target     l_procTarget;
-+    uint8_t    l_customDimm;
-+    std::vector<fapi::Target> l_mbaChiplets;
-+    fapi::Target              l_mbaTarget;
- 
-     FAPI_DBG(">> writeRepairDataToVPD");
- 
-@@ -202,12 +205,66 @@ ReturnCode writeRepairDataToVPD(const Target               &i_tgtHandle,
-                 break;
-             }
- 
--            if((l_bufSize == 0) ||
--               ((i_vpdType == EREPAIR_VPD_FIELD) &&
--                (l_bufSize > EREPAIR_MEM_FIELD_VPD_SIZE_PER_CENTAUR)) ||
--               ((i_vpdType == EREPAIR_VPD_MNFG) &&
--                (l_bufSize > EREPAIR_MEM_MNFG_VPD_SIZE_PER_CENTAUR)))
-+            // Get the connected MBA chiplet and determine whether we have CDIMM
-+            l_rc = fapiGetChildChiplets(i_tgtHandle,
-+                                        fapi::TARGET_TYPE_MBA_CHIPLET,
-+                                        l_mbaChiplets,
-+                                        fapi::TARGET_STATE_FUNCTIONAL);
-+
-+            if(l_rc || (0 == l_mbaChiplets.size()))
-+            {
-+                FAPI_ERR("Error (0x%x) during get child MBA targets",
-+                         static_cast<uint32_t> (l_rc));
-+                break;
-+            }
-+
-+            l_mbaTarget = l_mbaChiplets[0];
-+            std::vector<fapi::Target> l_target_dimm_array;
-+
-+            l_rc =  fapiGetAssociatedDimms(l_mbaTarget, l_target_dimm_array);
-+
-+            if(l_rc)
-+            {
-+                FAPI_ERR("Error (0x%x), from fapiGetAssociatedDimms",
-+                          static_cast<uint32_t>(l_rc));
-+                break;
-+            }
-+
-+            if(0 != l_target_dimm_array.size())
-+            {
-+                l_rc = FAPI_ATTR_GET(ATTR_SPD_CUSTOM,
-+                                     &l_target_dimm_array[0],
-+                                     l_customDimm);
-+                if(l_rc)
-+                {
-+                    FAPI_ERR("Error (0x%x), from FAPI_ATTR_GET",
-+                             static_cast<uint32_t>(l_rc));
-+                    break;
-+                }
-+            }
-+            else
-+            {
-+                l_customDimm = fapi::ENUM_ATTR_SPD_CUSTOM_NO;
-+            }
-+
-+            if(l_customDimm == fapi::ENUM_ATTR_SPD_CUSTOM_YES)
-+            {
-+                if((l_bufSize == 0) ||
-+                       ((i_vpdType == EREPAIR_VPD_FIELD) &&
-+                        (l_bufSize > EREPAIR_MEM_FIELD_VPD_SIZE_PER_CENTAUR)) ||
-+                       ((i_vpdType == EREPAIR_VPD_MNFG) &&
-+                        (l_bufSize > EREPAIR_MEM_MNFG_VPD_SIZE_PER_CENTAUR)))
-+                {
-+                    FAPI_SET_HWP_ERROR(l_rc,
-+                                       RC_ACCESSOR_HWP_INVALID_MEM_VPD_SIZE);
-+                    break;
-+                }
-+            }
-+            else if(l_bufSize == 0)
-             {
-+                // TODO RTC: 119531. Add upper bound checking for l_bufSize
-+                // This size check will depend on whether the Lane eRepair data
-+                // is stored on the Planar VPD or on the Riser card VPD.
-                 FAPI_SET_HWP_ERROR(l_rc, RC_ACCESSOR_HWP_INVALID_MEM_VPD_SIZE);
-                 break;
-             }
-@@ -221,7 +278,7 @@ ReturnCode writeRepairDataToVPD(const Target               &i_tgtHandle,
-                 break;
-             }
- 
--            // Retrieve the eRepair data from the Centaur FRU VPD
-+            // Retrieve the Field eRepair data from the Centaur FRU VPD
-             l_rc = fapiGetMBvpdField(l_vpdRecord,
-                                      MBVPD_KEYWORD_PDI,
-                                      i_tgtHandle,
-@@ -315,7 +372,7 @@ ReturnCode writeRepairDataToVPD(const Target               &i_tgtHandle,
-                 break;
-             }
- 
--            // Retrieve the eRepair data from the MVPD
-+            // Retrieve the Field eRepair data from the MVPD
-             l_rc = fapiGetMvpdField(l_vpdRecord,
-                                     MVPD_KEYWORD_PDI,
-                                     l_procTarget,
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index d3b76fa..e7bb202 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= 3593853a4323d9ec7de1ad6502e22b3e66af03ae
+HOSTBOOT_VERSION ?= bda236e6e0c7d3aa5165160abbd5ead92ac0a68e
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0
