summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2018-11-06 15:52:36 -0600
committerNicholas E. Bofferding <bofferdn@us.ibm.com>2018-12-13 18:18:52 -0600
commit552d96423109ce112513f493edd286f708d9df19 (patch)
treec9a36b2a725d638fbe8a2128f374a9455b99b878 /src
parent1851aa0056c54576d3b328f7b1c9070262857eb0 (diff)
downloadtalos-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.H46
-rw-r--r--src/include/usr/vpd/vpdreasoncodes.H10
-rw-r--r--src/usr/fsi/fsipres.C6
-rw-r--r--src/usr/hwas/hwasPlat.C50
-rw-r--r--src/usr/targeting/common/xmltohb/target_types.xml87
-rw-r--r--src/usr/vpd/ddimm.C209
-rw-r--r--src/usr/vpd/makefile1
-rw-r--r--src/usr/vpd/vpd.H11
-rw-r--r--src/usr/vpd/vpd.mk5
-rw-r--r--src/usr/vpd/vpd_common.C23
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()" );
OpenPOWER on IntegriCloud