Merge pull request #192 from jazurin/op_build_update_june18

opbuild hostboot package update June 2015
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