diff options
author | Benjamin Weisenbeck <bweisenb@us.ibm.com> | 2018-09-18 13:22:27 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-09-26 13:03:27 -0500 |
commit | 46663cd701c138b99c1d6a55ae2ba3fba0fabee7 (patch) | |
tree | 0c320b9550717b2ce3ba159ade755740e674f30a /src/usr/diag | |
parent | 3ee865ba154a8997907b772c88c85504053db0f0 (diff) | |
download | talos-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.rule | 17 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C | 70 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/p9/prdfLaneRepairExtraSig.H | 2 |
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 |