summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBilicon Patil <bilpatil@in.ibm.com>2013-01-03 08:18:31 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-01-14 11:35:04 -0600
commit8bbea08d4ffa53d978fcb4cdbce9d2b94f08b469 (patch)
treefd722e2556991c787ece5297c63f90ca98917ff8 /src
parentd5128c2b9a065f89f2c3b2b105bd9d7647e0a9f2 (diff)
downloadtalos-hostboot-8bbea08d4ffa53d978fcb4cdbce9d2b94f08b469.tar.gz
talos-hostboot-8bbea08d4ffa53d978fcb4cdbce9d2b94f08b469.zip
Refactoring the DMI eRepair restore code and makefile changes
Change-Id: I9c275a010b2767d45fa20ee984c9272a142f6c3c RTC: 60615 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/2803 Tested-by: Jenkins Server Reviewed-by: Brian H. Horton <brianh@linux.ibm.com> Reviewed-by: Zane Shelley <zshelle@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/makefile3
-rw-r--r--src/usr/hwpf/hwp/dmi_training/dmi_training.C134
-rw-r--r--src/usr/hwpf/hwp/erepairAccessorHwpFuncs.C820
-rw-r--r--src/usr/hwpf/hwp/io_restore_erepair/makefile46
-rw-r--r--src/usr/hwpf/hwp/io_restore_erepair/restore.mk29
-rw-r--r--src/usr/hwpf/hwp/makefile6
6 files changed, 337 insertions, 701 deletions
diff --git a/src/makefile b/src/makefile
index a5e788bc5..b401632f7 100644
--- a/src/makefile
+++ b/src/makefile
@@ -58,8 +58,7 @@ EXTENDED_MODULES = targeting ecmddatabuffer fapi hwp plat \
core_activate dram_initialization edi_ei_initialization \
establish_system_smp \
nest_chiplets start_payload thread_activate slave_sbe \
- attn runtime ibscom \
- io_restore_erepair
+ attn runtime ibscom
TESTCASE_MODULES = cxxtest testtrace testerrl testdevicefw testsyslib \
testscom testxscom testtargeting testinitservice testkernel \
diff --git a/src/usr/hwpf/hwp/dmi_training/dmi_training.C b/src/usr/hwpf/hwp/dmi_training/dmi_training.C
index 719c5eca3..2515e393d 100644
--- a/src/usr/hwpf/hwp/dmi_training/dmi_training.C
+++ b/src/usr/hwpf/hwp/dmi_training/dmi_training.C
@@ -1,26 +1,25 @@
-/* IBM_PROLOG_BEGIN_TAG
- * This is an automatically generated prolog.
- *
- * $Source: src/usr/hwpf/hwp/dmi_training/dmi_training.C $
- *
- * IBM CONFIDENTIAL
- *
- * COPYRIGHT International Business Machines Corp. 2012
- *
- * p1
- *
- * Object Code Only (OCO) source materials
- * Licensed Internal Code Source Materials
- * IBM HostBoot Licensed Internal Code
- *
- * The source code for this program is not published or other-
- * wise divested of its trade secrets, irrespective of what has
- * been deposited with the U.S. Copyright Office.
- *
- * Origin: 30
- *
- * IBM_PROLOG_END_TAG
- */
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/hwpf/hwp/dmi_training/dmi_training.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
/**
* @file dmi_training.C
@@ -496,33 +495,32 @@ void* call_dmi_erepair( void *io_pArgs )
l_fapi_endp1_target,
l_endp1_txFaillanes,
l_endp1_rxFaillanes);
- }
-
- if(l_errPtr)
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ if(l_errPtr)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
"ERROR 0x%.8X : io_restore_erepair HWP"
"( mcs 0x%x, mem 0x%x ) ",
l_errPtr->reasonCode(),
l_mcsNum,
l_memNum);
- /*@
- * @errortype
- * @reasoncode ISTEP_DMI_DRIVE_RESTORE_FAILED
- * @severity ERRL_SEV_UNRECOVERABLE
- * @moduleid ISTEP_DMI_IO_RESTORE_EREPAIR
- * @userdata1 bytes 0-1: plid identifying first error
- * bytes 2-3: reason code of first error
- * @userdata2 bytes 0-1: total number of elogs included
- * bytes 2-3: N/A
- * @devdesc call to io_restore_erepair has failed
- */
- l_StepError.addErrorDetails(ISTEP_DMI_DRIVE_RESTORE_FAILED,
- ISTEP_DMI_IO_RESTORE_EREPAIR,
- l_errPtr);
+ /*@
+ * @errortype
+ * @reasoncode ISTEP_DMI_DRIVE_RESTORE_FAILED
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @moduleid ISTEP_DMI_IO_RESTORE_EREPAIR
+ * @userdata1 bytes 0-1: plid identifying first error
+ * bytes 2-3: reason code of first error
+ * @userdata2 bytes 0-1: total number of elogs included
+ * bytes 2-3: N/A
+ * @devdesc call to io_restore_erepair has failed
+ */
+ l_StepError.addErrorDetails(ISTEP_DMI_DRIVE_RESTORE_FAILED,
+ ISTEP_DMI_IO_RESTORE_EREPAIR,
+ l_errPtr);
- errlCommit(l_errPtr, HWPF_COMP_ID);
- break;
+ errlCommit(l_errPtr, HWPF_COMP_ID);
+ break;
+ }
}
if(l_endp2_txFaillanes.size() || l_endp2_rxFaillanes.size())
@@ -542,39 +540,33 @@ void* call_dmi_erepair( void *io_pArgs )
l_fapi_endp2_target,
l_endp2_txFaillanes,
l_endp2_rxFaillanes);
- }
-
- if (l_errPtr)
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "ERROR 0x%.8X : io_restore_erepair HWP"
+ if (l_errPtr)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR 0x%.8X : io_restore_erepair HWP"
"( mcs 0x%x, mem 0x%x ) ",
l_errPtr->reasonCode(),
l_mcsNum,
l_memNum);
- /*@
- * @errortype
- * @reasoncode ISTEP_DMI_RECEIVE_RESTORE_FAILED
- * @severity ERRL_SEV_UNRECOVERABLE
- * @moduleid ISTEP_DMI_IO_RESTORE_EREPAIR
- * @userdata1 bytes 0-1: plid identifying first error
- * bytes 2-3: reason code of first error
- * @userdata2 bytes 0-1: total number of elogs included
- * bytes 2-3: N/A
- * @devdesc call to io_restore_erepair has failed
- */
- l_StepError.addErrorDetails(ISTEP_DMI_RECEIVE_RESTORE_FAILED,
- ISTEP_DMI_IO_RESTORE_EREPAIR,
- l_errPtr);
-
- errlCommit(l_errPtr, HWPF_COMP_ID);
- break;
- }
+ /*@
+ * @errortype
+ * @reasoncode ISTEP_DMI_RECEIVE_RESTORE_FAILED
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @moduleid ISTEP_DMI_IO_RESTORE_EREPAIR
+ * @userdata1 bytes 0-1: plid identifying first error
+ * bytes 2-3: reason code of first error
+ * @userdata2 bytes 0-1: total number of elogs included
+ * bytes 2-3: N/A
+ * @devdesc call to io_restore_erepair has failed
+ */
+ l_StepError.addErrorDetails(ISTEP_DMI_RECEIVE_RESTORE_FAILED,
+ ISTEP_DMI_IO_RESTORE_EREPAIR,
+ l_errPtr);
- if(!l_StepError.isNull())
- {
- break;
+ errlCommit(l_errPtr, HWPF_COMP_ID);
+ break;
+ }
}
} // end for l_mcs_target
diff --git a/src/usr/hwpf/hwp/erepairAccessorHwpFuncs.C b/src/usr/hwpf/hwp/erepairAccessorHwpFuncs.C
index e50df7b0b..741daef16 100644
--- a/src/usr/hwpf/hwp/erepairAccessorHwpFuncs.C
+++ b/src/usr/hwpf/hwp/erepairAccessorHwpFuncs.C
@@ -5,7 +5,7 @@
/* */
/* IBM CONFIDENTIAL */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012 */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
/* */
/* p1 */
/* */
@@ -85,7 +85,7 @@ fapi::ReturnCode mnfgCheckFieldVPD(const fapi::Target &i_endp1_target,
* CHARM operation, FALSE otherwise
* @param [in] i_vpdType Indicates whether to read Mnfg VPD or
* Field VPD
-
+ *
* @return ReturnCode
*/
fapi::ReturnCode getVerifiedRepairLanes(
@@ -113,7 +113,7 @@ fapi::ReturnCode getVerifiedRepairLanes(
* @param [out] o_invalidFails_inRx_Ofendp2 If TRUE, indicates that Tx has fail
* lane numbers for which there is no
* matching entry on Tx side
-
+ *
* @return void
*/
void invalidateNonMatchingFailLanes(std::vector<uint8_t> &io_endp1_txFaillanes,
@@ -162,10 +162,10 @@ bool removeSpareLanes(const fapi::Target &i_endp_target,
/**
* @brief This function determines the lane numbers that needs to be spared
- * to support Fabric Corner testing.
+ * to support Corner testing.
*
- * @param [in] i_tgtType The target type(XBus or ABus) for which
- * the lanes that need to be spared are
+ * @param [in] i_tgtType The target type(XBus or ABus or DMIBus) for
+ * which the lanes that need to be spared are
* determined
* @param [out] o_endp1_txFailLanes The reference to the vector which will
* have the Tx side of lanes that need to be
@@ -182,40 +182,11 @@ bool removeSpareLanes(const fapi::Target &i_endp_target,
*
* @return void
*/
-void getFabricCornerTestingLanes(const fapi::TargetType i_tgtType,
- std::vector<uint8_t> &o_endp1_txFailLanes,
- std::vector<uint8_t> &o_endp1_rxFailLanes,
- std::vector<uint8_t> &o_endp2_txFailLanes,
- std::vector<uint8_t> &o_endp2_rxFailLanes);
-
-
-/**
- * @brief This function determines the lane numbers that needs to be spared
- * to support Memory Corner testing.
- *
- * @param [in] i_tgtType The target type(MCS or MemBuf) for which
- * the lanes that need to be spared are
- * determined
- * @param [out] o_endp1_txFailLanes The reference to the vector which will
- * have the MCS_Transmit side of lanes that
- * need to be spared for endp1
- * @param [out] o_endp1_rxFailLanes The reference to the vector which will
- * have the MCS_Receive side of lanes that
- * need to be spared for endp1
- * @param [out] o_endp2_txFailLanes The reference to the vector which will
- * have the MemBuf_Transmit side of lanes
- * that need to be spared for endp2
- * @param [out] o_endp2_rxFailLanes The reference to the vector which will
- * have the MemBuf_Receive side of lanes
- * that need to be spared for endp2
- *
- * @return void
- */
-void getMemoryCornerTestingLanes(const fapi::TargetType i_tgtType,
- std::vector<uint8_t> &o_endp1_txFailLanes,
- std::vector<uint8_t> &o_endp1_rxFailLanes,
- std::vector<uint8_t> &o_endp2_txFailLanes,
- std::vector<uint8_t> &o_endp2_rxFailLanes);
+void getCornerTestingLanes(const fapi::TargetType i_tgtType,
+ std::vector<uint8_t> &o_endp1_txFailLanes,
+ std::vector<uint8_t> &o_endp1_rxFailLanes,
+ std::vector<uint8_t> &o_endp2_txFailLanes,
+ std::vector<uint8_t> &o_endp2_rxFailLanes);
/**
* @brief This function combines the eRepair lane numbers read from
@@ -370,7 +341,7 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
else if((l_endp1_tgtType == fapi::TARGET_TYPE_MCS_CHIPLET
&& l_endp2_tgtType != fapi::TARGET_TYPE_MEMBUF_CHIP) ||
(l_endp1_tgtType == fapi::TARGET_TYPE_MEMBUF_CHIP
- && l_endp2_tgtType != fapi::TARGET_TYPE_MCS_CHIPLET))
+ && l_endp2_tgtType != fapi::TARGET_TYPE_MCS_CHIPLET))
{
FAPI_ERR("erepairGetRestoreLanes: Invalid endpoint target"
" type %d-%d", l_endp1_tgtType, l_endp2_tgtType);
@@ -444,7 +415,7 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
// TODO: This is a temporary workaround until HWSV gets
// the MER0 records into PNOR. As per Dean, the
// Manufacturing support is needed by Feb-2013
- // RTC Task: 60517
+ // RTC Task: 60517
/* // Uncomment this block when MER0 is available
l_rc = getVerifiedRepairLanes(l_endp1_target,
o_endp1_txFaillanes,
@@ -546,7 +517,7 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
o_endp1_rxFaillanes.erase(std::remove(o_endp1_rxFaillanes.begin(),
o_endp1_rxFaillanes.end(),
INVALID_FAIL_LANE_NUMBER),
- o_endp1_rxFaillanes.end());
+ o_endp1_rxFaillanes.end());
// Check if there are invalid lanes in Tx side of endp2.
// If found, erase them from the vector
@@ -583,7 +554,7 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
" seen in Tx of endp1 target. No.of lanes: %d",
o_endp1_txFaillanes.size());
// TODO: RTC 60623
- // Need to provide FFDC data that has -
+ // Need to provide FFDC data that has -
// End point targets, Sub-interface type and fail lanes causing
// threshold exceed
}
@@ -597,7 +568,7 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
" seen in Rx of endp1 target. No.of lanes: %d",
o_endp1_rxFaillanes.size());
// TODO: RTC 60623
- // Need to provide FFDC data that has -
+ // Need to provide FFDC data that has -
// End point targets, Sub-interface type and fail lanes causing
// threshold exceed
}
@@ -611,7 +582,7 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
" seen in Tx of endp2 target. No.of lanes: %d",
o_endp2_txFaillanes.size());
// TODO: RTC 60623
- // Need to provide FFDC data that has -
+ // Need to provide FFDC data that has -
// End point targets, Sub-interface type and fail lanes causing
// threshold exceed
}
@@ -625,7 +596,7 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
" seen in Rx of endp2 target. No.of lanes: %d",
o_endp2_rxFaillanes.size());
// TODO: RTC 60623
- // Need to provide FFDC data that has -
+ // Need to provide FFDC data that has -
// End point targets, Sub-interface type and fail lanes causing
// threshold exceed
}
@@ -736,30 +707,15 @@ fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
}
*/
- if(l_enableDmiSpares &&
- (l_endp1_tgtType == fapi::TARGET_TYPE_MEMBUF_CHIP ||
- l_endp1_tgtType == fapi::TARGET_TYPE_MCS_CHIPLET))
+ if(l_enableDmiSpares || l_enableFabricSpares)
{
- // This is a Memory Corner testing IPL.
+ // This is a Corner testing IPL.
// eRepair Restore the pre-determined memory lanes
- getMemoryCornerTestingLanes(l_endp1_tgtType,
- o_endp1_txFaillanes,
- o_endp1_rxFaillanes,
- o_endp2_txFaillanes,
- o_endp2_rxFaillanes);
- }
-
- if(l_enableFabricSpares &&
- (l_endp1_tgtType == fapi::TARGET_TYPE_XBUS_ENDPOINT ||
- l_endp1_tgtType == fapi::TARGET_TYPE_ABUS_ENDPOINT))
- {
- // This is a Fabric Corner testing IPL.
- // eRepair Restore the pre-determined fabric lanes
- getFabricCornerTestingLanes(l_endp1_tgtType,
- o_endp1_txFaillanes,
- o_endp1_rxFaillanes,
- o_endp2_txFaillanes,
- o_endp2_rxFaillanes);
+ getCornerTestingLanes(l_endp1_tgtType,
+ o_endp1_txFaillanes,
+ o_endp1_rxFaillanes,
+ o_endp2_txFaillanes,
+ o_endp2_rxFaillanes);
}
} // end of if(l_mnfgModeIPL)
}while(0);
@@ -794,207 +750,93 @@ void combineFieldandMnfgLanes(std::vector<uint8_t> &i_mnfgFaillanes,
}
-void getFabricCornerTestingLanes(const fapi::TargetType i_tgtType,
- std::vector<uint8_t> &o_endp1_txFaillanes,
- std::vector<uint8_t> &o_endp1_rxFaillanes,
- std::vector<uint8_t> &o_endp2_txFaillanes,
- std::vector<uint8_t> &o_endp2_rxFaillanes)
+void getCornerTestingLanes(const fapi::TargetType i_tgtType,
+ std::vector<uint8_t> &o_endp1_txFaillanes,
+ std::vector<uint8_t> &o_endp1_rxFaillanes,
+ std::vector<uint8_t> &o_endp2_txFaillanes,
+ std::vector<uint8_t> &o_endp2_rxFaillanes)
{
std::vector<uint8_t>::iterator l_it;
- uint8_t l_spareIndx = 0;
+ uint8_t l_deployIndx = 0;
+ uint8_t l_maxDeploys = 0;
+ uint8_t *l_deployPtr = NULL;
- uint8_t l_xSpareLanes[XBUS_MAXSPARES_IN_HW] = {XBUS_8_SPARE_LANE_1,
- XBUS_8_SPARE_LANE_2};
-
- // Idea is to push_back the pre-determined lanes into the Tx and Rx
- // vectors of endpoint1 and clear the vectors of endpoint2
+ uint8_t l_xDeployLanes[XBUS_MAXSPARES_IN_HW] = {XBUS_SPARE_DEPLOY_LANE_1,
+ XBUS_SPARE_DEPLOY_LANE_2};
+
+ uint8_t l_aDeployLanes[ABUS_MAXSPARES_IN_HW] = {ABUS_SPARE_DEPLOY_LANE_1};
+
+ uint8_t l_dmiDeployLanes[DMIBUS_MAXSPARES_IN_HW] = {
+ DMIBUS_SPARE_DEPLOY_LANE_1,
+ DMIBUS_SPARE_DEPLOY_LANE_2};
+
+ // Idea is to push_back the pre-determined lanes into the Tx and Rx
+ // vectors of endpoint1 and endpoint2
do
{
- // We can clear out the lanes of endpoint2 because any existing
- // faillanes in endpoint2 have already been matched with endpoint1.
- // This means that there cannot be any faillanes in endpoint2 vectors
- // that do not have equivalent lanes in endpoint1.
- o_endp2_txFaillanes.clear();
- o_endp2_rxFaillanes.clear();
-
switch(i_tgtType)
{
case fapi::TARGET_TYPE_XBUS_ENDPOINT:
-
- for(l_spareIndx = 0;
- ((o_endp1_txFaillanes.size() < XBUS_MAXSPARES_IN_HW) &&
- (l_spareIndx < XBUS_MAXSPARES_IN_HW));
- l_spareIndx++)
- {
- l_it = std::find(o_endp1_txFaillanes.begin(),
- o_endp1_txFaillanes.end(),
- l_xSpareLanes[l_spareIndx]);
-
- if(l_it == o_endp1_txFaillanes.end())
- {
- o_endp1_txFaillanes.push_back(
- l_xSpareLanes[l_spareIndx]);
- }
- }
-
- for(l_spareIndx = 0;
- ((o_endp1_rxFaillanes.size() < XBUS_MAXSPARES_IN_HW) &&
- (l_spareIndx < XBUS_MAXSPARES_IN_HW));
- l_spareIndx++)
- {
- l_it = std::find(o_endp1_rxFaillanes.begin(),
- o_endp1_rxFaillanes.end(),
- l_xSpareLanes[l_spareIndx]);
-
- if(l_it == o_endp1_rxFaillanes.end())
- {
- o_endp1_rxFaillanes.push_back(
- l_xSpareLanes[l_spareIndx]);
- }
- }
+ l_maxDeploys = XBUS_MAXSPARES_IN_HW;
+ l_deployPtr = l_xDeployLanes;
break;
case fapi::TARGET_TYPE_ABUS_ENDPOINT:
-
- if(o_endp1_txFaillanes.size() < ABUS_MAXSPARES_IN_HW)
- {
- l_it = std::find(o_endp1_txFaillanes.begin(),
- o_endp1_txFaillanes.end(),
- ABUS_SPARE_DEPLOY_LANE_1);
-
- if(l_it == o_endp1_txFaillanes.end())
- {
- o_endp1_txFaillanes.push_back(
- ABUS_SPARE_DEPLOY_LANE_1);
- }
- }
-
- if(o_endp1_rxFaillanes.size() < ABUS_MAXSPARES_IN_HW)
- {
- l_it = std::find(o_endp1_rxFaillanes.begin(),
- o_endp1_rxFaillanes.end(),
- ABUS_SPARE_DEPLOY_LANE_1);
-
- if(l_it == o_endp1_rxFaillanes.end())
- {
- o_endp1_rxFaillanes.push_back(
- ABUS_SPARE_DEPLOY_LANE_1);
- }
- }
-
+ l_maxDeploys = ABUS_MAXSPARES_IN_HW;
+ l_deployPtr = l_aDeployLanes;
break;
- default:
- FAPI_ERR("getFabricCornerTestingLanes: Invalid target type");
+ case fapi::TARGET_TYPE_MCS_CHIPLET:
+ case fapi::TARGET_TYPE_MEMBUF_CHIP:
+ l_maxDeploys = DMIBUS_MAXSPARES_IN_HW;
+ l_deployPtr = l_dmiDeployLanes;
break;
- }; // end of switch case
- }while(0);
-}
-
-void getMemoryCornerTestingLanes(const fapi::TargetType i_tgtType,
- std::vector<uint8_t> &o_endp1_txFaillanes,
- std::vector<uint8_t> &o_endp1_rxFaillanes,
- std::vector<uint8_t> &o_endp2_txFaillanes,
- std::vector<uint8_t> &o_endp2_rxFaillanes)
-{
- std::vector<uint8_t>::iterator l_it;
- uint8_t l_spareIndx = 0;
-
- uint8_t l_dmiUpSpareLanes[DMIBUS_MAXSPARES_IN_HW] = {
- DMIBUS_UPSTREAM_SPARE_LANE_1,
- DMIBUS_UPSTREAM_SPARE_LANE_2};
- uint8_t l_dmiDownSpareLanes[DMIBUS_MAXSPARES_IN_HW] = {
- DMIBUS_DOWNSTREAM_SPARE_LANE_1,
- DMIBUS_DOWNSTREAM_SPARE_LANE_2};
+ default:
+ FAPI_ERR("getCornerTestingLanes: Invalid target type");
+ break;
+ };
- // Idea is to push_back the pre-determined lanes into the UpStream
- // and DownStream vectors of endpoint1 and clear the vectors of endpoint2
- do
- {
- // We can clear out the lanes of endpoint2 because any existing
- // faillanes in endpoint2 have already been matched with endpoint1.
- // This means that there cannot be any faillanes in endpoint2 vectors
- // that do not have equivalent lanes in endpoint1.
- o_endp2_txFaillanes.clear();
- o_endp2_rxFaillanes.clear();
+ std::sort(o_endp1_txFaillanes.begin(), o_endp1_txFaillanes.end());
+ std::sort(o_endp1_rxFaillanes.begin(), o_endp1_rxFaillanes.end());
- switch(i_tgtType)
+ for(l_deployIndx = 0;
+ ((l_deployIndx < l_maxDeploys) &&
+ (o_endp1_txFaillanes.size() < l_maxDeploys));
+ l_deployIndx++)
{
- case fapi::TARGET_TYPE_MCS_CHIPLET:
+ l_it = std::find(o_endp1_txFaillanes.begin(),
+ o_endp1_txFaillanes.end(),
+ l_deployPtr[l_deployIndx]);
- for(l_spareIndx = 0;
- ((o_endp1_txFaillanes.size() < DMIBUS_MAXSPARES_IN_HW) &&
- (l_spareIndx < DMIBUS_MAXSPARES_IN_HW));
- l_spareIndx++)
- {
- l_it = std::find(o_endp1_txFaillanes.begin(),
- o_endp1_txFaillanes.end(),
- l_dmiDownSpareLanes[l_spareIndx]);
-
- if(l_it == o_endp1_txFaillanes.end())
- {
- o_endp1_txFaillanes.push_back(
- l_dmiDownSpareLanes[l_spareIndx]);
- }
- }
-
- for(l_spareIndx = 0;
- ((o_endp1_rxFaillanes.size() < DMIBUS_MAXSPARES_IN_HW) &&
- (l_spareIndx < DMIBUS_MAXSPARES_IN_HW));
- l_spareIndx++)
- {
- l_it = std::find(o_endp1_rxFaillanes.begin(),
- o_endp1_rxFaillanes.end(),
- l_dmiUpSpareLanes[l_spareIndx]);
-
- if(l_it == o_endp1_rxFaillanes.end())
- {
- o_endp1_rxFaillanes.push_back(
- l_dmiUpSpareLanes[l_spareIndx]);
- }
- }
- break;
+ if(l_it == o_endp1_txFaillanes.end())
+ {
+ o_endp1_txFaillanes.push_back(l_deployPtr[l_deployIndx]);
+ }
+ }
- case fapi::TARGET_TYPE_MEMBUF_CHIP:
+ for(l_deployIndx = 0;
+ ((o_endp1_rxFaillanes.size() < l_maxDeploys) &&
+ (l_deployIndx < l_maxDeploys));
+ l_deployIndx++)
+ {
+ l_it = std::find(o_endp1_rxFaillanes.begin(),
+ o_endp1_rxFaillanes.end(),
+ l_deployPtr[l_deployIndx]);
- for(l_spareIndx = 0;
- ((o_endp1_txFaillanes.size() < DMIBUS_MAXSPARES_IN_HW) &&
- (l_spareIndx < DMIBUS_MAXSPARES_IN_HW));
- l_spareIndx++)
- {
- l_it = std::find(o_endp1_txFaillanes.begin(),
- o_endp1_txFaillanes.end(),
- l_dmiUpSpareLanes[l_spareIndx]);
-
- if(l_it == o_endp1_txFaillanes.end())
- {
- o_endp1_txFaillanes.push_back(
- l_dmiUpSpareLanes[l_spareIndx]);
- }
- }
+ if(l_it == o_endp1_rxFaillanes.end())
+ {
+ o_endp1_rxFaillanes.push_back(l_deployPtr[l_deployIndx]);
+ }
+ }
- for(l_spareIndx = 0;
- ((o_endp1_rxFaillanes.size() < DMIBUS_MAXSPARES_IN_HW) &&
- (l_spareIndx < DMIBUS_MAXSPARES_IN_HW));
- l_spareIndx++)
- {
- l_it = std::find(o_endp1_rxFaillanes.begin(),
- o_endp1_rxFaillanes.end(),
- l_dmiDownSpareLanes[l_spareIndx]);
-
- if(l_it == o_endp1_rxFaillanes.end())
- {
- o_endp1_rxFaillanes.push_back(
- l_dmiDownSpareLanes[l_spareIndx]);
- }
- }
- break;
+ // We can cassign the lanes of endpoint1 to endpoint2 because any
+ // existing faillanes in endpoint2 have already been matched with
+ // endpoint1. This means that there cannot be any faillanes in
+ // endpoint2 that do not have equivalent lanes in endpoint1.
+ o_endp2_txFaillanes = o_endp1_txFaillanes;
+ o_endp2_rxFaillanes = o_endp1_rxFaillanes;
- default:
- FAPI_ERR("getMemoryCornerTestingLanes: Invalid target type");
- break;
- }; // end of switch case
}while(0);
}
@@ -1005,11 +847,16 @@ bool removeSpareLanes(const fapi::Target &i_endp_target,
fapi::TargetType l_tgtType = fapi::TARGET_TYPE_NONE;
bool l_sparesFound = false;
uint8_t l_spareIndx = 0;
+ uint8_t l_maxSpares = 0;
+ uint8_t *l_txSparePtr = NULL;
+ uint8_t *l_rxSparePtr = NULL;
std::vector<uint8_t>::iterator l_it;
uint8_t l_xSpareLanes[XBUS_MAXSPARES_IN_HW] = {XBUS_8_SPARE_LANE_1,
XBUS_8_SPARE_LANE_2};
+ uint8_t l_aSpareLanes[ABUS_MAXSPARES_IN_HW] = {ABUS_SPARE_LANE_1};
+
uint8_t l_dmiUpSpareLanes[DMIBUS_MAXSPARES_IN_HW] =
{DMIBUS_UPSTREAM_SPARE_LANE_1,
DMIBUS_UPSTREAM_SPARE_LANE_2};
@@ -1029,176 +876,66 @@ bool removeSpareLanes(const fapi::Target &i_endp_target,
switch(l_tgtType)
{
case fapi::TARGET_TYPE_XBUS_ENDPOINT:
-
- for(l_spareIndx = 0;
- l_spareIndx < XBUS_MAXSPARES_IN_HW;
- l_spareIndx++)
- {
- // Find if there are spares as faillanes on Tx side,
- // and erase all instances
- l_it = std::remove(o_txFaillanes.begin(),
- o_txFaillanes.end(),
- l_xSpareLanes[l_spareIndx]);
-
- if(l_it != o_txFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, XBus spare lane %d"
- " cannot be repaired",
- l_xSpareLanes[l_spareIndx]);
-
- l_sparesFound = true;
- o_txFaillanes.erase(l_it, o_txFaillanes.end());
- }
-
- // Find if there are spares as faillanes on Rx side,
- // and erase all instances
- l_it = std::remove(o_rxFaillanes.begin(),
- o_rxFaillanes.end(),
- l_xSpareLanes[l_spareIndx]);
-
- if(l_it != o_rxFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, XBus spare lane %d"
- " cannot be repaired",
- l_xSpareLanes[l_spareIndx]);
-
- l_sparesFound = true;
- o_rxFaillanes.erase(l_it, o_rxFaillanes.end());
- }
- }
-
+ l_maxSpares = XBUS_MAXSPARES_IN_HW;
+ l_txSparePtr = l_rxSparePtr = l_xSpareLanes;
break;
case fapi::TARGET_TYPE_ABUS_ENDPOINT:
-
- // Find if there is fail lane ABUS_SPARE_LANE_1 on Tx side
- // and erase all instances
- l_it = std::remove(o_txFaillanes.begin(),
- o_txFaillanes.end(),
- ABUS_SPARE_LANE_1);
- if(l_it != o_txFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, ABus spare lane %d"
- " cannot be repaired",
- ABUS_SPARE_LANE_1);
-
- l_sparesFound = true;
- o_txFaillanes.erase(l_it, o_txFaillanes.end());
- }
-
- // Find if there is fail lane ABUS_SPARE_LANE_1 on Rx side
- // and erase all instances
- l_it = std::remove(o_rxFaillanes.begin(),
- o_rxFaillanes.end(),
- ABUS_SPARE_LANE_1);
- if(l_it != o_rxFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, ABus spare lane %d"
- " cannot be repaired",
- ABUS_SPARE_LANE_1);
-
- l_sparesFound = true;
- o_rxFaillanes.erase(l_it, o_rxFaillanes.end());
- }
-
- break;
+ l_maxSpares = ABUS_MAXSPARES_IN_HW;
+ l_txSparePtr = l_rxSparePtr = l_aSpareLanes;
+ break;
case fapi::TARGET_TYPE_MCS_CHIPLET:
-
- // Find if there are spares as faillanes on Tx(DownStream)
- // side, and erase all instances
- for(l_spareIndx = 0;
- l_spareIndx < DMIBUS_MAXSPARES_IN_HW;
- l_spareIndx++)
- {
- l_it = std::remove(o_txFaillanes.begin(),
- o_txFaillanes.end(),
- l_dmiDownSpareLanes[l_spareIndx]);
-
- if(l_it != o_txFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, DMIBus spare lane"
- " %d cannot be repaired",
- l_dmiDownSpareLanes[l_spareIndx]);
-
- l_sparesFound = true;
- o_txFaillanes.erase(l_it, o_txFaillanes.end());
- }
- }
-
- // Find if there are spares as faillanes on Rx(UpStream),
- // side, and erase all instances
- for(l_spareIndx = 0;
- l_spareIndx < DMIBUS_MAXSPARES_IN_HW;
- l_spareIndx++)
- {
- l_it = std::remove(o_rxFaillanes.begin(),
- o_rxFaillanes.end(),
- l_dmiUpSpareLanes[l_spareIndx]);
-
- if(l_it != o_rxFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, DMIBus spare lane"
- " %d cannot be repaired",
- l_dmiUpSpareLanes[l_spareIndx]);
-
- l_sparesFound = true;
- o_rxFaillanes.erase(l_it, o_rxFaillanes.end());
- }
- }
-
+ l_maxSpares = DMIBUS_MAXSPARES_IN_HW;
+ l_txSparePtr = l_dmiDownSpareLanes;
+ l_rxSparePtr = l_dmiUpSpareLanes;
break;
case fapi::TARGET_TYPE_MEMBUF_CHIP:
-
- // Find if there are spares as faillanes on Tx(UpStream)
- // side, and erase all instances
- for(l_spareIndx = 0;
- l_spareIndx < DMIBUS_MAXSPARES_IN_HW;
- l_spareIndx++)
- {
- l_it = std::remove(o_txFaillanes.begin(),
- o_txFaillanes.end(),
- l_dmiUpSpareLanes[l_spareIndx]);
-
- if(l_it != o_txFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, DMIBus spare lane"
- " %d cannot be repaired",
- l_dmiUpSpareLanes[l_spareIndx]);
-
- l_sparesFound = true;
- o_txFaillanes.erase(l_it, o_txFaillanes.end());
- }
- }
-
- // Find if there are spares as faillanes on Rx(DownStream),
- // side, and erase all instances
- for(l_spareIndx = 0;
- l_spareIndx < DMIBUS_MAXSPARES_IN_HW;
- l_spareIndx++)
- {
- l_it = std::remove(o_rxFaillanes.begin(),
- o_rxFaillanes.end(),
- l_dmiDownSpareLanes[l_spareIndx]);
-
- if(l_it != o_rxFaillanes.end())
- {
- FAPI_ERR("removeSpareLanes: Error, DMIBus spare lane"
- " %d cannot be repaired",
- l_dmiDownSpareLanes[l_spareIndx]);
-
- l_sparesFound = true;
- o_rxFaillanes.erase(l_it, o_rxFaillanes.end());
- }
- }
-
+ l_maxSpares = DMIBUS_MAXSPARES_IN_HW;
+ l_txSparePtr = l_dmiUpSpareLanes;
+ l_rxSparePtr = l_dmiDownSpareLanes;
break;
default:
FAPI_ERR("removeSpareLanes: Invalid target type %d",l_tgtType);
break;
};
+
+ for(l_spareIndx = 0; l_spareIndx < l_maxSpares; l_spareIndx++)
+ {
+ // Find if there are spares as faillanes on Tx side,
+ // and erase all instances
+ l_it = std::remove(o_txFaillanes.begin(),
+ o_txFaillanes.end(),
+ l_txSparePtr[l_spareIndx]);
+
+ if(l_it != o_txFaillanes.end())
+ {
+ FAPI_ERR("removeSpareLanes: Error, spare lane %d"
+ " cannot be repaired",
+ l_txSparePtr[l_spareIndx]);
+
+ l_sparesFound = true;
+ o_txFaillanes.erase(l_it, o_txFaillanes.end());
+ }
+
+ // Find if there are spares as faillanes on Rx side,
+ // and erase all instances
+ l_it = std::remove(o_rxFaillanes.begin(),
+ o_rxFaillanes.end(),
+ l_rxSparePtr[l_spareIndx]);
+
+ if(l_it != o_rxFaillanes.end())
+ {
+ FAPI_ERR("removeSpareLanes: Error, spare lane %d"
+ " cannot be repaired",
+ l_rxSparePtr[l_spareIndx]);
+
+ l_sparesFound = true;
+ o_rxFaillanes.erase(l_it, o_rxFaillanes.end());
+ }
+ }
}while(0);
return (l_sparesFound);
@@ -1366,7 +1103,6 @@ fapi::ReturnCode mnfgCheckFieldVPD(const fapi::Target &i_endp1_target,
return (l_rc);
}
-
fapi::ReturnCode getVerifiedRepairLanes(
const fapi::Target &i_endp1_target,
std::vector<uint8_t> &o_endp1_txFaillanes,
@@ -1403,67 +1139,41 @@ fapi::ReturnCode getVerifiedRepairLanes(
if(i_vpdType == EREPAIR_VPD_FIELD)
{
l_getLanes = &erepairGetFieldFailedLanes;
-
- for(l_tgtIndx = 0; l_tgtIndx < 2; l_tgtIndx++)
- {
- // Get failed Field lanes for endp1 and endp2
- l_rc = l_getLanes(l_target[l_tgtIndx],
- l_txFaillanes,
- l_rxFaillanes);
-
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairGetFieldFailedLanes for %s",
- l_target[l_tgtIndx].toEcmdString());
- break;
- }
- if(l_tgtIndx == 0)
- {
- o_endp1_txFaillanes = l_txFaillanes;
- o_endp1_rxFaillanes = l_rxFaillanes;
- }
- else
- {
- o_endp2_txFaillanes = l_txFaillanes;
- o_endp2_rxFaillanes = l_rxFaillanes;
- }
-
- l_txFaillanes.clear();
- l_rxFaillanes.clear();
- }
+ l_setLanes = &erepairSetFieldFailedLanes;
}
else if(i_vpdType == EREPAIR_VPD_MNFG)
{
l_getLanes = &erepairGetMnfgFailedLanes;
- for(l_tgtIndx = 0; l_tgtIndx < 2; l_tgtIndx++)
- {
- // Get failed Mnfg lanes for endp1 and endp2
- l_rc = l_getLanes(l_target[l_tgtIndx],
- l_txFaillanes,
- l_rxFaillanes);
+ l_setLanes = &erepairSetMnfgFailedLanes;
+ }
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairGetMnfgFailedLanes for %s",
- l_target[l_tgtIndx].toEcmdString());
- break;
- }
- if(l_tgtIndx == 0)
- {
- o_endp1_txFaillanes = l_txFaillanes;
- o_endp1_rxFaillanes = l_rxFaillanes;
- }
- else
- {
- o_endp2_txFaillanes = l_txFaillanes;
- o_endp2_rxFaillanes = l_rxFaillanes;
- }
+ for(l_tgtIndx = 0; l_tgtIndx < 2; l_tgtIndx++)
+ {
+ // Get failed lanes for endp1 and endp2
+ l_rc = l_getLanes(l_target[l_tgtIndx],
+ l_txFaillanes,
+ l_rxFaillanes);
- l_txFaillanes.clear();
- l_rxFaillanes.clear();
+ if(l_rc)
+ {
+ FAPI_ERR("getVerifiedRepairLanes: Error while getting failed"
+ " lanes for %s",
+ l_target[l_tgtIndx].toEcmdString());
+ break;
+ }
+ if(l_tgtIndx == 0)
+ {
+ o_endp1_txFaillanes = l_txFaillanes;
+ o_endp1_rxFaillanes = l_rxFaillanes;
+ }
+ else
+ {
+ o_endp2_txFaillanes = l_txFaillanes;
+ o_endp2_rxFaillanes = l_rxFaillanes;
}
+
+ l_txFaillanes.clear();
+ l_rxFaillanes.clear();
}
if(l_rc)
@@ -1506,139 +1216,73 @@ fapi::ReturnCode getVerifiedRepairLanes(
/***** Correct eRepair data of endp1 in VPD *****/
- if(i_vpdType == EREPAIR_VPD_FIELD)
+ for(l_tgtIndx = 0; l_tgtIndx < 2; l_tgtIndx++)
{
- l_setLanes = &erepairSetFieldFailedLanes;
-
- for(l_tgtIndx = 0; l_tgtIndx < 2; l_tgtIndx++)
+ if(l_tgtIndx == 0)
{
- if(l_tgtIndx == 0)
- {
- l_txFaillanes = o_endp1_txFaillanes;
- l_rxFaillanes = o_endp1_rxFaillanes;
- }
- else
- {
- l_txFaillanes = o_endp2_txFaillanes;
- l_rxFaillanes = o_endp2_rxFaillanes;
- }
-
- // Update endp1 and endp2 VPD to invalidate fail lanes that do
- // not have matching fail lanes on the other end
- if(l_invalidFails_inTx_Ofendp1 && l_invalidFails_inRx_Ofendp1)
- {
- l_rc = l_setLanes(l_target[l_tgtIndx],
- l_txFaillanes,
- l_rxFaillanes);
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairSetFieldFailedLanes for Tx and Rx lanes"
- " on %s", l_target[l_tgtIndx].toEcmdString());
- break;
- }
- }
- else if(l_invalidFails_inTx_Ofendp1)
- {
- l_rc = l_setLanes(l_target[l_tgtIndx],
- l_txFaillanes,
- l_emptyVector);
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairSetFieldFailedLanes for Tx lanes on %s",
- l_target[l_tgtIndx].toEcmdString());
- break;
- }
- }
- else if(l_invalidFails_inRx_Ofendp1)
- {
- l_rc = l_setLanes(l_target[l_tgtIndx],
- l_emptyVector,
- l_rxFaillanes);
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairSetFieldFailedLanes for Rx lanes on %s",
- l_target[l_tgtIndx].toEcmdString());
- break;
- }
- }
+ l_txFaillanes = o_endp1_txFaillanes;
+ l_rxFaillanes = o_endp1_rxFaillanes;
}
- } // end of if(i_vpdType == EREPAIR_VPD_FIELD)
- else if(i_vpdType == EREPAIR_VPD_MNFG)
- {
- l_setLanes = &erepairSetMnfgFailedLanes;
-
- for(l_tgtIndx = 0; l_tgtIndx < 2; l_tgtIndx++)
+ else
{
- if(l_tgtIndx == 0)
- {
- l_txFaillanes = o_endp1_txFaillanes;
- l_rxFaillanes = o_endp1_rxFaillanes;
- }
- else
- {
- l_txFaillanes = o_endp2_txFaillanes;
- l_rxFaillanes = o_endp2_rxFaillanes;
- }
+ l_txFaillanes = o_endp2_txFaillanes;
+ l_rxFaillanes = o_endp2_rxFaillanes;
+ }
- // Update endp1 and endp2 VPD to invalidate fail lanes that do
- // not have matching fail lanes on the other end
- if(l_invalidFails_inTx_Ofendp1 && l_invalidFails_inRx_Ofendp1)
+ // Update endp1 and endp2 VPD to invalidate fail lanes that do
+ // not have matching fail lanes on the other end
+ if(l_invalidFails_inTx_Ofendp1 && l_invalidFails_inRx_Ofendp1)
+ {
+ l_rc = l_setLanes(l_target[l_tgtIndx],
+ l_txFaillanes,
+ l_rxFaillanes);
+ if(l_rc)
{
- l_rc = l_setLanes(l_target[l_tgtIndx],
- l_txFaillanes,
- l_rxFaillanes);
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairSetMnfgFailedLanes for Tx and Rx lanes"
- " on %s", l_target[l_tgtIndx].toEcmdString());
- break;
- }
+ FAPI_ERR("getVerifiedRepairLanes: Error while setting"
+ " lanes for Tx and Rx on %s",
+ l_target[l_tgtIndx].toEcmdString());
+ break;
}
- else if(l_invalidFails_inTx_Ofendp1)
+ }
+ else if(l_invalidFails_inTx_Ofendp1)
+ {
+ l_rc = l_setLanes(l_target[l_tgtIndx],
+ l_txFaillanes,
+ l_emptyVector);
+ if(l_rc)
{
- l_rc = l_setLanes(l_target[l_tgtIndx],
- l_txFaillanes,
- l_emptyVector);
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairSetMnfgFailedLanes for Tx lanes on %s",
- l_target[l_tgtIndx].toEcmdString());
- break;
- }
+ FAPI_ERR("getVerifiedRepairLanes: Error while setting"
+ " lanes for Tx on %s",
+ l_target[l_tgtIndx].toEcmdString());
+ break;
}
- else if(l_invalidFails_inRx_Ofendp1)
+ }
+ else if(l_invalidFails_inRx_Ofendp1)
+ {
+ l_rc = l_setLanes(l_target[l_tgtIndx],
+ l_emptyVector,
+ l_rxFaillanes);
+ if(l_rc)
{
- l_rc = l_setLanes(l_target[l_tgtIndx],
- l_emptyVector,
- l_rxFaillanes);
- if(l_rc)
- {
- FAPI_ERR("getVerifiedRepairLanes: Error from"
- " erepairSetMnfgFailedLanes for Rx lanes on %s",
- l_target[l_tgtIndx].toEcmdString());
- break;
- }
+ FAPI_ERR("getVerifiedRepairLanes: Error while setting"
+ " lanes Rx on %s",
+ l_target[l_tgtIndx].toEcmdString());
+ break;
}
- } // end of for(l_tgtIndx) loop
- } // end of if(i_vpdType == EREPAIR_VPD_MNFG)
-
+ }
+ } // end of for loop
}while(0);
return l_rc;
}
-
void invalidateNonMatchingFailLanes(std::vector<uint8_t> &io_endp1_txFaillanes,
std::vector<uint8_t> &io_endp2_rxFaillanes,
bool &o_invalidFails_inTx_Ofendp1,
bool &o_invalidFails_inRx_Ofendp2)
{
std::vector<uint8_t>::iterator l_it;
+ std::vector<uint8_t>::iterator l_itTmp;
std::vector<uint8_t>::iterator l_itDrv;
std::vector<uint8_t>::iterator l_itRcv;
@@ -1650,41 +1294,59 @@ void invalidateNonMatchingFailLanes(std::vector<uint8_t> &io_endp1_txFaillanes,
// Start with drive side fail lanes and check for matching lanes
// on the recieve side
+ l_itTmp = io_endp2_rxFaillanes.begin();
for(l_itDrv = io_endp1_txFaillanes.begin();
l_itDrv != io_endp1_txFaillanes.end();
l_itDrv++)
{
- l_it = std::find(io_endp2_rxFaillanes.begin(),
- io_endp2_rxFaillanes.end(),
- *l_itDrv);
+ l_it = std::lower_bound(io_endp2_rxFaillanes.begin(),
+ io_endp2_rxFaillanes.end(),
+ *l_itDrv);
// If matching fail lane is not found on the receive side,
// invalidate the drive side fail lane number
- if(l_it == io_endp2_rxFaillanes.end())
+ if((l_it == io_endp2_rxFaillanes.end()) || (*l_it > *l_itDrv))
{
*l_itDrv = INVALID_FAIL_LANE_NUMBER;
o_invalidFails_inTx_Ofendp1 = true;
}
+ else
+ {
+ // save the iterator for the next search
+ l_itTmp = l_it;
+ }
}
+ // Sort again as we might have invalidated some lanes
+ std::sort(io_endp1_txFaillanes.begin(),io_endp1_txFaillanes.end());
// Now, traverse through the receive side fail lanes and
// check for matching lanes on the drive side
for(l_itRcv = io_endp2_rxFaillanes.begin();
- l_itRcv != io_endp2_rxFaillanes.end();
+ ((l_itRcv <= l_itTmp) && (l_itRcv != io_endp2_rxFaillanes.end()));
l_itRcv++)
{
- l_it = std::find(io_endp1_txFaillanes.begin(),
- io_endp1_txFaillanes.end(),
- *l_itRcv);
+ l_it = std::lower_bound(io_endp1_txFaillanes.begin(),
+ io_endp1_txFaillanes.end(),
+ *l_itRcv);
// If matching lane is not found on the driver side,
// invalidate the receive side fail lane number
- if(l_it == io_endp1_txFaillanes.end())
+ if((l_it == io_endp1_txFaillanes.end()) || (*l_it > *l_itRcv))
{
*l_itRcv = INVALID_FAIL_LANE_NUMBER;
o_invalidFails_inRx_Ofendp2 = true;
- }
+ }
+ }
+
+ // Need to invalidate all the entries beyond the last
+ // lower bound of first search
+ if(l_itTmp != io_endp2_rxFaillanes.end())
+ {
+ for(l_itTmp++; l_itTmp != io_endp2_rxFaillanes.end(); l_itTmp++)
+ {
+ *l_itTmp = INVALID_FAIL_LANE_NUMBER;
+ }
}
}
diff --git a/src/usr/hwpf/hwp/io_restore_erepair/makefile b/src/usr/hwpf/hwp/io_restore_erepair/makefile
deleted file mode 100644
index 10d4cdd50..000000000
--- a/src/usr/hwpf/hwp/io_restore_erepair/makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-# IBM_PROLOG_BEGIN_TAG
-# This is an automatically generated prolog.
-#
-# $Source: src/usr/hwpf/hwp/io_restore_erepair/makefile $
-#
-# IBM CONFIDENTIAL
-#
-# COPYRIGHT International Business Machines Corp. 2012
-#
-# p1
-#
-# Object Code Only (OCO) source materials
-# Licensed Internal Code Source Materials
-# IBM HostBoot Licensed Internal Code
-#
-# The source code for this program is not published or otherwise
-# divested of its trade secrets, irrespective of what has been
-# deposited with the U.S. Copyright Office.
-#
-# Origin: 30
-#
-# IBM_PROLOG_END_TAG
-
-ROOTPATH = ../../../../..
-
-MODULE = io_restore_erepair
-
-## support for Targeting and fapi
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/ecmddatabuffer
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/fapi
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/plat
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/hwp
-
-## pointer to common HWP files
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/include
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/bus_training
-
-## Include sub dirs
-## NOTE: add a new EXTRAINCDIR when you add a new HWP
-
-OBJS = io_restore_erepair.o
-
-## NOTE: add a new directory onto the vpaths when you add a new HWP
-VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/io_restore_erepair
-
-include ${ROOTPATH}/config.mk
diff --git a/src/usr/hwpf/hwp/io_restore_erepair/restore.mk b/src/usr/hwpf/hwp/io_restore_erepair/restore.mk
new file mode 100644
index 000000000..dc50c80d2
--- /dev/null
+++ b/src/usr/hwpf/hwp/io_restore_erepair/restore.mk
@@ -0,0 +1,29 @@
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: src/usr/hwpf/hwp/io_restore_erepair/restore.mk $
+#
+# IBM CONFIDENTIAL
+#
+# COPYRIGHT International Business Machines Corp. 2013
+#
+# p1
+#
+# Object Code Only (OCO) source materials
+# Licensed Internal Code Source Materials
+# IBM HostBoot Licensed Internal Code
+#
+# The source code for this program is not published or otherwise
+# divested of its trade secrets, irrespective of what has been
+# deposited with the U.S. Copyright Office.
+#
+# Origin: 30
+#
+# IBM_PROLOG_END_TAG
+EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/bus_training
+EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/io_restore_erepair
+
+VPATH += io_restore_erepair
+
+OBJS += io_restore_erepair.o
+
diff --git a/src/usr/hwpf/hwp/makefile b/src/usr/hwpf/hwp/makefile
index 0673ab8dc..74d953b7e 100644
--- a/src/usr/hwpf/hwp/makefile
+++ b/src/usr/hwpf/hwp/makefile
@@ -5,7 +5,7 @@
#
# IBM CONFIDENTIAL
#
-# COPYRIGHT International Business Machines Corp. 2011,2012
+# COPYRIGHT International Business Machines Corp. 2011,2013
#
# p1
#
@@ -51,10 +51,10 @@ SUBDIRS = dmi_training.d sbe_centaur_init.d mc_config.d \
dram_training.d activate_powerbus.d build_winkle_images.d \
core_activate.d dram_initialization.d edi_ei_initialization.d \
establish_system_smp.d bus_training.d \
- nest_chiplets.d start_payload.d thread_activate.d slave_sbe.d \
- io_restore_erepair.d
+ nest_chiplets.d start_payload.d thread_activate.d slave_sbe.d
include mvpd_accessors/mvpd.mk
include utility_procedures/utils.mk
+include io_restore_erepair/restore.mk
include ${ROOTPATH}/config.mk
OpenPOWER on IntegriCloud