From d12d677e100a9b48657c672e16288615703866e8 Mon Sep 17 00:00:00 2001 From: Bilicon Patil Date: Mon, 23 Sep 2013 02:09:13 -0500 Subject: PRD: Add rules for connected peer resolution Change-Id: I0af5b6a32059d22e7183a5bd2b4702971c21769b RTC: 72645 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/6289 Tested-by: Jenkins Server Reviewed-by: Sachin Gupta Reviewed-by: A. Patrick Williams III Reviewed-by: Zane Shelley Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/7209 --- .../common/framework/resolution/iipResolution.C | 52 ++++++++++-------- .../framework/resolution/iipResolutionFactory.C | 6 ++- .../framework/resolution/iipResolutionFactory.h | 6 ++- .../framework/resolution/prdfCalloutConnected.H | 18 +++++-- .../prdf/common/framework/rule/prdfRuleMetaData.C | 11 ++++ .../diag/prdf/common/framework/rule/prdrCompile.C | 1 + .../prdf/common/framework/rule/prdrCompile.lex | 1 + .../diag/prdf/common/framework/rule/prdrCompile.y | 5 ++ src/usr/diag/prdf/common/framework/rule/prdrExpr.H | 31 ++++++++--- .../diag/prdf/common/framework/rule/prdrLoadChip.C | 3 ++ .../prdf/common/plat/pegasus/Proc_acts_ABUS.rule | 6 +-- .../prdf/common/plat/pegasus/Proc_acts_PB.rule | 1 - .../prdf/common/plat/pegasus/Proc_acts_XBUS.rule | 8 +-- src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C | 62 ---------------------- 14 files changed, 106 insertions(+), 105 deletions(-) diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C index 2aa11b790..ae73bcd9e 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C @@ -228,43 +228,53 @@ int32_t CalloutConnected::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) { using namespace TARGETING; - TargetHandle_t sourceTrgt = ServiceDataCollector::getTargetAnalyzed(); - TargetHandle_t connTrgt = NULL; - - TargetHandleList list = getConnected( sourceTrgt, iv_targetType ); + TargetHandle_t sourceTrgt = ServiceDataCollector::getTargetAnalyzed(); + TargetHandle_t connTrgt = NULL; + TargetHandle_t srcEndPoint = NULL; - if ( 0xffffffff == iv_idx ) - { - if ( 0 < list.size() ) - connTrgt = list[0]; - } - else + if(TYPE_NA == iv_peerConnType) { - for (TargetHandleList::iterator i = list.begin(); i != list.end(); i++) + TargetHandleList list = getConnected( sourceTrgt, iv_targetType ); + + if ( 0xffffffff == iv_idx ) { - if ( iv_idx == getTargetPosition(*i) ) + if ( 0 < list.size() ) + connTrgt = list[0]; + } + else + { + for (TargetHandleList::iterator i = list.begin(); + i != list.end(); + i++) { - connTrgt = *i; - break; + if ( iv_idx == getTargetPosition(*i) ) + { + connTrgt = *i; + break; + } } } } + else + { + srcEndPoint = getConnectedChild( sourceTrgt, iv_peerConnType, iv_idx ); + + if ( NULL != srcEndPoint ) + connTrgt = getConnectedPeerTarget( srcEndPoint ); + } if ( NULL != connTrgt ) - { io_serviceData.service_data->SetCallout( connTrgt, iv_priority ); - } else { if ( NULL != iv_altResolution ) - { iv_altResolution->Resolve( io_serviceData ); - } else { - PRDF_ERR( "[CalloutConnected::Resolve] No connected chip found: " - "sourceTrgt=0x%08x iv_targetType=0x%x", - getHuid(sourceTrgt), iv_targetType ); + PRDF_ERR( "[CalloutConnected::Resolve] No connected chip found:" + " sourceTrgt=0x%08x, iv_peerConnType=0x%x", + getHuid(sourceTrgt), iv_peerConnType); + io_serviceData.service_data->SetCallout( sourceTrgt ); } } diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C index 10d0de2e2..56e8085f7 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C @@ -187,12 +187,14 @@ Resolution & ResolutionFactory::GetConnectedCalloutResolution( TARGETING::TYPE i_targetType, uint32_t i_idx, PRDpriority i_priority, - Resolution * i_altResolution ) + Resolution * i_altResolution, + TARGETING::TYPE i_peerConnType ) { CalloutConnected key( i_targetType, i_idx, i_priority, - i_altResolution ); + i_altResolution, + i_peerConnType ); return iv_connectedCallouts.get(key); } diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h index 8d883ccba..b1a39e1dd 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h @@ -145,6 +145,8 @@ public: * @param[in] idx index in GetConnected list to use * @param[in] i_priority @see prdfCallouts.H * @param[in] i_altResolution resolution for failure scenarios + * @param[in] i_peerConnType Type of target which connects to peer + of i_targetType * @return reference to a resolution * @note Don't use this to callout clocks - use prdfClockResolution */ @@ -152,7 +154,9 @@ public: TARGETING::TYPE i_targetType, uint32_t i_idx = 0, PRDpriority i_priority = MRU_MED, - Resolution * i_altResolution = NULL ); + Resolution * i_altResolution = NULL, + TARGETING::TYPE i_peerConnType + = TARGETING::TYPE_NA ); // dg04a - end // dg05a - start diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H index 4b8173687..10738d4ce 100755 --- a/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H +++ b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H @@ -80,12 +80,15 @@ public: * @param[in] i_altResolution to use if the connection does not exist or * is invalid. * If NULL than source is called out + * @param[i] i_peerConnType type of unit that is peer connected to + * i_targetType * @note Don't use this class to callout clocks - use ClockResolution */ CalloutConnected( TARGETING::TYPE i_targetType, uint32_t i_idx =0xffffffff , PRDpriority i_priority = MRU_MED, - Resolution * i_altResolution = NULL ); + Resolution * i_altResolution = NULL, + TARGETING::TYPE i_peerConnType = TARGETING::TYPE_NA ); // ~CalloutConnected(); default dtor is sufficient @@ -109,23 +112,27 @@ private: // Data uint32_t iv_idx; PRDF::PRDpriority iv_priority; Resolution * iv_altResolution; + TARGETING::TYPE iv_peerConnType; }; inline CalloutConnected::CalloutConnected(void) : iv_targetType(TARGETING::TYPE_NA), iv_idx(0xffffffff ), iv_priority(MRU_LOW), - iv_altResolution(NULL) + iv_altResolution(NULL), + iv_peerConnType(TARGETING::TYPE_NA) {} inline CalloutConnected::CalloutConnected( TARGETING::TYPE i_targetType, uint32_t i_idx, PRDpriority i_priority, - Resolution * i_altResolution ): + Resolution * i_altResolution, + TARGETING::TYPE i_peerConnType ): iv_targetType( i_targetType ), iv_idx( i_idx ), iv_priority( i_priority ), - iv_altResolution( i_altResolution ) + iv_altResolution( i_altResolution ), + iv_peerConnType(i_peerConnType) { } inline bool CalloutConnected::operator == ( const CalloutConnected & r ) const @@ -133,7 +140,8 @@ inline bool CalloutConnected::operator == ( const CalloutConnected & r ) const return ( ( iv_targetType == r.iv_targetType ) && ( iv_idx == r.iv_idx ) && ( iv_priority == r.iv_priority ) && ( ( iv_altResolution == r.iv_altResolution ) || - ( &iv_altResolution == &r.iv_altResolution ) ) ); + ( &iv_altResolution == &r.iv_altResolution ) ) && + ( iv_peerConnType == r.iv_peerConnType) ); } } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C b/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C index 73db21a52..ba2e1c35f 100644 --- a/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C +++ b/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C @@ -918,6 +918,17 @@ Resolution * RuleMetaData::createResolution( Prdr::Expr * i_action, (CalloutPriorityEnum) i_action->cv_value[1].i ); break; + case 'r': // PEER + l_rc = &i_data.cv_reslFactory.GetConnectedCalloutResolution( + (TARGETING::TYPE) i_action->cv_value[2].i, + i_action->cv_value[3].i, + (CalloutPriorityEnum) i_action->cv_value[1].i, + ( NULL == i_action->cv_value[4].p ? NULL : + ( this->createResolution( + i_action->cv_value[4].p, i_data ) ) ), + (TARGETING::TYPE) i_action->cv_value[5].i); + break; + case 's': // SELF default: l_rc = &i_data.cv_reslFactory.GetCalloutResolution( diff --git a/src/usr/diag/prdf/common/framework/rule/prdrCompile.C b/src/usr/diag/prdf/common/framework/rule/prdrCompile.C index 8d0507177..dc15d0e38 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrCompile.C +++ b/src/usr/diag/prdf/common/framework/rule/prdrCompile.C @@ -454,6 +454,7 @@ uint32_t prdrActionArgMap(const std::string & i_arg) g_ActionArgMap["TYPE_L4"] = TARGETING::TYPE_L4; g_ActionArgMap["TYPE_MBA"] = TARGETING::TYPE_MBA; g_ActionArgMap["TYPE_OCC"] = TARGETING::TYPE_OCC; + g_ActionArgMap["TYPE_NA"] = TARGETING::TYPE_NA; // Initialize symbolic callouts. for ( SymCallout_t * i = symCalloutArray; NULL != i->str; i++ ) diff --git a/src/usr/diag/prdf/common/framework/rule/prdrCompile.lex b/src/usr/diag/prdf/common/framework/rule/prdrCompile.lex index 67d8445ed..3f63a3785 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrCompile.lex +++ b/src/usr/diag/prdf/common/framework/rule/prdrCompile.lex @@ -127,6 +127,7 @@ flag { return PRDR_ACT_FLAG; } capture { return PRDR_ACT_CAPTURE; } connected { return PRDR_CONNECTED; } +connected_peer { return PRDR_CONNECTED_PEER; } nonzero { return PRDR_ACT_NONZERO; } alternate { return PRDR_ALTERNATE; } procedure { return PRDR_PROCEDURE; } diff --git a/src/usr/diag/prdf/common/framework/rule/prdrCompile.y b/src/usr/diag/prdf/common/framework/rule/prdrCompile.y index 1c270217d..1f44e93ad 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrCompile.y +++ b/src/usr/diag/prdf/common/framework/rule/prdrCompile.y @@ -138,6 +138,7 @@ using namespace PRDR_COMPILER; %token PRDR_ACT_CAPTURE %token PRDR_CONNECTED +%token PRDR_CONNECTED_PEER %token PRDR_ACT_NONZERO %token PRDR_ALTERNATE %token PRDR_PROCEDURE @@ -950,6 +951,10 @@ action_callout: PRDR_ACT_CALLOUT '(' PRDR_ID ')' { $$ = new ExprAct_Callout($8, $5, ExprAct_Callout::CALLOUT_PROC); } + | PRDR_ACT_CALLOUT '(' PRDR_CONNECTED_PEER '(' PRDR_ID ',' PRDR_INTEGER action_callout_alt ')' ',' PRDR_ID ')' + { + $$ = new ExprAct_Callout($11, $5, ExprAct_Callout::CALLOUT_PEER, $7, $8); + } ; diff --git a/src/usr/diag/prdf/common/framework/rule/prdrExpr.H b/src/usr/diag/prdf/common/framework/rule/prdrExpr.H index 534c074fa..b5437814c 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrExpr.H +++ b/src/usr/diag/prdf/common/framework/rule/prdrExpr.H @@ -865,16 +865,19 @@ class ExprAct_Callout : public Expr CALLOUT_SELF = 's', CALLOUT_CHIP = 'c', CALLOUT_PROC = 'p', + CALLOUT_PEER = 'r', }; Callout_type cv_type; ExprAct_Callout(std::string * i_1, - std::string * i_2 = NULL, - Callout_type i_t = CALLOUT_SELF, - uint32_t i_3 = 0xffffffff, - Expr * i_alt = NULL) : - cv_1(i_1), cv_2(i_2), cv_3(i_3), cv_alt(i_alt), cv_type(i_t) + std::string * i_2 = NULL, + Callout_type i_t = CALLOUT_SELF, + uint32_t i_3 = 0xffffffff, + Expr * i_alt = NULL): + cv_1(i_1), cv_2(i_2), + cv_3(i_3), cv_alt(i_alt), + cv_type(i_t) {} int output(FILE * i_file) @@ -904,6 +907,14 @@ class ExprAct_Callout : public Expr // Write ALT resolution. if (NULL != cv_alt) cv_alt->output(i_file); + + // Write peer connection type + if(CALLOUT_PEER == cv_type) + l_arg = htonl(prdrActionArgMap(*cv_2)); + else + l_arg = htonl(prdrActionArgMap("TYPE_NA")); + + PRDR_FWRITE(&l_arg, sizeof(l_arg), 1, i_file); } return 0; @@ -924,9 +935,17 @@ class ExprAct_Callout : public Expr } else { - o_stream << "connected ( " << *cv_2 ; + if(CALLOUT_PEER == cv_type) + { + o_stream << "connected_peer ( " << *cv_2 ; + } + else + { + o_stream << "connected ( " << *cv_2 ; + } if ( 0xffffffff != cv_3 ) o_stream << ", " << cv_3; + o_stream << " ), " << *cv_1 << " ) "; } } diff --git a/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C b/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C index 55e87c465..21198ad86 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C +++ b/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C @@ -434,6 +434,9 @@ void ReadExpr(UtilStream & i_stream, Expr & o_expr) } else o_expr.cv_value[4].p = NULL; + + // Read peer connection type + i_stream >> o_expr.cv_value[5].i; } break; diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_ABUS.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_ABUS.rule index e9810f67a..c5587db7f 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_ABUS.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_ABUS.rule @@ -489,7 +489,7 @@ actionclass calloutAbus0Interface { callout(procedure(PassiveFabric_OffNode_ENUM), MRU_MED); callout(connected(TYPE_ABUS, 0), MRU_MEDA); - funccall("calloutPeerBus_abus0"); + callout(connected_peer(TYPE_ABUS, 0), MRU_MEDA); }; /** Callout the ABUS 1 interface */ @@ -497,7 +497,7 @@ actionclass calloutAbus1Interface { callout(procedure(PassiveFabric_OffNode_ENUM), MRU_MED); callout(connected(TYPE_ABUS, 1), MRU_MEDA); - funccall("calloutPeerBus_abus1"); + callout(connected_peer(TYPE_ABUS, 1), MRU_MEDA); }; /** Callout the ABUS 2 interface */ @@ -505,7 +505,7 @@ actionclass calloutAbus2Interface { callout(procedure(PassiveFabric_OffNode_ENUM), MRU_MED); callout(connected(TYPE_ABUS, 2), MRU_MEDA); - funccall("calloutPeerBus_abus2"); + callout(connected_peer(TYPE_ABUS, 2), MRU_MEDA); }; /** Callout the ABUS 0 interface, threshold 1 */ diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule index a00b1a3f3..bb9c76c7b 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_PB.rule @@ -3335,4 +3335,3 @@ actionclass callout2ndLvlMedThr1 callout2ndLvlMed; threshold1; }; - diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_XBUS.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_XBUS.rule index e3311b177..167fd2d80 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_XBUS.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_XBUS.rule @@ -677,7 +677,7 @@ group gIoxFir_3 filter singlebit actionclass calloutXbus0Interface { callout(connected(TYPE_XBUS, 0), MRU_MEDA); - funccall("calloutPeerBus_xbus0"); + callout(connected_peer(TYPE_XBUS, 0), MRU_MEDA); callout(procedure(PassiveFabric_OnNode_ENUM), MRU_LOW); }; @@ -685,7 +685,7 @@ actionclass calloutXbus0Interface actionclass calloutXbus1Interface { callout(connected(TYPE_XBUS, 1), MRU_MEDA); - funccall("calloutPeerBus_xbus1"); + callout(connected_peer(TYPE_XBUS, 1), MRU_MEDA); callout(procedure(PassiveFabric_OnNode_ENUM), MRU_LOW); }; @@ -693,7 +693,7 @@ actionclass calloutXbus1Interface actionclass calloutXbus2Interface { callout(connected(TYPE_XBUS, 2), MRU_MEDA); - funccall("calloutPeerBus_xbus2"); + callout(connected_peer(TYPE_XBUS, 2), MRU_MEDA); callout(procedure(PassiveFabric_OnNode_ENUM), MRU_LOW); }; @@ -701,7 +701,7 @@ actionclass calloutXbus2Interface actionclass calloutXbus3Interface { callout(connected(TYPE_XBUS, 3), MRU_MEDA); - funccall("calloutPeerBus_xbus3"); + callout(connected_peer(TYPE_XBUS, 3), MRU_MEDA); callout(procedure(PassiveFabric_OnNode_ENUM), MRU_LOW); }; diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C index e77e092d4..053dd4535 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfP8Proc.C @@ -596,68 +596,6 @@ PRDF_PLUGIN_DEFINE( Proc, isVeniceProc ); // Callout plugins //------------------------------------------------------------------------------ -/** - * @brief Callout the peer end point on the given bus (priority MRU_MEDA). - * @param i_chip A P8 chip. - * @param i_sc The step code data struct. - * @param i_type Bus type (TYPE_XBUS or TYPE_ABUS). - * @param i_pos Bus position. - * @return SUCCESS - */ -int32_t calloutPeerBus( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & i_sc, - TYPE i_type, uint32_t i_pos ) -{ - #define PRDF_FUNC "[Proc::calloutPeerBus] " - - // FIXME RTC 72645 Can removed plugins once callout(connected()) is fixed. - - do - { - TargetHandle_t srcEndPoint = getConnectedChild( i_chip->GetChipHandle(), - i_type, i_pos ); - if ( NULL == srcEndPoint ) - { - PRDF_ERR( PRDF_FUNC"getConnectedChild(0x%08x,%d,%d) failed", - i_chip->GetId(), i_type, i_pos ); - break; - } - - TargetHandle_t destEndPoint = getConnectedPeerTarget( srcEndPoint ); - if ( NULL == destEndPoint ) - { - PRDF_ERR( PRDF_FUNC"getConnectedPeerTarget(0x%08x) failed", - getHuid(srcEndPoint) ); - break; - } - - i_sc.service_data->SetCallout( destEndPoint, MRU_MEDA ); - - } while (0); - - return SUCCESS; - - #undef PRDF_FUNC -} - -#define PLUGIN_CALLOUT_PEER_BUS( BUS, TYPE, POS ) \ -int32_t calloutPeerBus_##BUS##POS( ExtensibleChip * i_chip, \ - STEP_CODE_DATA_STRUCT & i_sc ) \ -{ return calloutPeerBus( i_chip, i_sc, TYPE, POS ); } \ -PRDF_PLUGIN_DEFINE( Proc, calloutPeerBus_##BUS##POS ); - -PLUGIN_CALLOUT_PEER_BUS( xbus, TYPE_XBUS, 0 ) -PLUGIN_CALLOUT_PEER_BUS( xbus, TYPE_XBUS, 1 ) -PLUGIN_CALLOUT_PEER_BUS( xbus, TYPE_XBUS, 2 ) -PLUGIN_CALLOUT_PEER_BUS( xbus, TYPE_XBUS, 3 ) - -PLUGIN_CALLOUT_PEER_BUS( abus, TYPE_ABUS, 0 ) -PLUGIN_CALLOUT_PEER_BUS( abus, TYPE_ABUS, 1 ) -PLUGIN_CALLOUT_PEER_BUS( abus, TYPE_ABUS, 2 ) - -#undef PLUGIN_CALLOUT_PEER_BUS - -//------------------------------------------------------------------------------ - /** * @brief Call to check for configured PHB (before capturing FFDC) * @param i_chip P8 chip -- cgit v1.2.1