summaryrefslogtreecommitdiffstats
path: root/src/usr/diag
diff options
context:
space:
mode:
authorBenjamin Weisenbeck <bweisenb@us.ibm.com>2018-09-18 13:22:27 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-09-26 13:03:27 -0500
commit46663cd701c138b99c1d6a55ae2ba3fba0fabee7 (patch)
tree0c320b9550717b2ce3ba159ade755740e674f30a /src/usr/diag
parent3ee865ba154a8997907b772c88c85504053db0f0 (diff)
downloadtalos-hostboot-46663cd701c138b99c1d6a55ae2ba3fba0fabee7.tar.gz
talos-hostboot-46663cd701c138b99c1d6a55ae2ba3fba0fabee7.zip
PRD: Distinguish hard obus link failures from predictive callouts
Change-Id: If9235e50960503a2ab70e76257efa44c251d2cb5 CQ: SW438692 Backport: release-fips922 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/66329 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/66639 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag')
-rw-r--r--src/usr/diag/prdf/common/plat/p9/p9_obus_regs.rule17
-rw-r--r--src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C70
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/p9/prdfLaneRepairExtraSig.H2
3 files changed, 64 insertions, 25 deletions
diff --git a/src/usr/diag/prdf/common/plat/p9/p9_obus_regs.rule b/src/usr/diag/prdf/common/plat/p9/p9_obus_regs.rule
index d3721f8d4..a61e8f247 100644
--- a/src/usr/diag/prdf/common/plat/p9/p9_obus_regs.rule
+++ b/src/usr/diag/prdf/common/plat/p9/p9_obus_regs.rule
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2016,2017
+# Contributors Listed Below - COPYRIGHT 2016,2018
# [+] International Business Machines Corp.
#
#
@@ -55,3 +55,18 @@
capture group default;
};
+ register LINK_STATUS_REG0
+ {
+ name "P9 OBUS target Link0 Quality Status register";
+ scomaddr 0x09010826;
+ capture group default;
+ };
+
+ register LINK_STATUS_REG1
+ {
+ name "P9 OBUS target Link1 Quality Status register";
+ scomaddr 0x09010827;
+ capture group default;
+ };
+
+
diff --git a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C
index d7d059bf1..ec0ee0619 100644
--- a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C
+++ b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C
@@ -374,12 +374,12 @@ int32_t handleLaneRepairEvent( ExtensibleChip * i_chip,
}
-void obus_smpCallout_link( TargetHandle_t &i_smpTgt )
+void obus_smpCallout( TargetHandle_t i_smpTgt, TargetHandle_t i_obusTgt,
+ STEP_CODE_DATA_STRUCT & i_sc )
{
errlHndl_t l_mainElog = NULL;
l_mainElog = ServiceGeneratorClass::ThisServiceGenerator().getErrl();
-
if ( NULL == l_mainElog )
{
PRDF_ERR("smpCallout_link Failed to get the global error log" );
@@ -387,18 +387,41 @@ void obus_smpCallout_link( TargetHandle_t &i_smpTgt )
else
{
// add callout(s) on any bit firing
+ // get the peer SMGROUP target associated with input SMPGROUP
+ TargetHandle_t l_smpPeerTgt = i_smpTgt->getAttr<ATTR_PEER_TARGET>();
+ PRDF_ASSERT(nullptr != l_smpPeerTgt);
+
#ifdef __HOSTBOOT_MODULE
- l_mainElog->addPartCallout( i_smpTgt, HWAS::SMP_CABLE,
- HWAS::SRCI_PRIORITY_MED, HWAS::NO_DECONFIG, HWAS::GARD_Predictive );
+ HWAS::CalloutFlag_t calloutFlg = HWAS::FLAG_NONE;
+
+ // Get Link position 0/1 (check if tgt pos is even/odd)
+ uint32_t lnk = getTargetPosition(i_smpTgt) % 2;
+
+ // If Link status reg has been zeroed, we know this link has failed
+ ExtensibleChip *obusChip =
+ (ExtensibleChip *)systemPtr->GetChip( i_obusTgt );
+ SCAN_COMM_REGISTER_CLASS *lnkStat = obusChip->getRegister(
+ lnk==0 ? "LINK_STATUS_REG0" : "LINK_STATUS_REG1" );
+
+ int32_t rc = lnkStat->Read();
+
+ if (rc != SUCCESS)
+ {
+ PRDF_ERR("smpCallout_link Failed to read LINK_STATUS_REG");
+ }
+ else if ( lnkStat->BitStringIsZero() )
+ {
+ calloutFlg = HWAS::FLAG_LINK_DOWN;
+ i_sc.service_data->SetErrorSig(PRDFSIG_LinkFailed);
+ }
+
+ l_mainElog->addBusCallout( i_smpTgt, l_smpPeerTgt, HWAS::O_BUS_TYPE,
+ HWAS::SRCI_PRIORITY_MED, calloutFlg );
#else
// FSP code
#ifndef ESW_SIM_COMPILE
errlHndl_t l_err = NULL;
- // get the peer SMGROUP target associated with input SMPGROUP
- TargetHandle_t l_smpPeerTgt = i_smpTgt->getAttr<ATTR_PEER_TARGET>();
- PRDF_ASSERT(nullptr != l_smpPeerTgt);
-
// Call SVPD routine to add callouts
l_err = HWSV::SvrError::AddBusCallouts( l_mainElog, i_smpTgt,
l_smpPeerTgt, HWAS::O_BUS_TYPE,
@@ -481,7 +504,8 @@ void obus_getSmpTarget( TargetHandle_t &i_obusTgt,
/** Given the OBUS TARGET and SMP link number -- do the callout **/
-void obus_smpCallout_link( TargetHandle_t &i_obusTgt, uint32_t i_link )
+void obus_smpCallout_link( TargetHandle_t &i_obusTgt, uint32_t i_link,
+ STEP_CODE_DATA_STRUCT & i_sc )
{
TargetHandle_t l_smpTarg = nullptr;
@@ -491,7 +515,7 @@ void obus_smpCallout_link( TargetHandle_t &i_obusTgt, uint32_t i_link )
PRDF_ASSERT(nullptr != l_smpTarg);
// Callout both SMPGROUPS
- obus_smpCallout_link( l_smpTarg );
+ obus_smpCallout( l_smpTarg, i_obusTgt, i_sc );
return;
@@ -499,8 +523,8 @@ void obus_smpCallout_link( TargetHandle_t &i_obusTgt, uint32_t i_link )
/** Given the OBUS unit number and SMP link number -- do the callout **/
-void obus_smpCallout_link( uint32_t i_obusNum,
- ExtensibleChip * i_chip, uint32_t i_link )
+void obus_smpCallout_link( uint32_t i_obusNum, ExtensibleChip * i_chip,
+ uint32_t i_link, STEP_CODE_DATA_STRUCT & i_sc )
{
// From NEST so it will be a processor target
TargetHandle_t rxTrgt = i_chip->getTrgt();
@@ -512,7 +536,7 @@ void obus_smpCallout_link( uint32_t i_obusNum,
PRDF_ASSERT( NULL != l_obus );
// We found the right OBUS target
- obus_smpCallout_link( l_obus, i_link );
+ obus_smpCallout_link( l_obus, i_link, i_sc );
} // end obus_smpCallout_link - obus & smp link numbers
@@ -525,7 +549,7 @@ int32_t obus_callout_L0( ExtensibleChip * i_chip,
// Need the obus target
TargetHandle_t rxTrgt = i_chip->getTrgt();
// Call out LINK0 in SMPGROUP
- obus_smpCallout_link( rxTrgt, 0 );
+ obus_smpCallout_link( rxTrgt, 0, i_sc );
return rc;
@@ -541,7 +565,7 @@ int32_t obus_callout_L1( ExtensibleChip * i_chip,
// Need the obus target
TargetHandle_t rxTrgt = i_chip->getTrgt();
// Call out LINK1 in SMPGROUP
- obus_smpCallout_link( rxTrgt, 1 );
+ obus_smpCallout_link( rxTrgt, 1, i_sc );
return rc;
@@ -555,7 +579,7 @@ int32_t obus0_callout_L0( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus0 link0
- obus_smpCallout_link( 0, i_chip, 0 );
+ obus_smpCallout_link( 0, i_chip, 0, i_sc );
return rc;
@@ -570,7 +594,7 @@ int32_t obus0_callout_L1( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus0 link1
- obus_smpCallout_link( 0, i_chip, 1 );
+ obus_smpCallout_link( 0, i_chip, 1, i_sc );
return rc;
@@ -585,7 +609,7 @@ int32_t obus1_callout_L0( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus1 link0
- obus_smpCallout_link( 1, i_chip, 0 );
+ obus_smpCallout_link( 1, i_chip, 0, i_sc );
return rc;
@@ -600,7 +624,7 @@ int32_t obus1_callout_L1( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus1 link1
- obus_smpCallout_link( 1, i_chip, 1 );
+ obus_smpCallout_link( 1, i_chip, 1, i_sc );
return rc;
@@ -615,7 +639,7 @@ int32_t obus2_callout_L0( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus2 link0
- obus_smpCallout_link( 2, i_chip, 0 );
+ obus_smpCallout_link( 2, i_chip, 0, i_sc );
return rc;
@@ -630,7 +654,7 @@ int32_t obus2_callout_L1( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus2 link1
- obus_smpCallout_link( 2, i_chip, 1 );
+ obus_smpCallout_link( 2, i_chip, 1, i_sc );
return rc;
@@ -645,7 +669,7 @@ int32_t obus3_callout_L0( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus3 link0
- obus_smpCallout_link( 3, i_chip, 0 );
+ obus_smpCallout_link( 3, i_chip, 0, i_sc );
return rc;
@@ -660,7 +684,7 @@ int32_t obus3_callout_L1( ExtensibleChip * i_chip,
int32_t rc = SUCCESS;
// callout obus3 link0
- obus_smpCallout_link( 3, i_chip, 1 );
+ obus_smpCallout_link( 3, i_chip, 1, i_sc );
return rc;
diff --git a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepairExtraSig.H b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepairExtraSig.H
index 06f2b7fce..888f3e313 100755
--- a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepairExtraSig.H
+++ b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepairExtraSig.H
@@ -32,5 +32,5 @@
PRDR_ERROR_SIGNATURE( ERepair_ERROR, 0xffff0000, "","ERepair Internal error" );
PRDR_ERROR_SIGNATURE( ERepair_FWThrExceeded, 0xffff0001, "",
"ERepair FW threshold exceeded" );
-
+PRDR_ERROR_SIGNATURE( LinkFailed, 0xffff0002, "", "Half link failed; degraded performance" );
#endif // __prdfLaneRepairExtraSig_H
OpenPOWER on IntegriCloud