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