summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndres Lugo-Reyes <aalugore@us.ibm.com>2015-05-05 13:14:27 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2015-06-19 16:00:51 -0500
commitef69ea46b6208625307bd42b2cf29beef10c8418 (patch)
tree1256d14ea7950e28714553f5503be2530bd04e9d /src
parent4d1c59f09b6b0ab9236aa42694cb2e42cbe8d3eb (diff)
downloadtalos-hostboot-ef69ea46b6208625307bd42b2cf29beef10c8418.tar.gz
talos-hostboot-ef69ea46b6208625307bd42b2cf29beef10c8418.zip
Add serial numbers/part numbers to err logs w/ hwcallouts
Change-Id: Ifef77c71f40e70136cdb5172ce653f7a5ebfdd10 RTC:122890 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16870 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Reviewed-by: Brian H. Horton <brianh@linux.ibm.com> Reviewed-by: Corey V. Swenson <cswenson@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/errl/errlentry.H9
-rw-r--r--src/include/usr/vpd/vpd_if.H9
-rw-r--r--src/include/usr/vpd/vpdreasoncodes.H1
-rw-r--r--src/usr/errl/errlentry.C103
-rw-r--r--src/usr/errl/runtime/makefile2
-rw-r--r--src/usr/fsi/fsipres.C28
-rw-r--r--src/usr/targeting/common/xmltohb/attribute_types_hb.xml38
-rw-r--r--src/usr/targeting/common/xmltohb/target_types_hb.xml14
-rwxr-xr-xsrc/usr/vpd/dimmPres.C15
-rw-r--r--src/usr/vpd/makefile4
-rw-r--r--src/usr/vpd/spd.C110
-rwxr-xr-xsrc/usr/vpd/spd.H11
-rwxr-xr-xsrc/usr/vpd/vpd.C305
-rw-r--r--src/usr/vpd/vpd.H16
14 files changed, 583 insertions, 82 deletions
diff --git a/src/include/usr/errl/errlentry.H b/src/include/usr/errl/errlentry.H
index 27fcf126f..38624ab6b 100644
--- a/src/include/usr/errl/errlentry.H
+++ b/src/include/usr/errl/errlentry.H
@@ -711,6 +711,15 @@ private:
*/
void addHbBuildId();
+ /**
+ * @brief called by addHwCallout to retrieve the serial and part number
+ * from the current target. If the current target does not contain
+ * ATTR_PART_NUMBER or ATTR_SERIAL_NUMBER, find the first parent that does
+ * and adds the attribute to the error log.
+ *
+ * @param[in] i_target The target to get the numbers for
+ */
+ void addPartAndSerialNumbersToErrLog(const TARGETING::Target * i_target);
/**
* @brief Disabled copy constructor and assignment operator
diff --git a/src/include/usr/vpd/vpd_if.H b/src/include/usr/vpd/vpd_if.H
index d3915ee6a..eff196042 100644
--- a/src/include/usr/vpd/vpd_if.H
+++ b/src/include/usr/vpd/vpd_if.H
@@ -70,6 +70,15 @@ namespace VPD
*/
bool cvpdPresent ( TARGETING::Target * i_target );
+
+ /**
+ * @brief This function sets the part and serial number attributes for
+ * a given target
+ * @param[in] i_target - the target to set the attributes for
+ *
+ */
+ void setPartAndSerialNumberAttributes( TARGETING::Target * i_target );
+
/**
* @brief This function checks to see if the given pvpd target
* is present
diff --git a/src/include/usr/vpd/vpdreasoncodes.H b/src/include/usr/vpd/vpdreasoncodes.H
index 2cfe8a68a..9692a4a78 100644
--- a/src/include/usr/vpd/vpdreasoncodes.H
+++ b/src/include/usr/vpd/vpdreasoncodes.H
@@ -48,6 +48,7 @@ enum vpdModuleId
// Common VPD
VPD_WRITE_PNOR = 0x10,
VPD_ENSURE_CACHE_IS_IN_SYNC = 0x11,
+ VPD_GET_PN_AND_SN = 0x12,
// IPVPD
VPD_IPVPD_TRANSLATE_RECORD = 0x20,
diff --git a/src/usr/errl/errlentry.C b/src/usr/errl/errlentry.C
index 6c5245a7e..07dd5b78a 100644
--- a/src/usr/errl/errlentry.C
+++ b/src/usr/errl/errlentry.C
@@ -51,6 +51,7 @@
#include <targeting/common/targetservice.H>
#include <targeting/common/utilFilter.H>
#include <config.h>
+#include <initservice/initserviceif.H>
// Hostboot Image ID string
@@ -518,6 +519,7 @@ void ErrlEntry::addHwCallout(const TARGETING::Target *i_target,
const HWAS::GARD_ErrorType i_gardErrorType)
{
+
if (i_target == TARGETING::MASTER_PROCESSOR_CHIP_TARGET_SENTINEL)
{
#ifdef CONFIG_ERRL_ENTRY_TRACE
@@ -638,6 +640,7 @@ void ErrlEntry::addHwCallout(const TARGETING::Target *i_target,
ErrlUserDetailsCallout(&ep, size1,
i_priority, i_deconfigState, i_gardErrorType).addToLog(this);
+
}
if (i_gardErrorType != GARD_NULL)
{
@@ -685,6 +688,74 @@ void ErrlEntry::addHbBuildId()
}
///////////////////////////////////////////////////////////////////////////////
+// Called by addHwCallout to get the part and serial numbers from the current
+// target so that it can be appended to the error log
+void ErrlEntry::addPartAndSerialNumbersToErrLog
+ (const TARGETING::Target * i_target)
+{
+ TRACDCOMP(g_trac_errl, ENTER_MRK"ErrlEntry::addPartAndSerialNumbersToErrLog()");
+
+
+ // Get the type of the target
+ const TARGETING::Target * l_target = i_target;
+ TARGETING::TYPE l_type = l_target->getAttr<TARGETING::ATTR_TYPE>();
+
+ do
+ {
+ if((l_type != TARGETING::TYPE_PROC ) &&
+ (l_type != TARGETING::TYPE_DIMM ) &&
+ (l_type != TARGETING::TYPE_MEMBUF ))
+ {
+ TARGETING::PredicatePostfixExpr l_procDimmMembuf;
+ TARGETING::TargetHandleList l_pList;
+
+ TARGETING::PredicateCTM l_procs(TARGETING::CLASS_CHIP,
+ TARGETING::TYPE_PROC);
+
+ TARGETING::PredicateCTM l_dimms(TARGETING::CLASS_CARD,
+ TARGETING::TYPE_DIMM);
+
+ TARGETING::PredicateCTM l_membufs(TARGETING::CLASS_CHIP,
+ TARGETING::TYPE_MEMBUF);
+
+ l_procDimmMembuf.push(&l_procs).push(&l_dimms).Or()
+ .push(&l_membufs).Or();
+
+ // Search for any parents with TYPE_PROC, TYPE_DIMM, or TYPE_MEMBUF
+ TARGETING::targetService().getAssociated( l_pList, l_target,
+ TARGETING::TargetService::PARENT,
+ TARGETING::TargetService::ALL,
+ &l_procDimmMembuf);
+ // If no parent of desired type is present, break
+ if(!l_pList.size())
+ {
+ TRACFCOMP(g_trac_errl, "Error! errlentry.C::addPartAndSerialNumbersToErrLog - No parent containing Serial/Part numbers found.");
+ break;
+ }
+ else
+ {
+ // We have found the parent
+ l_target = l_pList[0];
+ }
+
+ }
+ // We have made it here so we have found a target that contains
+ // ATTR_SERIAL_NUMBER and ATTR_PART_NUMBER
+ //Add the part number to the error log.
+ ErrlUserDetailsAttribute( l_target,
+ TARGETING::ATTR_PART_NUMBER).addToLog(this);
+
+ //Add the serial number to the error log.
+ ErrlUserDetailsAttribute( l_target,
+ TARGETING::ATTR_SERIAL_NUMBER).addToLog(this);
+
+ }while( 0 );
+
+ TRACDCOMP(g_trac_errl, EXIT_MRK"ErrlEntry::addPartAndSerialNumbersToErrLog()");
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
// for use by ErrlManager
void ErrlEntry::commit( compId_t i_committerComponent )
{
@@ -708,6 +779,38 @@ void ErrlEntry::commit( compId_t i_committerComponent )
// Add the Hostboot Build ID to the error log
addHbBuildId();
+ // If this error was a hardware callout, add the serial and part numbers
+ // to the log. FSP provides this data so if there is no FSP, get them here.
+ if(!INITSERVICE::spBaseServicesEnabled())
+ {
+ for(size_t i = 0; i < iv_SectionVector.size(); i++)
+ {
+ ErrlUD * l_udSection = iv_SectionVector[i];
+ HWAS::callout_ud_t * l_ud =
+ reinterpret_cast<HWAS::callout_ud_t*>(l_udSection->iv_pData);
+
+ if((ERRL_COMP_ID == (l_udSection)->iv_header.iv_compId) &&
+ (1 == (l_udSection)->iv_header.iv_ver) &&
+ (ERRL_UDT_CALLOUT == (l_udSection)->iv_header.iv_sst) &&
+ (HWAS::HW_CALLOUT == l_ud->type))
+ {
+ uint8_t * l_uData = (uint8_t *)(l_ud + 1);
+ TARGETING::Target * l_target = NULL;
+
+ bool l_err = HWAS::retrieveTarget(l_uData,
+ l_target,
+ this);
+ if(!l_err)
+ {
+ addPartAndSerialNumbersToErrLog( l_target );
+ }
+ else
+ {
+ TRACFCOMP(g_trac_errl, "ErrlEntry::commit() - Error retrieving target");
+ }
+ }
+ }
+ }
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/src/usr/errl/runtime/makefile b/src/usr/errl/runtime/makefile
index 14212597f..c80c9fdaa 100644
--- a/src/usr/errl/runtime/makefile
+++ b/src/usr/errl/runtime/makefile
@@ -33,7 +33,7 @@ VPATH += ${ROOTPATH}/src/usr/hwas/common
OBJS += rt_errlmanager.o
OBJS += rt_vfs.o
-OBJS += $(if $(CONFIG_BMC_IPMI),hwasCallout.o)
+OBJS += hwasCallout.o
SUBDIRS += test.d
diff --git a/src/usr/fsi/fsipres.C b/src/usr/fsi/fsipres.C
index 00aa81357..b092c0973 100644
--- a/src/usr/fsi/fsipres.C
+++ b/src/usr/fsi/fsipres.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2011,2014 */
+/* Contributors Listed Below - COPYRIGHT 2011,2015 */
/* [+] Google Inc. */
/* [+] International Business Machines Corp. */
/* */
@@ -34,6 +34,7 @@
#include <hwas/common/hwasCallout.H>
#include <targeting/common/predicates/predicatectm.H>
#include <config.h>
+#include <initservice/initserviceif.H>
extern trace_desc_t* g_trac_fsi;
@@ -197,14 +198,23 @@ errlHndl_t procPresenceDetect(DeviceFW::OperationType i_opType,
FSI_COMP_ID );
}
-
bool present = fsi_present && mvpd_present;
+ if( present )
+ {
+ //Fsp sets PN/SN so if there is none, do it here
+ if(!INITSERVICE::spBaseServicesEnabled())
+ {
+ // set part and serial number attributes for current target
+ VPD::setPartAndSerialNumberAttributes( i_target );
+
+ }
+ }
+
memcpy(io_buffer, &present, sizeof(present));
io_buflen = sizeof(present);
return NULL;
}
-
/**
* @brief Performs a presence detect operation on a Membuf Chip.
*
@@ -271,6 +281,7 @@ errlHndl_t membPresenceDetect(DeviceFW::OperationType i_opType,
cvpd_present = VPD::cvpdPresent( i_target );
}
+
#if defined(CONFIG_CVPD_READ_FROM_HW) && defined(CONFIG_CVPD_READ_FROM_PNOR)
if( cvpd_present )
{
@@ -347,7 +358,18 @@ errlHndl_t membPresenceDetect(DeviceFW::OperationType i_opType,
errlCommit( l_errl,
FSI_COMP_ID );
}
+
bool present = fsi_present && cvpd_present;
+ if( present )
+ {
+ //Fsp sets PN/SN so if there is none, do it here
+ if(!INITSERVICE::spBaseServicesEnabled())
+ {
+ // set part and serial number attributes for current target
+ VPD::setPartAndSerialNumberAttributes( i_target );
+ }
+
+ }
memcpy(io_buffer, &present, sizeof(present));
io_buflen = sizeof(present);
diff --git a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
index 42b0e6564..ff0109eea 100644
--- a/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
+++ b/src/usr/targeting/common/xmltohb/attribute_types_hb.xml
@@ -1123,4 +1123,42 @@ ID for the sensor number returned with the elog. -->
<hbOnly/>
</attribute>
+<attribute>
+ <id>SERIAL_NUMBER</id>
+ <description>The serial number for a particular FRU target</description>
+ <simpleType>
+ <uint8_t>
+ <default>0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0</default>
+ </uint8_t>
+ <array>18</array>
+ </simpleType>
+ <persistency>volatile-zeroed</persistency>
+ <readable/>
+ <writeable/>
+ <hwpfToHbAttrMap>
+ <id>ATTR_SERIAL_NUMBER</id>
+ <macro>DIRECT</macro>
+ </hwpfToHbAttrMap>
+ <hbOnly/>
+</attribute>
+
+<attribute>
+ <id>PART_NUMBER</id>
+ <description>The part number for a particular FRU target</description>
+ <simpleType>
+ <uint8_t>
+ <default>0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0</default>
+ </uint8_t>
+ <array>18</array>
+ </simpleType>
+ <persistency>volatile-zeroed</persistency>
+ <readable/>
+ <writeable/>
+ <hwpfToHbAttrMap>
+ <id>ATTR_PART_NUMBER</id>
+ <macro>DIRECT</macro>
+ </hwpfToHbAttrMap>
+ <hbOnly/>
+</attribute>
+
</attributes>
diff --git a/src/usr/targeting/common/xmltohb/target_types_hb.xml b/src/usr/targeting/common/xmltohb/target_types_hb.xml
index d023f507c..4cb14ecd6 100644
--- a/src/usr/targeting/common/xmltohb/target_types_hb.xml
+++ b/src/usr/targeting/common/xmltohb/target_types_hb.xml
@@ -106,7 +106,15 @@
<attribute>
<id>HOMER_VIRT_ADDR</id>
</attribute>
- <attribute><id>VPD_SWITCHES</id></attribute>
+ <attribute>
+ <id>VPD_SWITCHES</id>
+ </attribute>
+ <attribute>
+ <id>SERIAL_NUMBER</id>
+ </attribute>
+ <attribute>
+ <id>PART_NUMBER</id>
+ </attribute>
</targetTypeExtension>
<targetTypeExtension>
@@ -163,6 +171,8 @@
<id>ISDIMM_MBVPD_INDEX</id>
</attribute>
<attribute><id>IPMI_SENSORS</id></attribute>
+ <attribute><id>PART_NUMBER</id></attribute>
+ <attribute><id>SERIAL_NUMBER</id></attribute>
</targetTypeExtension>
<targetTypeExtension>
@@ -188,6 +198,8 @@
<id>lcard-dimm</id>
<attribute><id>VPD_SWITCHES</id></attribute>
<attribute><id>IPMI_SENSORS</id></attribute>
+ <attribute><id>PART_NUMBER</id></attribute>
+ <attribute><id>SERIAL_NUMBER</id></attribute>
</targetTypeExtension>
<targetTypeExtension>
diff --git a/src/usr/vpd/dimmPres.C b/src/usr/vpd/dimmPres.C
index 1524aebd4..cc7d19255 100755
--- a/src/usr/vpd/dimmPres.C
+++ b/src/usr/vpd/dimmPres.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. */
/* */
@@ -42,6 +42,7 @@
#include <vpd/vpdreasoncodes.H>
#include <vpd/spdenums.H>
#include <config.h>
+#include <initservice/initserviceif.H>
#include "spd.H"
@@ -203,6 +204,18 @@ errlHndl_t dimmPresenceDetect( DeviceFW::OperationType i_opType,
}
}
#endif
+
+ if( present && !err )
+ {
+ //Fsp sets PN/SN so if there is none, do it here
+ if(!INITSERVICE::spBaseServicesEnabled())
+ {
+ //populate serial and part number attributes
+ SPD::setPartAndSerialNumberAttributes( i_target );
+
+ }
+ }
+
// copy present value into output buffer so caller can read it
memcpy( io_buffer, &present, presentSz );
io_buflen = presentSz;
diff --git a/src/usr/vpd/makefile b/src/usr/vpd/makefile
index cd7299257..59fa95977 100644
--- a/src/usr/vpd/makefile
+++ b/src/usr/vpd/makefile
@@ -38,8 +38,8 @@ SUBDIRS += runtime.d
BINARY_FILES = $(IMGDIR)/dimmspd.dat:3a9f53e3684e57401ed0aed75f25980fca99f40b
-#Update mvpd to include LRPx records for all possible cores CCIN 54E3
-BINARY_FILES += $(IMGDIR)/procmvpd.dat:254c30077a002ccdaca3b34c50abcafbf5ae3e48
+#Updated mvpd to contain VRML so the part/serial numbers can be found for procs CCIN 54E3
+BINARY_FILES += $(IMGDIR)/procmvpd.dat:65759fa4aebd2e3b42b25309504a3007b3b51036
BINARY_FILES += $(IMGDIR)/procmvpd_ven.dat:dd8507bec946283260f82af212ed32feaeb3363a
#Update to Centaur DD2.0 for CCIN 31E8
diff --git a/src/usr/vpd/spd.C b/src/usr/vpd/spd.C
index 54837a581..3ca80fbff 100644
--- a/src/usr/vpd/spd.C
+++ b/src/usr/vpd/spd.C
@@ -2008,7 +2008,114 @@ errlHndl_t getKeywordEntry ( VPD::vpdKeyword i_keyword,
// ------------------------------------------------------------------
-// cmpPnorSeeprom
+// setPartAndSerialNumberAttributes
+// ------------------------------------------------------------------
+void setPartAndSerialNumberAttributes( TARGETING::Target * i_target )
+{
+ errlHndl_t l_err = NULL;
+ VPD::vpdKeyword l_partKeyword = SPD::MODULE_PART_NUMBER;
+ VPD::vpdKeyword l_serialKeyword = SPD::MODULE_SERIAL_NUMBER;
+
+ do
+ {
+ // Read the Basic Memory Type
+ uint8_t l_memType = 0x0;
+ l_err = getMemType( l_memType,
+ i_target,
+ VPD::PNOR );
+ if( l_err )
+ {
+ TRACDCOMP(g_trac_spd, ERR_MRK"spd.C::setPartAndSerialNumberAttributes(): Error after getMemType");
+ errlCommit(l_err, VPD_COMP_ID );
+ l_err = NULL;
+ break;
+ }
+
+ if(( SPD_DDR3 != l_memType ) &&
+ ( SPD_DDR4 != l_memType ))
+ {
+ TRACDCOMP(g_trac_spd, ERR_MRK"spd.C::setPartAndSerialNumberAttributes(): Unknown memType");
+ break;
+ }
+
+ // Get the keyword sizes
+ size_t l_partDataSize = 0;
+ size_t l_serialDataSize = 0;
+ if( SPD_DDR3 == l_memType )
+ {
+ l_partDataSize = ddr3Data[l_partKeyword].length;
+ l_serialDataSize = ddr3Data[l_serialKeyword].length;
+ }
+ else
+ {
+ l_partDataSize = ddr4Data[l_partKeyword].length;
+ l_serialDataSize = ddr4Data[l_serialKeyword].length;
+ }
+
+ //read the keywords from SEEPROM since PNOR may not be loaded yet
+ uint8_t l_partNumberData[l_partDataSize];
+ l_err = spdGetValue( l_partKeyword,
+ l_partNumberData,
+ l_partDataSize,
+ i_target,
+ l_memType,
+ VPD::PNOR );
+
+ if( l_err )
+ {
+ TRACDCOMP(g_trac_spd, ERR_MRK"spd.C::setPartAndSerialNumberAttributes(): Error after spdGetValue-> PART_NUMBER");
+ errlCommit(l_err, VPD_COMP_ID);
+ l_err = NULL;
+ break;
+ }
+
+ uint8_t l_serialNumberData[l_serialDataSize];
+ l_err = spdGetValue( l_serialKeyword,
+ l_serialNumberData,
+ l_serialDataSize,
+ i_target,
+ l_memType,
+ VPD::PNOR );
+
+ if( l_err )
+ {
+ TRACDCOMP(g_trac_spd, ERR_MRK"spd.C::setPartAndSerialNumberAttributes(): Error after spdGetValue-> SERIAL_NUMBER");
+ errlCommit(l_err, VPD_COMP_ID);
+ l_err = NULL;
+ break;
+ }
+ // Set the attributes
+ TARGETING::ATTR_PART_NUMBER_type l_PN;
+ TARGETING::ATTR_SERIAL_NUMBER_type l_SN;
+ size_t expectedPNSize = sizeof(l_PN);
+ size_t expectedSNSize = sizeof(l_SN);
+ if(expectedPNSize < l_partDataSize)
+ {
+ TRACFCOMP(g_trac_spd, "Part data size too large for attribute. Expected: %d Actual: %d",
+ expectedPNSize, l_partDataSize);
+ }
+ else
+ {
+ memcpy(l_PN, l_partNumberData, l_partDataSize);
+ i_target->trySetAttr<TARGETING::ATTR_PART_NUMBER>(l_PN);
+ }
+ if(expectedSNSize < l_serialDataSize)
+ {
+ TRACFCOMP(g_trac_spd, "Serial data size too large for attribute. Expected: %d Actual: %d",
+ expectedSNSize, l_serialDataSize);
+ }
+ else
+ {
+ memcpy(l_SN, l_serialNumberData, l_serialDataSize);
+ i_target->trySetAttr<TARGETING::ATTR_SERIAL_NUMBER>(l_SN);
+ }
+ }while( 0 );
+
+ TRACSSCOMP(g_trac_spd, EXIT_MRK"spd.C::setPartAndSerialNumberAttributes()");
+}
+
+// ------------------------------------------------------------------
+// cmpPnorToSeeprom
// ------------------------------------------------------------------
errlHndl_t cmpPnorToSeeprom ( TARGETING::Target * i_target,
VPD::vpdKeyword i_keyword,
@@ -2019,7 +2126,6 @@ errlHndl_t cmpPnorToSeeprom ( TARGETING::Target * i_target,
TRACSSCOMP( g_trac_spd, ENTER_MRK"cmpPnorSeeprom()" );
o_match = false;
-
do
{
// Read the Basic Memory Type
diff --git a/src/usr/vpd/spd.H b/src/usr/vpd/spd.H
index e53ca7e23..6c02cf216 100755
--- a/src/usr/vpd/spd.H
+++ b/src/usr/vpd/spd.H
@@ -415,6 +415,17 @@ errlHndl_t getVpdLocation ( int64_t & o_vpdLocation,
TARGETING::Target * i_target );
+
+
+/**
+ * @brief This function sets the part and serial number attributes for the
+ * given target.
+ * @param[in] i_target - the target to set the attributes for
+ *
+ */
+void setPartAndSerialNumberAttributes( TARGETING::Target * i_target );
+
+
/**
* @brief This function compares value of the keyword in PNOR/SEEPROM
* and returns the result
diff --git a/src/usr/vpd/vpd.C b/src/usr/vpd/vpd.C
index 3656696c4..0aeb5b80c 100755
--- a/src/usr/vpd/vpd.C
+++ b/src/usr/vpd/vpd.C
@@ -36,6 +36,8 @@
#include "cvpd.H"
#include "pvpd.H"
#include "spd.H"
+#include "ipvpd.H"
+
// ----------------------------------------------
// Trace definitions
@@ -426,106 +428,265 @@ bool resolveVpdSource( TARGETING::Target * i_target,
// ------------------------------------------------------------------
-// ensureCacheIsInSync
+// setPartAndSerialNumberAttributes
// ------------------------------------------------------------------
-errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
+void setPartAndSerialNumberAttributes( TARGETING::Target * i_target )
{
errlHndl_t l_err = NULL;
+ vpdKeyword l_serialNumberKeyword = 0;
+ size_t l_dataSize = 0;
- TRACSSCOMP( g_trac_vpd, ENTER_MRK"ensureCacheIsInSync() " );
+ TARGETING::TYPE l_type = i_target->getAttr<TARGETING::ATTR_TYPE>();
- IpVpdFacade* l_ipvpd = &(Singleton<MvpdFacade>::instance());
+ TRACSSCOMP(g_trac_vpd, ENTER_MRK"vpd.C::setPartAndSerialNumberAttributes");
+ do
+ {
+ IpVpdFacade * l_ipvpd = &(Singleton<MvpdFacade>::instance());
+ if(l_type == TARGETING::TYPE_MEMBUF)
+ {
+ l_ipvpd = &(Singleton<CvpdFacade>::instance());
+ }
- vpdRecord l_record = 0;
- vpdKeyword l_keywordPN = 0;
- vpdKeyword l_keywordSN = 0;
+ IpVpdFacade::input_args_t l_args;
- TARGETING::TYPE l_type = i_target->getAttr<TARGETING::ATTR_TYPE>();
+ l_err = getPnAndSnRecordAndKeywords( i_target,
+ l_type,
+ l_args.record,
+ l_args.keyword,
+ l_serialNumberKeyword );
- if( l_type == TARGETING::TYPE_PROC )
- {
- l_record = MVPD::VRML;
- l_keywordPN = MVPD::PN;
- l_keywordSN = MVPD::SN;
- }
- else if( l_type == TARGETING::TYPE_MEMBUF )
- {
- l_ipvpd = &(Singleton<CvpdFacade>::instance());
- l_record = CVPD::OPFR;
- 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
- // SPD does not use records
- l_keywordPN = SPD::MODULE_PART_NUMBER;
- l_keywordSN = SPD::MODULE_SERIAL_NUMBER;
- }
- else
- {
- TRACFCOMP(g_trac_vpd,ERR_MRK"ensureCacheIsInSync() Unexpected target type, huid=0x%X",TARGETING::get_huid(i_target));
- /*@
- * @errortype
- * @moduleid VPD_ENSURE_CACHE_IS_IN_SYNC
- * @reasoncode VPD_UNEXPECTED_TARGET_TYPE
- * @userdata1 Target HUID
- * @userdata2 <UNUSED>
- * @devdesc Unexpected target type
- */
- l_err = new ERRORLOG::ErrlEntry(
- ERRORLOG::ERRL_SEV_UNRECOVERABLE,
- VPD_ENSURE_CACHE_IS_IN_SYNC,
- VPD_UNEXPECTED_TARGET_TYPE,
- TO_UINT64(TARGETING::get_huid(i_target)),
- 0x0,
- true /*Add HB Software Callout*/ );
- return l_err;
- }
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_vpd, "setPartAndSerialNumberAttributes::Error getting record/keywords for PN/SN");
+ errlCommit(l_err, VPD_COMP_ID);
+ l_err = NULL;
+ break;
+ }
- do
- {
- // Make sure we are comparing the correct pn/sn for CVPD
- if( ( l_type == TARGETING::TYPE_MEMBUF ) ||
- ( l_type == TARGETING::TYPE_NODE ) )
+ // Get the size of the part number
+ l_err = l_ipvpd->read( i_target,
+ NULL,
+ l_dataSize,
+ l_args );
+
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_vpd, " vpd.C::setPartAndSerialNumbers::read part number size");
+ errlCommit(l_err, VPD_COMP_ID);
+ l_err = NULL;
+ break;
+ }
+
+ //get the actual part number data
+ uint8_t l_partNumberData[l_dataSize];
+ l_err = l_ipvpd->read( i_target,
+ l_partNumberData,
+ l_dataSize,
+ l_args );
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_vpd, "vpd.C::setPartAndSerialNumbers::read part number");
+ errlCommit(l_err, VPD_COMP_ID);
+ l_err = NULL;
+ break;
+ }
+
+ // Set the part number attribute
+ TARGETING::ATTR_PART_NUMBER_type l_partNumber;
+ size_t expectedPNSize = sizeof(l_partNumber);
+ if(expectedPNSize < l_dataSize)
+ {
+ TRACFCOMP(g_trac_vpd, "Part number data to large for attribute. Expected: %d Actual: %d",
+ expectedPNSize, l_dataSize);
+ }
+ else
+ {
+ memcpy( l_partNumber, l_partNumberData, l_dataSize );
+ i_target->trySetAttr<TARGETING::ATTR_PART_NUMBER>(l_partNumber);
+ }
+ // Get the serial number attribute data
+ l_args.keyword = l_serialNumberKeyword;
+ l_dataSize = 0;
+ l_err = l_ipvpd->read( i_target,
+ NULL,
+ l_dataSize,
+ l_args );
+
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_vpd, "vpd.C::setPartAndSerialNumbers::read serial number size");
+ errlCommit( l_err, VPD_COMP_ID );
+ l_err = NULL;
+ break;
+ }
+
+ // Get the actual serial number data
+ uint8_t l_serialNumberData[l_dataSize];
+ l_err = l_ipvpd->read( i_target,
+ l_serialNumberData,
+ l_dataSize,
+ l_args );
+
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_vpd, "vpd.C::setPartAndSerialNumbers::serial number");
+ errlCommit( l_err, VPD_COMP_ID );
+ l_err = NULL;
+ break;
+ }
+
+ // set the serial number attribute
+ TARGETING::ATTR_SERIAL_NUMBER_type l_serialNumber;
+ size_t expectedSNSize = sizeof(l_serialNumber);
+ if(expectedSNSize < l_dataSize)
+ {
+ TRACFCOMP(g_trac_vpd, "Serial number data to large for attribute. Expected: %d Actual: %d",
+ expectedSNSize, l_dataSize);
+ }
+ else
+ {
+ memcpy( l_serialNumber, l_serialNumberData, l_dataSize );
+ i_target->trySetAttr
+ <TARGETING::ATTR_SERIAL_NUMBER>(l_serialNumber);
+ }
+
+
+ }while( 0 );
+
+}
+
+
+
+// ------------------------------------------------------------------
+// getPnAndSnRecordAndKeywords
+// ------------------------------------------------------------------
+errlHndl_t getPnAndSnRecordAndKeywords( TARGETING::Target * i_target,
+ TARGETING::TYPE i_type,
+ vpdRecord & io_record,
+ vpdKeyword & io_keywordPN,
+ vpdKeyword & io_keywordSN )
+{
+ TRACFCOMP(g_trac_vpd, ENTER_MRK"getPnAndSnRecordAndKeywords()");
+ errlHndl_t l_err = NULL;
+ do{
+
+ if( i_type == TARGETING::TYPE_PROC )
+ {
+ io_record = MVPD::VRML;
+ io_keywordPN = MVPD::PN;
+ io_keywordSN = MVPD::SN;
+ }
+ else if( i_type == TARGETING::TYPE_MEMBUF )
{
+#if defined(CONFIG_CVPD_READ_FROM_HW) && defined(CONFIG_CVPD_READ_FROM_PNOR)
+ IpVpdFacade* l_ipvpd = &(Singleton<CvpdFacade>::instance());
+ io_record = CVPD::OPFR;
+ io_keywordPN = CVPD::VP;
+ io_keywordSN = CVPD::VS;
+
bool l_zeroPN;
l_err = l_ipvpd->cmpSeepromToZero( i_target,
- l_record,
- l_keywordPN,
+ io_record,
+ io_keywordPN,
l_zeroPN );
if (l_err)
{
- TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::ensureCacheIsInSync: Error checking if OPFR:VP == 0");
+ TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::getPnAndSnRecordAndKeywords: Error checking if OPFR:VP == 0");
break;
}
bool l_zeroSN;
l_err = l_ipvpd->cmpSeepromToZero( i_target,
- l_record,
- l_keywordSN,
+ io_record,
+ io_keywordSN,
l_zeroSN );
if (l_err)
{
- TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::ensureCacheIsInSync: Error checking if OPFR:VS == 0");
+ TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::getPnAndSnRecordAndKeywords: Error checking if OPFR:VS == 0");
break;
}
// If VP and VS are zero, use VINI instead
if( l_zeroPN && l_zeroSN )
{
- l_record = CVPD::VINI;
- l_keywordPN = CVPD::PN;
- l_keywordSN = CVPD::SN;
+ TRACFCOMP(g_trac_vpd, "setting cvpd to VINI PN SN");
+ io_record = CVPD::VINI;
+ io_keywordPN = CVPD::PN;
+ io_keywordSN = CVPD::SN;
}
+#else
+ io_record = CVPD::VINI;
+ io_keywordPN = CVPD::PN;
+ io_keywordSN = CVPD::SN;
+#endif
}
+ else if( i_type == TARGETING::TYPE_DIMM )
+ {
+ // SPD does not have singleton instance
+ // SPD does not use records
+ io_keywordPN = SPD::MODULE_PART_NUMBER;
+ io_keywordSN = SPD::MODULE_SERIAL_NUMBER;
+ }
+ else
+ {
+ TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::getPnAndSnRecordAndKeywords() Unexpected target type, huid=0x%X",TARGETING::get_huid(i_target));
+ /*@
+ * @errortype
+ * @moduleid VPD_GET_PN_AND_SN
+ * @reasoncode VPD_UNEXPECTED_TARGET_TYPE
+ * @userdata1 Target HUID
+ * @userdata2 <UNUSED>
+ * @devdesc Unexpected target type
+ */
+ l_err = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ VPD_GET_PN_AND_SN,
+ VPD_UNEXPECTED_TARGET_TYPE,
+ TO_UINT64(TARGETING::get_huid(i_target)),
+ 0x0,
+ true /*Add HB Software Callout*/ );
+
+ }
+ }while( 0 );
+ TRACSSCOMP(g_trac_vpd, EXIT_MRK"getPnAndSnRecordAndKeywords()");
+ return l_err;
+}
+
+// ------------------------------------------------------------------
+// ensureCacheIsInSync
+// ------------------------------------------------------------------
+errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
+{
+ errlHndl_t l_err = NULL;
+
+ TRACSSCOMP( g_trac_vpd, ENTER_MRK"ensureCacheIsInSync() " );
+
+ vpdRecord l_record = 0;
+ vpdKeyword l_keywordPN = 0;
+ vpdKeyword l_keywordSN = 0;
+
+ TARGETING::TYPE l_type = i_target->getAttr<TARGETING::ATTR_TYPE>();
+
+ IpVpdFacade* l_ipvpd = &(Singleton<MvpdFacade>::instance());
+ // If we have a membuf, use CVPD api
+ if(l_type == TARGETING::TYPE_MEMBUF)
+ {
+ l_ipvpd = &(Singleton<CvpdFacade>::instance());
+ }
+ do
+ {
+ // Get the correct Part and serial numbers
+ l_err = getPnAndSnRecordAndKeywords( i_target,
+ l_type,
+ l_record,
+ l_keywordPN,
+ l_keywordSN );
+ if( l_err )
+ {
+ TRACDCOMP(g_trac_vpd, "VPD::ensureCacheIsInSync: Error getting part and serial numbers");
+ break;
+ }
+
// Compare the Part Numbers in PNOR/SEEPROM
bool l_matchPN = false;
@@ -546,7 +707,7 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
}
if (l_err)
{
- TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::ensureCacheIsInSync: Error checking for PNOR/SEEPROM PN match");
+ TRACDCOMP(g_trac_vpd,ERR_MRK"VPD::ensureCacheIsInSync: Error checking for PNOR/SEEPROM PN match");
break;
}
@@ -568,7 +729,7 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
}
if( l_err )
{
- TRACFCOMP(g_trac_vpd,ERR_MRK"VPD::ensureCacheIsInSync: Error checking for PNOR/SEEPROM SN match");
+ TRACDCOMP(g_trac_vpd,ERR_MRK"VPD::ensureCacheIsInSync: Error checking for PNOR/SEEPROM SN match");
break;
}
@@ -597,7 +758,7 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
}
if( l_err )
{
- TRACFCOMP(g_trac_vpd,"Error loading SEEPROM VPD into PNOR");
+ TRACDCOMP(g_trac_vpd,"Error loading SEEPROM VPD into PNOR");
break;
}
}
diff --git a/src/usr/vpd/vpd.H b/src/usr/vpd/vpd.H
index e6cada716..3d7b22a6e 100644
--- a/src/usr/vpd/vpd.H
+++ b/src/usr/vpd/vpd.H
@@ -219,6 +219,22 @@ bool resolveVpdSource( TARGETING::Target * i_target,
vpdCmdTarget i_vpdCmdTarget,
vpdCmdTarget& o_vpdSource );
+/**
+ * @brief This function sets the correct record/keyword combinations
+ * for the part and serial numbers.
+ * @param[in] i_target - target to get the data for
+ * @param[in/out] io_record - record for target
+ * @param[in/out] io_partKeyword - the part number keyword
+ * @param[in/out] io_serialKeyword - the serial number keyword
+ *
+ * @return errlHndl_t - NULL if successful, otherwise a pointer to the
+ * error log.
+ */
+errlHndl_t getPnAndSnRecordAndKeywords( TARGETING::Target * i_target,
+ TARGETING::TYPE i_type,
+ vpdRecord & io_record,
+ vpdKeyword & io_partKeyword,
+ vpdKeyword & io_serialKeyword);
}; //end VPD namespace
OpenPOWER on IntegriCloud