summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/build/simics/hb-pnor-vpd-preload.pl8
-rw-r--r--src/include/usr/hwas/common/hwas.H17
-rw-r--r--src/usr/fapi2/test/fapi2GetChildrenTest.H16
-rw-r--r--src/usr/fapi2/test/fapi2TestUtils.H3
-rw-r--r--src/usr/hwas/HBconfig4
-rw-r--r--src/usr/hwas/common/deconfigGard.C12
-rw-r--r--src/usr/hwas/common/hwas.C213
-rw-r--r--src/usr/hwas/test/hwas1test.H67
-rw-r--r--src/usr/vpd/ipvpd.C18
-rw-r--r--src/usr/vpd/makefile2
10 files changed, 252 insertions, 108 deletions
diff --git a/src/build/simics/hb-pnor-vpd-preload.pl b/src/build/simics/hb-pnor-vpd-preload.pl
index 25a1c5a24..f82cca728 100755
--- a/src/build/simics/hb-pnor-vpd-preload.pl
+++ b/src/build/simics/hb-pnor-vpd-preload.pl
@@ -306,11 +306,15 @@ sub createMVPDData
{
$sourceFile = "$dataPath/$mvpdFile";
}
+
+ debugMsg( "Using source $sourceFile for machine $machine\n" );
}
else
{
# No processor, use empty data chunk.
$sourceFile = $emptyMVPD;
+
+ debugMsg( "Using source $sourceFile\n" );
}
$result = `dd if=$sourceFile of=$sysMVPDFile conv=notrunc oflag=append 2>&1 1>/dev/null`;
@@ -377,6 +381,8 @@ sub createCVPDData
$sourceFile = $emptyMemVPD;
}
+ debugMsg( "Using source $sourceFile\n" );
+
$result = `dd if=$sourceFile of=$sysMemVPDFile conv=notrunc oflag=append 2>&1 1>/dev/null`;
if( $? )
{
@@ -439,6 +445,8 @@ sub createSPDData
$sourceFile = $emptySPD;
}
+ debugMsg( "Using source $sourceFile\n" );
+
$result = `dd if=$sourceFile of=$sysSPDFile conv=notrunc oflag=append 2>&1 1>/dev/null`;
if( $? )
{
diff --git a/src/include/usr/hwas/common/hwas.H b/src/include/usr/hwas/common/hwas.H
index 2a6d59ed9..8dafb39ae 100644
--- a/src/include/usr/hwas/common/hwas.H
+++ b/src/include/usr/hwas/common/hwas.H
@@ -81,31 +81,36 @@ errlHndl_t initHardware();
errlHndl_t discoverTargets();
/**
- * @brief restrictEXunits Internal HWAS function to restrict the EXs
+ * @brief restrictECunits Internal HWAS function to restrict the ECs
*
- * This routine will walk through the procs in the list, and turn EX
+ * This routine will walk through the procs in the list, and turn EC
* units to not functional if the number of units is larger than the max
* given. This is used for PR keyword and Field Core Override (FCO)
* processing.
*
* @param[in] i_procRestrict vector of procRestrict entries
* @param[in] i_present boolean for 'present' HWAS value for restricted
- * EX units
+ * EC units
* @param[in] i_deconfigReason DECONFIGURED_BY_ enum or 0
*
* @return errlHndl_t valid errlHndl_t handle if there was an error
* NULL if no errors;
*/
-// structure used to store proc information for EX restrict processing
+// Maximum number of EXs per proc
+#define NUM_EX_PER_EQ 2
+#define NUM_EQ_PER_CHIP 6
+#define NUM_EX_PER_CHIP (NUM_EX_PER_EQ * NUM_EQ_PER_CHIP)
+
+// structure used to store proc information for EC restrict processing
typedef struct {
TARGETING::TargetHandle_t target; // proc target
uint32_t group; // uniq id for this group - ie: FRUID, node
- uint32_t maxEXs; // max EX units for this group
+ uint32_t maxECs; // max EC units for this group
uint8_t procs; // number of procs in the group
} procRestrict_t;
-errlHndl_t restrictEXunits(
+errlHndl_t restrictECunits(
std::vector <procRestrict_t> &i_procRestrict,
const bool i_present,
const uint32_t i_deconfigReason);
diff --git a/src/usr/fapi2/test/fapi2GetChildrenTest.H b/src/usr/fapi2/test/fapi2GetChildrenTest.H
index 855028cb5..ddcf1f9ae 100644
--- a/src/usr/fapi2/test/fapi2GetChildrenTest.H
+++ b/src/usr/fapi2/test/fapi2GetChildrenTest.H
@@ -142,10 +142,11 @@ void test_fapi2GetChildren()
// l_actualSize = l_childMCAs.size();
//
// //Set expected size to be the number of MCAs per MCBIST
-// l_expectedSize = 2;
+// l_expectedSize = MCA_PER_MCS * MCS_PER_PROC / MCBIST_PER_PROC;
// numTests++;
// if(l_actualSize != l_expectedSize)
// {
+// FAPI_INF("fapi2TargetTest:: MCAs per MCBIST mismatch");
// numFails++;
// break;
// }
@@ -159,6 +160,7 @@ void test_fapi2GetChildren()
numTests++;
if(l_actualSize != l_expectedSize)
{
+ FAPI_INF("fapi2TargetTest:: present cores per proc mismatch");
numFails++;
break;
}
@@ -168,10 +170,11 @@ void test_fapi2GetChildren()
l_actualSize = l_childCores.size();
//Set expected size to be the number of cores per proc
- l_expectedSize = 1;
+ l_expectedSize = EQ_PER_PROC * EX_PER_EQ * CORE_PER_EX;
numTests++;
if(l_actualSize != l_expectedSize)
{
+ FAPI_INF("fapi2TargetTest:: functional cores per proc mismatch");
numFails++;
break;
}
@@ -180,11 +183,12 @@ void test_fapi2GetChildren()
l_targetHuid = TARGETING::get_huid(l_nimbusProc) ;
l_actualSize = l_childMCAs.size();
- //Set expected size to be the number of cores per proc
- l_expectedSize = 8;
+ //Set expected size to be the number of MCAs per proc
+ l_expectedSize = MCA_PER_MCS * MCS_PER_PROC;
numTests++;
if(l_actualSize != l_expectedSize)
{
+ FAPI_INF("fapi2TargetTest:: MCAs per proc mismatch");
numFails++;
break;
}
@@ -198,6 +202,7 @@ void test_fapi2GetChildren()
numTests++;
if(l_actualSize != l_expectedSize)
{
+ FAPI_INF("fapi2TargetTest:: cores per EX mismatch");
numFails++;
break;
}
@@ -211,6 +216,7 @@ void test_fapi2GetChildren()
numTests++;
if(l_actualSize != l_expectedSize)
{
+ FAPI_INF("fapi2TargetTest:: cores per EQ mismatch");
numFails++;
break;
}
@@ -379,6 +385,7 @@ void test_fapi2GetChildren()
if(candidateTarget == NULL)
{
+ FAPI_INF("fapi2TargetTest:: candidateTarget not found");
numFails++;
break;
}
@@ -392,6 +399,7 @@ void test_fapi2GetChildren()
if(l_actualSize != l_expectedSize)
{
+ FAPI_INF("fapi2TargetTest:: children of pervasive mismatch");
numFails++;
break;
}
diff --git a/src/usr/fapi2/test/fapi2TestUtils.H b/src/usr/fapi2/test/fapi2TestUtils.H
index c2f6d2649..8fb194c1e 100644
--- a/src/usr/fapi2/test/fapi2TestUtils.H
+++ b/src/usr/fapi2/test/fapi2TestUtils.H
@@ -36,6 +36,9 @@
#define EQ_PER_PROC 6
#define EX_PER_EQ 2
#define CORE_PER_EX 2
+#define MCS_PER_PROC 4
+#define MCA_PER_MCS 2
+#define MCBIST_PER_PROC 2
#include <fapi2.H>
diff --git a/src/usr/hwas/HBconfig b/src/usr/hwas/HBconfig
index f20bab8d1..371bca3b0 100644
--- a/src/usr/hwas/HBconfig
+++ b/src/usr/hwas/HBconfig
@@ -1,7 +1,7 @@
-config SKIP_RESTRICT_EX_UNITS
+config SKIP_RESTRICT_EC_UNITS
default n
help
- Skip restricting the number of ex/cores based on PR keyword
+ Skip restricting the number of ec/cores based on PR keyword
config NO_GARD_SUPPORT
default n
diff --git a/src/usr/hwas/common/deconfigGard.C b/src/usr/hwas/common/deconfigGard.C
index 5e08ed095..8071d7df5 100644
--- a/src/usr/hwas/common/deconfigGard.C
+++ b/src/usr/hwas/common/deconfigGard.C
@@ -752,7 +752,7 @@ errlHndl_t DeconfigGard::processFieldCoreOverride()
std::sort(pProcList.begin(), pProcList.end(),
compareTargetHuid);
- // create list for restrictEXunits() function
+ // create list for restrictECunits() function
procRestrict_t l_procEntry;
std::vector <procRestrict_t> l_procRestrictList;
for (TargetHandleList::const_iterator
@@ -764,22 +764,22 @@ errlHndl_t DeconfigGard::processFieldCoreOverride()
const TargetHandle_t pProc = *pProc_it;
// save info so that we can
- // restrict the number of EX units
+ // restrict the number of EC units
HWAS_DBG("pProc %.8X - pushing to proclist",
get_huid(pProc));
l_procEntry.target = pProc;
l_procEntry.group = 0;
l_procEntry.procs = pProcList.size();
- l_procEntry.maxEXs = l_fco;
+ l_procEntry.maxECs = l_fco;
l_procRestrictList.push_back(l_procEntry);
} // for pProc_it
- // restrict the EX units; units turned off are marked
+ // restrict the EC units; units turned off are marked
// present=true, functional=false, and marked with the
// appropriate deconfigure code.
- HWAS_INF("FCO: calling restrictEXunits with %d entries",
+ HWAS_INF("FCO: calling restrictECunits with %d entries",
l_procRestrictList.size());
- l_pErr = restrictEXunits(l_procRestrictList,
+ l_pErr = restrictECunits(l_procRestrictList,
true, DECONFIGURED_BY_FIELD_CORE_OVERRIDE);
if (l_pErr)
{
diff --git a/src/usr/hwas/common/hwas.C b/src/usr/hwas/common/hwas.C
index 064563a1b..2b7f584c2 100644
--- a/src/usr/hwas/common/hwas.C
+++ b/src/usr/hwas/common/hwas.C
@@ -52,7 +52,6 @@
#include <hwas/common/hwas_reasoncodes.H>
#include <targeting/common/utilFilter.H>
-
namespace HWAS
{
@@ -364,16 +363,16 @@ errlHndl_t discoverTargets()
l_procEntry.group = pTarget->getAttr<ATTR_FRU_ID>();
l_procEntry.procs =
(prData[7] & VPD_VINI_PR_B7_MASK) + 1;
- l_procEntry.maxEXs = l_procEntry.procs *
+ l_procEntry.maxECs = l_procEntry.procs *
(prData[2] & VPD_VINI_PR_B2_MASK)
>> VPD_VINI_PR_B2_SHIFT;
l_procPRList.push_back(l_procEntry);
- if (l_procEntry.maxEXs == 0)
+ if (l_procEntry.maxECs == 0)
{
// this is PROBABLY bad PR, so YELL...
HWAS_ERR("pTarget %.8X - PR VPD says 0 CORES",
- pTarget->getAttr<ATTR_HUID>());
+ pTarget->getAttr<ATTR_HUID>());
}
}
}
@@ -443,17 +442,17 @@ errlHndl_t discoverTargets()
}
}
- // PR keyword processing - potentially reduce the number of ex/core
+ // PR keyword processing - potentially reduce the number of ec/core
// units that are functional based on what's in the PR keyword.
- // call to restrict EX units, marking bad units as present=false;
+ // call to restrict EC units, marking bad units as present=false;
// deconfigReason = 0 because present is false so this is not a
// deconfigured event.
-#ifndef CONFIG_SKIP_RESTRICT_EX_UNITS
- errl = restrictEXunits(l_procPRList, false, 0);
+#ifndef CONFIG_SKIP_RESTRICT_EC_UNITS
+ errl = restrictECunits(l_procPRList, false, 0);
if (errl)
{
- HWAS_ERR("discoverTargets: restrictEXunits failed");
+ HWAS_ERR("discoverTargets: restrictECunits failed");
break;
}
#endif
@@ -922,16 +921,14 @@ bool isDescFunctional(const TARGETING::TargetHandle_t &i_desc,
-errlHndl_t restrictEXunits(
+errlHndl_t restrictECunits(
std::vector <procRestrict_t> &i_procList,
const bool i_present,
const uint32_t i_deconfigReason)
{
- HWAS_INF("restrictEXunits entry, %d elements", i_procList.size());
+ HWAS_INF("restrictECunits entry, %d elements", i_procList.size());
errlHndl_t errl = NULL;
- // @todo RTC:145459 - P9 changes for PR core restriction
- return errl;
// sort by group so PROC# are in the right groupings.
std::sort(i_procList.begin(), i_procList.end(),
compareProcGroup);
@@ -946,20 +943,23 @@ errlHndl_t restrictEXunits(
{
// determine the number of procs we should enable
uint8_t procs = i_procList[procIdx].procs;
- uint32_t maxEXs = i_procList[procIdx].maxEXs;
+ uint32_t maxECs = i_procList[procIdx].maxECs;
// this procs number, used to determine groupings
uint32_t thisGroup = i_procList[procIdx].group;
- HWAS_INF("procRestrictList[%d] - maxEXs %d, procs %d, group %d",
- procIdx, maxEXs, procs, thisGroup);
+ HWAS_INF("procRestrictList[%d] - maxECs %d, procs %d, group %d",
+ procIdx, maxECs, procs, thisGroup);
- // exs and iters for each proc in this vpd set
+ // exs, ecs, and iters for each proc in this vpd set
TargetHandleList pEXList[procs];
TargetHandleList::const_iterator pEX_it[procs];
+ TargetHandleList pECList[procs][NUM_EX_PER_CHIP];
+ TargetHandleList::const_iterator pEC_it[procs][NUM_EX_PER_CHIP];
// find the proc's that we think are in this group
- uint32_t currentEXs = 0;
+ uint32_t currentPairedECs = 0;
+ uint32_t currentSingleECs = 0;
for (uint32_t i = 0; i < procs; ) // increment in loop
{
TargetHandle_t pProc = i_procList[procIdx].target;
@@ -988,13 +988,47 @@ errlHndl_t restrictEXunits(
// sort the list by ATTR_HUID to ensure that we
// start at the same place each time
std::sort(pEXList[i].begin(), pEXList[i].end(),
- compareTargetHuid);
+ compareTargetHuid);
// keep a pointer into that list
pEX_it[i] = pEXList[i].begin();
- // keep local count of current functional EX units
- currentEXs += pEXList[i].size();
+ for (uint32_t j = 0;
+ (j < NUM_EX_PER_CHIP) && (pEX_it[i] != pEXList[i].end());
+ j++)
+ {
+ TargetHandle_t pEX = *(pEX_it[i]);
+
+ // get this EX's (CHILD) functional EC/core units
+ getChildChiplets(pECList[i][j], pEX,
+ TYPE_CORE, true);
+
+ if (!pECList[i][j].empty())
+ {
+ // sort the list by ATTR_HUID to ensure that we
+ // start at the same place each time
+ std::sort(pECList[i][j].begin(), pECList[i][j].end(),
+ compareTargetHuid);
+
+ // keep a pointer into that list
+ pEC_it[i][j] = pECList[i][j].begin();
+
+ // keep local count of current functional EC units
+ if (pECList[i][j].size() == 2)
+ {
+ // track ECs that can make a fused-core pair
+ currentPairedECs += pECList[i][j].size();
+ }
+ else
+ {
+ // track ECs without a pair for a fused-core
+ currentSingleECs += pECList[i][j].size();
+ }
+ }
+
+ // go to next EX
+ (pEX_it[i])++;
+ } // for j < NUM_EX_PER_CHIP
// go to next proc
i++;
@@ -1008,88 +1042,99 @@ errlHndl_t restrictEXunits(
// advance the outer loop as well since we're doing these
// procs together
++procIdx;
- } // for
+ } // for i < procs
- if (currentEXs <= maxEXs)
+ if ((currentPairedECs + currentSingleECs) <= maxECs)
{
// we don't need to restrict - we're done with this group.
- HWAS_DBG("currentEXs %d <= maxEXs %d -- done",
- currentEXs, maxEXs);
+ HWAS_DBG("currentECs %d <= maxECs %d -- done",
+ (currentPairedECs + currentSingleECs), maxECs);
continue;
}
- HWAS_DBG("currentEXs %d > maxEXs %d -- restricting!",
- currentEXs, maxEXs);
-
- // now need to find EX units that stay function, going
- // across the list of units for each proc we have, until
- // we get to the max or run out of EXs.
- uint8_t procs_remaining = procs;
- uint32_t goodEXs = 0;
- HWAS_DBG("procs %d maxEXs %d", procs, maxEXs);
- do
+ HWAS_DBG("currentECs %d > maxECs %d -- restricting!",
+ (currentPairedECs + currentSingleECs), maxECs);
+
+ // now need to find EC units that stay functional, going
+ // across the list of units for each proc and EX we have,
+ // until we get to the max or run out of ECs, giving
+ // preference to paired ECs and if we are in fused mode
+ // excluding single, non-paired ECs.
+
+ // Use as many paired ECs as we can up to maxECs
+ uint32_t pairedECs_remaining =
+ (maxECs < currentPairedECs) ? maxECs : currentPairedECs;
+ // If not in fused mode, use single ECs as needed to get to maxECs
+ uint32_t singleECs_remaining =
+ ((maxECs > currentPairedECs) && !is_fused_mode())
+ ? (maxECs - currentPairedECs) : 0;
+ uint32_t goodECs = 0;
+ HWAS_DBG("procs %d maxECs %d", procs, maxECs);
+
+ // Each pECList has ECs for a given EX and proc. Check each EC list to
+ // determine if it has an EC pair or a single EC and if the remaining
+ // count indicates the given EC from that list is to stay functional.
+
+ // Cycle through the procs
+ for (uint32_t i = 0; i < procs; i++)
{
- // now cycle thru the procs, stopping when we either hit
- // the end, or when we hit our maxEXs limit
- for (uint32_t i = 0;(i < procs) && (goodEXs < maxEXs);i++)
+ // Cycle through the EXs for this proc
+ for (uint32_t j = 0; j < NUM_EX_PER_CHIP; j++)
{
- // if we have EX units still to process
- // from this processor
- if (pEX_it[i] != pEXList[i].end())
+ // Walk through the EC list from this EX
+ while (pEC_it[i][j] != pECList[i][j].end())
{
- // got a functional EX
- goodEXs++;
- HWAS_DBG("pEX %.8X - is good %d!",
- (*(pEX_it[i]))->getAttr<ATTR_HUID>(), goodEXs);
-
- (pEX_it[i])++; // next ex/core in this proc's list
-
- // check to see if we just hit the end of the list
- if (pEX_it[i] == pEXList[i].end())
+ // Check if EC pair for this EX
+ if ((pECList[i][j].size() == 2) &&
+ (pairedECs_remaining != 0))
{
- procs_remaining--;
- continue;
+ // got a functional EC that is part of a pair
+ goodECs++;
+ pairedECs_remaining--;
+ HWAS_DBG("pEC %.8X - is good %d!",
+ (*(pEC_it[i][j]))->getAttr<ATTR_HUID>(),
+ goodECs);
+ }
+ // Check if single EC for this EX
+ else if ((pECList[i][j].size() == 1) &&
+ (singleECs_remaining != 0))
+ {
+ // got a functional EC without a pair
+ goodECs++;
+ singleECs_remaining--;
+ HWAS_DBG("pEC %.8X - is good %d!",
+ (*(pEC_it[i][j]))->getAttr<ATTR_HUID>(),
+ ++goodECs);
+ }
+ // Otherwise paired or single EC, but not needed for maxECs
+ else
+ {
+ // got an EC to be restricted and marked not functional
+ TargetHandle_t l_pEC = *(pEC_it[i][j]);
+ enableHwasState(l_pEC, i_present,
+ false, i_deconfigReason);
+ HWAS_INF("pEC %.8X - marked %spresent,"
+ " NOT functional",
+ l_pEC->getAttr<ATTR_HUID>(),
+ i_present ? "" : "NOT ");
}
- }
- } // for
- }
- while ((goodEXs < maxEXs) && (procs_remaining != 0));
- // now mark the rest of the EXs as non-functional
- for (uint32_t i = 0;i < procs;i++)
- {
- // walk thru the rest of the EX list
- while (pEX_it[i] != pEXList[i].end())
- {
- TargetHandle_t l_pEX = *(pEX_it[i]);
- enableHwasState(l_pEX, i_present, false, i_deconfigReason);
- HWAS_INF("pEX %.8X - marked %spresent, NOT functional",
- l_pEX->getAttr<ATTR_HUID>(),
- i_present ? "" : "NOT ");
-
- // now need to mark the child CORE
- TargetHandleList pCoreList;
- getChildChiplets(pCoreList, l_pEX, TYPE_CORE, true);
- enableHwasState(pCoreList[0], i_present, false,
- i_deconfigReason);
- HWAS_INF("pCore %.8X - marked %spresent, NOT functional",
- l_pEX->getAttr<ATTR_HUID>(),
- i_present ? "" : "NOT ");
- (pEX_it[i])++; // next ex/core in this proc's list
- }
- } // for making remaining non-functional
+ (pEC_it[i][j])++; // next ec in this ex's list
+ } // while pEC_it[i][j] != pECList[i][j].end()
+ } // for j < NUM_EX_PER_CHIP
+ } // for i < procs
} // for procIdx < l_ProcCount
if (errl)
{
- HWAS_INF("restrictEXunits failed (plid 0x%X)", errl->plid());
+ HWAS_INF("restrictECunits failed (plid 0x%X)", errl->plid());
}
else
{
- HWAS_INF("restrictEXunits completed successfully");
+ HWAS_INF("restrictECunits completed successfully");
}
return errl;
-} // restrictEXunits
+} // restrictECunits
void checkCriticalResources(uint32_t & io_commonPlid,
@@ -1339,9 +1384,9 @@ errlHndl_t checkMinimumHardware(const TARGETING::ConstTargetHandle_t i_nodeOrSys
else
{
// we have a Master Proc and it's functional
- // check for at least 1 functional ex/core on Master Proc
+ // check for at least 1 functional ec/core on Master Proc
TargetHandleList l_cores;
- PredicateCTM l_core(CLASS_UNIT, TYPE_EX);
+ PredicateCTM l_core(CLASS_UNIT, TYPE_CORE);
PredicatePostfixExpr l_coresFunctional;
l_coresFunctional.push(&l_core).push(&l_functional).And();
targetService().getAssociated(l_cores, l_pMasterProc,
diff --git a/src/usr/hwas/test/hwas1test.H b/src/usr/hwas/test/hwas1test.H
index b6aad2fa2..1f24dadd0 100644
--- a/src/usr/hwas/test/hwas1test.H
+++ b/src/usr/hwas/test/hwas1test.H
@@ -1236,6 +1236,73 @@ public:
TS_TRACE( "testHWASisDescFunctional exit" );
}
+ /**
+ * @brief test restrictECunits
+ */
+ void testHWASrestrictECunits()
+ {
+ using namespace HWAS;
+ using namespace TARGETING;
+
+ errlHndl_t errl = NULL;
+
+ // list of procs and data that we'll need to look at the PR keyword
+ procRestrict_t l_procEntry;
+ std::vector <procRestrict_t> l_procPRList;
+
+ // Get list of present targets with type PROC
+ TargetHandleList pCheckPres;
+ getAllChips( pCheckPres, TYPE_PROC, true );
+
+ for (TargetHandleList::const_iterator pTarget_it = pCheckPres.begin();
+ pTarget_it != pCheckPres.end();
+ ++pTarget_it
+ )
+ {
+ TargetHandle_t pTarget = *pTarget_it;
+
+ // read the PR keywords that we need, so that if
+ // we have errors, we can handle them as approprite.
+ uint8_t prData[VPD_VINI_PR_DATA_LENGTH/sizeof(uint8_t)];
+ bzero(prData, sizeof(prData));
+ errl = platReadPR(pTarget, prData);
+ if (errl != NULL)
+ { // read of PR keyword failed
+ TS_FAIL("testHWASrestrictECunits>"
+ "pTarget %.8X - read PR failed - bad",
+ pTarget->getAttr<ATTR_HUID>());
+ }
+ else
+ {
+ // save info so that we can
+ // process the PR keyword after this loop
+ l_procEntry.target = pTarget;
+ l_procEntry.group = pTarget->getAttr<ATTR_FRU_ID>();
+ l_procEntry.procs = (prData[7] & VPD_VINI_PR_B7_MASK) + 1;
+ l_procEntry.maxECs = l_procEntry.procs *
+ (prData[2] & VPD_VINI_PR_B2_MASK) >> VPD_VINI_PR_B2_SHIFT;
+ l_procPRList.push_back(l_procEntry);
+
+ if (l_procEntry.maxECs == 0)
+ {
+ // this is PROBABLY bad PR, so YELL...
+ TS_FAIL("testHWASrestrictECunits>"
+ "pTarget %.8X - PR VPD says 0 CORES",
+ pTarget->getAttr<ATTR_HUID>());
+ }
+ }
+ } // for pTarget_it
+
+ // Call restrictECunits
+ errl = restrictECunits(l_procPRList, false, 0);
+ if (errl != NULL)
+ { // restrict EC units failed
+ TS_FAIL("testHWASrestrictECunits> - restrict EC units failed");
+ }
+
+ TS_TRACE( "testHWASrestrictECunits exit" );
+ }
+
};
#endif //
diff --git a/src/usr/vpd/ipvpd.C b/src/usr/vpd/ipvpd.C
index e148bc970..8067d24a5 100644
--- a/src/usr/vpd/ipvpd.C
+++ b/src/usr/vpd/ipvpd.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2015 */
+/* Contributors Listed Below - COPYRIGHT 2013,2016 */
/* [+] Google Inc. */
/* [+] International Business Machines Corp. */
/* */
@@ -1435,7 +1435,9 @@ errlHndl_t IpVpdFacade::retrieveKeyword ( const char * i_keywordName,
errlHndl_t err = NULL;
TRACSSCOMP( g_trac_vpd,
- ENTER_MRK"IpVpdFacade::retrieveKeyword()" );
+ ENTER_MRK"IpVpdFacade::retrieveKeyword(%s, %s, . . .)",
+ i_keywordName,
+ i_recordName );
do
{
@@ -1641,7 +1643,9 @@ errlHndl_t IpVpdFacade::fetchDataFromPnor ( uint64_t i_byteAddr,
{
errlHndl_t err = NULL;
TRACSSCOMP( g_trac_vpd,
- ENTER_MRK"IpVpdFacade::fetchDataFromPnor()" );
+ ENTER_MRK"IpVpdFacade::fetchDataFromPnor(%ld, %d, . . .)",
+ i_byteAddr,
+ i_numBytes );
do
{
// Call a function in the common VPD code
@@ -1679,7 +1683,9 @@ errlHndl_t IpVpdFacade::fetchDataFromEeprom ( uint64_t i_byteAddr,
{
errlHndl_t err = NULL;
TRACSSCOMP( g_trac_vpd,
- ENTER_MRK"IpVpdFacade::fetchDataFromEeprom()" );
+ ENTER_MRK"IpVpdFacade::fetchDataFromEeprom(%ld, %d, . . .)",
+ i_byteAddr,
+ i_numBytes );
do
{
@@ -1724,7 +1730,9 @@ errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName,
int matchesFound = 0;
TRACSSCOMP( g_trac_vpd,
- ENTER_MRK"IpVpdFacade::findKeywordAddr()" );
+ ENTER_MRK"IpVpdFacade::findKeywordAddr(%s, %s, . . .)",
+ i_keywordName,
+ i_recordName );
do
{
diff --git a/src/usr/vpd/makefile b/src/usr/vpd/makefile
index 482d927ff..2f044d3d5 100644
--- a/src/usr/vpd/makefile
+++ b/src/usr/vpd/makefile
@@ -41,7 +41,7 @@ BINARY_FILES = $(IMGDIR)/dimmspd.dat:3a9f53e3684e57401ed0aed75f25980fca99f40b
#found for procs CCIN 54E3
BINARY_FILES += $(IMGDIR)/procmvpd.dat:65759fa4aebd2e3b42b25309504a3007b3b51036
BINARY_FILES += $(IMGDIR)/procmvpd_ven.dat:dd8507bec946283260f82af212ed32feaeb3363a
-BINARY_FILES += $(IMGDIR)/procmvpd_p9n.dat:c459021cad3335d42274fbf151ecd3647d0df578
+BINARY_FILES += $(IMGDIR)/procmvpd_p9n.dat:99dcbae6e8900149e9d4378cfc15667586a4e363
#Update to Centaur DD2.0 for CCIN 31E8
OpenPOWER on IntegriCloud