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