diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2018-11-06 15:52:36 -0600 |
---|---|---|
committer | Nicholas E. Bofferding <bofferdn@us.ibm.com> | 2018-12-13 18:18:52 -0600 |
commit | 552d96423109ce112513f493edd286f708d9df19 (patch) | |
tree | c9a36b2a725d638fbe8a2128f374a9455b99b878 /src | |
parent | 1851aa0056c54576d3b328f7b1c9070262857eb0 (diff) | |
download | talos-hostboot-552d96423109ce112513f493edd286f708d9df19.tar.gz talos-hostboot-552d96423109ce112513f493edd286f708d9df19.zip |
Hack to force OCMB presence detection
Temporary code that assumes the OCMB is present if the target is
in the model. Also adds a check to throw an error instead of
crashing if VPD_REC_NUM isn't set.
Change-Id: Iba87d13093f0044bdf28a10621561e02d10faaf6
RTC: 196805
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/68488
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/include/usr/devicefw/userif.H | 46 | ||||
-rw-r--r-- | src/include/usr/vpd/vpdreasoncodes.H | 10 | ||||
-rw-r--r-- | src/usr/fsi/fsipres.C | 6 | ||||
-rw-r--r-- | src/usr/hwas/hwasPlat.C | 50 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/target_types.xml | 87 | ||||
-rw-r--r-- | src/usr/vpd/ddimm.C | 209 | ||||
-rw-r--r-- | src/usr/vpd/makefile | 1 | ||||
-rw-r--r-- | src/usr/vpd/vpd.H | 11 | ||||
-rw-r--r-- | src/usr/vpd/vpd.mk | 5 | ||||
-rw-r--r-- | src/usr/vpd/vpd_common.C | 23 |
10 files changed, 359 insertions, 89 deletions
diff --git a/src/include/usr/devicefw/userif.H b/src/include/usr/devicefw/userif.H index a6c7f26b0..cf00cfee1 100644 --- a/src/include/usr/devicefw/userif.H +++ b/src/include/usr/devicefw/userif.H @@ -49,29 +49,29 @@ namespace DeviceFW enum AccessType { - SCOM = 0, - PNOR, - MAILBOX, - PRESENT, - FSI, - SPD, + SCOM = 0, // SCOM registers + PNOR, // PNOR flash + MAILBOX, // FSP mailbox + PRESENT, // Presence detection + FSI, // FSI/CFAM registers + SPD, // Serial Presence Detect Data for JEDEC DIMMs MVPD, // Module (processor) VPD CVPD, // Centaur (memory buffer) VPD - SCAN, - EEPROM, - GPIO, - LPC, + SCAN, // Scan rings + EEPROM, // Standard EEPROM/SEEPROM over i2c + GPIO, // GPIO registers + LPC, // Low Pin Count bus IPMIBT, // As opposed to other phy's - PVPD, - TPM, - SIO, - AHB_SIO, + PVPD, // Planar VPD + TPM, // Trusted Platform Module + SIO, // BMC Super I/O registers + AHB_SIO, // AST Hostbridge via SIO DVPD, // Direct access memory VPD - DEPRECATED_MEMD_VPD, - NODECOMM, - NVDIMM, - FAPI_I2C, - MMIO, + NODECOMM, // Internode communication + NVDIMM, // Non-volatile DIMM controller access + FAPI_I2C, // FAPI2-triggered i2c accesses + MMIO, // Memory Mapped I/O + IDEC, // Read and set EC and CHIPID values LAST_ACCESS_TYPE, }; @@ -406,6 +406,14 @@ namespace DeviceFW static_cast<uint64_t>((i_accessLimit)) /** + * @brief Additional device addressing parameters for MMIO ops. + * Construct the device addressing parameters for the IDEC operation + * (no parameters) + */ + #define DEVICE_IDEC_ADDRESS()\ + DeviceFW::IDEC + + /** * @brief Perform a hardware read operation. * * @param[in] i_target Device target to operate on. diff --git a/src/include/usr/vpd/vpdreasoncodes.H b/src/include/usr/vpd/vpdreasoncodes.H index a0c552b29..92aea3196 100644 --- a/src/include/usr/vpd/vpdreasoncodes.H +++ b/src/include/usr/vpd/vpdreasoncodes.H @@ -49,6 +49,7 @@ enum vpdModuleId VPD_WRITE_PNOR = 0x10, VPD_ENSURE_CACHE_IS_IN_SYNC = 0x11, VPD_GET_PN_AND_SN = 0x12, + VPD_GET_VPD_LOCATION = 0x13, // IPVPD VPD_IPVPD_TRANSLATE_RECORD = 0x20, @@ -85,8 +86,6 @@ enum vpdModuleId VPD_SPD_GET_MOD_TYPE = 0x6E, VPD_SPD_FETCH_DATA = 0x6F, - // Centaur FRU VPD - // Runtime VPD VPD_RT_GET_ADDR = 0x80, VPD_RT_WRITE_PNOR = 0x81, @@ -96,6 +95,12 @@ enum vpdModuleId VPD_SEND_I2C_LOCK_MSG = 0x85, VPD_FILL_I2C_LOCK_MSG = 0x86, + // DDIMM VPD + MOD_OCMBPRESENCEDETECT = 0x90, + + // Centaur FRU VPD + + }; /** @@ -149,6 +154,7 @@ enum vpdReasonCode VPD_RT_NODE_TOO_LARGE = VPD_COMP_ID | 0x3b, VPD_CANNOT_WRITE_OVERRIDDEN_VPD = VPD_COMP_ID | 0x3c, VPD_FAILED_TO_RESOLVE_NODE_TARGET = VPD_COMP_ID | 0x3d, + VPD_BAD_REC_NUM = VPD_COMP_ID | 0x3e, }; diff --git a/src/usr/fsi/fsipres.C b/src/usr/fsi/fsipres.C index 7b25f9c94..873b58af4 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,2017 */ +/* Contributors Listed Below - COPYRIGHT 2011,2018 */ /* [+] Google Inc. */ /* [+] International Business Machines Corp. */ /* */ @@ -256,6 +256,7 @@ errlHndl_t membPresenceDetect(DeviceFW::OperationType i_opType, * @moduleid FSI::MOD_FSIPRES_MEMBPRESENCEDETECT * @reasoncode FSI::RC_INVALID_LENGTH * @userdata1 Data Length + * @userdata2 HUID of target being detected * @devdesc presenceDetect> Invalid data length (!= 1 bytes) * @custdesc FSI buffer length is not 1 byte when finding * a memory buffer chip @@ -265,7 +266,8 @@ errlHndl_t membPresenceDetect(DeviceFW::OperationType i_opType, FSI::MOD_FSIPRES_MEMBPRESENCEDETECT, FSI::RC_INVALID_LENGTH, TO_UINT64(io_buflen), - true /*SW error*/); + TARGETING::get_huid(i_target), + ERRORLOG::ErrlEntry::ADD_SW_CALLOUT); io_buflen = 0; return l_errl; } diff --git a/src/usr/hwas/hwasPlat.C b/src/usr/hwas/hwasPlat.C index f55f885ff..cf436b869 100644 --- a/src/usr/hwas/hwasPlat.C +++ b/src/usr/hwas/hwasPlat.C @@ -75,6 +75,41 @@ using namespace TARGETING; //****************************************************************************** errlHndl_t platReadIDEC(const TargetHandle_t &i_target) { + // Call over to the target-specific layer since every chip can have + // unique registers + size_t sz = 0; + errlHndl_t l_errl = + DeviceFW::deviceWrite(i_target, + nullptr, + sz, + DEVICE_IDEC_ADDRESS()); + + return l_errl; +} + +/** + * @brief Read the chipid and EC/DD-level for standard CFAM chips and set + * the attributes. + * + * @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 (bytes, must equal 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 cfamIDEC(DeviceFW::OperationType i_opType, + TARGETING::Target* i_target, + void* io_buffer, + size_t& io_buflen, + int64_t i_accessType, + va_list i_args) +{ // we got a target - read the ID/EC // and update the appropriate ATTR_ field. uint64_t id_ec; @@ -181,6 +216,17 @@ errlHndl_t platReadIDEC(const TargetHandle_t &i_target) return errl; } // platReadIDEC +// Register the standard CFAM function for IDEC calls for processors +// and memory buffers +DEVICE_REGISTER_ROUTE(DeviceFW::WRITE, + DeviceFW::IDEC, + TARGETING::TYPE_PROC, + cfamIDEC); +DEVICE_REGISTER_ROUTE(DeviceFW::WRITE, + DeviceFW::IDEC, + TARGETING::TYPE_MEMBUF, + cfamIDEC); + //****************************************************************************** // platIsMinHwCheckingAllowed function // Description: This function will return false always because when Hostboot @@ -528,7 +574,7 @@ errlHndl_t platPresenceDetect(TargetHandleList &io_targets) if (present == true) { - HWAS_DBG( "pTarget %.8X - detected present", + HWAS_INF( "pTarget %.8X - detected present", pTarget->getAttr<ATTR_HUID>()); // advance to next entry in the list @@ -536,7 +582,7 @@ errlHndl_t platPresenceDetect(TargetHandleList &io_targets) } else { // chip not present -- remove from list - HWAS_DBG( "pTarget %.8X - no presence", + HWAS_INF( "pTarget %.8X - no presence", pTarget->getAttr<ATTR_HUID>()); // erase this target, and 'increment' to next diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml index 9e8bc0bf8..f5636ba4f 100644 --- a/src/usr/targeting/common/xmltohb/target_types.xml +++ b/src/usr/targeting/common/xmltohb/target_types.xml @@ -377,6 +377,9 @@ <default>OCMB_CHIP</default> <id>TYPE</id> </attribute> + <attribute> + <id>VPD_REC_NUM</id> + </attribute> </targetType> <!-- Explorer OCMB --> @@ -397,6 +400,27 @@ <value>0</value> </field> <field> + <id>supportsFsiScom</id> + <value>0</value> + </field> + <field> + <id>supportsInbandScom</id> + <value>0</value> + </field> + <field> + <id>supportsXscom</id> + <value>0</value> + </field> + </default> + <id>PRIMARY_CAPABILITIES</id> + </attribute> + <attribute> + <default> + <field> + <id>reserved</id> + <value>0</value> + </field> + <field> <id>useFsiScom</id> <value>0</value> </field> @@ -1594,27 +1618,6 @@ <id>PRD_HWP_PLID</id> </attribute> <attribute> - <default> - <field> - <id>reserved</id> - <value>0</value> - </field> - <field> - <id>supportsFsiScom</id> - <value>1</value> - </field> - <field> - <id>supportsInbandScom</id> - <value>0</value> - </field> - <field> - <id>supportsXscom</id> - <value>1</value> - </field> - </default> - <id>PRIMARY_CAPABILITIES</id> - </attribute> - <attribute> <id>REL_POS</id> </attribute> </targetType> @@ -1668,27 +1671,6 @@ <id>PARENT_PERVASIVE</id> </attribute> <attribute> - <default> - <field> - <id>reserved</id> - <value>0</value> - </field> - <field> - <id>supportsFsiScom</id> - <value>0</value> - </field> - <field> - <id>supportsInbandScom</id> - <value>0</value> - </field> - <field> - <id>supportsXscom</id> - <value>0</value> - </field> - </default> - <id>PRIMARY_CAPABILITIES</id> - </attribute> - <attribute> <default>CAPP</default> <id>TYPE</id> </attribute> @@ -2250,27 +2232,6 @@ <id>HWAS_STATE_CHANGED_SUBSCRIPTION_MASK</id> </attribute> <attribute> - <default> - <field> - <id>reserved</id> - <value>0</value> - </field> - <field> - <id>supportsFsiScom</id> - <value>0</value> - </field> - <field> - <id>supportsInbandScom</id> - <value>0</value> - </field> - <field> - <id>supportsXscom</id> - <value>0</value> - </field> - </default> - <id>PRIMARY_CAPABILITIES</id> - </attribute> - <attribute> <default>NX</default> <id>TYPE</id> </attribute> diff --git a/src/usr/vpd/ddimm.C b/src/usr/vpd/ddimm.C new file mode 100644 index 000000000..9c7cdc728 --- /dev/null +++ b/src/usr/vpd/ddimm.C @@ -0,0 +1,209 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/vpd/ddimm.C $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2018 */ +/* [+] 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 */ +/** + * Provides functionality related to the DDIMM package + */ + +#include <devicefw/driverif.H> +#include <targeting/common/attributes.H> +#include <vpd/vpd_if.H> +#include <errl/errlmanager.H> +#include <hwas/common/hwasCallout.H> +#include <targeting/common/predicates/predicatectm.H> +#include <config.h> +#include <initservice/initserviceif.H> +#include <vpd/vpdreasoncodes.H> +#include "spd.H" +#include <chipids.H> + +extern trace_desc_t* g_trac_vpd; + + +namespace VPD +{ + +#ifndef __HOSTBOOT_RUNTIME // No presence detection in HBRT + +/** + * @brief Performs a presence detect operation on a OCMB Chip. + * + * There is no way to access the OCMB until later in the IPL so we will + * use the existence of VPD as the only indication.. + * + * @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 ocmbPresenceDetect(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 = nullptr; + + if (unlikely(io_buflen < sizeof(bool))) + { + TRACFCOMP(g_trac_vpd, + ERR_MRK "VPD::ocmbPresenceDetect> Invalid data length: %d", + io_buflen); + /*@ + * @errortype + * @moduleid VPD::MOD_OCMBPRESENCEDETECT + * @reasoncode VPD::VPD_INVALID_LENGTH + * @userdata1 Data Length + * @userdata2 HUID of target being detected + * @devdesc ocmbPresenceDetect> Invalid data length (!= 1 bytes) + * @custdesc Firmware error during boot + */ + l_errl = + new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + VPD::MOD_OCMBPRESENCEDETECT, + VPD::VPD_INVALID_LENGTH, + TO_UINT64(io_buflen), + TARGETING::get_huid(i_target), + ERRORLOG::ErrlEntry::ADD_SW_CALLOUT); + io_buflen = 0; + return l_errl; + } + +//@TODO-RTC:196805-Add real implementation +bool l_ocmbvpd_present = true; //default to everything present for now +//------------------------------------------------------------------- +#if 0 + + // First, make sure that the i2c master exists or we can't read + // our vpd +#ifdef CONFIG_MEMVPD_READ_FROM_HW + // look up i2cMasterPath from EEPROM_VPD_PRIMARY_INFO + // check if that target exists directly via FSI + bool l_check_for_vpd = isSlavePresent(i2cMasterTarget); + +#else + // just default to yes for PNOR-based VPD + bool l_check_for_vpd = true; +#endif + + // Next, probe the VPD contents to see if we have anything + bool l_ocmbvpd_present = ...; +#endif + + +#if defined(CONFIG_MEMVPD_READ_FROM_HW) && defined(CONFIG_MEMVPD_READ_FROM_PNOR) + if( l_ocmbvpd_present ) + { + // Check if the VPD data in the PNOR matches the SEEPROM + l_errl = VPD::ensureCacheIsInSync( i_target ); + if( l_errl ) + { + // Save this plid to use later + //l_saved_plid = l_errl->plid(); + l_ocmbvpd_present = false; + + TRACFCOMP(g_trac_vpd,ERR_MRK "VPD::ocmbPresenceDetect> Error during ensureCacheIsInSync (DDIMM)" ); + errlCommit( l_errl, VPD_COMP_ID ); + } + } + else + { + // Defer invalidating DDIMM VPD in the PNOR in case another target + // might be sharing this VPD_REC_NUM. Check all targets sharing this + // VPD_REC_NUM after target discovery in VPD::validateSharedPnorCache. + // Ensure the VPD_SWITCHES cache valid bit is invalid at this point. + TARGETING::ATTR_VPD_SWITCHES_type vpdSwitches = + i_target->getAttr<TARGETING::ATTR_VPD_SWITCHES>(); + vpdSwitches.pnorCacheValid = 0; + i_target->setAttr<TARGETING::ATTR_VPD_SWITCHES>( vpdSwitches ); + } +#endif + +//------------------------------------------------------------------- + + if( l_ocmbvpd_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 + SPD::setPartAndSerialNumberAttributes( i_target ); + } + + } + memcpy(io_buffer, &l_ocmbvpd_present, sizeof(l_ocmbvpd_present)); + io_buflen = sizeof(l_ocmbvpd_present); + + return nullptr; +} + +// Register the presence detect function with the device framework +DEVICE_REGISTER_ROUTE(DeviceFW::READ, + DeviceFW::PRESENT, + TARGETING::TYPE_OCMB_CHIP, + ocmbPresenceDetect); + + +//@fixme - RTC:201996 - Collect IDEC later in the boot +errlHndl_t ocmbIDEC(DeviceFW::OperationType i_opType, + TARGETING::Target* i_target, + void* io_buffer, + size_t& io_buflen, + int64_t i_accessType, + va_list i_args) +{ + // for now just hardcode the answer to something explicitly invalid + uint8_t l_ec = INVALID__ATTR_EC; + i_target->setAttr<TARGETING::ATTR_EC>(l_ec); + i_target->setAttr<TARGETING::ATTR_HDAT_EC>(l_ec); + + // we can assume this is an Explorer chip though + uint32_t l_id = POWER_CHIPID::EXPLORER_16; + i_target->setAttr<TARGETING::ATTR_CHIP_ID>(l_id); + + return nullptr; +} + +// Register the presence detect function with the device framework +DEVICE_REGISTER_ROUTE(DeviceFW::WRITE, + DeviceFW::IDEC, + TARGETING::TYPE_OCMB_CHIP, + ocmbIDEC); + + +#endif // !__HOSTBOOT_RUNTIME + + +//Other DDIMM functions go here + + +}; //namespace VPD diff --git a/src/usr/vpd/makefile b/src/usr/vpd/makefile index 8ba3fa45e..d5637f4dc 100644 --- a/src/usr/vpd/makefile +++ b/src/usr/vpd/makefile @@ -36,7 +36,6 @@ OBJS += rtvpd_load.o SUBDIRS += test.d SUBDIRS += runtime.d - #Updated mvpd to contain VRML so that part/serial numbers can be #found for procs CCIN 54E3 BINARY_FILES += $(IMGDIR)/procmvpd.dat:65759fa4aebd2e3b42b25309504a3007b3b51036 diff --git a/src/usr/vpd/vpd.H b/src/usr/vpd/vpd.H index 7446dc491..28582d0d9 100644 --- a/src/usr/vpd/vpd.H +++ b/src/usr/vpd/vpd.H @@ -294,5 +294,16 @@ errlHndl_t getPnAndSnRecordAndKeywords( TARGETING::Target * i_target, */ void updateSerialNumberFromBMC( TARGETING::Target * i_nodetarget ); +/** + * Define useful constants for VPD code + */ + +// default invalid value for ATTR_VPD_REC_NUM +constexpr TARGETING::ATTR_VPD_REC_NUM_type INVALID__ATTR_VPD_REC_NUM = 0xFFFF; + +// default unknown EC level +constexpr TARGETING::ATTR_EC_type INVALID__ATTR_EC = 0xFF; + + }; //end VPD namespace #endif diff --git a/src/usr/vpd/vpd.mk b/src/usr/vpd/vpd.mk index b8337b989..25daaa933 100644 --- a/src/usr/vpd/vpd.mk +++ b/src/usr/vpd/vpd.mk @@ -22,6 +22,10 @@ # permissions and limitations under the License. # # IBM_PROLOG_END_TAG + +# Needed for chipids.H +EXTRAINCDIR += ${ROOTPATH}/src/import/chips/common/utils/ + # common objects with runtime OBJS += vpd_common.o OBJS += ipvpd.o @@ -31,3 +35,4 @@ OBJS += pvpd.o OBJS += dvpd.o OBJS += spd.o OBJS += errlud_vpd.o +OBJS += ddimm.o diff --git a/src/usr/vpd/vpd_common.C b/src/usr/vpd/vpd_common.C index 3c657acb5..0196b8be8 100644 --- a/src/usr/vpd/vpd_common.C +++ b/src/usr/vpd/vpd_common.C @@ -24,6 +24,7 @@ /* IBM_PROLOG_END_TAG */ #include "vpd.H" +#include <vpd/vpdreasoncodes.H> // ---------------------------------------------- // Trace definitions @@ -58,6 +59,28 @@ errlHndl_t getVpdLocation ( int64_t & o_vpdLocation, INFO_MRK"Using VPD location: %d", o_vpdLocation ); + if( o_vpdLocation == INVALID__ATTR_VPD_REC_NUM ) + { + TRACFCOMP(g_trac_vpd,ERR_MRK"getVpdLocation() Invalid VPD_REC_NUM for %.8X", + TARGETING::get_huid(i_target)); + /*@ + * @errortype + * @moduleid VPD_GET_VPD_LOCATION + * @reasoncode VPD_BAD_REC_NUM + * @userdata1 Target HUID + * @userdata2 VPD_REC_NUM + * @devdesc getVpdLocation> VPD_REC_NUM is invalid, bad MRW + * @custdesc Firmware configuration error + */ + err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, + VPD_GET_VPD_LOCATION, + VPD_BAD_REC_NUM, + TARGETING::get_huid(i_target), + INVALID__ATTR_VPD_REC_NUM, + ERRORLOG::ErrlEntry::ADD_SW_CALLOUT ); + } + TRACSSCOMP( g_trac_vpd, EXIT_MRK"getVpdLocation()" ); |