opbuild hostboot package update June 2015

Removed redundant patches. Added patch to fix HWP error that was preventing IPL.
Updated hostboot version to 17f94afce9979da7c750fd8022604dc0b43dcf4f
Tested on habanero, palmetto HW (trace enabled and disabled),
IPL all the way to petitboot.
Built Firestone pnor
diff --git a/openpower/package/hostboot/hostboot-0007-Fix-handling-of-ECC-protected-partitions-at-runtime.patch b/openpower/package/hostboot/hostboot-0003-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0007-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
rename to openpower/package/hostboot/hostboot-0003-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
diff --git a/openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch b/openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch
deleted file mode 100644
index 455b3c7..0000000
--- a/openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From d7b5b4a29107c17ad97b2c25cec11f51df485ea1 Mon Sep 17 00:00:00 2001
-From: Brian Horton <brianh@linux.ibm.com>
-Date: Tue, 31 Mar 2015 13:26:40 -0500
-Subject: [PATCH] undo 1.18 change
-
-Change-Id: I477dd4a478fc3c752a7f4f9dd1dff9f03ce39cc1
----
- .../mss_thermal_init/mss_thermal_init.C            |    5 +++--
- 1 files changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
-index a98b58d..b90d1d6 100644
---- a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
-+++ b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
-@@ -22,7 +22,7 @@
- /* permissions and limitations under the License.                         */
- /*                                                                        */
- /* IBM_PROLOG_END_TAG                                                     */
--// $Id: mss_thermal_init.C,v 1.20 2015/03/02 20:43:37 pardeik Exp $
-+// $Id: mss_thermal_init.C,v 1.20a CHANGED IN OPENPOWER PATCH brianh Exp $
- // $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/centaur/working/procedures/ipl/fapi/mss_thermal_init.C,v $
- //------------------------------------------------------------------------------
- // *! (C) Copyright International Business Machines Corp. 2011
-@@ -49,6 +49,7 @@
- //------------------------------------------------------------------------------
- // Version:|  Author: |  Date:  | Comment:
- //---------|----------|---------|-----------------------------------------------
-+//   1.20a | brianh   |31-MAR-15| under 1.18
- //   1.20  | pardeik  |02-MAR-15| initialize l_dimm_ranks_array to zero
- //                              | use const variables in for loops instead of numbers
- //   1.18  | pardeik  |12-FEB-15| change ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP to
-@@ -295,7 +296,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
-       else
-       {
- 	  // sensor cache address map for non custom dimm temperature sensors (which i2c bus and i2c address they are)
--	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, &i_target, l_dimm_sensor_cache_addr_map);
-+	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, NULL, l_dimm_sensor_cache_addr_map);
- 	  if (l_rc) return l_rc;
-       }
- 
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0010-Remove-gard-actions-for-memory-plugging-errors.patch b/openpower/package/hostboot/hostboot-0004-Remove-gard-actions-for-memory-plugging-errors.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0010-Remove-gard-actions-for-memory-plugging-errors.patch
rename to openpower/package/hostboot/hostboot-0004-Remove-gard-actions-for-memory-plugging-errors.patch
diff --git a/openpower/package/hostboot/hostboot-0005-SW311560-HWP-error-prevent-IPL-on-habanero.patch b/openpower/package/hostboot/hostboot-0005-SW311560-HWP-error-prevent-IPL-on-habanero.patch
new file mode 100644
index 0000000..cb4e060
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0005-SW311560-HWP-error-prevent-IPL-on-habanero.patch
@@ -0,0 +1,60 @@
+From 58a3d0ad88b91c7c9cab1e2c4c9e3dbc7377303f Mon Sep 17 00:00:00 2001
+From: Prachi Gupta <pragupta@us.ibm.com>
+Date: Wed, 17 Jun 2015 09:22:10 -0500
+Subject: [PATCH] SW311560: HWP error prevent IPL on habanero
+
+Change-Id: Ibd19f1986c768e08a97acdbd8b39c174f51bb399
+CQ:SW311560
+---
+ .../hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C  | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C b/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C
+index 1f1bb7e..996a1e0 100644
+--- a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C
++++ b/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C
+@@ -22,7 +22,7 @@
+ /* permissions and limitations under the License.                         */
+ /*                                                                        */
+ /* IBM_PROLOG_END_TAG                                                     */
+-// $Id: mss_eff_config_thermal.C,v 1.31 2015/04/06 22:33:11 pardeik Exp $
++// $Id: mss_eff_config_thermal.C,v 1.32 2015/06/16 21:57:30 pardeik Exp $
+ // $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/
+ //          centaur/working/procedures/ipl/fapi/mss_eff_config_thermal.C,v $
+ //------------------------------------------------------------------------------
+@@ -55,6 +55,9 @@
+ //------------------------------------------------------------------------------
+ // Version:|  Author: |  Date:  | Comment:
+ //---------|----------|---------|-----------------------------------------------
++//   1.32  | pardeik  | 06/16/15| fix for ISDIMM systems to prevent a zero
++//         |          |         |   ATTR_MSS_MEM_WATT_TARGET value
++//         |          |         | Removed unneeded TODO commented section
+ //   1.31  | pardeik  | 04/06/15 | attribute name changed for adjustment enable
+ //   1.30  | pardeik  |12-FEB-15| CDIMM DDR4 throttle updates (set Nmba to Nchip)
+ //         |          |         | Support for vmem regulator power adjustment
+@@ -131,10 +134,6 @@
+ //         |          |         | case. 
+ //   1.1   | pardeik  |01-NOV-11| First Draft.
+ 
+-/*
+-TODO ITEMS:
+-1.  Update ISDIMM power table after hardware measurements are done (GA3)
+-*/
+ 
+ //------------------------------------------------------------------------------
+ //  My Includes
+@@ -583,6 +582,11 @@ extern "C" {
+ //------------------------------------------------------------------------------
+ 
+ // adjust the regulator power limit per dimm if enabled and use this if less than the thermal limit
++// If reg power limit is zero, then set to thermal limit - needed for ISDIMM systems since some of these MRW attributes are not defined
++	if (l_dimm_reg_power_limit_per_dimm == 0)
++	{
++	    l_dimm_reg_power_limit_per_dimm = dimm_thermal_power_limit;
++	}
+ 	l_dimm_reg_power_limit_per_dimm_adj = l_dimm_reg_power_limit_per_dimm;
+ 	if (l_dimm_reg_power_limit_adj_enable == fapi::ENUM_ATTR_MRW_VMEM_REGULATOR_POWER_LIMIT_PER_DIMM_ADJ_ENABLE_TRUE)
+ 	{
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch b/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch
deleted file mode 100644
index 3777b11..0000000
--- a/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From a4f739abb72b8ac5748138183b274cca5eef50ff Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 12 May 2015 15:32:20 -0500
-Subject: [PATCH] PCIe lane swap fix in processMRW.pl
-
-Change-Id: Iee7127fef7f4a911a77e0c24c896d840b1b45ff4
----
- src/usr/targeting/common/processMrw.pl | 25 +++++++++++--------------
- 1 file changed, 11 insertions(+), 14 deletions(-)
-
-diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
-index 5d44e74..bbdb936 100644
---- a/src/usr/targeting/common/processMrw.pl
-+++ b/src/usr/targeting/common/processMrw.pl
-@@ -805,8 +805,8 @@ sub processPcie
-     $iop_swap{0}{1}{'11'}=$t[7];
- 
-     $iop_swap{1}{0}{'00'}=$t[8];
--    $iop_swap{1}{0}{'01'}=$t[9];
--    $iop_swap{1}{0}{'10'}=$t[10];
-+    $iop_swap{1}{0}{'10'}=$t[9];
-+    $iop_swap{1}{0}{'01'}=$t[10];
-     $iop_swap{1}{0}{'11'}=$t[11];
-     $iop_swap{1}{1}{'00'}=$t[12];
-     $iop_swap{1}{1}{'10'}=$t[13];
-@@ -906,25 +906,22 @@ sub processPcie
-           die "PCIE config for $iop,$iop_lane_swap[$iop],$lane_rev not found\n";
-         }
-     }
--    my $lane_swap_attr0 = sprintf("%s,%s",$iop_lane_swap[0],
--                          $iop_lane_swap[1]);
--    my $lane_swap_attr1 = sprintf("%s,0,%s,0",$iop_lane_swap[0],
--                          $iop_lane_swap[1]);
-+
-+    my $lane_rev_attr0 = sprintf("%s,%s",
-+                         oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
-+    my $lane_rev_attr1 = sprintf("%s,0,%s,0",
-+                         oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
- 
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP",
--        $lane_swap_attr0);
-+        $lane_rev_attr0);
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_NON_BIFURCATED",
--        $lane_swap_attr1);
-+        $lane_rev_attr1);
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_BIFURCATED",
-         "0,0,0,0");
--
--    my $lane_rev_attr = sprintf("%s,0,%s,0",
--                         oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
--
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL",
--        $lane_rev_attr);
-+        "0,0,0,0");
-     $targetObj->setAttribute($parentTarget,
--        "PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED",$lane_rev_attr);
-+        "PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED","0,0,0,0");
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL_BIFURCATED",
-         "0,0,0,0");
- 
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch b/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
deleted file mode 100644
index eb8d12a..0000000
--- a/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From d2bdfed735f6c5e69b606f0251aba131fec4275d Mon Sep 17 00:00:00 2001
-From: Brian Stegmiller <bjs@us.ibm.com>
-Date: Thu, 14 May 2015 13:47:36 -0500
-Subject: [PATCH] ATTN: IPOLL interrupt workaround
-
-Circumvents issue where interrupts happen before OPAL is ready
-to handle them
-
-Change-Id: I3d378cd03dac51aaa5b2f77e8940eb63f170016b
-Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/17795
-Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
-Tested-by: Jenkins Server
----
- src/usr/diag/attn/common/attnsvc_common.C | 83 +++++++++++++++++++++++++++++--
- 1 file changed, 79 insertions(+), 4 deletions(-)
-
-diff --git a/src/usr/diag/attn/common/attnsvc_common.C b/src/usr/diag/attn/common/attnsvc_common.C
-index c56b8a8..5067438 100644
---- a/src/usr/diag/attn/common/attnsvc_common.C
-+++ b/src/usr/diag/attn/common/attnsvc_common.C
-@@ -43,6 +43,13 @@ using namespace ERRORLOG;
- 
- namespace ATTN
- {
-+const uint64_t MCIFIRACT0     = 0x02011846;
-+const uint64_t MCIFIRACT1     = 0x02011847;
-+
-+const uint64_t MCIFIRMASK     = 0x02011843;
-+const uint64_t MCIFIRMASK_AND = 0x02011844;
-+const uint64_t MCIFIRMASK_OR  = 0x02011845;
-+
- 
- void getPbGp2Mask(uint64_t i_pos, void * i_data)
- {
-@@ -104,11 +111,11 @@ errlHndl_t ServiceCommon::configureInterrupts(
-         ConfigureMode i_mode)
- {
-     errlHndl_t err = NULL;
--
--    TargetHandleList procs;
-+    TargetHandleList  procs;
-     getTargetService().getAllChips(procs, TYPE_PROC);
-     TargetHandleList::iterator it = procs.begin();
- 
-+
-     while(it != procs.end())
-     {
-         uint64_t mask = 0;
-@@ -172,12 +179,10 @@ errlHndl_t ServiceCommon::configureInterrupts(
- 
-         #ifndef __HOSTBOOT_RUNTIME
-         // enable attentions in ipoll mask
--
-         mask = HostMask::nonHost();
-         mask |= HostMask::host();
- 
-         // this doesn't have an and/or reg for some reason...
--
-         err = modifyScom(*it,
-                          IPOLL::address,
-                          i_mode == UP ? ~mask : mask,
-@@ -187,6 +192,76 @@ errlHndl_t ServiceCommon::configureInterrupts(
-         {
-             break;
-         }
-+
-+        #else  // HOSTBOOT_RUNTIME
-+
-+        if (i_mode == UP)
-+        {
-+            HwasState         l_functional;
-+            uint64_t          l_mciAct0 = 0;
-+            uint64_t          l_mciAct1 = 0;
-+            uint64_t          l_mciBitMask = 0;
-+            TargetHandleList  l_mcsList;
-+            // Get list of MCS units associated with this proc
-+            getTargetService().getMcsList( *it, l_mcsList );
-+
-+            // We need to set/clear mask bits in the MCIFIRs that
-+            // are associated with host attentions.  This should
-+            // cause interrupts to re-occur if they had happened
-+            // prior to starting the opal-prd application.
-+            TargetHandleList::iterator  l_mcsIt = l_mcsList.begin();
-+
-+            while(l_mcsIt != l_mcsList.end())
-+            {
-+                // Make sure functional prior to using
-+                if (!((*l_mcsIt)->tryGetAttr<ATTR_HWAS_STATE>(l_functional)))
-+                {
-+                    // Can't tell if functional so skip this MCS
-+                    break;
-+                }
-+
-+                if ( !(l_functional.functional) )
-+                {
-+                    // Not functional MCS so skip it
-+                    break;
-+                }
-+
-+                // Read ACTION registers to see if HOST ATTN
-+                err = getScom(*l_mcsIt, MCIFIRACT0, l_mciAct0);
-+
-+                if (NULL == err)
-+                {
-+                    err = getScom(*l_mcsIt, MCIFIRACT1, l_mciAct1);
-+                }
-+
-+                if (NULL == err)
-+                {
-+                    // Create bit mask we will use to write to MCIFIR
-+                    // (ACT0=1, ACT1=0) indicate bits we want
-+                    l_mciBitMask = l_mciAct0 & ~l_mciAct1;
-+                    // Set mask bits
-+                    err = putScom(*l_mcsIt, MCIFIRMASK_OR, l_mciBitMask);
-+                }
-+
-+                if (NULL == err)
-+                {
-+                    // Clear mask bits
-+                    err = putScom(*l_mcsIt, MCIFIRMASK_AND, ~l_mciBitMask);
-+                }
-+
-+                // Commit any failure we had and move to next MCS unit
-+                if (NULL != err)
-+                {
-+                    errlCommit(err, ATTN_COMP_ID);
-+                }
-+
-+                l_mcsIt++;
-+
-+            } // end while on MCS units
-+
-+            l_mcsList.clear();
-+        } // end if UP MODE -- enabling
-+
-         #endif //__HOSTBOOT_RUNTIME
- 
-         ++it;
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch b/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch
deleted file mode 100644
index e51afbf..0000000
--- a/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch
+++ /dev/null
@@ -1,2271 +0,0 @@
-From 9597cf58b44fd0c16da9d3592e8fd586a4dbf04d Mon Sep 17 00:00:00 2001
-From: Bill Schwartz <whs@us.ibm.com>
-Date: Fri, 27 Feb 2015 15:41:10 -0600
-Subject: [PATCH] Add support for backplane VPD
-
-Replace the temporary use of mem buf to access planar vpd with new
-planar vpd interfaces.
-
-Change-Id: I24cda4d713806330a9f61d588006d63966f92550
-RTC: 118373
-Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16326
-Tested-by: Jenkins Server
-Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
----
- src/include/usr/devicefw/userif.H                  |  23 +
- src/include/usr/vpd/cvpdenums.H                    |   1 -
- src/include/usr/vpd/pvpdenums.H                    |  96 ++++
- src/include/usr/vpd/vpd_if.H                       |   8 +
- src/include/usr/vpd/vpdreasoncodes.H               |   4 +
- src/usr/devtree/bld_devtree.C                      |  85 ++--
- src/usr/hwas/hwasPlat.C                            |   6 +-
- src/usr/hwas/hwasPlatCallout.C                     |   6 +-
- src/usr/i2c/eepromdd.C                             |   5 +
- src/usr/ipmi/ipmifruinv.C                          | 502 +++++++++++++--------
- src/usr/ipmi/ipmifruinvprvt.H                      | 112 ++++-
- src/usr/targeting/common/xmltohb/target_types.xml  |   2 +
- .../targeting/common/xmltohb/target_types_hb.xml   |   5 +
- src/usr/vpd/HBconfig                               |  27 ++
- src/usr/vpd/cvpd.C                                 |  36 +-
- src/usr/vpd/cvpd.H                                 |  22 +-
- src/usr/vpd/ipvpd.C                                |  50 +-
- src/usr/vpd/ipvpd.H                                |  22 +-
- src/usr/vpd/pvpd.C                                 | 369 +++++++++++++++
- src/usr/vpd/pvpd.H                                 | 149 ++++++
- src/usr/vpd/vpd.C                                  |  17 +-
- src/usr/vpd/vpd.H                                  |   1 +
- src/usr/vpd/vpd.mk                                 |   5 +-
- 23 files changed, 1307 insertions(+), 246 deletions(-)
- create mode 100644 src/include/usr/vpd/pvpdenums.H
- create mode 100644 src/usr/vpd/pvpd.C
- create mode 100644 src/usr/vpd/pvpd.H
-
-diff --git a/src/include/usr/devicefw/userif.H b/src/include/usr/devicefw/userif.H
-index 6d041f2..eac5366 100644
---- a/src/include/usr/devicefw/userif.H
-+++ b/src/include/usr/devicefw/userif.H
-@@ -61,6 +61,7 @@ namespace DeviceFW
-         GPIO,
-         LPC,
-         IPMIBT,    // As opposed to other phy's
-+        PVPD,
- 
-         LAST_ACCESS_TYPE,
-     };
-@@ -166,6 +167,28 @@ namespace DeviceFW
-             static_cast<uint64_t>(( i_location ))
- 
-     /**
-+     * Construct the device addressing parameters for the PVPD device ops.
-+     * @param[in] i_record - The enumeration of the PVPD record to access.
-+     * @param[in] i_keyword - The enumeration of the PVPD keyword, located
-+     *      within the i_record Record to access.
-+     */
-+    #define DEVICE_PVPD_ADDRESS( i_record, i_keyword )\
-+        DEVICE_PVPD_FORCE_ADDRESS( i_record, i_keyword, VPD::AUTOSELECT )
-+
-+    /**
-+     * Construct the device addressing parameters for the PVPD device ops.
-+     * @param[in] i_record - The enumeration of the PVPD record to access.
-+     * @param[in] i_keyword - The enumeration of the PVPD keyword, located
-+     *      within the i_record Record to access.
-+     * @param[in] i_location - The location of the data (PNOR/SEEPROM)
-+            see vpd_if.H
-+     */
-+    #define DEVICE_PVPD_FORCE_ADDRESS( i_record, i_keyword, i_location )\
-+        DeviceFW::PVPD, static_cast<uint64_t>(( i_record )),\
-+            static_cast<uint64_t>(( i_keyword )),\
-+            static_cast<uint64_t>(( i_location ))
-+
-+    /**
-      * Construct the device addressing parameters for the SCAN device ops.
-      * @param[in] i_ring - The ring address to scan
-      * @param[in] i_ringlen - The length of the ring to scan in bits
-diff --git a/src/include/usr/vpd/cvpdenums.H b/src/include/usr/vpd/cvpdenums.H
-index 4b5adb2..79b8109 100644
---- a/src/include/usr/vpd/cvpdenums.H
-+++ b/src/include/usr/vpd/cvpdenums.H
-@@ -45,7 +45,6 @@ namespace CVPD
-         OPFR        = 0x05,
-         VNDR        = 0x06,
-         SPDX        = 0x07,
--        OSYS        = 0x08,
-         // Last Record
-         CVPD_LAST_RECORD,
-         CVPD_TEST_RECORD,   // Test purposes ONLY!
-diff --git a/src/include/usr/vpd/pvpdenums.H b/src/include/usr/vpd/pvpdenums.H
-new file mode 100644
-index 0000000..acf3bbd
---- /dev/null
-+++ b/src/include/usr/vpd/pvpdenums.H
-@@ -0,0 +1,96 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/include/usr/vpd/pvpdenums.H $                             */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
-+/* [+] International Business Machines Corp.                              */
-+/*                                                                        */
-+/*                                                                        */
-+/* Licensed under the Apache License, Version 2.0 (the "License");        */
-+/* you may not use this file except in compliance with the License.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+#ifndef __PVPDENUMS_H
-+#define __PVPDENUMS_H
-+
-+#include <vpd/ipvpdenums.H>
-+
-+namespace PVPD
-+{
-+
-+    /**
-+     * @brief Enumeration for the PVPD Records that contain
-+     *       the keyword enumerations below.
-+     *
-+     */
-+    enum pvpdRecord
-+    {
-+        PVPD_FIRST_RECORD   = 0x00,
-+        VINI        = PVPD_FIRST_RECORD,
-+        OSYS        = 0x01,
-+        OPFR        = 0x02,
-+        VNDR        = 0x03,
-+        // Last Record
-+        PVPD_LAST_RECORD,
-+        PVPD_TEST_RECORD,   // Test purposes ONLY!
-+
-+        //Start common IPVPD enums
-+        PVPD_INVALID_RECORD = IPVPD::INVALID_RECORD,
-+    };
-+
-+    /**
-+     * @brief Enumerations for PVPD keywords that can be
-+     *       accessed in the PVPD.
-+     */
-+    enum pvpdKeyword
-+    {
-+        PVPD_FIRST_KEYWORD      = 0x00,
-+        pdI         = PVPD_FIRST_KEYWORD,
-+        B3         = 0x01,
-+        B4         = 0x02,
-+        B7         = 0x03,
-+        CC         = 0x04,
-+        CE         = 0x05,
-+        CT         = 0x06,
-+        DR         = 0x07,
-+        ET         = 0x08,
-+        FN         = 0x09,
-+        HE         = 0x0a,
-+        HW         = 0x0b,
-+        IN         = 0x0c,
-+        MM         = 0x0d,
-+        PF         = 0x0e,
-+        PN         = 0x0f,
-+        RT         = 0x10,
-+        SN         = 0x11,
-+        SS         = 0x12,
-+        VD         = 0x13,
-+        VN         = 0x14,
-+        VP         = 0x15,
-+        VS         = 0x16,
-+        VZ         = 0x17,
-+
-+        // Last Keyword
-+        PVPD_LAST_KEYWORD,
-+        PVPD_TEST_KEYWORD,  // Test purposes ONLY!
-+
-+        //Start common IPVPD enums
-+        FULL_RECORD = IPVPD::FULL_RECORD,
-+        PVPD_INVALID_KEYWORD    = IPVPD::INVALID_KEYWORD,
-+    };
-+
-+};  // end PVPD
-+
-+#endif
-diff --git a/src/include/usr/vpd/vpd_if.H b/src/include/usr/vpd/vpd_if.H
-index 0b3298a..d3915ee 100644
---- a/src/include/usr/vpd/vpd_if.H
-+++ b/src/include/usr/vpd/vpd_if.H
-@@ -71,6 +71,14 @@ namespace VPD
-     bool cvpdPresent ( TARGETING::Target * i_target );
- 
-     /**
-+     * @brief This function checks to see if the given pvpd target
-+     *      is present
-+     * @param[in] i_target - Target device to search for pvpd
-+     * @return bool - true if pvpd is present, false if it is not.
-+     */
-+    bool pvpdPresent ( TARGETING::Target * i_target );
-+
-+    /**
-      * @brief This function checks if the PNOR cache for this target is in
-      *      sync with the SEEPROM, if not it loads the PNOR cache from SEEPROM.
-      * @param[in] i_target - Target device
-diff --git a/src/include/usr/vpd/vpdreasoncodes.H b/src/include/usr/vpd/vpdreasoncodes.H
-index 88668b7..2cfe8a6 100644
---- a/src/include/usr/vpd/vpdreasoncodes.H
-+++ b/src/include/usr/vpd/vpdreasoncodes.H
-@@ -61,6 +61,9 @@ enum vpdModuleId
-     VPD_IPVPD_LOAD_PNOR                     = 0x33,
-     VPD_IPVPD_GET_RECORD_LIST_SEEPROM       = 0x34,
- 
-+    // PVPD
-+    VPD_PVPD_PRESENCEDETECT                 = 0x50,
-+
-     // DIMM SPD
-     VPD_SPD_GET_KEYWORD_VALUE               = 0x61,
-     VPD_SPD_GET_VALUE                       = 0x62,
-@@ -131,6 +134,7 @@ enum vpdReasonCode
-     VPD_UNEXPECTED_TARGET_TYPE          = VPD_COMP_ID | 0x33,
-     VPD_WRITE_DEST_UNRESOLVED           = VPD_COMP_ID | 0x34,
-     VPD_CACHE_SIZE_EXCEEDED             = VPD_COMP_ID | 0x35,
-+    VPD_INVALID_LENGTH                  = VPD_COMP_ID | 0x36,
- };
- 
- 
-diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C
-index a8ece97..a311efe 100644
---- a/src/usr/devtree/bld_devtree.C
-+++ b/src/usr/devtree/bld_devtree.C
-@@ -45,7 +45,7 @@
- #include <fsi/fsiif.H>
- #include <config.h>
- #include <devicefw/userif.H>
--#include <vpd/cvpdenums.H>
-+#include <vpd/pvpdenums.H>
- #include <i2c/i2cif.H>
- #include <i2c/eepromif.H>
- #include <ipmi/ipmisensor.H>
-@@ -351,12 +351,9 @@ void add_i2c_info( const TARGETING::Target* i_targ,
-                 }
-                 else if( l_type == TARGETING::TYPE_MEMBUF )
-                 {
--                    //@fixme-RTC:118373-Remove Hab/Palm workaround
--                    //   once node vpd is supported
--                    sprintf( l_label, "system-vpd" );
--                    /*sprintf( l_label, "memb-vpd-%d",
-+                    sprintf( l_label, "memb-vpd-%d",
-                              eep2->assocTarg
--                             ->getAttr<TARGETING::ATTR_POSITION>() );*/
-+                             ->getAttr<TARGETING::ATTR_POSITION>() );
-                 }
-                 else if( l_type == TARGETING::TYPE_DIMM )
-                 {
-@@ -1054,39 +1051,46 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-            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);
--
--        //if can't find a centaur for the CVPD, default to unknown
--        if (l_membTargetList.size())
-+        TARGETING::TargetHandleList l_nodeTargetList;
-+        PredicateCTM predNode(CLASS_ENC, TYPE_NODE);
-+        PredicateHwas predFunctional;
-+        predFunctional.functional(true);
-+        PredicatePostfixExpr nodeCheckExpr;
-+        nodeCheckExpr.push(&predNode).push(&predFunctional).And();
-+
-+        targetService().getAssociated(l_nodeTargetList, sys,
-+                    TargetService::CHILD, TargetService::IMMEDIATE,
-+                    &nodeCheckExpr);
-+
-+        //if can't find a node for the PVPD, default to unknown
-+        if (l_nodeTargetList.size())
-         {
--            TARGETING::Target * l_pMem = l_membTargetList[0];
-+            TARGETING::Target * l_pNode = l_nodeTargetList[0];
-             size_t vpdSize = 0x0;
- 
-             // Note: First read with NULL for o_buffer sets vpdSize to the
-             // correct length
--            errhdl = deviceRead( l_pMem,
-+            errhdl = deviceRead( l_pNode,
-                                  NULL,
-                                  vpdSize,
--                                 DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                      CVPD::MM ));
-+                                 DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                      PVPD::MM ));
- 
-             if(errhdl)
-             {
-                 TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:MM size for HUID=0x%.8X",
--                          TARGETING::get_huid(l_pMem));
-+                          TARGETING::get_huid(l_pNode));
- 
-                 // Try the OPFR record
--                errlHndl_t opfr_errhdl = deviceRead( l_pMem,
-+                errlHndl_t opfr_errhdl = deviceRead( l_pNode,
-                                            NULL,
-                                            vpdSize,
--                                           DEVICE_CVPD_ADDRESS( CVPD::OPFR,
--                                                                CVPD::DR ));
-+                                           DEVICE_PVPD_ADDRESS( PVPD::OPFR,
-+                                                                PVPD::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));
-+                              TARGETING::get_huid(l_pNode));
-                     delete opfr_errhdl; //delete OPFR log, VPD is just bad
-                 }
-                 else
-@@ -1095,16 +1099,16 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-                     errhdl = NULL;
-                     char drBuf[vpdSize+1];
-                     memset(&drBuf, 0x0, (vpdSize+1)); //null terminated str
--                    errhdl = deviceRead( l_pMem,
-+                    errhdl = deviceRead( l_pNode,
-                                          reinterpret_cast<void*>( &drBuf ),
-                                          vpdSize,
--                                         DEVICE_CVPD_ADDRESS( CVPD::OPFR,
--                                                              CVPD::DR ));
-+                                         DEVICE_PVPD_ADDRESS( PVPD::OPFR,
-+                                                              PVPD::DR ));
- 
-                     if(errhdl)
-                     {
-                         TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OPFR:DR for HUID=0x%.8X",
--                                  TARGETING::get_huid(l_pMem));
-+                                  TARGETING::get_huid(l_pNode));
-                     }
-                     else
-                     {
-@@ -1117,16 +1121,16 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-             {
-                 char mmBuf[vpdSize+1];
-                 memset(&mmBuf, 0x0, (vpdSize+1)); //ensure null terminated str
--                errhdl = deviceRead( l_pMem,
-+                errhdl = deviceRead( l_pNode,
-                                      reinterpret_cast<void*>( &mmBuf ),
-                                      vpdSize,
--                                     DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                          CVPD::MM ));
-+                                     DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                          PVPD::MM ));
- 
-                 if(errhdl)
-                 {
-                     TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:MM for HUID=0x%.8X",
--                              TARGETING::get_huid(l_pMem));
-+                              TARGETING::get_huid(l_pNode));
-                 }
-                 else
-                 {
-@@ -1153,42 +1157,40 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-            1) OSYS:SS
-            2) Default to 'unavailable'
-          */
--        // TODO RTC 118373 -- update to account for firestone/memory riser
-         foundvpd = false;
--        if( l_membTargetList.size() )
-+        if( l_nodeTargetList.size() )
-         {
--            // TODO RTC 118373 - Should be able to read from attribute
--            TARGETING::Target * l_pMem = l_membTargetList[0];
-+            TARGETING::Target * l_pNode = l_nodeTargetList[0];
-             size_t vpdSize = 0x0;
- 
-             // Note: First read with NULL for o_buffer sets vpdSize to the
-             // correct length
--            errhdl = deviceRead( l_pMem,
-+            errhdl = deviceRead( l_pNode,
-                                  NULL,
-                                  vpdSize,
--                                 DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                      CVPD::SS ));
-+                                 DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                      PVPD::SS ));
- 
-             if(errhdl)
-             {
-                 TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:SS size for HUID=0x%.8X",
--                          TARGETING::get_huid(l_pMem));
-+                          TARGETING::get_huid(l_pNode));
-                 // 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,
-+                errhdl = deviceRead( l_pNode,
-                                      reinterpret_cast<void*>( &ssBuf ),
-                                      vpdSize,
--                                     DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                          CVPD::SS ));
-+                                     DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                          PVPD::SS ));
- 
-                 if(errhdl)
-                 {
-                     TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:SS for HUID=0x%.8X",
--                              TARGETING::get_huid(l_pMem));
-+                              TARGETING::get_huid(l_pNode));
-                 }
-                 else
-                 {
-@@ -1205,7 +1207,6 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-             delete errhdl;
-             errhdl = NULL;
-         }
--
-         if( !foundvpd ) //serial number not found, default to unavailable
-         {
-             i_dt->addPropertyString(rootNode, "system-id", "unavailable");
-diff --git a/src/usr/hwas/hwasPlat.C b/src/usr/hwas/hwasPlat.C
-index 80c36f9..ef631b5 100644
---- a/src/usr/hwas/hwasPlat.C
-+++ b/src/usr/hwas/hwasPlat.C
-@@ -421,9 +421,13 @@ errlHndl_t platPresenceDetect(TargetHandleList &io_targets)
-             HWAS_DBG("pTarget %.8X - detected present",
-                 pTarget->getAttr<ATTR_HUID>());
- 
--            // on to the next target
-+        // If there is planar VPD, then don't skip the presence detect.
-+        // The presence detect will log any problems and load pnor.
-+#if !defined(CONFIG_HAVE_PVPD)
-+            // on to the next target if there is no Planar VPD
-             pTarget_it++;
-             continue;
-+#endif
-         }
- 
-         // call deviceRead() to see if they are present
-diff --git a/src/usr/hwas/hwasPlatCallout.C b/src/usr/hwas/hwasPlatCallout.C
-index 0f15082..03756a8 100644
---- a/src/usr/hwas/hwasPlatCallout.C
-+++ b/src/usr/hwas/hwasPlatCallout.C
-@@ -122,10 +122,12 @@ errlHndl_t platHandleHWCallout(
-         } // switch i_deconfigState
- 
-         // check to see if this target is the master processor
--        //  and if it's been deconfigured.
-+        //  and if it's being deconfigured.
-+        //  NOTE: will be non-functional early in IPL before discovery complete.
-         TARGETING::Target *l_masterProc;
-         TARGETING::targetService().masterProcChipTargetHandle(l_masterProc);
--        if (i_pTarget == l_masterProc)
-+        if ( (i_pTarget == l_masterProc) &&
-+             (NO_DECONFIG != i_deconfigState) )
-         {
-             const TARGETING::HwasState hwasState =
-                     l_masterProc->getAttr<TARGETING::ATTR_HWAS_STATE>();
-diff --git a/src/usr/i2c/eepromdd.C b/src/usr/i2c/eepromdd.C
-index 372fcc7..b2e1c90 100755
---- a/src/usr/i2c/eepromdd.C
-+++ b/src/usr/i2c/eepromdd.C
-@@ -97,6 +97,11 @@ DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD,
-                        TARGETING::TYPE_MEMBUF,
-                        eepromPerformOp );
- 
-+// Register the perform Op with the routing code for Nodes.
-+DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD,
-+                       DeviceFW::EEPROM,
-+                       TARGETING::TYPE_NODE,
-+                       eepromPerformOp );
- 
- // ------------------------------------------------------------------
- // eepromPerformOp
-diff --git a/src/usr/ipmi/ipmifruinv.C b/src/usr/ipmi/ipmifruinv.C
-index cc2f06a..49c5e7e 100644
---- a/src/usr/ipmi/ipmifruinv.C
-+++ b/src/usr/ipmi/ipmifruinv.C
-@@ -29,6 +29,7 @@
- #include <devicefw/userif.H>
- #include <vpd/spdenums.H>
- #include <vpd/cvpdenums.H>
-+#include <vpd/pvpdenums.H>
- #include <targeting/common/commontargeting.H>
- #include <targeting/common/utilFilter.H>
- #include <errl/errlmanager.H>
-@@ -51,7 +52,17 @@ inline static bool comparePairs(
-               const std::pair<TARGETING::TargetHandle_t, uint8_t>& i_lhs,
-               const std::pair<TARGETING::TargetHandle_t, uint8_t>& i_rhs)
- {
--        return (i_lhs.second < i_rhs.second);
-+    bool l_compare = i_lhs.second < i_rhs.second;
-+
-+    // in case of a tie, if the left is a Node, sort it first.
-+    if (i_lhs.second == i_rhs.second)
-+    {
-+        if (TARGETING::TYPE_NODE==i_lhs.first->getAttr<TARGETING::ATTR_TYPE>())
-+        {
-+           l_compare = true;
-+        }
-+    }
-+    return l_compare;
- }
- 
- IpmiFruInv::IpmiFruInv(TARGETING::TargetHandle_t i_target)
-@@ -82,7 +93,14 @@ IpmiFruInv *IpmiFruInv::Factory(TARGETING::TargetHandleList i_targets,
-             l_fru = new procIpmiFruInv(l_target, i_updateData);
-             break;
-         case TARGETING::TYPE_MEMBUF:
--            // @todo-RTC:117702
-+            // A memory riser card will have a mem buff with a distinct FRU ID
-+            l_fru = new membufIpmiFruInv(l_target, i_targets, i_updateData);
-+            break;
-+        case TARGETING::TYPE_NODE:
-+            // When the planar eeprom is shared for planar vpd and memory vpd,
-+            // the node and membufs will have the same FRU ID. The node has
-+            // been sorted ahead of the membufs. The membufs are extra targets
-+            // for their ECIDs.
-             l_fru = new backplaneIpmiFruInv(l_target, i_targets, i_updateData);
-             break;
-         case TARGETING::TYPE_SYS:
-@@ -425,11 +443,11 @@ errlHndl_t isdimmIpmiFruInv::buildProductInfoArea(std::vector<uint8_t> &io_data)
-         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);
- 
-+    //Finalize section formatting
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"isdimIpmiFruInv::buildProductInfoArea - Errors "
-@@ -580,11 +598,11 @@ errlHndl_t procIpmiFruInv::buildBoardInfoArea(std::vector<uint8_t> &io_data)
-         //Indicate end of custom fields
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Complete formatting for this data record
--        postFormatProcessing(io_data);
--
-     } while (0);
- 
-+    //Complete formatting for this data record
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"buildBoardInfoArea - Errors Collecting ISDimm "
-@@ -610,64 +628,18 @@ errlHndl_t procIpmiFruInv::buildMultiRecordInfoArea(
- errlHndl_t procIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
-                                      uint8_t i_record,
-                                      uint8_t i_keyword,
--                                     bool i_ascii)
-+                                     bool i_ascii,
-+                                     bool i_typeLengthByte)
- {
--    size_t     l_vpdSize = 0;
-     errlHndl_t l_errl = NULL;
- 
--    do {
--
--        //First get size of data by passing NULL
--        l_errl = deviceRead(iv_target,
--                                      NULL,
--                                      l_vpdSize,
--                                      DEVICE_MVPD_ADDRESS(i_record, i_keyword));
--
--        if (l_errl)
--        {
--            TRACFCOMP(g_trac_ipmi,"procIpmiFruInv::addVpdData - Error while "
--                      "reading MVPD keyword size");
--            break;
--        }
--
--        //Assert if vpd field is too large to fit in IPMI fru inventory format
--        assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
--
--        if (l_vpdSize > 0)
--        {
--            //Determine how big data is and expand it to handle the soon to
--            //be read VPD 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 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;
--            }
--
--            //Read the VPD data directly into fru inventory data buffer
--            l_errl = deviceRead(iv_target,&io_data[l_offset+1],l_vpdSize,
--                                DEVICE_MVPD_ADDRESS(i_record, i_keyword));
--        }
--        else
--        {
--            TRACFCOMP(g_trac_ipmi,"procIpmiFruInv::addVpdData - "
--                      " No size returned for MVPD keyword");
--        }
--    } while(0);
--
--    if (l_errl)
--    {
--        TRACFCOMP(g_trac_ipmi, "addVpdData - Error acquiring data from Vpd.");
--    }
--
-+    l_errl = addCommonVpdData(iv_target,
-+                              io_data,
-+                              DeviceFW::MVPD,
-+                              i_record,
-+                              i_keyword,
-+                              i_ascii,
-+                              i_typeLengthByte);
-     return l_errl;
- }
- 
-@@ -699,8 +671,7 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-         preFormatProcessing(io_data, false);
-         //Set Chassis Enclosure Type - Not Ascii
-         // Also, do not include type/length byte
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::ET, false, false);
-+        l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::ET, false, false);
- 
-         //Support Legacy VPD without OSYS record
-         if (l_errl)
-@@ -714,12 +685,10 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-             //Set default chassis type
-             io_data.push_back(IPMIFRUINV::DEFAULT_CHASSIS_TYPE);
-             //Set chassis part number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
-+            l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VP, true);
-             if (l_errl) { break; }
-             //Set chassis serial number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
-+            l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VS, true);
-             if (l_errl) { break; }
-         }
-         else
-@@ -728,13 +697,11 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-                       " Using NEW OSYS RECORD FOR Chassis VPD Data");
- 
-             //Set chassis part number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::MM, true);
-+            l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::MM, true);
-             if (l_errl) { break; }
- 
-             //Set chassis serial number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::SS, true);
-+            l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::SS, true);
-             if (l_errl) { break; }
- 
-         }
-@@ -743,10 +710,11 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-         io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Complete record data formatting
--        postFormatProcessing(io_data);
-     } while (0);
- 
-+    //Complete record data formatting
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::buildChassisInfoArea - "
-@@ -771,67 +739,39 @@ errlHndl_t backplaneIpmiFruInv::buildBoardInfoArea(
-         io_data.push_back(0);
- 
-         //Set Vendor Name - ascii formatted data
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VN, true);
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VN, true);
-         if (l_errl) { break; }
- 
-         //Set Product Name - ascii formatted data
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::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);
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::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; }
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VP, true);
- 
-         //Push Fru File ID Byte - NULL
-         io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
- 
--        bool l_setCustomData = false;
--        // Check if we should add ECID
--        for (TARGETING::TargetHandleList::const_iterator extraTargets_it =
--                iv_extraTargets.begin();
--                extraTargets_it != iv_extraTargets.end();
--                ++extraTargets_it
--            )
-+        //Only set the ECID Data during an update scenario
-+        if (iv_isUpdate == true)
-         {
--            TARGETING::TargetHandle_t l_extraTarget = *extraTargets_it;
--
--            //Only set the ECID Data during an update scenario
--            if (iv_isUpdate == true &&
--                (l_extraTarget->getAttr<TARGETING::ATTR_TYPE>() ==
--                                                        TARGETING::TYPE_MEMBUF))
--            {
--                TARGETING::ATTR_ECID_type ecidInfo;
--                bool getEcid =
--                      l_extraTarget->tryGetAttr<TARGETING::ATTR_ECID>(ecidInfo);
--                if (getEcid)
--                {
--                    l_setCustomData = true;
--                    addEcidData(l_extraTarget, ecidInfo, io_data);
--                }
--            }
-+            customEcidData (iv_extraTargets, io_data);
-         }
- 
--        //If no Custom data was sent, an Empty Byte is needed
--        if (!l_setCustomData)
--        {
--            io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
--        }
-         //Indicate End of Custom Fields
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Complete record data formatting
--        postFormatProcessing(io_data);
--
-     } while (0);
- 
-+    //Complete record data formatting
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::buildBoardInfoArea - "
-@@ -860,74 +800,17 @@ errlHndl_t backplaneIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
-                                      uint8_t i_keyword,
-                                      bool i_ascii,
-                                      bool i_typeLengthByte)
-+
- {
--    size_t     l_vpdSize = 0;
-     errlHndl_t l_errl = NULL;
- 
--    do {
--        //First get size of data with NULL parameter
--        l_errl = deviceRead(iv_target,
--                                      NULL,
--                                      l_vpdSize,
--                                      //@fixme RTC Story 118373
--                                      DEVICE_CVPD_ADDRESS(i_record, i_keyword));
--
--        if (l_errl)
--        {
--            TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::addVpdData - Error "
--                      "while reading CVPD keyword size");
--            break;
--        }
--
--        //Assert if vpd field is too large to fit in IPMI fru inventory format
--        assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
--
--        if (l_vpdSize > 0)
--        {
--            uint8_t l_offset = 0;
--            //Add on the typelength byte if requested
--            if (i_typeLengthByte)
--            {
--                //Determine how big data is and expand it to handle the soon to
--                //be read VPD data
--                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 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;
--            }
--            else
--            {
--                //Determine how big data is and expand it to handle the soon to
--                //be read VPD data
--                l_offset = io_data.size();
--                io_data.resize(l_offset + l_vpdSize);
--            }
--            //Read the VPD data directly into fru inventory data buffer
--            l_errl = deviceRead(iv_target,&io_data[l_offset],l_vpdSize,
--                                     DEVICE_CVPD_ADDRESS(i_record, i_keyword));
--        }
--        else
--        {
--            TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::addVpdData - "
--                      " No size returned for CVPD keyword");
--        }
--    } while(0);
--
--    if (l_errl)
--    {
--        TRACFCOMP(g_trac_ipmi, "backplaneIpmiFruInv::addVpdData - Error "
--                  "acquiring data from Vpd.");
--    }
-+    l_errl = addCommonVpdData(iv_target,
-+                              io_data,
-+                              DeviceFW::PVPD,
-+                              i_record,
-+                              i_keyword,
-+                              i_ascii,
-+                              i_typeLengthByte);
- 
-     return l_errl;
- }
-@@ -1106,11 +989,11 @@ errlHndl_t systemFwIpmiFruInv::buildProductInfoArea(std::vector<uint8_t>
- 
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Finalize section formatting
--        postFormatProcessing(io_data);
--
-     } while(0);
- 
-+    //Finalize section formatting
-+    postFormatProcessing(io_data);
-+
-     return l_errl;
- }
- 
-@@ -1121,7 +1004,155 @@ errlHndl_t systemFwIpmiFruInv::buildMultiRecordInfoArea(std::vector<uint8_t>
-     return IpmiFruInv::buildEmptyArea(io_data);
- }
- 
-+//##############################################################################
-+membufIpmiFruInv::membufIpmiFruInv( TARGETING::TargetHandle_t i_target,
-+                                     TARGETING::TargetHandleList i_extraTargets,
-+                                     bool i_isUpdate)
-+    :IpmiFruInv(i_target),
-+    iv_isUpdate(i_isUpdate),
-+    iv_extraTargets(i_extraTargets)
-+{
-+};
-+
-+errlHndl_t membufIpmiFruInv::buildInternalUseArea(
-+                                                 std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildChassisInfoArea(
-+                                                  std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildBoardInfoArea(
-+                                              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);
-+
-+        //Set MFG Date/Time - Blank
-+        io_data.push_back(0);
-+        io_data.push_back(0);
-+        io_data.push_back(0);
-+
-+        //Set Vendor Name - ascii formatted data
-+        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VN, true);
-+        if (l_errl) { break; }
-+
-+        //Set Product Name - ascii formatted data
-+        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
-+        if (l_errl) { break; }
-+
-+        //Set Product Serial number - ascii formatted data
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
-+        if (l_errl) { break; }
-+
-+        //Set Product Part number - ascii formatted data
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        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);
-+
-+        //Only set the ECID Data during an update scenario
-+        if (iv_isUpdate == true)
-+        {
-+            customEcidData (iv_extraTargets, io_data);
-+        }
-+
-+        //Indicate End of Custom Fields
-+        io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
-+
-+    } while (0);
-+
-+    //Complete record data formatting
-+    postFormatProcessing(io_data);
-+
-+    if (l_errl)
-+    {
-+        TRACFCOMP(g_trac_ipmi,"membufIpmiFruInv::buildBoardInfoArea - "
-+                  "Errors collecting board info data");
-+    }
-+
-+    return l_errl;
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildProductInfoArea(
-+                                                  std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildMultiRecordInfoArea(
-+                                                  std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
-+                                     uint8_t i_record,
-+                                     uint8_t i_keyword,
-+                                     bool i_ascii,
-+                                     bool i_typeLengthByte)
-+{
-+    errlHndl_t l_errl = NULL;
-+
-+    l_errl = addCommonVpdData(iv_target,
-+                              io_data,
-+                              DeviceFW::CVPD,
-+                              i_record,
-+                              i_keyword,
-+                              i_ascii,
-+                              i_typeLengthByte);
-+    return l_errl;
-+}
-+//##############################################################################
-+void IpmiFruInv::customEcidData(TARGETING::TargetHandleList i_extraTargets,
-+                     std::vector<uint8_t> &io_data)
-+{
-+
-+    bool l_setCustomData = false;
-+    // Check if we should add ECID
-+    for (TARGETING::TargetHandleList::const_iterator extraTargets_it =
-+                i_extraTargets.begin();
-+                extraTargets_it != i_extraTargets.end();
-+                ++extraTargets_it
-+            )
-+    {
-+        TARGETING::TargetHandle_t l_extraTarget = *extraTargets_it;
-+
-+        //Only set the ECID Data during an update scenario
-+        if ( l_extraTarget->getAttr<TARGETING::ATTR_TYPE>() ==
-+                                                        TARGETING::TYPE_MEMBUF)
-+        {
-+            TARGETING::ATTR_ECID_type ecidInfo;
-+            bool getEcid =
-+                      l_extraTarget->tryGetAttr<TARGETING::ATTR_ECID>(ecidInfo);
-+            if (getEcid)
-+            {
-+                l_setCustomData = true;
-+                addEcidData(l_extraTarget, ecidInfo, io_data);
-+            }
-+        }
-+    }
- 
-+    //If no Custom data was sent, an Empty Byte is needed
-+    if (!l_setCustomData)
-+    {
-+        io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-+    }
-+}
- 
- void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
-                              const TARGETING::ATTR_ECID_type& i_ecidInfo,
-@@ -1149,6 +1180,94 @@ void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
-     return;
- }
- 
-+errlHndl_t IpmiFruInv::addCommonVpdData(
-+                                     const TARGETING::TargetHandle_t& i_target,
-+                                     std::vector<uint8_t> &io_data,
-+                                     DeviceFW::AccessType i_accessType,
-+                                     uint8_t i_record,
-+                                     uint8_t i_keyword,
-+                                     bool i_ascii,
-+                                     bool i_typeLengthByte)
-+{
-+    size_t     l_vpdSize = 0;
-+    errlHndl_t l_errl = NULL;
-+
-+    do {
-+        // First get size with NULL call:
-+        // Bypass DEVICE_?VPD_ADDRESS inorder to maximize common code
-+        l_errl = deviceRead(i_target,
-+                            NULL,
-+                            l_vpdSize,
-+                            i_accessType,
-+                            i_record,
-+                            i_keyword,
-+                            VPD::AUTOSELECT);
-+
-+        if (l_errl)
-+        {
-+            TRACFCOMP(g_trac_ipmi,"addCommonVpdData - Error "
-+                      "while reading keyword size");
-+            break;
-+        }
-+
-+        //Assert if vpd field is too large to fit in IPMI fru inventory format
-+        assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
-+
-+        if (l_vpdSize > 0)
-+        {
-+            uint8_t l_offset = 0;
-+            //Add on the typelength byte if requested
-+            if (i_typeLengthByte)
-+            {
-+                //Determine how big data is and expand it to handle the soon to
-+                //be read VPD data
-+                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 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;
-+            }
-+            else
-+            {
-+                //Determine how big data is and expand it to handle the soon to
-+                //be read VPD data
-+                l_offset = io_data.size();
-+                io_data.resize(l_offset + l_vpdSize);
-+            }
-+            //Read the VPD data directly into fru inventory data buffer
-+            l_errl = deviceRead(i_target,
-+                            &io_data[l_offset],
-+                            l_vpdSize,
-+                            i_accessType,
-+                            i_record,
-+                            i_keyword,
-+                            VPD::AUTOSELECT);
-+        }
-+        else
-+        {
-+            TRACFCOMP(g_trac_ipmi,"addCommonVpdData - "
-+                      " No size returned for keyword");
-+        }
-+    } while(0);
-+
-+    if (l_errl)
-+    {
-+        TRACFCOMP(g_trac_ipmi, "addCommonVpdData - Error "
-+                  "acquiring data from Vpd.");
-+    }
-+
-+    return l_errl;
-+}
-+
- void IPMIFRUINV::clearData(uint8_t i_fruId)
- {
-     uint8_t l_clearData[] =
-@@ -1292,10 +1411,12 @@ void IPMIFRUINV::gatherClearData(const TARGETING::Target* i_pSys,
-                                     std::map<uint8_t,bool>& io_frusToClear)
- {
-     TARGETING::PredicateCTM predChip(TARGETING::CLASS_CHIP);
-+    TARGETING::PredicateCTM predNode(TARGETING::CLASS_ENC,
-+                                     TARGETING::TYPE_NODE);
-     TARGETING::PredicateCTM predDimm(TARGETING::CLASS_LOGICAL_CARD,
-                                          TARGETING::TYPE_DIMM);
-     TARGETING::PredicatePostfixExpr checkAllExpr;
--    checkAllExpr.push(&predChip).push(&predDimm).Or();
-+    checkAllExpr.push(&predChip).push(&predNode).Or().push(&predDimm).Or();
-     TARGETING::TargetHandleList l_allPossibleFrus;
-     TARGETING::targetService().getAssociated( l_allPossibleFrus, i_pSys,
-     TARGETING::TargetService::CHILD, TARGETING::TargetService::ALL,
-@@ -1336,14 +1457,19 @@ void IPMIFRUINV::gatherSetData(const TARGETING::Target* i_pSys,
-     //                    may be needed
-     l_present.present(true);
- 
-+    checkExpr.push(&predChip);
-+    TARGETING::PredicateCTM predNode(TARGETING::CLASS_ENC,
-+                                     TARGETING::TYPE_NODE);
-+    checkExpr.push(&predNode).Or();
-+
-     //When updating data on a later pass ignore dimms
-     if (i_updateData)
-     {
--        checkExpr.push(&predChip).push(&l_present).And();
-+        checkExpr.push(&l_present).And();
-     }
-     else
-     {
--        checkExpr.push(&predChip).push(&predDimm).Or().push(&l_present).And();
-+        checkExpr.push(&predDimm).Or().push(&l_present).And();
-     }
- 
-     TARGETING::TargetHandleList pCheckPres;
-@@ -1374,6 +1500,10 @@ void IPMIFRUINV::gatherSetData(const TARGETING::Target* i_pSys,
-     }
- 
-     //Sort the vector by FRU_ID for later use.
-+    //When the planar eeprom is shared for planar and memory buffer vpd, the
-+    //node and membuffs will have the same FRU ID. For this case, sort the Node
-+    //to be ahead of the mem buffs. The mem buffs will be extra targets for
-+    //their ECIDs.
-     std::sort(io_potentialFrus.begin(),
-               io_potentialFrus.end(),
-               comparePairs);
-diff --git a/src/usr/ipmi/ipmifruinvprvt.H b/src/usr/ipmi/ipmifruinvprvt.H
-index 468a47f..57d6e13 100644
---- a/src/usr/ipmi/ipmifruinvprvt.H
-+++ b/src/usr/ipmi/ipmifruinvprvt.H
-@@ -186,6 +186,32 @@ class IpmiFruInv
-                      const TARGETING::ATTR_ECID_type& i_ecidInfo,
-                      std::vector<uint8_t> &io_data);
- 
-+    /**
-+      * @brief Adds Ecid attribute data from extra targets as custom data
-+      * @param[in] TargetHandleList, Handle to list of extra
-+      *             targets associated with this FRU Record
-+      * @param[in/out] data, The container to put ECID attribute data in
-+      */
-+    void customEcidData(TARGETING::TargetHandleList i_extraTargets,
-+                     std::vector<uint8_t> &io_data);
-+
-+    /**
-+     * @brief Retrieve vpd record keyword and add to IPMI Fru Inventory record
-+     * @param[in/out] data, The container with record data
-+     * @param[in] access, Indicates vpd module to access (MVPD,PVPD,CPVD)
-+     * @param[in] record,  Indicates major offset in the VPD to get more data
-+     * @param[in] keyword, Indicates minor offset in the VPD to get more data
-+     * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     */
-+    errlHndl_t addCommonVpdData(
-+                          const TARGETING::TargetHandle_t& i_target,
-+                          std::vector<uint8_t> &io_data,
-+                          DeviceFW::AccessType i_accessType,
-+                          uint8_t i_record,
-+                          uint8_t i_keyword,
-+                          bool i_ascii,
-+                          bool i_typeLengthByte);
-+
-   private:
- 
-     /**
-@@ -376,11 +402,13 @@ class procIpmiFruInv : public IpmiFruInv
-      * @param[in] record,  Indicates major offset in the VPD to get more data
-      * @param[in] keyword, Indicates minor offset in the VPD to get more data
-      * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     * @param[in] typeLengthBtye, Indicates whether type length to be added.
-      */
-     errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
-                           uint8_t i_record,
-                           uint8_t i_keyword,
--                          bool i_ascii=false);
-+                          bool i_ascii=false,
-+                          bool i_typeLengthByte=true);
- 
- };
- 
-@@ -453,13 +481,13 @@ class backplaneIpmiFruInv : public IpmiFruInv
-      * @param[in] record,  Indicates major offset in the VPD to get more data
-      * @param[in] keyword, Indicates minor offset in the VPD to get more data
-      * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     * @param[in] typeLengthBtye, Indicates whether type length to be added.
-      */
-     errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
-                           uint8_t i_record,
-                           uint8_t i_keyword,
-                           bool i_ascii=false,
-                           bool i_typeLengthByte=true);
--
- };
- 
- //Child class for building up System Firwmare Fru Inventory Record Data
-@@ -507,4 +535,84 @@ class systemFwIpmiFruInv : public IpmiFruInv
- 
- };
- 
-+//Child class for building up membuf Fru Inventory Record Data. For example,
-+//for a memory riser card Fru.
-+class membufIpmiFruInv : public IpmiFruInv
-+{
-+
-+  public:
-+
-+     /**
-+     * @brief Constructor
-+     *
-+     * @param[in] TargetHandle_t, Handle to target for which
-+     *             to get relevant IPMI FRU Data from
-+     * @param[in] TargetHandleList, Handle to list of extra
-+     *             targets associated with this FRU Record
-+     * @param[in] isUpdate, Indicator if the code is updating
-+     *             existing data, or setting base data.
-+     */
-+    membufIpmiFruInv( TARGETING::TargetHandle_t i_target,
-+                         TARGETING::TargetHandleList i_extraTargets,
-+                         bool i_isUpdate );
-+
-+    /**
-+     * @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);
-+
-+  protected:
-+    //Indicator if a data update is happening.
-+    //True - means we are solely updating certain data
-+    //False - means we are doing the initial 'base' data set
-+    bool iv_isUpdate;
-+
-+    //The list of Extra Targets if multiple targets are
-+    //associated with one FRU_ID
-+    TARGETING::TargetHandleList iv_extraTargets;
-+
-+  private:
-+
-+    /**
-+     * @brief Adds the specified VPD data to the data to build up a given
-+     *        IPMI Fru Inventory record
-+     * @param[in/out] data, The container with record data
-+     * @param[in] record,  Indicates major offset in the VPD to get more data
-+     * @param[in] keyword, Indicates minor offset in the VPD to get more data
-+     * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     * @param[in] typeLengthBtye, Indicates whether type length to be added.
-+     */
-+    errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
-+                          uint8_t i_record,
-+                          uint8_t i_keyword,
-+                          bool i_ascii=false,
-+                          bool i_typeLengthByte=true);
-+
-+};
-+
- #endif
-diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
-index 82ec014..759b73e 100644
---- a/src/usr/targeting/common/xmltohb/target_types.xml
-+++ b/src/usr/targeting/common/xmltohb/target_types.xml
-@@ -913,6 +913,8 @@
-     <attribute><id>FRU_ID</id></attribute>
-     <attribute><id>TPM_PRIMARY_INFO</id></attribute>
-     <attribute><id>TPM_BACKUP_INFO</id></attribute>
-+    <attribute><id>EEPROM_VPD_PRIMARY_INFO</id></attribute>
-+    <attribute><id>VPD_REC_NUM</id></attribute>
- </targetType>
- 
- <targetType>
-diff --git a/src/usr/targeting/common/xmltohb/target_types_hb.xml b/src/usr/targeting/common/xmltohb/target_types_hb.xml
-index b0429da..d023f50 100644
---- a/src/usr/targeting/common/xmltohb/target_types_hb.xml
-+++ b/src/usr/targeting/common/xmltohb/target_types_hb.xml
-@@ -180,6 +180,11 @@
- </targetTypeExtension>
- 
- <targetTypeExtension>
-+    <id>enc-node-power8</id>
-+    <attribute><id>VPD_SWITCHES</id></attribute>
-+</targetTypeExtension>
-+
-+<targetTypeExtension>
-     <id>lcard-dimm</id>
-     <attribute><id>VPD_SWITCHES</id></attribute>
-     <attribute><id>IPMI_SENSORS</id></attribute>
-diff --git a/src/usr/vpd/HBconfig b/src/usr/vpd/HBconfig
-index 1361834..1d6e6f1 100644
---- a/src/usr/vpd/HBconfig
-+++ b/src/usr/vpd/HBconfig
-@@ -33,6 +33,28 @@ config CVPD_WRITE
-     help
-         Ensure at least one of the CVPD WRITEs are enabled
- 
-+config PVPD_READ_FROM_PNOR
-+    default n
-+    help
-+        Read Planar VPD data from PNOR cache
-+
-+config PVPD_READ_FROM_HW
-+    default n
-+    help
-+        Read Planar VPD data from HW resources
-+
-+config PVPD_WRITE_TO_PNOR
-+    default y if PVPD_READ_FROM_PNOR
-+    depends on PVPD_READ_FROM_PNOR
-+    help
-+        Write Planar VPD data to PNOR cache
-+
-+config PVPD_WRITE_TO_HW
-+    default y if PVPD_READ_FROM_HW
-+    depends on PVPD_READ_FROM_HW
-+    help
-+        Write Planar VPD data to HW resources
-+
- config MVPD_READ_FROM_PNOR
-     default y
-     help
-@@ -105,6 +127,11 @@ config HAVE_MBVPD
-     help
-         Have MemBuff/Centaur VPD, PNOR or HW
- 
-+config HAVE_PVPD
-+    default y if PVPD_READ_FROM_PNOR || PVPD_READ_FROM_HW
-+    help
-+        Have Planar VPD, PNOR or HW
-+
- config PALMETTO_PASS1
-     default n
-     help
-diff --git a/src/usr/vpd/cvpd.C b/src/usr/vpd/cvpd.C
-index 50815f1..fa37dc9 100644
---- a/src/usr/vpd/cvpd.C
-+++ b/src/usr/vpd/cvpd.C
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2013,2014                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
- /* [+] Google Inc.                                                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
-@@ -31,7 +31,10 @@
- #include <trace/interface.H>
- #include <errl/errlentry.H>
- #include <errl/errlmanager.H>
-+#include <targeting/common/commontargeting.H>
- #include <targeting/common/targetservice.H>
-+#include <targeting/common/util.H>
-+#include <targeting/common/utilFilter.H>
- #include <devicefw/driverif.H>
- #include <vfs/vfs.H>
- #include <vpd/vpdreasoncodes.H>
-@@ -40,6 +43,7 @@
- #include <i2c/eepromif.H>
- #include <config.h>
- #include "cvpd.H"
-+#include "pvpd.H"
- #include "vpd.H"
- 
- // ----------------------------------------------
-@@ -233,15 +237,41 @@ IpVpdFacade(CVPD::SECTION_SIZE,
-     iv_configInfo.vpdReadHW = true;
- #else
-     iv_configInfo.vpdReadHW = false;
--#endif    
-+#endif
- #ifdef CONFIG_CVPD_WRITE_TO_PNOR
-     iv_configInfo.vpdWritePNOR = true;
- #else
-     iv_configInfo.vpdWritePNOR = false;
--#endif    
-+#endif
- #ifdef CONFIG_CVPD_WRITE_TO_HW
-     iv_configInfo.vpdWriteHW = true;
- #else
-     iv_configInfo.vpdWriteHW = false;
- #endif
- }
-+
-+// Retrun lists of records that should be copied to pnor.
-+void CvpdFacade::getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize)
-+{
-+    // Always return this object's list
-+    o_primaryVpdRecords = iv_vpdRecords;
-+    o_primaryRecSize = iv_recSize;
-+
-+    // If the planar errprom  being shared with a mem buf,
-+    // then return the pvpd list as the alternative record list.
-+    // At thip point, if the membufs are be processed, then the node
-+    // might not have been discovered yet. If pvpd is being cached, then
-+    // include the pvpd list as the altnative.
-+#ifdef CONFIG_PVPD_READ_FROM_PNOR
-+    o_altVpdRecords = Singleton<PvpdFacade>::instance().iv_vpdRecords;
-+    o_altRecSize = Singleton<PvpdFacade>::instance().iv_recSize;
-+#else
-+    o_altVpdRecords = NULL;
-+    o_altRecSize = 0;
-+#endif
-+}
-+
-diff --git a/src/usr/vpd/cvpd.H b/src/usr/vpd/cvpd.H
-index e7a2d9f..9c729c3 100644
---- a/src/usr/vpd/cvpd.H
-+++ b/src/usr/vpd/cvpd.H
-@@ -79,7 +79,6 @@ namespace CVPD
-         { OPFR, "OPFR" },
-         { VNDR, "VNDR" },
-         { SPDX, "SPDX" },
--        { OSYS, "OSYS" },
-         // -------------------------------------------------------------------
-         // DO NOT USE!!  This is for test purposes ONLY!
-         { CVPD_TEST_RECORD, "TEST" },
-@@ -182,5 +181,26 @@ class CvpdFacade: public IpVpdFacade
-      */
-     CvpdFacade( );
- 
-+  private:
-+
-+    /**
-+     * @brief This function returns a primary and an alternate list of records
-+     *       that should be copied to pnor. The Alternate list is optional.
-+     *
-+     * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_primaryRecSize -    Size of o_primaryVpdRecords array
-+     *
-+     * @param[out] o_altVpdRecords -     Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_altRecSize -        Size of o_altVpdRecords array
-+     *
-+     */
-+    void getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize);
-+
- };
- #endif  // __CVPD_H
-diff --git a/src/usr/vpd/ipvpd.C b/src/usr/vpd/ipvpd.C
-index 3da20b2..e148bc9 100644
---- a/src/usr/vpd/ipvpd.C
-+++ b/src/usr/vpd/ipvpd.C
-@@ -43,6 +43,7 @@
- #include <vpd/ipvpdenums.H>
- 
- #include "vpd.H"
-+#include "cvpd.H"
- #include "ipvpd.H"
- #include "errlud_vpd.H"
- 
-@@ -1336,6 +1337,19 @@ IpVpdFacade::getRecordListSeeprom ( std::list<TocPtRecord> & o_recList,
-         return err;
-     }
- 
-+    // Get the list of records that should be copied to pnor.
-+    // The list of records for this vpd sub class will be the primary list.
-+    // If the eeprom is being shared, then their might be an alternate list
-+    // to also include.
-+    const  recordInfo* l_primaryVpdRecords = NULL;
-+    uint64_t           l_primaryRecSize = 0;
-+    const  recordInfo* l_altVpdRecords = NULL;
-+    uint64_t           l_altRecSize = 0;
-+    getRecordLists(l_primaryVpdRecords,
-+                   l_primaryRecSize,
-+                   l_altVpdRecords,
-+                   l_altRecSize);
-+
-     offset = le16toh( toc_rec->record_offset ) + 1;  // skip 'large resource'
- 
-     // Read the PT keyword(s) from the VTOC
-@@ -1367,20 +1381,36 @@ IpVpdFacade::getRecordListSeeprom ( std::list<TocPtRecord> & o_recList,
-               vtoc_pt_offset < pt_len;
-               vtoc_pt_offset += sizeof(TocPtRecord) )
-         {
-+            bool l_found = false;
-             toc_rec =
-                 reinterpret_cast<TocPtRecord*>(l_buffer + vtoc_pt_offset);
- 
-             // Save record if on the list for this target
--            for ( uint32_t rec = 0; rec < iv_recSize; rec++ )
-+            for ( uint32_t rec = 0; rec < l_primaryRecSize; rec++ )
-             {
-                 if ( memcmp( toc_rec->record_name,
--                            iv_vpdRecords[rec].recordName,
-+                            l_primaryVpdRecords[rec].recordName,
-                             RECORD_BYTE_SIZE ) == 0 )
-                 {
-                     o_recList.push_back(*toc_rec);
-+                    l_found = true;
-                     break;
-                 }
-             }
-+            // if not found, check the alternate list
-+            if (!l_found)
-+            {
-+                for ( uint32_t rec = 0; rec < l_altRecSize; rec++ )
-+                {
-+                    if ( memcmp( toc_rec->record_name,
-+                            l_altVpdRecords[rec].recordName,
-+                            RECORD_BYTE_SIZE ) == 0 )
-+                    {
-+                        o_recList.push_back(*toc_rec);
-+                        break;
-+                    }
-+                }
-+            }
-         }
-     }
- 
-@@ -2182,3 +2212,19 @@ void IpVpdFacade::setConfigFlagsHW ( )
-         iv_configInfo.vpdWriteHW = true;
-     }
- }
-+
-+// Return the lists of records that should be copied to pnor.
-+// The default lists to use are this object's record list and size.
-+// No Alternate.
-+void IpVpdFacade::getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize)
-+{
-+    o_primaryVpdRecords = iv_vpdRecords;
-+    o_primaryRecSize = iv_recSize;
-+    o_altVpdRecords = NULL;
-+    o_altRecSize = 0;
-+}
-+
-diff --git a/src/usr/vpd/ipvpd.H b/src/usr/vpd/ipvpd.H
-index 5cc7bec..e4c4162 100644
---- a/src/usr/vpd/ipvpd.H
-+++ b/src/usr/vpd/ipvpd.H
-@@ -677,7 +677,24 @@ class IpVpdFacade
-     errlHndl_t checkBufferSize( size_t i_bufferSize,
-                                 size_t i_expectedSize,
-                                 TARGETING::Target * i_target );
--
-+    /**
-+     * @brief This function returns a primary and an alternate list of records
-+     *       that should be copied to pnor. The Alternate list is optional.
-+     *
-+     * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_primaryRecSize -    Size of o_primaryVpdRecords array
-+     *
-+     * @param[out] o_altVpdRecords -     Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_altRecSize -        Size of o_altVpdRecords array
-+     *
-+     */
-+    virtual void getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize);
- 
-   protected: // Variables
- 
-@@ -693,6 +710,8 @@ class IpVpdFacade
-      */
-     uint64_t iv_vpdMaxSections;
- 
-+
-+  public: // Variables
-     /**
-      * @brief Pointer to array of VPD Record information
-      *
-@@ -705,6 +724,7 @@ class IpVpdFacade
-      */
-     uint64_t iv_recSize;
- 
-+  protected: // Variables
-     /**
-      * @brief Pointer to array of VPD Keyword information
-      *
-diff --git a/src/usr/vpd/pvpd.C b/src/usr/vpd/pvpd.C
-new file mode 100644
-index 0000000..ec62237
---- /dev/null
-+++ b/src/usr/vpd/pvpd.C
-@@ -0,0 +1,369 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/vpd/pvpd.C $                                          */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
-+/* [+] International Business Machines Corp.                              */
-+/*                                                                        */
-+/*                                                                        */
-+/* Licensed under the Apache License, Version 2.0 (the "License");        */
-+/* you may not use this file except in compliance with the License.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+// ----------------------------------------------
-+// Includes
-+// ----------------------------------------------
-+#include <string.h>
-+#include <endian.h>
-+#include <trace/interface.H>
-+#include <errl/errlentry.H>
-+#include <errl/errlmanager.H>
-+#include <targeting/common/targetservice.H>
-+#include <targeting/common/util.H>
-+#include <targeting/common/utilFilter.H>
-+#include <devicefw/driverif.H>
-+#include <vfs/vfs.H>
-+#include <vpd/vpdreasoncodes.H>
-+#include <vpd/pvpdenums.H>
-+#include <vpd/vpd_if.H>
-+#include <i2c/eepromif.H>
-+#include <config.h>
-+#include "pvpd.H"
-+#include "cvpd.H"
-+#include "vpd.H"
-+
-+// ----------------------------------------------
-+// Trace definitions
-+// ----------------------------------------------
-+extern trace_desc_t* g_trac_vpd;
-+
-+
-+// ------------------------
-+// Macros for unit testing
-+//#define TRACUCOMP(args...)  TRACFCOMP(args)
-+#define TRACUCOMP(args...)
-+//#define TRACSSCOMP(args...)  TRACFCOMP(args)
-+#define TRACSSCOMP(args...)
-+
-+namespace PVPD
-+{
-+    // ----------------------------------------------
-+    // Globals
-+    // ----------------------------------------------
-+    mutex_t g_mutex = MUTEX_INITIALIZER;
-+
-+
-+    /**
-+     * @brief This function will perform the steps required to do a read from
-+     *      the Hostboot PVPD data.
-+     *
-+     * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in
-+     *       driververif.H
-+     *
-+     * @param[in] i_target - Processor Target device
-+     *
-+     * @param [in/out] io_buffer - Pointer to the data that was read from
-+     *       the target device.  This parameter, when set to NULL, will return
-+     *       the keyword size value in io_buflen.
-+     *
-+     * @param [in/out] io_buflen - Length of the buffer to be read or written
-+     *       to/from the target.  This value should indicate the size of the
-+     *       io_buffer parameter that has been allocated.  Being returned it
-+     *       will indicate the number of valid bytes in the buffer being
-+     *       returned. This parameter will contain the size of a keyword when
-+     *       the io_buffer parameter is passed in NULL.
-+     *
-+     * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in
-+     *       usrif.H
-+     *
-+     * @param [in] i_args - This is an argument list for the device driver
-+     *       framework.
-+     *
-+     * @return errlHndl_t - NULL if successful, otherwise a pointer to the
-+     *       error log.
-+     */
-+    errlHndl_t pvpdRead ( DeviceFW::OperationType i_opType,
-+                          TARGETING::Target * i_target,
-+                          void * io_buffer,
-+                          size_t & io_buflen,
-+                          int64_t i_accessType,
-+                          va_list i_args )
-+    {
-+        errlHndl_t err = NULL;
-+        IpVpdFacade::input_args_t args;
-+        args.record = ((pvpdRecord)va_arg( i_args, uint64_t ));
-+        args.keyword = ((pvpdKeyword)va_arg( i_args, uint64_t ));
-+        args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t ));
-+
-+        TRACSSCOMP( g_trac_vpd,
-+                    ENTER_MRK"pvpdRead()" );
-+
-+        err = Singleton<PvpdFacade>::instance().read(i_target,
-+                                                     io_buffer,
-+                                                     io_buflen,
-+                                                     args);
-+
-+        return err;
-+    }
-+
-+
-+    /**
-+     * @brief This function will perform the steps required to do a write to
-+     *      the Hostboot PVPD data.
-+     *
-+     * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in
-+     *       driververif.H
-+     *
-+     * @param[in] i_target - Processor Target device
-+     *
-+     * @param [in/out] io_buffer - Pointer to the data that was read from
-+     *       the target device.  It will also be used to contain data to
-+     *       be written to the device.
-+     *
-+     * @param [in/out] io_buflen - Length of the buffer to be read or written
-+     *       to/from the target.  This value should indicate the size of the
-+     *       io_buffer parameter that has been allocated.  Being returned it
-+     *       will indicate the number of valid bytes in the buffer being
-+     *       returned.
-+     *
-+     * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in
-+     *       usrif.H
-+     *
-+     * @param [in] i_args - This is an argument list for the device driver
-+     *       framework.
-+     *
-+     * @return errlHndl_t - NULL if successful, otherwise a pointer to the
-+     *       error log.
-+     */
-+    errlHndl_t pvpdWrite ( DeviceFW::OperationType i_opType,
-+                           TARGETING::Target * i_target,
-+                           void * io_buffer,
-+                           size_t & io_buflen,
-+                           int64_t i_accessType,
-+                           va_list i_args )
-+    {
-+        errlHndl_t err = NULL;
-+        IpVpdFacade::input_args_t args;
-+        args.record = ((pvpdRecord)va_arg( i_args, uint64_t ));
-+        args.keyword = ((pvpdKeyword)va_arg( i_args, uint64_t ));
-+        args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t ));
-+
-+        TRACSSCOMP( g_trac_vpd,
-+                    ENTER_MRK"pvpdWrite()" );
-+
-+
-+        err = Singleton<PvpdFacade>::instance().write(i_target,
-+                                                      io_buffer,
-+                                                      io_buflen,
-+                                                      args);
-+
-+        return err;
-+    }
-+
-+    // Register with the routing code
-+    DEVICE_REGISTER_ROUTE( DeviceFW::READ,
-+                           DeviceFW::PVPD,
-+                           TARGETING::TYPE_NODE,
-+                           pvpdRead );
-+    DEVICE_REGISTER_ROUTE( DeviceFW::WRITE,
-+                           DeviceFW::PVPD,
-+                           TARGETING::TYPE_NODE,
-+                           pvpdWrite );
-+
-+}; // end namespace PVPD
-+
-+#if !defined(__HOSTBOOT_RUNTIME)
-+// --------------------------------------------------------
-+// Presence Detection
-+//---------------------------------------------------------
-+
-+/**
-+ * @brief Performs a presence detect operation on a Node card.
-+ *
-+ * There is no FSI presence detection, just Planar vpd detection.
-+ * Presence is always returned as Success (unless the unlikely case of too
-+ * small of a buffer passed). A problem with planar EEPROM is logged but
-+ * not passed up so that the enclosure and everything inside is not
-+ * deconfigured.
-+ *
-+ * @param[in]   i_opType        Operation type, see DeviceFW::OperationType
-+ *                              in driverif.H
-+ * @param[in]   i_target        Presence detect target
-+ * @param[in/out] io_buffer     Read: Pointer to output data storage
-+ *                              Write: Pointer to input data storage
-+ * @param[in/out] io_buflen     Input: size of io_buffer (in bytes, always 1)
-+ *                              Output: Success = 1, Failure = 0
-+ * @param[in]   i_accessType    DeviceFW::AccessType enum (userif.H)
-+ * @param[in]   i_args          This is an argument list for DD framework.
-+ *                              In this function, there are no arguments.
-+ * @return  errlHndl_t
-+ */
-+errlHndl_t nodePresenceDetect(DeviceFW::OperationType i_opType,
-+                              TARGETING::Target* i_target,
-+                              void* io_buffer,
-+                              size_t& io_buflen,
-+                              int64_t i_accessType,
-+                              va_list i_args)
-+{
-+    errlHndl_t l_errl = NULL;
-+    bool pvpd_present = true;
-+
-+    if (unlikely(io_buflen < sizeof(bool)))
-+    {
-+        TRACFCOMP(g_trac_vpd,
-+                  ERR_MRK "nodePresenceDetect> Invalid data length: %d",
-+                  io_buflen);
-+        /*@
-+         * @errortype
-+         * @moduleid     VPD::VPD_PVPD_PRESENCEDETECT
-+         * @reasoncode   VPD::VPD_INVALID_LENGTH
-+         * @userdata1    Data Length
-+         * @devdesc      presenceDetect> Invalid data length (!= 1 bytes)
-+         */
-+        l_errl =
-+                new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-+                                        VPD::VPD_PVPD_PRESENCEDETECT,
-+                                        VPD::VPD_INVALID_LENGTH,
-+                                        TO_UINT64(io_buflen),
-+                                        true /*SW error*/);
-+        io_buflen = 0;
-+        return l_errl;
-+    }
-+
-+#if defined(CONFIG_PVPD_READ_FROM_HW) && defined(CONFIG_PVPD_READ_FROM_PNOR)
-+    pvpd_present = VPD::pvpdPresent( i_target );
-+    if( pvpd_present )
-+    {
-+        // Check if the VPD data in the PNOR matches the SEEPROM
-+        l_errl = VPD::ensureCacheIsInSync( i_target );
-+        if( l_errl )
-+        {
-+            TRACFCOMP(g_trac_vpd,ERR_MRK "nodePresenceDetect>"
-+                    " Error during ensureCacheIsInSync (PVPD)" );
-+            errlCommit( l_errl, FSI_COMP_ID );
-+        }
-+    }
-+    else
-+    {
-+        TRACFCOMP(g_trac_vpd,
-+                  ERR_MRK "nodePresenceDetect> failed presence detect");
-+
-+        // Invalidate PVPD in the PNOR
-+        l_errl = VPD::invalidatePnorCache(i_target);
-+        if (l_errl)
-+        {
-+            TRACFCOMP( g_trac_vpd, "Error invalidating PVPD in PNOR" );
-+            errlCommit( l_errl, VPD_COMP_ID );
-+        }
-+        pvpd_present = true;
-+    }
-+#endif
-+
-+    // Always return presence.
-+    // A returned error deconfigures the node and stops the IPL.
-+    memcpy(io_buffer, &pvpd_present, sizeof(pvpd_present));
-+    io_buflen = sizeof(pvpd_present);
-+
-+    return NULL;
-+}
-+
-+// Register as the presence detect for nodes.
-+DEVICE_REGISTER_ROUTE(DeviceFW::READ,
-+                      DeviceFW::PRESENT,
-+                      TARGETING::TYPE_NODE,
-+                      nodePresenceDetect);
-+#endif
-+
-+bool VPD::pvpdPresent( TARGETING::Target * i_target )
-+{
-+    TRACSSCOMP( g_trac_vpd, ENTER_MRK"pvpdPresent()");
-+#if(defined( CONFIG_PVPD_READ_FROM_HW ) && !defined( __HOSTBOOT_RUNTIME) )
-+
-+    return EEPROM::eepromPresence( i_target );
-+
-+#else
-+    return Singleton<PvpdFacade>::instance().hasVpdPresent( i_target,
-+                                                            PVPD::OPFR,
-+                                                            PVPD::VP );
-+#endif
-+}
-+
-+
-+//PVPD Class Functions
-+/**
-+ * @brief  Constructor
-+ * Planar VPD is included in the Centaur PNOR section.
-+ * Including with Centaur vpd minimizes the number of PNOR sections.
-+ */
-+PvpdFacade::PvpdFacade() :
-+IpVpdFacade(CVPD::SECTION_SIZE, // note use of CVPD
-+            CVPD::MAX_SECTIONS, // note use of CVPD
-+            PVPD::pvpdRecords,
-+            (sizeof(PVPD::pvpdRecords)/sizeof(PVPD::pvpdRecords[0])),
-+            PVPD::pvpdKeywords,
-+            (sizeof(PVPD::pvpdKeywords)/sizeof(PVPD::pvpdKeywords[0])),
-+            PNOR::CENTAUR_VPD,  // note use of CVPD
-+            PVPD::g_mutex,
-+            VPD::VPD_WRITE_PLANAR)
-+{
-+    TRACUCOMP(g_trac_vpd, "PvpdFacade::PvpdFacade> " );
-+
-+#ifdef CONFIG_PVPD_READ_FROM_PNOR
-+    iv_configInfo.vpdReadPNOR = true;
-+#else
-+    iv_configInfo.vpdReadPNOR = false;
-+#endif
-+#ifdef CONFIG_PVPD_READ_FROM_HW
-+    iv_configInfo.vpdReadHW = true;
-+#else
-+    iv_configInfo.vpdReadHW = false;
-+#endif
-+#ifdef CONFIG_PVPD_WRITE_TO_PNOR
-+    iv_configInfo.vpdWritePNOR = true;
-+#else
-+    iv_configInfo.vpdWritePNOR = false;
-+#endif
-+#ifdef CONFIG_PVPD_WRITE_TO_HW
-+    iv_configInfo.vpdWriteHW = true;
-+#else
-+    iv_configInfo.vpdWriteHW = false;
-+#endif
-+}
-+
-+// Retrun lists of records that should be copied to pnor.
-+void PvpdFacade::getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize)
-+{
-+    // Always return this object's list
-+    o_primaryVpdRecords = iv_vpdRecords;
-+    o_primaryRecSize = iv_recSize;
-+
-+    // If the planar eeprom is being shared with a mem buf,
-+    // then return the cvpd list as the alternative record list.
-+    // At thip point, if the node is be processed, then the mem buffs
-+    // might have not been discovered yet. If cvpd is being cached, then
-+    // include the cvpd list as the altnative.
-+#ifdef CONFIG_CVPD_READ_FROM_PNOR
-+    o_altVpdRecords = Singleton<CvpdFacade>::instance().iv_vpdRecords;
-+    o_altRecSize = Singleton<CvpdFacade>::instance().iv_recSize;
-+#else
-+    o_altVpdRecords = NULL;
-+    o_altRecSize = 0;
-+#endif
-+}
-+
-diff --git a/src/usr/vpd/pvpd.H b/src/usr/vpd/pvpd.H
-new file mode 100644
-index 0000000..092dd45
---- /dev/null
-+++ b/src/usr/vpd/pvpd.H
-@@ -0,0 +1,149 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/vpd/pvpd.H $                                          */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
-+/* [+] International Business Machines Corp.                              */
-+/*                                                                        */
-+/*                                                                        */
-+/* Licensed under the Apache License, Version 2.0 (the "License");        */
-+/* you may not use this file except in compliance with the License.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+#ifndef __PVPD_H
-+#define __PVPD_H
-+
-+
-+/**
-+ * @file pvpd.H
-+ *
-+ * @brief Provides the interfaces for the PVPD device driver
-+ *
-+ */
-+
-+// ----------------------------------------------
-+// Includes
-+// ----------------------------------------------
-+#include <errl/errlentry.H>
-+#include <vpd/pvpdenums.H>
-+
-+#include "ipvpd.H"
-+#include <config.h>
-+
-+namespace PVPD
-+{
-+
-+    /**
-+     * @brief Conversion of PVPD Records to corresponding character
-+     *        representation.
-+     */
-+    const IpVpdFacade::recordInfo pvpdRecords[] =
-+    {
-+        // -------------------------------------------------------------------
-+        // NOTE: This list must remain an ordered list!  There will be a
-+        //      testcase that checks this.  When adding new entries to the
-+        //      list, be sure that the keyword in each entry (value 0)
-+        //      are in ascending order.
-+        // -------------------------------------------------------------------
-+        { VINI, "VINI" },
-+        { OSYS, "OSYS" },
-+        { OPFR, "OPFR" },
-+        { VNDR, "VNDR" },
-+        // -------------------------------------------------------------------
-+        // DO NOT USE!!  This is for test purposes ONLY!
-+        { PVPD_TEST_RECORD, "TEST" },
-+        // -------------------------------------------------------------------
-+    };
-+
-+    /**
-+     * @brief Conversion of PVPD Keywords to corresponding character
-+     *        representation.
-+     */
-+    const IpVpdFacade::keywordInfo pvpdKeywords[] =
-+    {
-+        // -------------------------------------------------------------------
-+        // NOTE: This list must remain an ordered list!  There will be a
-+        //      testcase that checks this.  When adding new entries to
-+        //      the list, be sure that the keyword in each entry (value 0)
-+        //      are in ascending order.
-+        // -------------------------------------------------------------------
-+        { pdI, "#I" },
-+        { B3,  "B3" },
-+        { B4,  "B4" },
-+        { B7,  "B7" },
-+        { CC,  "CC" },
-+        { CE,  "CE" },
-+        { CT,  "CT" },
-+        { DR,  "DR" },
-+        { ET,  "ET" },
-+        { FN,  "FN" },
-+        { HE,  "HE" },
-+        { HW,  "HW" },
-+        { IN,  "IN" },
-+        { MM,  "MM" },
-+        { PF,  "PF" },
-+        { PN,  "PN" },
-+        { RT,  "RT" },
-+        { SN,  "SN" },
-+        { SS,  "SS" },
-+        { VD,  "VD" },
-+        { VN,  "VN" },
-+        { VP,  "VP" },
-+        { VS,  "VS" },
-+        { VZ,  "VZ" },
-+
-+        // -------------------------------------------------------------------
-+        // DO NOT USE!!  This is for test purposes ONLY!
-+        { PVPD_TEST_KEYWORD, "XX" },
-+        // -------------------------------------------------------------------
-+
-+        //Common ipvpd
-+        { FULL_RECORD, "FL"},
-+    };
-+
-+}; // end PVPD namespace
-+
-+class PvpdFacade: public IpVpdFacade
-+{
-+  public:
-+
-+    /**
-+     * @brief Constructor
-+     */
-+    PvpdFacade( );
-+
-+  private:
-+
-+    /**
-+     * @brief This function returns a primary and an alternate list of records
-+     *       that should be copied to pnor. The Alternate list is optional.
-+     *
-+     * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_primaryRecSize -    Size of o_primaryVpdRecords array
-+     *
-+     * @param[out] o_altVpdRecords -     Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_altRecSize -        Size of o_altVpdRecords array
-+     *
-+     */
-+    void getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize);
-+
-+};
-+#endif  // __PVPD_H
-diff --git a/src/usr/vpd/vpd.C b/src/usr/vpd/vpd.C
-index 9b4e1f8..3656696 100755
---- a/src/usr/vpd/vpd.C
-+++ b/src/usr/vpd/vpd.C
-@@ -34,10 +34,9 @@
- #include "vpd.H"
- #include "mvpd.H"
- #include "cvpd.H"
-+#include "pvpd.H"
- #include "spd.H"
- 
--
--
- // ----------------------------------------------
- // Trace definitions
- // ----------------------------------------------
-@@ -456,6 +455,13 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-         l_keywordPN = CVPD::VP;
-         l_keywordSN = CVPD::VS;
-     }
-+    else if( l_type == TARGETING::TYPE_NODE )
-+    {
-+        l_ipvpd     = &(Singleton<PvpdFacade>::instance());
-+        l_record    = PVPD::OPFR;
-+        l_keywordPN = PVPD::VP;
-+        l_keywordSN = PVPD::VS;
-+    }
-     else if( l_type == TARGETING::TYPE_DIMM )
-     {
-         // SPD does not have a singleton instance
-@@ -487,7 +493,8 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-     do
-     {
-         // Make sure we are comparing the correct pn/sn for CVPD
--        if( l_type == TARGETING::TYPE_MEMBUF )
-+        if( ( l_type == TARGETING::TYPE_MEMBUF ) ||
-+            ( l_type == TARGETING::TYPE_NODE   ) )
-         {
-             bool l_zeroPN;
-             l_err = l_ipvpd->cmpSeepromToZero( i_target,
-@@ -523,6 +530,7 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-         // Compare the Part Numbers in PNOR/SEEPROM
-         bool l_matchPN = false;
-         if( ( l_type == TARGETING::TYPE_PROC   ) ||
-+            ( l_type == TARGETING::TYPE_NODE   ) ||
-             ( l_type == TARGETING::TYPE_MEMBUF ) )
-         {
-             l_err = l_ipvpd->cmpPnorToSeeprom( i_target,
-@@ -577,7 +585,8 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-             HWAS::markTargetChanged(i_target);
- 
-             // Load the PNOR data from the SEEPROM
--            if( ( l_type == TARGETING::TYPE_PROC   ) ||
-+            if( ( l_type == TARGETING::TYPE_PROC ) ||
-+                ( l_type == TARGETING::TYPE_NODE ) ||
-                 ( l_type == TARGETING::TYPE_MEMBUF ) )
-             {
-                 l_err = l_ipvpd->loadPnor( i_target );
-diff --git a/src/usr/vpd/vpd.H b/src/usr/vpd/vpd.H
-index 9c39a7f..e6cada7 100644
---- a/src/usr/vpd/vpd.H
-+++ b/src/usr/vpd/vpd.H
-@@ -50,6 +50,7 @@ enum VPD_MSG_TYPE
-     VPD_WRITE_DIMM    = 0x00C1, //< DIMM SPD
-     VPD_WRITE_PROC    = 0x00C2, //< Processor MVPD
-     VPD_WRITE_MEMBUF  = 0x00C3, //< Centaur FRU VPD
-+    VPD_WRITE_PLANAR  = 0x00C4, //< Planar VPD
- };
- 
- /**
-diff --git a/src/usr/vpd/vpd.mk b/src/usr/vpd/vpd.mk
-index 9f85755..65d22e3 100644
---- a/src/usr/vpd/vpd.mk
-+++ b/src/usr/vpd/vpd.mk
-@@ -5,7 +5,9 @@
- #
- # OpenPOWER HostBoot Project
- #
--# COPYRIGHT International Business Machines Corp. 2013,2014
-+# Contributors Listed Below - COPYRIGHT 2013,2015
-+# [+] International Business Machines Corp.
-+#
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
-@@ -24,5 +26,6 @@
- OBJS += ipvpd.o
- OBJS += mvpd.o
- OBJS += cvpd.o
-+OBJS += pvpd.o
- OBJS += spd.o
- OBJS += errlud_vpd.o
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch b/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch
deleted file mode 100644
index bbbc2ff..0000000
--- a/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 9d5d91597d325d63465a4f62a98bb5d8ff0f90a4 Mon Sep 17 00:00:00 2001
-From: Doug Gilbert <dgilbert@us.ibm.com>
-Date: Wed, 3 Jun 2015 14:06:09 -0500
-Subject: [PATCH] Support for OCC Centaur numbering
-
-Change-Id: I11f6641548dbb0a0f4f586f592fa0d357a6c9a84
-RTC: 127111
-Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/18179
-Tested-by: Jenkins Server
-Reviewed-by: Christopher Cain <cjcain@us.ibm.com>
-Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
-Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
----
- src/usr/htmgt/htmgt_cfgdata.C | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/usr/htmgt/htmgt_cfgdata.C b/src/usr/htmgt/htmgt_cfgdata.C
-index dcf1f9d..f4bcfd8 100644
---- a/src/usr/htmgt/htmgt_cfgdata.C
-+++ b/src/usr/htmgt/htmgt_cfgdata.C
-@@ -307,6 +307,8 @@ void getMemConfigMessageData(const TargetHandle_t i_occ,
- 
-             //Centaur #
-             centPos = (*centaur)->getAttr<ATTR_POSITION>();
-+            // ATTR_POSITION is system wide. Must be 0-7 on each OCC
-+            centPos = centPos % 8;
-             o_data[index++] = centPos;
- 
-             //Dimm # (0xFF since a centaur)
-@@ -425,6 +427,8 @@ void getMemThrottleMessageData(const TargetHandle_t i_occ,
-     for (centaur=centaurs.begin(); centaur!=centaurs.end(); ++centaur)
-     {
-         centPos = (*centaur)->getAttr<ATTR_POSITION>();
-+        // ATTR_POSITION is system wide. Must 0-7 on each OCC
-+        centPos = centPos % 8;
- 
-         mbas.clear();
-         getChildAffinityTargets(mbas, *centaur,
--- 
-2.3.0
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index 3b7bc6f..63e2123 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= c646754e720b5cd21534425ca90bb414a4a3ff12
+HOSTBOOT_VERSION ?= 17f94afce9979da7c750fd8022604dc0b43dcf4f
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0