summaryrefslogtreecommitdiffstats
path: root/src/usr/hwas/common/hwas.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hwas/common/hwas.C')
-rw-r--r--src/usr/hwas/common/hwas.C117
1 files changed, 85 insertions, 32 deletions
diff --git a/src/usr/hwas/common/hwas.C b/src/usr/hwas/common/hwas.C
index 371474c17..bc42b4140 100644
--- a/src/usr/hwas/common/hwas.C
+++ b/src/usr/hwas/common/hwas.C
@@ -1724,6 +1724,22 @@ void invokePresentByAssoc()
// make one list
TargetHandleList l_funcTargetList;
+ // get the functional MCBISTs
+ TargetHandleList l_funcMCBISTTargetList;
+ getAllChiplets(l_funcMCBISTTargetList, TYPE_MCBIST, true );
+ l_funcTargetList.insert(l_funcTargetList.begin(),
+ l_funcMCBISTTargetList.begin(),
+ l_funcMCBISTTargetList.end());
+
+ // If VPO, dump targets (MCBIST) for verification & debug purposes
+ #ifdef CONFIG_VPO_COMPILE
+ HWAS_INF("invokePresentByAssoc(): MCBIST targets:");
+ for (auto l_MCBIST : l_funcMCBISTTargetList)
+ {
+ HWAS_INF(" MCBIST: HUID %.8x", TARGETING::get_huid(l_MCBIST));
+ }
+ #endif
+
// get the functional MCSs
TargetHandleList l_funcMCSTargetList;
getAllChiplets(l_funcMCSTargetList, TYPE_MCS, true );
@@ -1734,12 +1750,9 @@ void invokePresentByAssoc()
// If VPO, dump targets (MCS) for verification & debug purposes
#ifdef CONFIG_VPO_COMPILE
HWAS_INF("invokePresentByAssoc(): MCS targets:");
- for (TargetHandleList::const_iterator
- l_MCS_Itr = l_funcMCSTargetList.begin();
- l_MCS_Itr != l_funcMCSTargetList.end();
- l_MCS_Itr++)
+ for (auto l_MCS : l_funcMCSTargetList)
{
- HWAS_INF(" MCS: HUID %.8x", TARGETING::get_huid(*l_MCS_Itr));
+ HWAS_INF(" MCS: HUID %.8x", TARGETING::get_huid(l_MCS));
}
#endif
@@ -1754,12 +1767,9 @@ void invokePresentByAssoc()
// If VPO, dump targets (MEMBUF) for verification & debug purposes
#ifdef CONFIG_VPO_COMPILE
HWAS_INF("invokePresentByAssoc(): MEMBUF targets:");
- for (TargetHandleList::const_iterator
- l_MEMBUF_Itr = l_funcMembufTargetList.begin();
- l_MEMBUF_Itr != l_funcMembufTargetList.end();
- l_MEMBUF_Itr++)
+ for (auto l_MEMBUF : l_funcMembufTargetList)
{
- HWAS_INF(" MEMBUF: HUID %.8x", TARGETING::get_huid(*l_MEMBUF_Itr));
+ HWAS_INF(" MEMBUF: HUID %.8x", TARGETING::get_huid(l_MEMBUF));
}
#endif
@@ -1774,12 +1784,9 @@ void invokePresentByAssoc()
// If VPO, dump targets (MBA) for verification & debug purposes
#ifdef CONFIG_VPO_COMPILE
HWAS_INF("invokePresentByAssoc(): MBA targets:");
- for (TargetHandleList::const_iterator
- l_MBA_Itr = l_funcMBATargetList.begin();
- l_MBA_Itr != l_funcMBATargetList.end();
- l_MBA_Itr++)
+ for (auto l_MBA : l_funcMBATargetList)
{
- HWAS_INF(" MBA: HUID %.8x", TARGETING::get_huid(*l_MBA_Itr));
+ HWAS_INF(" MBA: HUID %.8x", TARGETING::get_huid(l_MBA));
}
#endif
@@ -1794,12 +1801,9 @@ void invokePresentByAssoc()
// If VPO, dump targets (MCA) for verification & debug purposes
#ifdef CONFIG_VPO_COMPILE
HWAS_INF("invokePresentByAssocDA(): MCA targets:");
- for (TargetHandleList::const_iterator
- l_MCA_Itr = l_funcMcaTargetList.begin();
- l_MCA_Itr != l_funcMcaTargetList.end();
- l_MCA_Itr++)
+ for (auto l_MCA : l_funcMcaTargetList)
{
- HWAS_INF(" MCA: HUID %.8x", TARGETING::get_huid(*l_MCA_Itr));
+ HWAS_INF(" MCA: HUID %.8x", TARGETING::get_huid(l_MCA));
}
#endif
// get the functional dimms
@@ -1813,12 +1817,9 @@ void invokePresentByAssoc()
// If VPO, dump targets (DIMM) for verification & debug purposes
#ifdef CONFIG_VPO_COMPILE
HWAS_INF("invokePresentByAssoc(): DIMM targets:");
- for (TargetHandleList::const_iterator
- l_DIMM_Itr = l_funcDIMMTargetList.begin();
- l_DIMM_Itr != l_funcDIMMTargetList.end();
- l_DIMM_Itr++)
+ for (auto l_DIMM : l_funcDIMMTargetList)
{
- HWAS_INF(" DIMM: HUID %.8x", TARGETING::get_huid(*l_DIMM_Itr));
+ HWAS_INF(" DIMM: HUID %.8x", TARGETING::get_huid(l_DIMM));
}
#endif
@@ -1873,9 +1874,11 @@ void presentByAssoc(TargetInfoVector& io_funcTargets,
std::sort(io_funcTargets.begin(), io_funcTargets.end(),
compareAffinity);
+
// Keep track of the most recently seen MCS MEMBUF and MBA. This allows the
// algorithm to quickly check if targets share a MCS or MEMBUF and used
// for backtracking after deleting a target from the vector
+ size_t l_MCBISTIndex = __INT_MAX__;
size_t l_MCSIndex = __INT_MAX__;
size_t l_MEMBUFIndex = __INT_MAX__;
size_t l_MBAIndex = __INT_MAX__;
@@ -1905,6 +1908,31 @@ void presentByAssoc(TargetInfoVector& io_funcTargets,
switch (l_curTargetInfo.type)
{
+ case TYPE_MCBIST:
+ {
+ // No Child MCSs
+ // If next is not a MCS sharing the same MCAs, deconfig MCBIST
+ if ( (l_nextTargetInfo == NULL) ||
+ (l_nextTargetInfo->type != TYPE_MCS) ||
+ !isSameSubPath(l_curTargetInfo, *l_nextTargetInfo) )
+ {
+ // Disable MCBIST - NO_CHILD_MCS
+ l_curTargetInfo.reason =
+ DeconfigGard::DECONFIGURED_BY_NO_CHILD_MCS;
+ // Add target to Deconfig vector to be deconfigured later
+ o_targToDeconfig.push_back(l_curTargetInfo);
+ // Remove target from funcTargets
+ io_funcTargets.erase(it);
+ }
+ // Update MCBIST Index
+ else
+ {
+ l_MCBISTIndex = i;
+ i++;
+ continue;
+ }
+ break;
+ }// MCBIST
case TYPE_MCS:
{
// No Child MEMBUFs or MCAs
@@ -1917,16 +1945,38 @@ void presentByAssoc(TargetInfoVector& io_funcTargets,
// Disable MCS - NO_CHILD_MEMBUF_OR_MCA
l_curTargetInfo.reason =
DeconfigGard::DECONFIGURED_BY_NO_CHILD_MEMBUF_OR_MCA;
- // Add target to Deconfig vector to be deconfigured later
- o_targToDeconfig.push_back(l_curTargetInfo);
- // Remove target from funcTargets
- io_funcTargets.erase(it);
+
+ }
+ // No Parent MCBIST
+ // If MCS doesn't share the same MCBIST as MCSIndex, deconfig MCS
+ else if ( (l_MCBISTIndex == __INT_MAX__) ||
+ !isSameSubPath(l_curTargetInfo, io_funcTargets[l_MCBISTIndex]))
+ {
+ // Disable MCS - NO_PARENT_MCBIST
+ l_curTargetInfo.reason =
+ DeconfigGard::DECONFIGURED_BY_NO_PARENT_MCBIST;
}
// Update MCS Index
else
{
l_MCSIndex = i;
i++;
+ continue;
+ }
+ // Add target to Deconfig vector to be deconfigured later
+ o_targToDeconfig.push_back(l_curTargetInfo);
+ // Remove target from funcTargets
+ io_funcTargets.erase(it);
+
+ // Backtrack to last MCBIST
+ if ( l_MCBISTIndex != __INT_MAX__ )
+ {
+ i = l_MCBISTIndex;
+ }
+ // Backtrack to beginning if no MCS has been seen yet
+ else
+ {
+ i = 0;
}
break;
} // MCS
@@ -2064,7 +2114,6 @@ void presentByAssoc(TargetInfoVector& io_funcTargets,
o_targToDeconfig.push_back(l_curTargetInfo);
// Remove target from funcTargets
io_funcTargets.erase(it);
-
// Backtrack to last MCS
if ( l_MCSIndex != __INT_MAX__ )
{
@@ -2097,7 +2146,6 @@ void presentByAssoc(TargetInfoVector& io_funcTargets,
o_targToDeconfig.push_back(l_curTargetInfo);
// Remove target from funcTargets
io_funcTargets.erase(it);
-
// Backtrack to last MBA
if ( l_MBAIndex != __INT_MAX__ )
{
@@ -2106,7 +2154,7 @@ void presentByAssoc(TargetInfoVector& io_funcTargets,
// Backtrack to last MCA
else if ( l_MCAIndex != __INT_MAX__)
{
- i = l_MCSIndex;
+ i = l_MCAIndex;
}
// Backtrack to last MEMBUF if no MBA has been seen yet
else if ( l_MEMBUFIndex != __INT_MAX__)
@@ -2118,6 +2166,11 @@ void presentByAssoc(TargetInfoVector& io_funcTargets,
{
i = l_MCSIndex;
}
+ // Backtrack to last MCS if no MEMBUF has been seen yet
+ else if ( l_MCBISTIndex != __INT_MAX__)
+ {
+ i = l_MCBISTIndex;
+ }
// Backtrack to beginning if no MCS has been seen yet
else
{
OpenPOWER on IntegriCloud