diff options
| author | Andres Lugo-Reyes <aalugore@us.ibm.com> | 2015-05-05 13:14:27 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-06-19 16:00:51 -0500 |
| commit | ef69ea46b6208625307bd42b2cf29beef10c8418 (patch) | |
| tree | 1256d14ea7950e28714553f5503be2530bd04e9d /src | |
| parent | 4d1c59f09b6b0ab9236aa42694cb2e42cbe8d3eb (diff) | |
| download | talos-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.H | 9 | ||||
| -rw-r--r-- | src/include/usr/vpd/vpd_if.H | 9 | ||||
| -rw-r--r-- | src/include/usr/vpd/vpdreasoncodes.H | 1 | ||||
| -rw-r--r-- | src/usr/errl/errlentry.C | 103 | ||||
| -rw-r--r-- | src/usr/errl/runtime/makefile | 2 | ||||
| -rw-r--r-- | src/usr/fsi/fsipres.C | 28 | ||||
| -rw-r--r-- | src/usr/targeting/common/xmltohb/attribute_types_hb.xml | 38 | ||||
| -rw-r--r-- | src/usr/targeting/common/xmltohb/target_types_hb.xml | 14 | ||||
| -rwxr-xr-x | src/usr/vpd/dimmPres.C | 15 | ||||
| -rw-r--r-- | src/usr/vpd/makefile | 4 | ||||
| -rw-r--r-- | src/usr/vpd/spd.C | 110 | ||||
| -rwxr-xr-x | src/usr/vpd/spd.H | 11 | ||||
| -rwxr-xr-x | src/usr/vpd/vpd.C | 305 | ||||
| -rw-r--r-- | src/usr/vpd/vpd.H | 16 |
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 |

