Habanero Updates for SL
diff --git a/openpower/package/habanero-xml/habanero-xml-0001-Revert-Merge-pull-request-18-from-open-power-bofferd.patch b/openpower/package/habanero-xml/habanero-xml-0001-Revert-Merge-pull-request-18-from-open-power-bofferd.patch
new file mode 100644
index 0000000..0a921c5
--- /dev/null
+++ b/openpower/package/habanero-xml/habanero-xml-0001-Revert-Merge-pull-request-18-from-open-power-bofferd.patch
@@ -0,0 +1,84 @@
+From b1eb2395a4bf796603cb34aa5913f43b84c42855 Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Tue, 31 Mar 2015 07:56:06 -0500
+Subject: [PATCH] Revert "Merge pull request #18 from
+ open-power/bofferdn-hab-loadline"
+
+This reverts commit ddb962894919657517f0d9bca4540a427953f987, reversing
+changes made to a98bf456ff5d9f18dc2af1ffc59d67a302029a76.
+
+Conflicts:
+	habanero.xml
+---
+ habanero.xml | 48 ++++++++++++++++++++++++------------------------
+ 1 file changed, 24 insertions(+), 24 deletions(-)
+
+diff --git a/habanero.xml b/habanero.xml
+index 8768f72..1aa85a8 100644
+--- a/habanero.xml
++++ b/habanero.xml
+@@ -4967,6 +4967,30 @@
+ 		<default>1</default>
+ 	</attribute>
+ 	<attribute>
++		<id>PROC_R_DISTLOSS_VCS</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_R_DISTLOSS_VDD</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_R_LOADLINE_VCS</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_R_LOADLINE_VDD</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_VRM_VOFFSET_VCS</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_VRM_VOFFSET_VDD</id>
++		<default></default>
++	</attribute>
++	<attribute>
+ 		<id>PROC_X_BUS_WIDTH</id>
+ 		<default>2</default>
+ 	</attribute>
+@@ -6996,30 +7020,6 @@
+ 		<default>0</default>
+ 	</attribute>
+ 	<attribute>
+-		<id>PROC_R_DISTLOSS_VCS</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_R_DISTLOSS_VDD</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_R_LOADLINE_VCS</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_R_LOADLINE_VDD</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_VRM_VOFFSET_VCS</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_VRM_VOFFSET_VDD</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+ 		<id>PSI_BRIDGE_BASE_ADDR</id>
+ 		<default>0,0x0000000000000000</default>
+ 	</attribute>
+-- 
+1.8.2.2
+
diff --git a/openpower/package/habanero-xml/habanero-xml-0002-Add-System-Fw-Fru-Id.patch b/openpower/package/habanero-xml/habanero-xml-0002-Add-System-Fw-Fru-Id.patch
new file mode 100644
index 0000000..f285bfa
--- /dev/null
+++ b/openpower/package/habanero-xml/habanero-xml-0002-Add-System-Fw-Fru-Id.patch
@@ -0,0 +1,27 @@
+From d1fa8a2e10849a388e09f94dd25dc9008951c1c8 Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Tue, 31 Mar 2015 07:43:23 -0500
+Subject: [PATCH] Add System Fw Fru Id
+
+---
+ habanero.xml | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/habanero.xml b/habanero.xml
+index 1aa85a8..16976a7 100644
+--- a/habanero.xml
++++ b/habanero.xml
+@@ -4667,6 +4667,10 @@
+ 		<default></default>
+ 	</attribute>
+ 	<attribute>
++	        <id>BMC_FRU_ID</id>
++	        <default>43</default>
++        </attribute>
++	<attribute>
+ 		<id>FRU_NAME</id>
+ 		<default></default>
+ 	</attribute>
+-- 
+1.8.2.2
+
diff --git a/openpower/package/habanero-xml/habanero-xml.mk b/openpower/package/habanero-xml/habanero-xml.mk
index e1abd28..0ab244c 100644
--- a/openpower/package/habanero-xml/habanero-xml.mk
+++ b/openpower/package/habanero-xml/habanero-xml.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HABANERO_XML_VERSION ?= 4c1e936c0329384020b126efe69d2148cfe48960
+HABANERO_XML_VERSION ?= 4173b205b0a7dfd18a97f3a0d5319c9aad893035
 HABANERO_XML_SITE ?= $(call github,open-power,habanero-xml,$(HABANERO_XML_VERSION))
 
 HABANERO_XML_LICENSE = Apache-2.0
diff --git a/openpower/package/hostboot/hostboot-0008-Update-SBE-Update-IPMI-Watchdog-call-to-use-HARD_RES.patch b/openpower/package/hostboot/hostboot-0008-Update-SBE-Update-IPMI-Watchdog-call-to-use-HARD_RES.patch
new file mode 100644
index 0000000..9911d22
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0008-Update-SBE-Update-IPMI-Watchdog-call-to-use-HARD_RES.patch
@@ -0,0 +1,33 @@
+From a048585e96058e9bf1ba43853de3a6b70053d740 Mon Sep 17 00:00:00 2001
+From: Mike Baiocchi <baiocchi@us.ibm.com>
+Date: Thu, 26 Mar 2015 13:16:18 -0500
+Subject: [PATCH 1/5] Update SBE Update IPMI Watchdog call to use HARD_RESET
+ action
+
+This commit updates how the SBE Update code will setup the IPMI
+watchdog timer before calling doShutdown().  Rather than using
+NO_ACTIONS, the updated code will use the HARD_RESET action.
+
+Change-Id: Id251307aa76259d8a290a92d9e9f3418b181bc3e
+RTC: 124679
+(cherry picked from commit 815998ab802c19ade01cdc71a9e59946eedf1ab1)
+---
+ src/usr/sbe/sbe_resolve_sides.C | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/usr/sbe/sbe_resolve_sides.C b/src/usr/sbe/sbe_resolve_sides.C
+index 49d2c25..26ac4e6 100644
+--- a/src/usr/sbe/sbe_resolve_sides.C
++++ b/src/usr/sbe/sbe_resolve_sides.C
+@@ -1350,7 +1350,7 @@ void sbePreShutdownIpmiCalls( void )
+                                static_cast<uint8_t>
+                                           (IPMIWATCHDOG::DO_NOT_STOP |
+                                            IPMIWATCHDOG::BIOS_FRB2), // default
+-                               IPMIWATCHDOG::NO_ACTIONS); // boot count reset
++                               IPMIWATCHDOG::TIMEOUT_HARD_RESET);
+         if(err)
+         {
+                TRACFCOMP( g_trac_sbe,
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0009-Reject-IPMI-events-which-arent-destined-for-the-host.patch b/openpower/package/hostboot/hostboot-0009-Reject-IPMI-events-which-arent-destined-for-the-host.patch
new file mode 100644
index 0000000..6676254
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0009-Reject-IPMI-events-which-arent-destined-for-the-host.patch
@@ -0,0 +1,142 @@
+From 1e70ee010552ad835b03751ebf4788e367bcecd4 Mon Sep 17 00:00:00 2001
+From: Brian Silver <bsilver@us.ibm.com>
+Date: Thu, 26 Mar 2015 15:34:54 -0500
+Subject: [PATCH 2/5] Reject IPMI events which aren't destined for the host
+
+Change-Id: I378e0763c5ca8c13830d0e6c057b24e6beb5dc8c
+(cherry picked from commit e7b68743f7d2a160fd1dd3019f5614860576de64)
+---
+ src/include/usr/ipmi/ipmiif.H |  8 ++++
+ src/usr/ipmi/ipmirp.C         | 92 +++++++++++++++++++++++++++----------------
+ 2 files changed, 65 insertions(+), 35 deletions(-)
+
+diff --git a/src/include/usr/ipmi/ipmiif.H b/src/include/usr/ipmi/ipmiif.H
+index 56e3c53..e65252a 100644
+--- a/src/include/usr/ipmi/ipmiif.H
++++ b/src/include/usr/ipmi/ipmiif.H
+@@ -88,6 +88,14 @@ namespace IPMI
+         NETFUN_NONE     = (0x30 << 2),
+     };
+ 
++    // SMS_ATN OEM Event constants
++    enum oem_event
++    {
++        OEM_VALID_NETFUN      = 0x3a,
++        OEM_VALID_SEL_ID      = 0x5555,
++        OEM_VALID_RECORD_TYPE = 0xC0,
++    };
++
+     // IPMI Completion Codes
+     enum completion_code
+     {
+diff --git a/src/usr/ipmi/ipmirp.C b/src/usr/ipmi/ipmirp.C
+index 5925d45..de1b219 100644
+--- a/src/usr/ipmi/ipmirp.C
++++ b/src/usr/ipmi/ipmirp.C
+@@ -331,46 +331,68 @@ void IpmiRP::postEvent(IPMI::oemSEL* i_event)
+ {
+     // Called in the context of the RP message loop, mutex locked
+ 
+-    // Check to see if this event has a queue registered
+-    IPMI::event_q_t::iterator it = iv_eventq.find(i_event->iv_cmd[0]);
++    do {
++        // Check to see if event is valid. AMI recomends we check the netfun,
++        // the SEL id, and the record id. If they don't match, we're allowed
++        // to consider this an unhandled message.
++        if ( (i_event->iv_netfun      != IPMI::OEM_VALID_NETFUN) ||
++             (i_event->iv_record      != IPMI::OEM_VALID_SEL_ID) ||
++             (i_event->iv_record_type != IPMI::OEM_VALID_RECORD_TYPE) )
++        {
++            IPMI_TRAC("rejecting event netfun: 0x%x record: 0x%x record type: 0x%x cmd: 0x%x",
++                      i_event->iv_netfun,
++                      i_event->iv_record,
++                      i_event->iv_record_type,
++                      i_event->iv_cmd[0]);
+ 
+-    msg_q_t outq = (it == iv_eventq.end()) ? iv_last_chanceq : it->second;
++            // ... and clean up the memory for the caller
++            delete i_event;
++            break;
++        }
+ 
+-    // Create a message to send asynchronously to the event handler queue
+-    // Assign the event to the message, the caller will delete the message
+-    // and the event.
+-    msg_t* msg = msg_allocate();
+-    msg->type = IPMI::TYPE_EVENT;
+-    msg->extra_data = i_event;
++        // Check to see if this event has a queue registered
++        IPMI::event_q_t::iterator it = iv_eventq.find(i_event->iv_cmd[0]);
++        msg_q_t outq = (it == iv_eventq.end()) ? iv_last_chanceq : it->second;
+ 
+-    IPMI_TRAC("queuing event %x:%x for handler",
+-              i_event->iv_netfun, i_event->iv_cmd[0])
+-    int rc = msg_send(outq, msg);
++        // Create a message to send asynchronously to the event handler queue
++        // Assign the event to the message, the caller will delete the message
++        // and the event.
++        msg_t* msg = msg_allocate();
++        msg->type = IPMI::TYPE_EVENT;
++        msg->extra_data = i_event;
+ 
+-    if (rc)
+-    {
+-        /* @errorlog tag
+-         * @errortype       ERRL_SEV_UNRECOVERABLE
+-         * @moduleid        IPMI::MOD_IPMISRV_SEND
+-         * @reasoncode      IPMI::RC_INVALID_SEND
+-         * @userdata1       rc from msq_send()
+-         * @devdesc         msg_send() failed
+-         * @custdesc        Firmware error during IPMI event handling
+-         */
+-        errlHndl_t err =
+-            new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+-                                    IPMI::MOD_IPMISRV_SEND,
+-                                    IPMI::RC_INVALID_SEND,
+-                                    rc,
+-                                    0,
+-                                    true);
+-        err->collectTrace(IPMI_COMP_NAME);
+-        errlCommit(err, IPMI_COMP_ID);
++        IPMI_TRAC("queuing event %x:%x for handler",
++                  i_event->iv_netfun, i_event->iv_cmd[0])
++            int rc = msg_send(outq, msg);
+ 
+-        // ... and clean up the memory for the caller
+-        delete i_event;
+-        msg_free(msg);
+-    }
++        if (rc)
++        {
++            /* @errorlog tag
++             * @errortype       ERRL_SEV_UNRECOVERABLE
++             * @moduleid        IPMI::MOD_IPMISRV_SEND
++             * @reasoncode      IPMI::RC_INVALID_SEND
++             * @userdata1       rc from msq_send()
++             * @devdesc         msg_send() failed
++             * @custdesc        Firmware error during IPMI event handling
++             */
++            errlHndl_t err =
++                new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
++                                        IPMI::MOD_IPMISRV_SEND,
++                                        IPMI::RC_INVALID_SEND,
++                                        rc,
++                                        0,
++                                        true);
++            err->collectTrace(IPMI_COMP_NAME);
++            errlCommit(err, IPMI_COMP_ID);
++
++            // ... and clean up the memory for the caller
++            delete i_event;
++            msg_free(msg);
++        }
++
++    } while(0);
++
++    return;
+ }
+ 
+ /**
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0010-Support-partial-good-Xbus.patch b/openpower/package/hostboot/hostboot-0010-Support-partial-good-Xbus.patch
new file mode 100644
index 0000000..df1a728
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0010-Support-partial-good-Xbus.patch
@@ -0,0 +1,71 @@
+From 07b936c1c5f97314719e7e988e6c07810637b8c1 Mon Sep 17 00:00:00 2001
+From: Dean Sanner <dsanner@us.ibm.com>
+Date: Wed, 11 Mar 2015 09:11:14 -0500
+Subject: [PATCH 3/8] Support partial good Xbus
+
+Change-Id: I245cd9947d5b7a05ff9a8f92ff18c658b1fe09d6
+Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16300
+Tested-by: Jenkins Server
+Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
+Reviewed-by: Brian H. Horton <brianh@linux.ibm.com>
+Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
+(cherry picked from commit a0f4a934254572ce49a1ddf5e4d5d944b52779be)
+---
+ src/usr/hwpf/plat/fapiPlatAttributeService.C | 22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+diff --git a/src/usr/hwpf/plat/fapiPlatAttributeService.C b/src/usr/hwpf/plat/fapiPlatAttributeService.C
+index 6e4f400..7da841a 100644
+--- a/src/usr/hwpf/plat/fapiPlatAttributeService.C
++++ b/src/usr/hwpf/plat/fapiPlatAttributeService.C
+@@ -58,11 +58,14 @@
+ #include <hwpf/hwp/pll_accessors/getPllRingInfoAttr.H>
+ #include <hwpf/hwp/winkle_ring_accessors/getL3DeltaDataAttr.H>
+ #include <fapiAttributeIds.H>
++#include <hwas/common/hwasCommon.H>
++
+ // The following file checks at compile time that all HWPF attributes are
+ // handled by Hostboot. This is done to ensure that the HTML file listing
+ // supported HWPF attributes lists attributes handled by Hostboot
+ #include <fapiAttributePlatCheck.H>
+ 
++
+ //******************************************************************************
+ // Implementation
+ //******************************************************************************
+@@ -1239,6 +1242,7 @@ fapi::ReturnCode fapiPlatGetEnableAttr ( fapi::AttributeId i_id,
+ {
+     fapi::ReturnCode l_rc;
+     TARGETING::Target * l_pTarget = NULL;
++    o_enable = 0;
+ 
+     // Get the Targeting Target
+     l_rc = getTargetingTarget(i_pFapiTarget, l_pTarget);
+@@ -1271,10 +1275,20 @@ fapi::ReturnCode fapiPlatGetEnableAttr ( fapi::AttributeId i_id,
+                 o_enable = 1;
+                 break;
+             case fapi::ATTR_PROC_X_ENABLE:
+-                // The enable flag reflects the state of the pervasive chiplet,
+-                //  NOT the bus logic, so always return true since we don't
+-                //  support partial good on the XBUS chiplet
+-                o_enable = 1;
++                // Need to support having the X bus chiplet partial good
++                // Look at the saved away PG data
++                TARGETING::ATTR_CHIP_REGIONS_TO_ENABLE_type l_chipRegionData;
++                l_rc = FAPI_ATTR_GET(ATTR_CHIP_REGIONS_TO_ENABLE, i_pFapiTarget,
++                                     l_chipRegionData);
++                if (l_rc) {
++                    FAPI_ERR("fapi_attr_get( ATTR_CHIP_REGIONS_TO_ENABLE ) failed. With rc = 0x%x",
++                             (uint32_t) l_rc );
++                    break;
++                }
++                else if (l_chipRegionData[HWAS::VPD_CP00_PG_XBUS_INDEX] != 0)
++                {
++                    o_enable = 0x1;
++                }
+                 break;
+             default:
+                 o_enable = 0;
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0011-Pull-model-name-and-serial-from-OSYS-record-if-avail.patch b/openpower/package/hostboot/hostboot-0011-Pull-model-name-and-serial-from-OSYS-record-if-avail.patch
new file mode 100644
index 0000000..0f20e0b
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0011-Pull-model-name-and-serial-from-OSYS-record-if-avail.patch
@@ -0,0 +1,213 @@
+From 438ebf4b5acbaab0da69009d4248a6aac45fbed6 Mon Sep 17 00:00:00 2001
+From: Dan Crowell <dcrowell@us.ibm.com>
+Date: Wed, 11 Mar 2015 16:44:59 -0500
+Subject: [PATCH 3/5] Pull model name and serial from OSYS record if available
+
+The supported level of OP planar VPD has the system model
+name inside OSYS:MM, not OPFR:DR.
+
+Change-Id: Iaa9c4e00325f8fa6efb7a9fca1275bcea2759308
+Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16308
+Reviewed-by: William H. Schwartz <whs@us.ibm.com>
+Tested-by: Jenkins Server
+Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
+(cherry picked from commit 2114a66c76558f41cd305fc294ccdfaf6607c0e5)
+---
+ src/usr/devtree/bld_devtree.C | 142 +++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 126 insertions(+), 16 deletions(-)
+
+diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C
+index f2e9438..622178a 100644
+--- a/src/usr/devtree/bld_devtree.C
++++ b/src/usr/devtree/bld_devtree.C
+@@ -1034,18 +1034,26 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
+     // Nothing to do for small trees currently.
+     if (!i_smallTree)
+     {
++        //===== compatible =====
+         /* Fetch the MRW-defined compatible model from attributes */
+         ATTR_OPAL_MODEL_type l_model = {0};
+         TARGETING::Target* sys = NULL;
+         TARGETING::targetService().getTopLevelTarget(sys);
+         sys->tryGetAttr<TARGETING::ATTR_OPAL_MODEL>(l_model);
+ 
+-        /* Add compatibility node */
++        /* Add compatibility value */
+         const char* l_compats[] = { "ibm,powernv", l_model, NULL };
+         i_dt->addPropertyStrings(rootNode, "compatible", l_compats);
+ 
+-        /* Add system model node */
+-        // Based off of the DR field in the OPFR
++        //===== model =====
++        /* Add system model value
++           Depending on the vintage of the planar VPD, there are 3 places
++           we need to look for this data.
++           1) OSYS:MM
++           2) OPFR:DR
++           3) Default to 'unknown'
++         */
++        bool foundvpd = false;
+         // TODO RTC 118373 -- update to account for firestone/memory riser
+         TARGETING::TargetHandleList l_membTargetList;
+         getAllChips(l_membTargetList, TYPE_MEMBUF);
+@@ -1061,42 +1069,144 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
+             errhdl = deviceRead( l_pMem,
+                                  NULL,
+                                  vpdSize,
+-                                 DEVICE_CVPD_ADDRESS( CVPD::OPFR,
+-                                                      CVPD::DR ));
++                                 DEVICE_CVPD_ADDRESS( CVPD::OSYS,
++                                                      CVPD::MM ));
+ 
+             if(errhdl)
+             {
+-                TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get DR size for HUID=0x%.8X",
++                TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:MM size for HUID=0x%.8X",
+                           TARGETING::get_huid(l_pMem));
+-                i_dt->addPropertyString(rootNode, "model", "unknown");
+-                errlCommit(errhdl, DEVTREE_COMP_ID);
++
++                // Try the OPFR record
++                errlHndl_t opfr_errhdl = deviceRead( l_pMem,
++                                           NULL,
++                                           vpdSize,
++                                           DEVICE_CVPD_ADDRESS( CVPD::OPFR,
++                                                                CVPD::DR ));
++                if(opfr_errhdl)
++                {
++                    TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OPFR:DR size for HUID=0x%.8X",
++                              TARGETING::get_huid(l_pMem));
++                    delete opfr_errhdl; //delete OPFR log, VPD is just bad
++                }
++                else
++                {
++                    delete errhdl; //ignore lack of OSYS due to older vpd
++                    errhdl = NULL;
++                    char drBuf[vpdSize+1];
++                    memset(&drBuf, 0x0, (vpdSize+1)); //null terminated str
++                    errhdl = deviceRead( l_pMem,
++                                         reinterpret_cast<void*>( &drBuf ),
++                                         vpdSize,
++                                         DEVICE_CVPD_ADDRESS( CVPD::OPFR,
++                                                              CVPD::DR ));
++
++                    if(errhdl)
++                    {
++                        TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OPFR:DR for HUID=0x%.8X",
++                                  TARGETING::get_huid(l_pMem));
++                    }
++                    else
++                    {
++                        foundvpd = true;
++                        i_dt->addPropertyString(rootNode, "model", drBuf);
++                    }
++                }
+             }
+             else
+             {
+-                char drBuf[vpdSize+1];
+-                memset(&drBuf, 0x0, (vpdSize+1)); //ensure null terminated str
++                char mmBuf[vpdSize+1];
++                memset(&mmBuf, 0x0, (vpdSize+1)); //ensure null terminated str
+                 errhdl = deviceRead( l_pMem,
+-                                     reinterpret_cast<void*>( &drBuf ),
++                                     reinterpret_cast<void*>( &mmBuf ),
+                                      vpdSize,
+-                                     DEVICE_CVPD_ADDRESS( CVPD::OPFR,
+-                                                          CVPD::DR ));
++                                     DEVICE_CVPD_ADDRESS( CVPD::OSYS,
++                                                          CVPD::MM ));
+ 
+                 if(errhdl)
+                 {
+-                    TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read DR for HUID=0x%.8X",
++                    TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:MM for HUID=0x%.8X",
+                               TARGETING::get_huid(l_pMem));
+                 }
+                 else
+                 {
+-                    i_dt->addPropertyString(rootNode, "model", drBuf);
++                    foundvpd = true;
++                    i_dt->addPropertyString(rootNode, "model", mmBuf);
+                 }
+             }
+         }
+-        else //chassis info not found, default to unknown
++
++        // just commit any errors we get, this isn't critical
++        if( errhdl )
++        {
++            errlCommit(errhdl, DEVTREE_COMP_ID); //commit original OSYS log
++        }
++
++        if( !foundvpd ) //chassis info not found, default to unknown
+         {
+             TRACFCOMP(g_trac_devtree,ERR_MRK" VPD not found, model defaulted to unknown");
+             i_dt->addPropertyString(rootNode, "model", "unknown");
+         }
++
++        //===== system-id =====
++        /* Add system-id value
++           1) OSYS:SS
++           2) Default to 'unavailable'
++         */
++        // TODO RTC 118373 -- update to account for firestone/memory riser
++        foundvpd = false;
++        if( l_membTargetList.size() )
++        {
++            // TODO RTC 118373 - Should be able to read from attribute
++            TARGETING::Target * l_pMem = l_membTargetList[0];
++            size_t vpdSize = 0x0;
++
++            // Note: First read with NULL for o_buffer sets vpdSize to the
++            // correct length
++            errhdl = deviceRead( l_pMem,
++                                 NULL,
++                                 vpdSize,
++                                 DEVICE_CVPD_ADDRESS( CVPD::OSYS,
++                                                      CVPD::SS ));
++
++            if(errhdl)
++            {
++                TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:SS size for HUID=0x%.8X",
++                          TARGETING::get_huid(l_pMem));
++                // Note - not supporting old vpd versions without OSYS here
++            }
++            else
++            {
++                char ssBuf[vpdSize+1];
++                memset(&ssBuf, 0x0, (vpdSize+1)); //ensure null terminated str
++                errhdl = deviceRead( l_pMem,
++                                     reinterpret_cast<void*>( &ssBuf ),
++                                     vpdSize,
++                                     DEVICE_CVPD_ADDRESS( CVPD::OSYS,
++                                                          CVPD::SS ));
++
++                if(errhdl)
++                {
++                    TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:SS for HUID=0x%.8X",
++                              TARGETING::get_huid(l_pMem));
++                }
++                else
++                {
++                    foundvpd = true;
++                    i_dt->addPropertyString(rootNode, "system-id", ssBuf);
++                }
++            }
++        }
++        // just commit any errors we get, this isn't critical
++        if( errhdl )
++        {
++            errlCommit(errhdl, DEVTREE_COMP_ID);
++        }
++
++        if( !foundvpd ) //serial number not found, default to unavailable
++        {
++            i_dt->addPropertyString(rootNode, "system-id", "unavailable");
++        }
+     }
+ 
+     return errhdl;
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0012-Cap-off-the-TRACFBIN-such-that-nothing-exceeds-64-by.patch b/openpower/package/hostboot/hostboot-0012-Cap-off-the-TRACFBIN-such-that-nothing-exceeds-64-by.patch
new file mode 100644
index 0000000..8b0b4ab
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0012-Cap-off-the-TRACFBIN-such-that-nothing-exceeds-64-by.patch
@@ -0,0 +1,57 @@
+From 22c58d6a7d3e6d69294aa16c9b0fa354ae9cf861 Mon Sep 17 00:00:00 2001
+From: Elizabeth Liner <eliner@us.ibm.com>
+Date: Mon, 30 Mar 2015 12:41:45 -0500
+Subject: [PATCH 4/5] Cap off the TRACFBIN such that nothing exceeds 64 bytes
+
+Change-Id: If8f08d1602b4437aa0e72e6d2e8d99ca615a2c77
+(cherry picked from commit cb2ea9c1b5d1906e0f58eda347367c648c18809a)
+---
+ src/include/usr/trace/interface.H | 16 +++++++++++-----
+ src/include/usr/trace/trace.H     |  2 ++
+ 2 files changed, 13 insertions(+), 5 deletions(-)
+
+diff --git a/src/include/usr/trace/interface.H b/src/include/usr/trace/interface.H
+index 3ef8575..d02db76 100644
+--- a/src/include/usr/trace/interface.H
++++ b/src/include/usr/trace/interface.H
+@@ -218,13 +218,19 @@ const uint32_t TRACE_FIELD   = 0;       //Indicates trace is field
+ */
+ #define TRACFBIN(des,printf_string,address,len) \
+     { \
++        uint16_t l_length = len; \
++        if(len > MAX_WORKING_TRACBIN_SIZE) \
++        { \
++            l_length = MAX_WORKING_TRACBIN_SIZE; \
++            TRACFCOMP(des,"Shrinking to max size in TRACFBIN"); \
++        } \
+         __TRACE_HASH_STRUCTURES(printf_string); \
+         TRACE::trace_adal_write_bin((des), \
+-                                    &__traceData_codeInfo, \
+-                                    __LINE__, \
+-                                    address, \
+-                                    len, \
+-                                    TRACE_FIELD); \
++                                &__traceData_codeInfo, \
++                                __LINE__, \
++                                address, \
++                                l_length, \
++                                TRACE_FIELD); \
+     }
+ 
+ /**
+diff --git a/src/include/usr/trace/trace.H b/src/include/usr/trace/trace.H
+index fdcce88..e969487 100644
+--- a/src/include/usr/trace/trace.H
++++ b/src/include/usr/trace/trace.H
+@@ -42,6 +42,8 @@ const uint32_t TRACE_DEBUG_OFF   = 0;       //< Set to this when debug trace off
+ const uint32_t TRAC_COMP_SIZE    = 16;      //< Max component name size
+ const uint32_t TRAC_MAX_ARGS     = 9;       //< Max number of arguments in trace
+ 
++const uint16_t MAX_WORKING_TRACBIN_SIZE = 64; //< Max working tracBin size
++
+ typedef uint32_t trace_hash_val;    //< Hash values are 32 bits.
+ 
+ 
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0013-Enable-vrml-mvpd.patch b/openpower/package/hostboot/hostboot-0013-Enable-vrml-mvpd.patch
new file mode 100644
index 0000000..04118e9
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0013-Enable-vrml-mvpd.patch
@@ -0,0 +1,38 @@
+From a5d5840c4780a39be436e2dde2a53037b1b82635 Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Mon, 30 Mar 2015 19:22:44 -0500
+Subject: [PATCH] Add VRML MVPD Enablement for Habanero
+
+Change-Id: I7dd2d155e295a5fee09010ba173c82748e25221d
+---
+ src/include/usr/vpd/mvpdenums.H | 1 +
+ src/usr/vpd/mvpd.H              | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/src/include/usr/vpd/mvpdenums.H b/src/include/usr/vpd/mvpdenums.H
+index 950245f..fd4ddaf 100644
+--- a/src/include/usr/vpd/mvpdenums.H
++++ b/src/include/usr/vpd/mvpdenums.H
+@@ -79,6 +79,7 @@ enum mvpdRecord
+     LWPE        = 0x20,
+     VWML        = 0x21,
+     MER0        = 0x22,
++    VRML        = 0x23,
+ 
+     // Last Record
+     MVPD_LAST_RECORD,
+diff --git a/src/usr/vpd/mvpd.H b/src/usr/vpd/mvpd.H
+index 60a8491..e9fe905 100644
+--- a/src/usr/vpd/mvpd.H
++++ b/src/usr/vpd/mvpd.H
+@@ -88,6 +88,7 @@ namespace MVPD
+         { LWPE, "LWPE" },
+         { VWML, "VWML" },
+         { MER0, "MER0" },
++        { VRML, "VRML" },
+         // -------------------------------------------------------------------
+         // DO NOT USE!!  This is for test purposes ONLY!
+         { MVPD_TEST_RECORD, "TEST" },
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0014-Update-VPD-Fields-Use-for-Fru-Inventory.patch b/openpower/package/hostboot/hostboot-0014-Update-VPD-Fields-Use-for-Fru-Inventory.patch
new file mode 100644
index 0000000..b048484
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0014-Update-VPD-Fields-Use-for-Fru-Inventory.patch
@@ -0,0 +1,203 @@
+From 1521a501ada30fd69606829b8f551547d7d882cd Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Mon, 30 Mar 2015 11:09:17 -0500
+Subject: [PATCH 5/5] Update VPD Fields Use for Fru Inventory
+
+Change-Id: Iaa4802e72e355acd03cb88e58c40d1069dd76ef5
+RTC:125044
+(cherry picked from commit 8a7427bd44bd4742a53412e6894cc2294d893012)
+---
+ src/usr/ipmi/ipmifruinv.C     | 97 +++++++++++++++++--------------------------
+ src/usr/ipmi/ipmifruinvprvt.H |  6 ++-
+ 2 files changed, 42 insertions(+), 61 deletions(-)
+
+diff --git a/src/usr/ipmi/ipmifruinv.C b/src/usr/ipmi/ipmifruinv.C
+index 7c9eb85..c6c7a30 100644
+--- a/src/usr/ipmi/ipmifruinv.C
++++ b/src/usr/ipmi/ipmifruinv.C
+@@ -35,6 +35,7 @@
+ #include <ipmi/ipmifruinv.H>
+ #include "ipmifru.H"
+ #include "ipmifruinvprvt.H"
++#include <stdio.h>
+ 
+ extern trace_desc_t * g_trac_ipmi;
+ 
+@@ -401,7 +402,7 @@ errlHndl_t isdimmIpmiFruInv::buildProductInfoArea(std::vector<uint8_t> &io_data)
+         l_errl = addVpdData(io_data, SPD::BASIC_MEMORY_TYPE);
+         if (l_errl) { break; }
+         //Set Product Part/Model Number
+-        l_errl = addVpdData(io_data, SPD::MODULE_PART_NUMBER);
++        l_errl = addVpdData(io_data, SPD::MODULE_PART_NUMBER, true);
+         if (l_errl) { break; }
+         //Set Product Version
+         l_errl = addVpdData(io_data, SPD::MODULE_REVISION_CODE);
+@@ -411,8 +412,7 @@ errlHndl_t isdimmIpmiFruInv::buildProductInfoArea(std::vector<uint8_t> &io_data)
+         if (l_errl) { break; }
+ 
+         //Add Asset Tag
+-        io_data.push_back(uint8_t(1)); //Asset Tag is One Byte for now
+-        io_data.push_back(uint8_t(0));
++        io_data.push_back(uint8_t(0)); //No Asset Tag needed - O bytes
+ 
+         //FRU File ID - Empty
+         io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
+@@ -434,7 +434,8 @@ errlHndl_t isdimmIpmiFruInv::buildProductInfoArea(std::vector<uint8_t> &io_data)
+ }
+ 
+ errlHndl_t isdimmIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
+-                                     uint8_t i_keyword)
++                                     uint8_t i_keyword,
++                                     bool i_ascii)
+ {
+     size_t     l_vpdSize = 0;
+     errlHndl_t l_errl = NULL;
+@@ -463,12 +464,22 @@ errlHndl_t isdimmIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
+             uint8_t l_offset = io_data.size();
+             io_data.resize(l_offset + 1 + l_vpdSize);
+ 
+-            //Add on the data to the type/length byte indicating it is binary
+-            io_data.at(l_offset) = l_vpdSize;
++            //Add on the data to the type/length byte indicating it is ascii
++            // otherwise leave it as binary
++            if (i_ascii)
++            {
++                io_data.at(l_offset) = l_vpdSize
++                                       + IPMIFRUINV::TYPELENGTH_BYTE_ASCII;
++            }
++            else
++            {
++                io_data.at(l_offset) = l_vpdSize;
++            }
++            l_offset += 1;
+ 
+             //Read the VPD data directly into fru inventory data buffer
+-            l_errl = deviceRead(iv_target,&io_data[l_offset+1], l_vpdSize,
+-                        DEVICE_SPD_ADDRESS(i_keyword));
++            l_errl = deviceRead(iv_target,&io_data[l_offset], l_vpdSize,
++                       DEVICE_SPD_ADDRESS(i_keyword));
+         }
+         else
+         {
+@@ -534,10 +545,10 @@ errlHndl_t procIpmiFruInv::buildBoardInfoArea(std::vector<uint8_t> &io_data)
+         l_errl = addVpdData(io_data, MVPD::VINI, MVPD::DR, true);
+         if (l_errl) { break; }
+         //Set Board Info serial number
+-        l_errl = addVpdData(io_data, MVPD::VINI, MVPD::SN);
++        l_errl = addVpdData(io_data, MVPD::VRML, MVPD::SN, true);
+         if (l_errl) { break; }
+         //Set Board part number
+-        l_errl = addVpdData(io_data, MVPD::VINI, MVPD::FN);
++        l_errl = addVpdData(io_data, MVPD::VRML, MVPD::PN, true);
+         if (l_errl) { break; }
+         //Set Board FRU File ID
+         l_errl = addVpdData(io_data, MVPD::VINI, MVPD::VZ);
+@@ -760,47 +771,18 @@ errlHndl_t backplaneIpmiFruInv::buildBoardInfoArea(
+ 
+         //Set Product Name - ascii formatted data
+         //@fixme RTC Story 118373
+-        l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::DR, true);
+-
+-        //Support Legacy VPD without OSYS record
+-        if (l_errl)
+-        {
+-
+-            TRACFCOMP(g_trac_ipmi,
+-                      "backplaneIpmiFruInv::buildChassisBoardInfoArea - "
+-                      " Using Legacy Chassis VPD Data without OSYS record");
+-
+-            //Delete errorlog and use Legacy VPD Fields
+-            delete l_errl;
+-            l_errl = NULL;
+-            //Set Product Name - ascii formatted data
+-            //@fixme RTC Story 118373
+-            l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
+-            if (l_errl) { break; }
+-
+-            //Set Product Serial number - ascii formatted data
+-            //@fixme RTC Story 118373
+-            l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
+-            if (l_errl) { break; }
+-
+-            //Set Product Part number - ascii formatted data
+-            //@fixme RTC Story 118373
+-            l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
+-            if (l_errl) { break; }
++        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
++        if (l_errl) { break; }
+ 
+-        }
+-        else
+-        {
+-            //Set serial number - ascii formatted field
+-            //@fixme RTC Story 118373
+-            l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::SS, true);
+-            if (l_errl) { break; }
++        //Set Product Serial number - ascii formatted data
++        //@fixme RTC Story 118373
++        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
++        if (l_errl) { break; }
+ 
+-            //Set chassis part number - ascii formatted field
+-            //@fixme RTC Story 118373
+-            l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::MM, true);
+-            if (l_errl) { break; }
+-        }
++        //Set Product Part number - ascii formatted data
++        //@fixme RTC Story 118373
++        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
++        if (l_errl) { break; }
+ 
+         //Push Fru File ID Byte - NULL
+         io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
+@@ -950,22 +932,19 @@ void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
+ {
+     // Create Custom ECID Field
+     // - First put in 'ECID:' to make it obvious what this is
+-    uint8_t l_data[] = {IPMIFRUINV::TYPELENGTH_BYTE_ASCII + 5,'E','C','I','D',
+-                                   ':', IPMIFRUINV::TYPELENGTH_BYTE_NULL + 16};
++    uint8_t l_data[] = {IPMIFRUINV::TYPELENGTH_BYTE_ASCII + 21,'E','C','I','D',
++                                    ':'};
+ 
+     // @todo-RTC:124687 - Refactor multiple reallocations
+     io_data.insert( io_data.end(),
+                     &l_data[0],
+                     &l_data[0] + (uint8_t(sizeof(l_data) / sizeof(uint8_t))));
+ 
+-    uint8_t* l_vDataPtr = (uint8_t*) &i_ecidInfo[0];
+-    //Insert first 64 bits of ECID data
+-    io_data.insert(io_data.end(),
+-                &l_vDataPtr[0], &l_vDataPtr[0]+8);
+-    l_vDataPtr = (uint8_t*) &i_ecidInfo[1];
+-    //Insert second 64 bits of ECID data
+-    io_data.insert(io_data.end(),
+-        &l_vDataPtr[0], &l_vDataPtr[0]+8);
++    char l_ecidAscii[33];
++    sprintf(l_ecidAscii, "%.16llX%.16llX", i_ecidInfo[0], i_ecidInfo[1]);
++
++    uint8_t* l_vDataPtr = (uint8_t*) &l_ecidAscii[0];
++    io_data.insert(io_data.end(), &l_vDataPtr[0], &l_vDataPtr[0]+16);
+ 
+     return;
+ }
+diff --git a/src/usr/ipmi/ipmifruinvprvt.H b/src/usr/ipmi/ipmifruinvprvt.H
+index aed5dfc..2573a84 100644
+--- a/src/usr/ipmi/ipmifruinvprvt.H
++++ b/src/usr/ipmi/ipmifruinvprvt.H
+@@ -303,9 +303,11 @@ class isdimmIpmiFruInv : public IpmiFruInv
+      *        record
+      * @param[in/out] data, The container with record data
+      * @param[in] keyword, Indicates where in the VPD to get more data
+-
++     * @param[in] ascii, Indicates if VPD field is in ascii format or not
+      */
+-    errlHndl_t addVpdData(std::vector<uint8_t> &io_data, uint8_t i_keyword);
++    errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
++                          uint8_t i_keyword,
++                          bool i_ascii=false);
+ 
+ };
+ 
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0015-Add-PNOR-Version-Information-to-IPMI-Fru-Inventory.patch b/openpower/package/hostboot/hostboot-0015-Add-PNOR-Version-Information-to-IPMI-Fru-Inventory.patch
new file mode 100644
index 0000000..83dca55
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0015-Add-PNOR-Version-Information-to-IPMI-Fru-Inventory.patch
@@ -0,0 +1,351 @@
+From 5bda70dc5e135261f5393858959056b44332885b Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Mon, 30 Mar 2015 15:11:28 -0500
+Subject: [PATCH 6/7] Add PNOR Version Information to IPMI Fru Inventory
+
+Change-Id: Ib49fe67e9c6631b2b7ea0005e692c9aea6d84057
+RTC:123353
+(cherry picked from commit 90f8e938932e867283e28cade6741b6bf968602c)
+---
+ src/usr/ipmi/ipmifruinv.C                          | 207 +++++++++++++++++++++
+ src/usr/ipmi/ipmifruinvprvt.H                      |  47 +++++
+ .../targeting/common/xmltohb/attribute_types.xml   |   8 +
+ src/usr/targeting/common/xmltohb/target_types.xml  |   1 +
+ 4 files changed, 263 insertions(+)
+
+diff --git a/src/usr/ipmi/ipmifruinv.C b/src/usr/ipmi/ipmifruinv.C
+index c6c7a30..b376ebf 100644
+--- a/src/usr/ipmi/ipmifruinv.C
++++ b/src/usr/ipmi/ipmifruinv.C
+@@ -36,6 +36,7 @@
+ #include "ipmifru.H"
+ #include "ipmifruinvprvt.H"
+ #include <stdio.h>
++#include <pnor/pnorif.H>
+ 
+ extern trace_desc_t * g_trac_ipmi;
+ 
+@@ -83,6 +84,10 @@ IpmiFruInv *IpmiFruInv::Factory(TARGETING::TargetHandleList i_targets,
+             // @todo-RTC:117702
+             l_fru = new backplaneIpmiFruInv(l_target, i_targets, i_updateData);
+             break;
++        case TARGETING::TYPE_SYS:
++            // Use sys target for setting System Firmware Info
++            l_fru = new systemFwIpmiFruInv(l_target);
++            break;
+         default:
+             assert(false,
+                 "IpmiFruInv::Factory: No support for target type given: [%08x]",
+@@ -926,6 +931,199 @@ errlHndl_t backplaneIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
+     return l_errl;
+ }
+ 
++//##############################################################################
++systemFwIpmiFruInv::systemFwIpmiFruInv( TARGETING::TargetHandle_t i_target )
++    :IpmiFruInv(i_target)
++{
++
++};
++
++errlHndl_t systemFwIpmiFruInv::buildInternalUseArea(std::vector<uint8_t>
++                                                                       &io_data)
++{
++    //This section not needed for proc type
++    return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++errlHndl_t systemFwIpmiFruInv::buildChassisInfoArea(std::vector<uint8_t>
++                                                                       &io_data)
++{
++    //This section not needed for system firmware type
++    return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++errlHndl_t systemFwIpmiFruInv::buildBoardInfoArea(std::vector<uint8_t> &io_data)
++{
++    //This section not needed for system firmware type
++    return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++errlHndl_t systemFwIpmiFruInv::buildProductInfoArea(std::vector<uint8_t>
++                                                                       &io_data)
++{
++    errlHndl_t l_errl = NULL;
++
++    do {
++        //Set formatting data that goes at the beginning of the record
++        preFormatProcessing(io_data, true);
++
++        uint8_t l_data[] = {IPMIFRUINV::TYPELENGTH_BYTE_ASCII + 3,'I','B','M',
++                            IPMIFRUINV::TYPELENGTH_BYTE_ASCII + 18, 'O','p','e',
++                            'n','P','O','W','E','R',' ','F','i','r','m','w','a',
++                            'r','e', IPMIFRUINV::TYPELENGTH_BYTE_NULL};
++
++        io_data.insert( io_data.end(),
++                    &l_data[0],
++                    &l_data[0] + (uint8_t(sizeof(l_data) / sizeof(uint8_t))));
++
++        //Get PNOR Version Here
++        PNOR::SectionInfo_t l_pnorInfo;
++        l_errl = getSectionInfo( PNOR::VERSION , l_pnorInfo);
++        if (l_errl) { break; }
++
++        uint8_t* l_versionData = reinterpret_cast<uint8_t*>( l_pnorInfo.vaddr );
++        //Total Bytes in PNOR Version String
++        uint8_t l_numBytes = 0;
++        uint8_t l_curOffset = 0;
++
++        //Total Number of fields needed to print PNOR Version String
++        uint8_t l_numFields = 0;
++        bool l_clearStandardFields = true;
++
++        //First determine number of bytes in PNOR Version string
++        //  with the caveat there is a max record size allowed, so
++        //  the string will be cut off if too long
++        //Also, remove whitespace/newline chars
++        while ((l_numBytes < IPMIFRUINV::MAX_RECORD_SIZE -
++                              (uint8_t(sizeof(l_data) / sizeof(uint8_t))) -
++                              IPMIFRUINV::COMMON_HEADER_FORMAT_SIZE - 8)
++                               && (((char)(l_versionData[l_numBytes])) != '\0'))
++        {
++
++            if (((char)(l_versionData[l_numBytes])) == '\n')
++            {
++
++                if (l_numBytes > l_curOffset)
++                {
++                    //Add on size of this field to the data buffer
++                    io_data.push_back(
++                         IPMIFRUINV::TYPELENGTH_BYTE_ASCII
++                           + (l_numBytes-l_curOffset));
++
++                    io_data.insert(io_data.end(),
++                       &l_versionData[0]+(l_curOffset),
++                       &l_versionData[0]+(l_numBytes));
++                }
++
++                //Null data for standard fields needs to be indicated once after
++                // the first segment of data is displayed to match the
++                // ipmi fru spec
++                if (l_clearStandardFields)
++                {
++                    //Add Empty Asset Tag
++                    io_data.push_back(uint8_t(0));
++                    //FRU File ID - Empty
++                    io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
++                    io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
++                    l_clearStandardFields = false;
++                }
++
++                //Increment past the newline char
++                l_curOffset = l_numBytes + 1;
++            }
++            l_numBytes++;
++        }
++
++        if (l_curOffset == 0)
++        {
++            //Calculate the number of fields required to display this data
++            //  given only MAX_ASCII_FIELD_SIZE bytes can be in any one given
++            //  IPMI fru inventory field
++            l_numFields = l_numBytes / IPMIFRUINV::MAX_ASCII_FIELD_SIZE;
++            if (l_numBytes % IPMIFRUINV::MAX_ASCII_FIELD_SIZE)
++            {
++                l_numFields += 1;
++            }
++
++            //Count by number of fields, adding the data to the buffer as
++            // we go.
++            for (uint8_t i=0; i < l_numFields; i++)
++            {
++                //Determine the data size for this particular field
++                uint8_t l_dataSize=IPMIFRUINV::MAX_ASCII_FIELD_SIZE;
++                if (i == l_numFields - 1)
++                {
++                    l_dataSize = l_numBytes -
++                           (i * IPMIFRUINV::MAX_ASCII_FIELD_SIZE);
++                }
++
++                //Add on size of this field to the data buffer
++                io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_ASCII
++                                         + l_dataSize);
++
++                //Insert this segment of version string data
++                io_data.insert(io_data.end(),
++                       &l_versionData[0]+(i * IPMIFRUINV::MAX_ASCII_FIELD_SIZE),
++                       &l_versionData[0]+(i * IPMIFRUINV::MAX_ASCII_FIELD_SIZE)
++                                        +l_dataSize);
++
++                //Null data for standard fields needs to be indicated once after
++                // the first segment of data is displayed to match the
++                // ipmi fru spec
++                if (l_clearStandardFields)
++                {
++                    //Add Empty Asset Tag
++                    io_data.push_back(uint8_t(0));
++                    //FRU File ID - Empty
++                    io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
++                    //io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
++                    l_clearStandardFields = false;
++                }
++
++            }
++        }
++        else
++        {
++            if (l_numBytes > l_curOffset)
++            {
++                io_data.push_back( IPMIFRUINV::TYPELENGTH_BYTE_ASCII
++                        + (l_numBytes-l_curOffset));
++
++                io_data.insert(io_data.end(),
++                       &l_versionData[0]+(l_curOffset),
++                       &l_versionData[0]+(l_numBytes));
++            }
++
++        }
++
++        if (l_clearStandardFields)
++        {
++            //Add Asset Tag
++            io_data.push_back(uint8_t(0)); //No Asset Tag needed - O bytes
++            //FRU File ID - Empty
++            io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
++            //io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
++        }
++
++        io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
++
++        //Finalize section formatting
++        postFormatProcessing(io_data);
++
++    } while(0);
++
++    return l_errl;
++}
++
++errlHndl_t systemFwIpmiFruInv::buildMultiRecordInfoArea(std::vector<uint8_t>
++                                                                       &io_data)
++{
++    //This section not needed for system firmware type
++    return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++
++
+ void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
+                              const TARGETING::ATTR_ECID_type& i_ecidInfo,
+                              std::vector<uint8_t> &io_data)
+@@ -993,6 +1191,15 @@ void IPMIFRUINV::setData(bool i_updateData)
+             IPMIFRUINV::gatherClearData(pSys, frusToClear);
+         }
+ 
++        //Get System FW FRU_ID if available
++        uint32_t l_systemFwFruId;
++        bool hasSystemFwFruId =
++                            pSys->tryGetAttr<TARGETING::ATTR_BMC_FRU_ID>(l_systemFwFruId);
++        if (hasSystemFwFruId)
++        {
++            l_potentialFrus.push_back(std::make_pair(pSys, l_systemFwFruId));
++        }
++
+         // Find list of all target types that may need a fru inv. record set
+         IPMIFRUINV::gatherSetData(pSys, frusToClear,
+                                      l_potentialFrus, i_updateData);
+diff --git a/src/usr/ipmi/ipmifruinvprvt.H b/src/usr/ipmi/ipmifruinvprvt.H
+index 2573a84..468a47f 100644
+--- a/src/usr/ipmi/ipmifruinvprvt.H
++++ b/src/usr/ipmi/ipmifruinvprvt.H
+@@ -42,6 +42,8 @@ namespace IPMIFRUINV
+         COMMON_HEADER_FORMAT_SIZE     = 8, //size in bytes
+         DEFAULT_CHASSIS_TYPE          = 0x05,
+         DEFAULT_FRU_OFFSET            = 0,
++        MAX_ASCII_FIELD_SIZE          = 0x3F, //size in bytes
++        MAX_RECORD_SIZE               = 0xFF, //size in bytes
+     };
+ };
+ 
+@@ -460,4 +462,49 @@ class backplaneIpmiFruInv : public IpmiFruInv
+ 
+ };
+ 
++//Child class for building up System Firwmare Fru Inventory Record Data
++class systemFwIpmiFruInv : public IpmiFruInv
++{
++
++  public:
++    /**
++    * @brief Constructor
++    *
++    * @param[in] TargetHandle_t, Handle to target for which
++    *             to get relevant IPMI FRU Data from
++    */
++    systemFwIpmiFruInv( TARGETING::TargetHandle_t i_target);
++
++    /**
++     * @brief Builds the Internal Use Area Data Section
++     * @param[in/out] data, The container to put internal use area data in
++     */
++    errlHndl_t buildInternalUseArea(std::vector<uint8_t> &io_data);
++
++    /**
++     * @brief Builds the Chassis Info Area Data Section
++     * @param[in/out] data, The container to put chassis info area data in
++     */
++    errlHndl_t buildChassisInfoArea(std::vector<uint8_t> &io_data);
++
++    /**
++     * @brief Builds the Board Info Area Data Section
++     * @param[in/out] data, The container to put board info area data in
++     */
++    errlHndl_t buildBoardInfoArea(std::vector<uint8_t> &io_data);
++
++    /**
++     * @brief Builds the Product Info Area Data Section
++     * @param[in/out] data, The container to put product info area data in
++     */
++    errlHndl_t buildProductInfoArea(std::vector<uint8_t> &io_data);
++
++    /**
++     * @brief Builds the MultiRecord Info Area Data Section
++     * @param[in/out] data, The container to put multirecord info area data in
++     */
++    errlHndl_t buildMultiRecordInfoArea(std::vector<uint8_t> &io_data);
++
++};
++
+ #endif
+diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml
+index c961ebe..bbf02dd 100644
+--- a/src/usr/targeting/common/xmltohb/attribute_types.xml
++++ b/src/usr/targeting/common/xmltohb/attribute_types.xml
+@@ -11425,6 +11425,14 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
+ </attribute>
+ 
+ <attribute>
++    <id>BMC_FRU_ID</id>
++    <description>BMC FRU ID attribute for node class</description>
++    <simpleType><uint32_t><default>0</default></uint32_t></simpleType>
++    <persistency>non-volatile</persistency>
++    <readable/>
++</attribute>
++
++<attribute>
+     <id>PLCK_IPL_ATTR_OVERRIDES_EXIST</id>
+     <description>
+       Set to 1 by HWSV to indicate that attribute overrides exist in a PLCK IPL
+diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
+index 6dc4e58..b4b9a30 100644
+--- a/src/usr/targeting/common/xmltohb/target_types.xml
++++ b/src/usr/targeting/common/xmltohb/target_types.xml
+@@ -305,6 +305,7 @@
+     <attribute><id>MNFG_TH_CEN_L4_CACHE_CES</id></attribute>
+     <attribute><id>OPT_MEMMAP_GROUP_POLICY</id></attribute>
+     <attribute><id>FRU_ID</id></attribute>
++    <attribute><id>BMC_FRU_ID</id></attribute>
+ </targetType>
+ 
+ <targetType>
+-- 
+1.8.2.2
+
diff --git a/openpower/package/palmetto-xml/palmetto-xml-0001-Revert-Merge-pull-request-12-from-open-power-bofferd.patch b/openpower/package/palmetto-xml/palmetto-xml-0001-Revert-Merge-pull-request-12-from-open-power-bofferd.patch
new file mode 100644
index 0000000..1eea695
--- /dev/null
+++ b/openpower/package/palmetto-xml/palmetto-xml-0001-Revert-Merge-pull-request-12-from-open-power-bofferd.patch
@@ -0,0 +1,84 @@
+From 55eae8d646b3c95df32b67ef8d67887581f94fa0 Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Tue, 31 Mar 2015 08:15:06 -0500
+Subject: [PATCH] Revert "Merge pull request #12 from
+ open-power/bofferdn-pal-loadline"
+
+This reverts commit dbe13549a81c15c81e1fbd2d3de80ea91dd20503, reversing
+changes made to 167ded68387aa69fabb28e6cafaa6ae4bf165a40.
+
+Conflicts:
+	palmetto.xml
+---
+ palmetto.xml | 48 ++++++++++++++++++++++++------------------------
+ 1 file changed, 24 insertions(+), 24 deletions(-)
+
+diff --git a/palmetto.xml b/palmetto.xml
+index 6df6652..89669ab 100644
+--- a/palmetto.xml
++++ b/palmetto.xml
+@@ -2854,6 +2854,30 @@
+ 		<default>1</default>
+ 	</attribute>
+ 	<attribute>
++		<id>PROC_R_DISTLOSS_VCS</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_R_DISTLOSS_VDD</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_R_LOADLINE_VCS</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_R_LOADLINE_VDD</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_VRM_VOFFSET_VCS</id>
++		<default></default>
++	</attribute>
++	<attribute>
++		<id>PROC_VRM_VOFFSET_VDD</id>
++		<default></default>
++	</attribute>
++	<attribute>
+ 		<id>PROC_X_BUS_WIDTH</id>
+ 		<default>2</default>
+ 	</attribute>
+@@ -3735,30 +3759,6 @@
+ 		<default>0</default>
+ 	</attribute>
+ 	<attribute>
+-		<id>PROC_R_DISTLOSS_VCS</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_R_DISTLOSS_VDD</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_R_LOADLINE_VCS</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_R_LOADLINE_VDD</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_VRM_VOFFSET_VCS</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+-		<id>PROC_VRM_VOFFSET_VDD</id>
+-		<default></default>
+-	</attribute>
+-	<attribute>
+ 		<id>PSI_BRIDGE_BASE_ADDR</id>
+ 		<default>0,0x0000000000000000</default>
+ 	</attribute>
+-- 
+1.8.2.2
+
diff --git a/openpower/package/palmetto-xml/palmetto-xml-0002-Add-Sys-Fw-Fru-Id.patch b/openpower/package/palmetto-xml/palmetto-xml-0002-Add-Sys-Fw-Fru-Id.patch
new file mode 100644
index 0000000..00ba3ca
--- /dev/null
+++ b/openpower/package/palmetto-xml/palmetto-xml-0002-Add-Sys-Fw-Fru-Id.patch
@@ -0,0 +1,27 @@
+From 3856cbf0c35a5ed0d983717150efbe446324713d Mon Sep 17 00:00:00 2001
+From: Bill Hoffa <wghoffa@us.ibm.com>
+Date: Tue, 31 Mar 2015 08:17:17 -0500
+Subject: [PATCH 2/2] Add Sys Fw Fru Id
+
+---
+ palmetto.xml | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/palmetto.xml b/palmetto.xml
+index 89669ab..8f32666 100644
+--- a/palmetto.xml
++++ b/palmetto.xml
+@@ -2554,6 +2554,10 @@
+ 		<default></default>
+ 	</attribute>
+ 	<attribute>
++	        <id>BMC_FRU_ID</id>
++	        <default>15</default>
++	</attribute>
++	<attribute>
+ 		<id>FRU_NAME</id>
+ 		<default></default>
+ 	</attribute>
+-- 
+1.8.2.2
+
diff --git a/openpower/package/palmetto-xml/palmetto-xml.mk b/openpower/package/palmetto-xml/palmetto-xml.mk
index b3268a0..41c348e 100644
--- a/openpower/package/palmetto-xml/palmetto-xml.mk
+++ b/openpower/package/palmetto-xml/palmetto-xml.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-PALMETTO_XML_VERSION = 167ded68387aa69fabb28e6cafaa6ae4bf165a40
+PALMETTO_XML_VERSION = 9206323e35e40ca8957049965ba8e2564467040e
 PALMETTO_XML_SITE = $(call github,open-power,palmetto-xml,$(PALMETTO_XML_VERSION))
 
 PALMETTO_XML_LICENSE = Apache-2.0