diff options
author | Prem Shanker Jha <premjha2@in.ibm.com> | 2014-11-05 00:28:59 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-02-16 11:59:55 -0600 |
commit | 28253411cc210245e515edff5b166dd6114d711b (patch) | |
tree | 68885d83cc9359f0ca1016100d74fc8d1b12b542 /src/usr/diag | |
parent | 0e58a17ace081132941307bb348edde68dea5279 (diff) | |
download | talos-hostboot-28253411cc210245e515edff5b166dd6114d711b.tar.gz talos-hostboot-28253411cc210245e515edff5b166dd6114d711b.zip |
PRD: Added support for gard of individual target callout.
Change-Id: I42b94169ec85c31410f7e2c95adfd19857351f65
RTC: 103773
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/14322
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Tested-by: Jenkins Server
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/15739
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/diag')
25 files changed, 587 insertions, 540 deletions
diff --git a/src/usr/diag/prdf/common/framework/resolution/iipCalloutResolution.h b/src/usr/diag/prdf/common/framework/resolution/iipCalloutResolution.h deleted file mode 100755 index f811b65dc..000000000 --- a/src/usr/diag/prdf/common/framework/resolution/iipCalloutResolution.h +++ /dev/null @@ -1,157 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/usr/diag/prdf/common/framework/resolution/iipCalloutResolution.h $ */ -/* */ -/* OpenPOWER HostBoot Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ - -#ifndef iipCalloutResolution_h -#define iipCalloutResolution_h - -// Class Description ************************************************* -// -// Name: CalloutResolution -// Base class: Resolution -// -// Description: Resolution makes a MRU Callout. -// -// Usage: -// -// -// CalloutResolution r1(PU0,MRU_MED); -// ResolutionMap rm(....) // see iipResolutionMap.h -// rm.Add(BIT_LIST_STRING_31,&r1); // if bit 31 is on callout PU0 HIGH as -// // the failing item -// -// ... -// -// -// End Class Description ********************************************* - -//-------------------------------------------------------------------- -// Includes -//-------------------------------------------------------------------- - -#include <prdfCallouts.H> -#include <iipResolution.h> - -namespace PRDF -{ - -//-------------------------------------------------------------------- -// Forward References -//-------------------------------------------------------------------- - -/** - A resolution that adds a MRU callout to the service data collector - @version V4R5 - @author Douglas R. Gilbert -*/ - -class CalloutResolution: public Resolution -{ -public: - - /** - CTOR - <ul> - <br><b>Parameters: </b> a MruValues, a PriorityValues (see xspiiCallout.h) - <br><b>Returns: </b> None. - <br><b>Requirements:</b> None. - <br><b>Promises: </b> Object created - <br><b>Exceptions: </b> None. - </ul><br> - */ - CalloutResolution(PRDcallout callout, PRDpriority priority); - CalloutResolution(void); // default - CalloutResolution(const CalloutResolution & cr); - - // Function Specification ******************************************** - // - // Purpose: Destruction - // Parameters: None. - // Returns: No value returned - // Requirements: None. - // Promises: None. - // Exceptions: None. - // Concurrency: Reentrant - // Notes: Compiler default is sufficient - // - // End Function Specification **************************************** - //~CalloutResolution(); - - /** - Resolve by adding a the MRU callout to the service data collector - <ul> - <br><b>Parameters: </b> ServiceDataCollector - <br><b>Returns: </b> Return code [SUCCESS | nonZero] - <br><b>Requirements:</b> none. - <br><b>Promises: </b> serviceData::getMruList().GetCount()++ - <br><b>Exceptions: </b> None. - </ul><br> - */ - virtual int32_t Resolve(STEP_CODE_DATA_STRUCT & error); - - // dg00 start - virtual bool operator==(const Resolution & r) const - { - return r.operator==(*this); // compare whatever r is with this - } - - virtual bool operator==(const CalloutResolution & r) const - { - return((xMruCallout == r.xMruCallout) && (xPriority == r.xPriority)); - } - -// friend int operator==(const CalloutResolution& a, const CalloutResolution& b) -// { -// return((a.xMruCallout == b.xMruCallout) && (a.xPriority == b.xPriority)); -// } - // dg00 end - -private: // functions -private: // Data - - PRDcallout xMruCallout; - PRDpriority xPriority; - -}; - - -inline -CalloutResolution::CalloutResolution(PRDcallout callout, - PRDpriority priority) -: xMruCallout(callout), xPriority(priority) -{} - -inline -CalloutResolution::CalloutResolution() : - xMruCallout(NULL), xPriority(MRU_MED) -{} - -inline -CalloutResolution::CalloutResolution(const CalloutResolution & cr) -: xMruCallout(cr.xMruCallout), xPriority(cr.xPriority) -{} - -} // end namespace PRDF - -#endif /* iipCalloutResolution_h */ diff --git a/src/usr/diag/prdf/common/framework/resolution/iipCaptureResolution.h b/src/usr/diag/prdf/common/framework/resolution/iipCaptureResolution.h index afc4a253e..d05f503f4 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipCaptureResolution.h +++ b/src/usr/diag/prdf/common/framework/resolution/iipCaptureResolution.h @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 1996,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ +/* [+] International Business Machines Corp. */ +/* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ @@ -52,7 +54,7 @@ class SCAN_COMM_REGISTER_CLASS; class SomeChipClass { public: CaptureResolution iv_captureScr; - CalloutResolution calloutSomething; + CalloutGardResolution calloutSomething; ResolutionMap someResolutionMap; // .... }; diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C index 3808b5759..bde13c9d2 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolution.C +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolution.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -39,7 +39,6 @@ #include <iipSystem.h> #include <prdfGlobal.H> //#include <iipCalloutMap.h> -#include <iipCalloutResolution.h> #include <iipstep.h> #include <iipCaptureData.h> #include <iipServiceDataCollector.h> @@ -52,7 +51,8 @@ #include <iipAnalyzeChipResolution.h> #include <xspprdTryResolution.h> #include <iipchip.h> -#include <prdfCalloutConnected.H> +#include <prdfCalloutGard.H> +#include <prdfCalloutConnectedGard.H> #include <prdfAnalyzeConnected.H> #include <prdfPlatServices.H> #undef iipResolution_C @@ -101,37 +101,37 @@ int32_t EregResolution::Resolve( STEP_CODE_DATA_STRUCT & io_data ) return rc; } - -//--------------------------------------------------------------------- -// CalloutResolution Member Function Specifications -// using MruValues (xspiiCallout.h) -//--------------------------------------------------------------------- - -int32_t CalloutResolution::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) +//-------------------------------------------------------------------- +// CalloutGardResolution Member Functions +//-------------------------------------------------------------------- +int32_t CalloutGardResolution::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) { /* - This resolution is only needed when we callout self.So during RuleChip - creation,we create CalloutResolution passing NULL as target value.In Resolve - function when we need to update SDC with target to be called out we get it - from Service Data Collector.It is because target currently under analysis is - the target that needs to be called out here.By instantiating Callout - resolution with just priority info and NULL target , we are able to reduce - CalloutResolution objects to one per priority instead of one per target per - priority.So,this reduction in number of resolution objects shall eventually - reduce memory utilization. + This resolution is only needed when we callout self. So, during RuleChip + creation, we create CalloutGardResolution passing NULL as target value. In + Resolve function when we need to update SDC with target to be called out, we + get it from Service Data Collector. It is because target currently under + analysis is the target that needs to be called out here. By instantiating + Callout resolution with just priority info and NULL target, we are able to + reduce CalloutGardResolution objects to one per priority instead of one per + target per priority. So, this reduction in number of resolution objects + shall eventually reduce memory utilization. */ - if ( PRDcalloutData::TYPE_TARGET == xMruCallout.getType() ) + if ( PRDcalloutData::TYPE_TARGET == iv_callout.getType() ) { PRDcallout l_targetCallout( ServiceDataCollector::getTargetAnalyzed() ); - io_serviceData.service_data->SetCallout( l_targetCallout, xPriority ); + io_serviceData.service_data->SetCallout( l_targetCallout, + iv_calloutPriority, + iv_gardState ); } else { - io_serviceData.service_data->SetCallout( xMruCallout,xPriority ); + io_serviceData.service_data->SetCallout( iv_callout, iv_calloutPriority, + iv_gardState ); } - return(SUCCESS); + return SUCCESS; } //-------------------------------------------------------------------- @@ -208,7 +208,10 @@ int32_t TryResolution::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) return rc; } -int32_t CalloutConnected::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) +//-------------------------------------------------------------------- +// CalloutConnectedGard Member Functions +//-------------------------------------------------------------------- +int32_t CalloutConnectedGard::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) { using namespace TARGETING; @@ -248,7 +251,9 @@ int32_t CalloutConnected::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) } if ( NULL != connTrgt ) - io_serviceData.service_data->SetCallout( connTrgt, iv_priority ); + io_serviceData.service_data->SetCallout( connTrgt, + iv_priority, + iv_gardState); else { if ( NULL != iv_altResolution ) @@ -259,7 +264,9 @@ int32_t CalloutConnected::Resolve( STEP_CODE_DATA_STRUCT & io_serviceData ) " sourceTrgt=0x%08x, iv_peerConnType=0x%x", getHuid(sourceTrgt), iv_peerConnType); - io_serviceData.service_data->SetCallout( sourceTrgt ); + io_serviceData.service_data->SetCallout( sourceTrgt, + MRU_MED, + iv_gardState ); } } diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolution.h b/src/usr/diag/prdf/common/framework/resolution/iipResolution.h index cd97dc3da..f3fb31d2e 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolution.h +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolution.h @@ -65,7 +65,6 @@ namespace PRDF //-------------------------------------------------------------------- // Forward References //-------------------------------------------------------------------- -class CalloutResolution; //dg00 class Resolution @@ -95,8 +94,7 @@ public: // Parameters: Reference to the Step code data structure // Returns: return code // Requirements: None - // Promises: if rc = SUCCESS then data filled with appropriate service - // data + // Promises: if rc = SUCCESS then data filled with apropriate service data // Exceptions: None // Concurrency: synchronous // Notes: if rc != SUCCESS then state of service data is unpredictable @@ -122,9 +120,6 @@ public: */ virtual bool operator==(const Resolution & r) const { return false; } // default - virtual bool operator==(const CalloutResolution & r) const - { return false; } - // dg00 end protected: diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C index b2a1109a3..e3eb70f65 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.C @@ -42,6 +42,8 @@ #include <prdfFlyWeight.C> // dg01 #include <prdfFlyWeightS.C> #include <prdfPlatServices.H> +#include <prdfCalloutConnectedGard.H> +#include <prdfCalloutGard.H> #undef iipResolutionFactory_C //---------------------------------------------------------------------- @@ -102,14 +104,13 @@ ResolutionFactory::~ResolutionFactory() // --------------------------------------------------------------------- -Resolution & ResolutionFactory::GetCalloutResolution(PRDcallout callout, - PRDpriority p) +Resolution & ResolutionFactory::getCalloutGardResol( PRDcallout callout, + PRDpriority p, + GARD_POLICY i_gardState ) { // search for existing callout - // dg01 start - CalloutResolution key(callout,p); - return iv_Callouts.get(key); - // dg01 end + CalloutGardResolution key(callout, p, i_gardState ); + return iv_calloutGardFW.get(key); } // ---------------------------------------------------------------------- @@ -185,22 +186,28 @@ MaskResolution & ResolutionFactory::GetThresholdResolution(uint32_t maskId) return *r; } -Resolution & ResolutionFactory::GetConnectedCalloutResolution( +// --------------------------------------------------------------------- + +Resolution & ResolutionFactory::getConnCalloutGardResol( TARGETING::TYPE i_targetType, uint32_t i_idx, PRDpriority i_priority, Resolution * i_altResolution, - TARGETING::TYPE i_peerConnType ) + TARGETING::TYPE i_peerConnType, + GARD_POLICY i_gardState ) { - CalloutConnected key( i_targetType, - i_idx, - i_priority, - i_altResolution, - i_peerConnType ); - - return iv_connectedCallouts.get(key); + CalloutConnectedGard key( i_targetType, + i_idx, + i_priority, + i_altResolution, + i_peerConnType, + i_gardState ); + + return iv_connCalloutGardFW.get(key); } +// --------------------------------------------------------------------- + Resolution & ResolutionFactory::GetAnalyzeConnectedResolution( TARGETING::TYPE i_targetType, uint32_t i_idx ) @@ -277,7 +284,6 @@ void ResolutionFactory::Reset() iv_captureResolutionFW.clear(); /*Clear because the "alt resolution" could have be a link or other cleared resolution.*/ - iv_connectedCallouts.clear(); iv_clockResolutionFW.clear(); } @@ -286,16 +292,12 @@ void ResolutionFactory::Reset() void ResolutionFactory::printStats() { - PRDF_TRAC("Callout"); - iv_Callouts.printStats( ); PRDF_TRAC("Link Resolution"); iv_Links.printStats( ); PRDF_TRAC("ThresholdResolutionList"); iv_thresholdResolutions.printStats( ); PRDF_TRAC("MaskResolution"); iv_maskResolutions.printStats( ); - PRDF_TRAC("ConnectedCallout"); - iv_connectedCallouts.printStats( ); PRDF_TRAC("AnalyzeConnectedCallout"); iv_analyzeConnected.printStats( ); PRDF_TRAC("pluginCallFW"); @@ -316,6 +318,10 @@ void ResolutionFactory::printStats() iv_captureResolutionFW.printStats( ); PRDF_TRAC("clockResolution"); iv_clockResolutionFW.printStats( ); + PRDF_TRAC("CalloutGardResolFW"); + iv_calloutGardFW.printStats( ); + PRDF_TRAC("CalloutConnectedGardResolFW"); + iv_connCalloutGardFW.printStats( ); } #endif diff --git a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h index 3369330e9..629e52b05 100755 --- a/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h +++ b/src/usr/diag/prdf/common/framework/resolution/iipResolutionFactory.h @@ -41,7 +41,6 @@ // Usage: // // ResolutionFactory & resolutionPool = ResolutionFactory::Access(); -// FinalResolution & fr = resolutionPool.GetCalloutResolution(EAGLE0_HIGH); // // // End Class Description ********************************************* @@ -56,9 +55,7 @@ #include <prdfGlobal.H> #include <prdfFlyWeight.H> #include <prdfFlyWeightS.H> -#include <iipCalloutResolution.h> #include <prdfThresholdResolutions.H> -#include <prdfCalloutConnected.H> #include <prdfAnalyzeConnected.H> #include <prdfPluginCallResolution.H> #include <iipEregResolution.h> @@ -68,6 +65,8 @@ #include <xspprdGardResolution.h> #include <prdfCaptureResolution.H> #include <prdfClockResolution.H> +#include <prdfCalloutGard.H> +#include <prdfCalloutConnectedGard.H> namespace PRDF { @@ -105,18 +104,18 @@ public: * resolution list */ void Reset(); - // dg03a end /** - * @brief Get a resolution that makes a callout - * @param [in] PRDcallout (see prdfCallouts.H) - * @param [in] PRDpriority (see prdfCallouts.H) + * @brief Returns resolution that callouts target. But it may or + may not gard it. + * @param PRDcallout (see prdfCallouts.H) + * @param PRDpriority (see prdfCallouts.H) + * @param gard policy associated with target. * @return Resolution & - * @note Regatta CSP use only. Do not call this method from a static - * object. */ - Resolution & GetCalloutResolution( PRDcallout callout, - PRDpriority p = PRDF::MRU_MED); + Resolution & getCalloutGardResol( PRDcallout callout, + PRDpriority p = PRDF::MRU_MED, + GARD_POLICY i_gard = GARD ); /** * @brief Get a threshold Resolution @@ -140,28 +139,30 @@ public: MaskResolution & GetThresholdResolution(uint32_t maskId, const ThresholdResolution::ThresholdPolicy* policy); - // dg04a - start /** - * @brief GetConnectedCalloutResolution - * @param[in] i_targetType Type of target connected to i_source - * @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 + * @brief Returns an instance of CalloutConnectedGard. + * @param i_targetType Type of target connected to i_source + * @param idx index in GetConnected list to use + * @param i_priority @see prdfCallouts.H + * @param i_altResolution resolution for failure scenarios + * @param i_peerConnType Type of target which connects to peer + of i_targetType + * @param i_gardState gard policy associated with callout target + * @return reference to a resolution + * @note This resolution callouts a connected target. There is an option + * to specify the gard policy for the callout target. Don't use + * this to callout clocks - use prdfClockResolution + */ - Resolution & GetConnectedCalloutResolution( - TARGETING::TYPE i_targetType, - uint32_t i_idx = 0, - PRDpriority i_priority = MRU_MED, - Resolution * i_altResolution = NULL, - TARGETING::TYPE i_peerConnType - = TARGETING::TYPE_NA ); - // dg04a - end - - // dg05a - start + Resolution & getConnCalloutGardResol( + TARGETING::TYPE i_targetType, + uint32_t i_idx = 0, + PRDpriority i_priority = MRU_MED, + Resolution * i_altResolution = NULL, + TARGETING::TYPE i_peerConnType = + TARGETING::TYPE_NA, + GARD_POLICY i_gardState = GARD ); + /** * @brief GetAnalyzeConnectedResoltuion * @param[in] i_targetType type of unit that's connected to the source @@ -373,14 +374,11 @@ public: private: // Data - // dg01 - start - typedef FlyWeight< CalloutResolution, 50> CalloutFW; // dg01a typedef FlyWeightS< ResolutionLink, 50> ResolutionLinkFW; // dg01a typedef FlyWeight< ThresholdResolution, 50 > ThresholdResolutionList; // dg02a typedef FlyWeight< MaskResolution, 50 > MaskResolutionFW; // dg02a - typedef FlyWeight< CalloutConnected, 25 > ConnectedFW; // dg04a typedef FlyWeight< AnalyzeConnected, 20 > AnalyzeCFW; // dg05a typedef FlyWeight< PluginCallResolution, 10 > PluginCallFW; // dg06a typedef FlyWeight< ThresholdSigResolution, 10 > ThresholdSigFW; // dg06a @@ -391,14 +389,14 @@ private: // Data typedef FlyWeight< GardResolution, 5 > GardResolutionFW; // dg06a typedef FlyWeight< CaptureResolution, 5> CaptureResolutionFW; // pw01 typedef FlyWeight< ClockResolution, 8 > ClockResolutionFW; // jl01a + typedef FlyWeight< CalloutGardResolution, 50 > CalloutGardResolFW; + typedef FlyWeight< CalloutConnectedGard, 25> CalloutConnectedGardResolFW; - CalloutFW iv_Callouts; // dg01a ResolutionLinkFW iv_Links; // dg01a ThresholdResolutionList iv_thresholdResolutions; // dg02a MaskResolutionFW iv_maskResolutions; // dg02a // dg01 - end - ConnectedFW iv_connectedCallouts; // dg04a AnalyzeCFW iv_analyzeConnected; // dg05a PluginCallFW iv_pluginCallFW; // dg06a ThresholdSigFW iv_thresholdSigFW; // dg06a @@ -409,6 +407,8 @@ private: // Data GardResolutionFW iv_gardResolutionFW; // dg06a CaptureResolutionFW iv_captureResolutionFW; // pw01 ClockResolutionFW iv_clockResolutionFW; // jl01a + CalloutGardResolFW iv_calloutGardFW; ///< stores CalloutGardResolution + CalloutConnectedGardResolFW iv_connCalloutGardFW; ///< CalloutConnectedGard }; diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H deleted file mode 100755 index f306e04c0..000000000 --- a/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H +++ /dev/null @@ -1,151 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnected.H $ */ -/* */ -/* OpenPOWER HostBoot Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2012,2015 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ - -#ifndef PRDFCALLOUTCONNECTED_H -#define PRDFCALLOUTCONNECTED_H -/** - @file prdfCalloutConnected.H - @brief A resolution to callout a connected MRU determined at the time of the error. -*/ - - -//-------------------------------------------------------------------- -// Includes -//-------------------------------------------------------------------- - -#include <iipResolution.h> -#include <prdfPlatServices.H> -#include <prdfCallouts.H> - -namespace PRDF -{ - -//-------------------------------------------------------------------- -// Forward References -//-------------------------------------------------------------------- -struct STEP_CODE_DATA_STRUCT; - -/** - This resolution calls out a connected MRU. - @author Doug Gilbert - @par - This resolution calls out a connected MRU, but waits until the time of the error - to determine whats connected. This allows for runtime GARD, dynamic failover and concurrent - maintenance - without having to call PRD to re-build itself. - @code - CalloutConnected iv_callout(PROC, TYPE_MCS ....); - // ...... - // This will add the MCSs thats connected to this PROC to the callout list - iv_callout.Resolve(serviceData); - @endcode - @note Don't use this class to callout clocks - use prdfClockResolution -*/ -class CalloutConnected : public Resolution -{ -public: - /** - default ctor - */ - CalloutConnected(void); - - /** - * @brief Constructor - * @param[in] i_targetType type of desired unit that's connected to - * i_psourceHandle - * @param[in] i_idx index into getConnected list to callout - * (i_idx = 0xffffffff means callout the first - * valid target) - * @param[in] i_priority callout priority @see srci.H for priority - * values - * @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, - TARGETING::TYPE i_peerConnType = TARGETING::TYPE_NA ); - - // ~CalloutConnected(); default dtor is sufficient - - /** - * @brief calls out the target connected to target under analysis. - * @param[io] io_service_data Reference to STEP_CODE_DATA_STRUCT - * @post service_data is complete - * @return SUCCESS | non-zero - * @note if the call to getConnected yields an invalid target then - * altResolution is called. If the altResolution is NULL than the - * source is added to the callout list. - */ - virtual int32_t Resolve( STEP_CODE_DATA_STRUCT & io_service_data ); - - virtual bool operator==(const CalloutConnected & r) const; - -private: // functions -private: // Data - - TARGETING::TYPE iv_targetType; - 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_peerConnType(TARGETING::TYPE_NA) -{} - -inline CalloutConnected::CalloutConnected( TARGETING::TYPE i_targetType, - uint32_t i_idx, - PRDpriority i_priority, - Resolution * i_altResolution, - TARGETING::TYPE i_peerConnType ): - iv_targetType( i_targetType ), - iv_idx( i_idx ), - iv_priority( i_priority ), - iv_altResolution( i_altResolution ), - iv_peerConnType(i_peerConnType) -{ } - -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_peerConnType == r.iv_peerConnType) ); -} - -} // end namespace PRDF - -#endif /* PRDFCALLOUTCONNECTED_H */ diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnectedGard.H b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnectedGard.H new file mode 100644 index 000000000..776ab9bd5 --- /dev/null +++ b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnectedGard.H @@ -0,0 +1,146 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/common/framework/resolution/prdfCalloutConnectedGard.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2014,2015 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ + +#ifndef PRDFCALLOUTCONNECTED_GARD_H +#define PRDFCALLOUTCONNECTED_GARD_H +/** + * @file prdfCalloutConnectedGard.H + * @brief A resolution to callout and gard connected MRU determined at the + * time of the error. + */ + + +//-------------------------------------------------------------------- +// Includes +//-------------------------------------------------------------------- + +#include <prdfPlatServices.H> +#include <prdfCallouts.H> +#include <iipResolution.h> + +namespace PRDF +{ + +//-------------------------------------------------------------------- +// Forward References +//-------------------------------------------------------------------- +struct STEP_CODE_DATA_STRUCT; + +class CalloutConnectedGard : public Resolution +{ + public: + /** + * @brief default ctor + */ + CalloutConnectedGard(void); + + /** + * @brief Constructor + * @param i_targetType type of desired unit that's connected to + * i_psourceHandle + * @param i_idx index into getConnected list to callout + * (i_idx = 0xffffffff means callout the first + * valid target) + * @param i_priority callout priority @see srci.H for priority + * values + * @param i_altResolution to use if the connection does not exist or + * is invalid. + * If NULL than source is called out + * @param i_peerConnType type of unit that is peer connected to + * i_targetType + * @param i_trgtGardState gard policy associated with target callout + * @note Don't use this class to callout clocks - use ClockResolution + */ + CalloutConnectedGard( TARGETING::TYPE i_targetType, + uint32_t i_idx = 0xffffffff, + PRDpriority i_priority = MRU_MED, + Resolution * i_altResolution = NULL, + TARGETING::TYPE i_peerConnType = TARGETING::TYPE_NA, + GARD_POLICY i_trgtGardState = PRDF::GARD ); + + // ~CalloutConnectedGard(); default dtor is sufficient + + /** + * @brief callout and gard target connected to target under analysis. + * @param io_service_data Reference to STEP_CODE_DATA_STRUCT + * @post service_data is complete + * @return SUCCESS | non-zero + * @note if the call to getConnected yields an invalid target then + * altResolution is called. If the altResolution is NULL than the + * source is added to the callout list. + */ + virtual int32_t Resolve( STEP_CODE_DATA_STRUCT & io_service_data ); + + /** + * @brief overloads operator == + */ + virtual bool operator==(const CalloutConnectedGard & i_right ) const; + + protected: // Data + + TARGETING::TYPE iv_targetType; + uint32_t iv_idx; + PRDF::PRDpriority iv_priority; + Resolution * iv_altResolution; + TARGETING::TYPE iv_peerConnType; + GARD_POLICY iv_gardState; ///< gard policy associated with resolution +}; + +inline CalloutConnectedGard::CalloutConnectedGard( void ) : + iv_targetType( TARGETING::TYPE_NA ), + iv_idx( 0xffffffff ), + iv_priority( MRU_LOW ), + iv_altResolution( NULL ), + iv_peerConnType( TARGETING::TYPE_NA ), + iv_gardState( PRDF::GARD ) +{} + +inline CalloutConnectedGard::CalloutConnectedGard( TARGETING::TYPE i_targetType, + uint32_t i_idx, + PRDpriority i_priority, + Resolution * i_altResolution, + TARGETING::TYPE i_peerConnType, + GARD_POLICY i_trgtGardState ) : + iv_targetType( i_targetType ), + iv_idx( i_idx ), + iv_priority( i_priority ), + iv_altResolution( i_altResolution ), + iv_peerConnType( i_peerConnType ), + iv_gardState( i_trgtGardState ) +{ } + +inline bool CalloutConnectedGard::operator == + ( const CalloutConnectedGard & i_right ) const +{ + return ( iv_targetType == i_right.iv_targetType && + iv_idx == i_right.iv_idx && iv_priority == i_right.iv_priority && + iv_altResolution == i_right.iv_altResolution && + iv_peerConnType == i_right.iv_peerConnType && + iv_gardState == i_right.iv_gardState ); +} + +} // end namespace PRDF + +#endif /* PRDFCALLOUTCONNECTED_GARD_H */ diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfCalloutGard.H b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutGard.H new file mode 100644 index 000000000..34b27650e --- /dev/null +++ b/src/usr/diag/prdf/common/framework/resolution/prdfCalloutGard.H @@ -0,0 +1,123 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/common/framework/resolution/prdfCalloutGard.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2014,2015 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); */ +/* you may not use this file except in compliance with the License. */ +/* You may obtain a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ +/* implied. See the License for the specific language governing */ +/* permissions and limitations under the License. */ +/* */ +/* IBM_PROLOG_END_TAG */ + +#ifndef PRDF_CALLOUT_GARD_H +#define PRDF_CALLOUT_GARD_H +/** + * @file prdfCalloutGard.H + * @brief A resolution to callout and gard MRU reporting attention. + */ + +//-------------------------------------------------------------------- +// Includes +//-------------------------------------------------------------------- + +#include <prdfCallouts.H> +#include <iipResolution.h> +#include <iipServiceDataCollector.h> + +namespace PRDF +{ + +//-------------------------------------------------------------------- +// Forward References +//-------------------------------------------------------------------- + + +class CalloutGardResolution: public Resolution +{ + public: + /** + * @brief constructor + * @param i_callout callout instance + * @param i_priority i_priority associated with callout. + * @param i_gardState gard policy associated with callout. + */ + CalloutGardResolution( PRDcallout i_callout, PRDpriority i_priority, + GARD_POLICY i_gardState ); + /** + * @brief constructor + */ + CalloutGardResolution(void); // default + + /** + * @brief constructor + */ + CalloutGardResolution(const CalloutGardResolution & i_cr); + + //~CalloutGardResolution(); + + /** + * @brief Executes the callout and enforces gard policy. + * @param error step code data struct. + */ + virtual int32_t Resolve(STEP_CODE_DATA_STRUCT & error); + + /** + * @brief compares if two CalloutGardResolution are identical. + */ + virtual bool operator==(const CalloutGardResolution & i_right ) const + { + return(( iv_callout == i_right.iv_callout) && + ( iv_calloutPriority == i_right.iv_calloutPriority) && + ( iv_gardState == i_right.iv_gardState )); + } + + protected: // Data + + PRDcallout iv_callout; ///< MRU associated with callout action + PRDpriority iv_calloutPriority; ///< Priority associated with callout + GARD_POLICY iv_gardState; ///< gard policy associated with resolution + +}; + + +inline CalloutGardResolution::CalloutGardResolution( + PRDcallout i_callout, + PRDpriority i_priority, + GARD_POLICY i_gardState ) : + iv_callout( i_callout ), + iv_calloutPriority( i_priority ), + iv_gardState( i_gardState ) +{} + +inline +CalloutGardResolution::CalloutGardResolution() : + iv_callout( NULL ), + iv_calloutPriority( MRU_MED ), + iv_gardState( GARD ) +{} + +inline +CalloutGardResolution::CalloutGardResolution( + const CalloutGardResolution & i_cr) : + iv_callout( i_cr.iv_callout ), + iv_calloutPriority( i_cr.iv_calloutPriority ), + iv_gardState( i_cr.iv_gardState ) +{} + +} // end namespace PRDF + +#endif /* PRDF_CALLOUT_GARD_H */ diff --git a/src/usr/diag/prdf/common/framework/resolution/prdfResetThresholdResolution.H b/src/usr/diag/prdf/common/framework/resolution/prdfResetThresholdResolution.H index 3af6e7bae..845f8e9e1 100755 --- a/src/usr/diag/prdf/common/framework/resolution/prdfResetThresholdResolution.H +++ b/src/usr/diag/prdf/common/framework/resolution/prdfResetThresholdResolution.H @@ -57,7 +57,6 @@ @code enum { thresholdValue = 32, MaskId = 05 }; ResetThresholdResolution rtr(thresholdValue,MaskId); - Resolution & fr = ResolutionFactory::Access().GetCalloutResolution(HOM_IOHUBCHIP0,MRU_HIGH); ResolutionMap rm(...); // see ResolutionMap rm.Add(BIT_LIST_STRING_05,&rtr,&ftr); // Resolution invoked when bit 5 // is on - callsout callout and diff --git a/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C b/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C index 7133e23fe..de390469e 100644 --- a/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C +++ b/src/usr/diag/prdf/common/framework/rule/prdfRuleMetaData.C @@ -338,8 +338,8 @@ errlHndl_t RuleMetaData::loadRuleFile( ScanFacility & i_scanFactory , // initialize all the pointers for the groups, but don't construct their // data yet. Resolution & l_defaultResolution = - i_reslFactory.GetCalloutResolution( NULL, - MRU_MED ); + i_reslFactory.getCalloutGardResol( NULL, + MRU_MED, GARD ); for (int i = 0; i < l_chip->cv_groupCount; i++) { iv_groupList.push_back( new Group( l_defaultResolution ) ); @@ -888,40 +888,46 @@ Resolution * RuleMetaData::createResolution( Prdr::Expr * i_action, case Prdr::ACT_CALL: // CALLOUT - switch ((char)i_action->cv_value[0].i) + switch (i_action->cv_value[0].i) { - case 'c': // connected chip. - l_rc = &i_data.cv_reslFactory.GetConnectedCalloutResolution( + case Prdr::CALLOUT_GARD_CHIP: // connected callout with gard + l_rc = &i_data.cv_reslFactory.getConnCalloutGardResol( (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 ) ) ) ); - break; - - case 'p': // Procedure. - l_rc = &i_data.cv_reslFactory.GetCalloutResolution( - (SymbolicFru) i_action->cv_value[2].i, - (CalloutPriorityEnum) i_action->cv_value[1].i ); + i_action->cv_value[4].p, i_data ) ) ), + TARGETING::TYPE_NA, + (GARD_POLICY) i_action->cv_value[6].i ); break; - case 'r': // PEER - l_rc = &i_data.cv_reslFactory.GetConnectedCalloutResolution( + // connected callout and gard with connection type + case Prdr::CALLOUT_GARD_PEER: + l_rc = &i_data.cv_reslFactory.getConnCalloutGardResol( (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); + (TARGETING::TYPE) i_action->cv_value[5].i, + (GARD_POLICY) i_action->cv_value[6].i ); + break; - case 's': // SELF + case Prdr::CALLOUT_PROC: // Procedure callout + l_rc = &i_data.cv_reslFactory.getCalloutGardResol( + (SymbolicFru) i_action->cv_value[2].i, + (CalloutPriorityEnum) i_action->cv_value[1].i ); + break; + + case Prdr::CALLOUT_GARD_SELF: // self callout with gard option default: - l_rc = &i_data.cv_reslFactory.GetCalloutResolution( + l_rc = &i_data.cv_reslFactory.getCalloutGardResol( NULL , - (CalloutPriorityEnum) i_action->cv_value[1].i ); + (CalloutPriorityEnum) i_action->cv_value[1].i, + (GARD_POLICY) i_action->cv_value[6].i ); break; }; diff --git a/src/usr/diag/prdf/common/framework/rule/prdrCommon.H b/src/usr/diag/prdf/common/framework/rule/prdrCommon.H index 6e1b1d7e4..a09871a40 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrCommon.H +++ b/src/usr/diag/prdf/common/framework/rule/prdrCommon.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -143,6 +143,14 @@ namespace Prdr ACT_CAPT = 'C', }; + enum Callout_type + { + CALLOUT_PROC = 0x00000001, // for procedure callout + CALLOUT_GARD_SELF = 0x00000002, // for self callout and gard + CALLOUT_GARD_CHIP = 0x00000003, // for connected callout and gard + CALLOUT_GARD_PEER = 0x00000004, // for callout and gard of connected + // peer + }; class SignatureOp { public: diff --git a/src/usr/diag/prdf/common/framework/rule/prdrCompile.C b/src/usr/diag/prdf/common/framework/rule/prdrCompile.C index f4da5bf20..67844c403 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrCompile.C +++ b/src/usr/diag/prdf/common/framework/rule/prdrCompile.C @@ -40,6 +40,7 @@ #include <prdrToken.H> #include <UtilHash.H> #include <xspprdGardResolution.h> +#include <prdfEnums.H> using namespace PRDR_COMPILER; @@ -463,6 +464,12 @@ uint32_t prdrActionArgMap(const std::string & i_arg) #define PRDF_SDC_FLAG(name, value) \ g_ActionArgMap[#name] = value; #define PRDF_SDC_FLAGS_MAP_END + + #define PRDF_GARD_POLICY_MAP_ONLY + #define PRDF_GARD_POLICY_MAP + #define PRDF_GARD_POLICY(name, value) \ + g_ActionArgMap[#name] = value; + #define PRDF_GARD_POLICY_MAP_END #undef iipServiceDataCollector_h #include <iipServiceDataCollector.h> diff --git a/src/usr/diag/prdf/common/framework/rule/prdrCompile.y b/src/usr/diag/prdf/common/framework/rule/prdrCompile.y index 78736643d..581f35ce2 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrCompile.y +++ b/src/usr/diag/prdf/common/framework/rule/prdrCompile.y @@ -156,8 +156,8 @@ using namespace PRDR_COMPILER; %token PRDR_TIME_MIN %token PRDR_TIME_HOUR %token PRDR_TIME_DAY - %token PRDR_FILTER + %token PRDR_FILTER_SINGLE_BIT %token PRDR_FILTER_PRIORITY %token PRDR_FILTER_SECONDARY @@ -946,23 +946,40 @@ action_callout: PRDR_ACT_CALLOUT '(' PRDR_ID ')' } | PRDR_ACT_CALLOUT '(' PRDR_CONNECTED '(' PRDR_ID action_callout_alt ')' ',' PRDR_ID ')' { - $$ = new ExprAct_Callout($9, $5, ExprAct_Callout::CALLOUT_CHIP, 0xffffffff, $6); + $$ = new ExprAct_Callout($9, $5, Prdr::CALLOUT_GARD_CHIP, 0xffffffff, $6 ); } | PRDR_ACT_CALLOUT '(' PRDR_CONNECTED '(' PRDR_ID ',' PRDR_INTEGER action_callout_alt ')' ',' PRDR_ID ')' { - $$ = new ExprAct_Callout($11, $5, ExprAct_Callout::CALLOUT_CHIP, $7, $8); + $$ = new ExprAct_Callout($11, $5, Prdr::CALLOUT_GARD_CHIP, $7, $8); } - | PRDR_ACT_CALLOUT '(' PRDR_PROCEDURE '(' PRDR_ID ')' ',' PRDR_ID ')' { - $$ = new ExprAct_Callout($8, $5, ExprAct_Callout::CALLOUT_PROC); + $$ = new ExprAct_Callout($8, $5, Prdr::CALLOUT_PROC ); } - | PRDR_ACT_CALLOUT '(' PRDR_CONNECTED_PEER '(' PRDR_ID ',' PRDR_INTEGER action_callout_alt ')' ',' PRDR_ID ')' + | 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); + $$ = new ExprAct_Callout($11, $5, Prdr::CALLOUT_GARD_PEER, $7, $8 ); + } + | PRDR_ACT_CALLOUT '(' PRDR_ID ',' PRDR_ID ')' + { + $$ = new ExprAct_Callout($3, NULL, Prdr::CALLOUT_GARD_SELF, 0xffffffff, NULL, $5); } + | PRDR_ACT_CALLOUT '(' PRDR_CONNECTED '(' PRDR_ID action_callout_alt')' ',' PRDR_ID ',' PRDR_ID ')' + { + $$ = new ExprAct_Callout($9, $5, Prdr::CALLOUT_GARD_CHIP, 0xffffffff, $6, $11 ); + } + + | PRDR_ACT_CALLOUT '(' PRDR_CONNECTED '(' PRDR_ID ',' PRDR_INTEGER action_callout_alt ')' ',' PRDR_ID ',' PRDR_ID ')' + { + $$ = new ExprAct_Callout($11, $5, Prdr::CALLOUT_GARD_CHIP, $7, $8, $13 ); + } + + | PRDR_ACT_CALLOUT '(' PRDR_CONNECTED_PEER '(' PRDR_ID ',' PRDR_INTEGER action_callout_alt ')' ',' PRDR_ID ',' PRDR_ID ')' + { + $$ = new ExprAct_Callout($11, $5, Prdr::CALLOUT_GARD_PEER, $7, $8, $13 ); + } ; action_callout_alt: diff --git a/src/usr/diag/prdf/common/framework/rule/prdrExpr.H b/src/usr/diag/prdf/common/framework/rule/prdrExpr.H index 79da66918..56cda4d49 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrExpr.H +++ b/src/usr/diag/prdf/common/framework/rule/prdrExpr.H @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2004,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ +/* [+] International Business Machines Corp. */ +/* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ @@ -860,24 +862,19 @@ class ExprAct_Callout : public Expr Expr * cv_alt; - enum Callout_type - { - CALLOUT_SELF = 's', - CALLOUT_CHIP = 'c', - CALLOUT_PROC = 'p', - CALLOUT_PEER = 'r', - }; - - Callout_type cv_type; + Prdr::Callout_type cv_type; + std::string * cv_4; ExprAct_Callout(std::string * i_1, std::string * i_2 = NULL, - Callout_type i_t = CALLOUT_SELF, + Prdr::Callout_type i_t = Prdr::CALLOUT_GARD_SELF, uint32_t i_3 = 0xffffffff, - Expr * i_alt = NULL): + Expr * i_alt = NULL, + std::string * i_4 = NULL ): cv_1(i_1), cv_2(i_2), cv_3(i_3), cv_alt(i_alt), - cv_type(i_t) + cv_type(i_t), + cv_4( i_4 ) {} int output(FILE * i_file) @@ -893,7 +890,7 @@ class ExprAct_Callout : public Expr uint32_t l_priority = htonl(prdrActionArgMap(*cv_1)); PRDR_FWRITE(&l_priority, sizeof(l_priority), 1, i_file); - if (CALLOUT_SELF != cv_type) + if ( Prdr::CALLOUT_GARD_SELF != cv_type ) { uint32_t l_arg = htonl(prdrActionArgMap(*cv_2)); PRDR_FWRITE(&l_arg, sizeof(l_arg), 1, i_file); @@ -909,15 +906,28 @@ class ExprAct_Callout : public Expr cv_alt->output(i_file); // Write peer connection type - if(CALLOUT_PEER == cv_type) + if(Prdr::CALLOUT_GARD_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); } + // Write gard state + if( NULL == cv_4 ) + { + // if no policy for gard has been specified, assume it to be + // GARD. + l_op = prdrActionArgMap("GARD"); + } + else + { + l_op = prdrActionArgMap(*cv_4); + } + PRDR_FWRITE(&l_op, 1, 1, i_file); return 0; + }; void generateDoxygen(std::ostream & o_stream, @@ -925,17 +935,24 @@ class ExprAct_Callout : public Expr std::ostream & o_errFile = std::cerr) { o_stream << "callout ( "; - if (CALLOUT_SELF == cv_type) + std::string tmpGard("GARD"); + if( NULL != cv_4 ) { - o_stream << "SELF, " << *cv_1 << " )"; + tmpGard.assign( *cv_4 ); } - else if (CALLOUT_PROC == cv_type) + + if ( Prdr::CALLOUT_GARD_SELF == cv_type ) { - o_stream << "procedure ( " << *cv_2 << " ), " << *cv_1 << " ) "; + o_stream << "SELF, " << *cv_1 << tmpGard << " )"; + } + else if ( Prdr::CALLOUT_PROC == cv_type ) + { + o_stream << "procedure ( " << *cv_2 << " ), " << *cv_1 + << "NO GARD" << " ) "; } else { - if(CALLOUT_PEER == cv_type) + if(Prdr::CALLOUT_GARD_PEER == cv_type) { o_stream << "connected_peer ( " << *cv_2 ; } @@ -946,10 +963,9 @@ class ExprAct_Callout : public Expr if ( 0xffffffff != cv_3 ) o_stream << ", " << cv_3; - o_stream << " ), " << *cv_1 << " ) "; + o_stream << " ), " << *cv_1 << tmpGard << " ) "; } } - }; class ExprAct_Funccall : public Expr diff --git a/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C b/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C index 0e24abe35..de6737b80 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C +++ b/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -437,7 +437,8 @@ void ReadExpr(UtilStream & i_stream, Expr & o_expr) i_stream >> l_tmpChar; o_expr.cv_value[0].i = l_tmpChar; i_stream >> o_expr.cv_value[1].i; - if ('s' != o_expr.cv_value[0].i) + + if( Prdr::CALLOUT_GARD_SELF != o_expr.cv_value[0].i ) { i_stream >> o_expr.cv_value[2].i; i_stream >> o_expr.cv_value[3].i; @@ -456,6 +457,11 @@ void ReadExpr(UtilStream & i_stream, Expr & o_expr) // Read peer connection type i_stream >> o_expr.cv_value[5].i; } + //Read gard state associated with callout + i_stream >> l_tmp8; + o_expr.cv_value[6].i = l_tmp8; + + break; case ACT_DUMP: //@ecdf diff --git a/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.H b/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.H index 2fc998377..44feebfbb 100755 --- a/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.H +++ b/src/usr/diag/prdf/common/framework/rule/prdrLoadChip.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -151,7 +151,7 @@ namespace Prdr union value { uint32_t i; Expr * p; }; /** Maximum number of entries a expression can have. */ - static const uint32_t MAX_VALUES = 6; + static const uint32_t MAX_VALUES = 7; unsigned char cv_op; /** Type of expr this is. */ diff --git a/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h b/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h index 4cbc27e76..91d16b348 100755 --- a/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h +++ b/src/usr/diag/prdf/common/framework/service/iipServiceDataCollector.h @@ -44,6 +44,30 @@ }; #endif +#ifndef PRDF_GARD_POLICY_MAP_ONLY + #define PRDF_GARD_POLICY_MAP \ + enum GARD_POLICY { + #define PRDF_GARD_POLICY(name, value) \ + name = value, + #define PRDF_GARD_POLICY_MAP_END \ + }; + #define NOT_FROM_RULE_CODE +#endif + +#ifdef NOT_FROM_RULE_CODE +namespace PRDF +{ +#endif + +PRDF_GARD_POLICY_MAP + PRDF_GARD_POLICY(NO_GARD, 0x00000001 ) + PRDF_GARD_POLICY(GARD, 0x00000002 ) +PRDF_GARD_POLICY_MAP_END + +#ifdef NOT_FROM_RULE_CODE +} +#endif + #ifndef PRDF_SDC_FLAGS_MAP_ONLY #include <prdfErrorSignature.H> @@ -76,13 +100,20 @@ namespace PRDF struct SdcCallout { PRDcallout callout; PRDpriority priority; + GARD_POLICY gardState; + //bool gard; - SdcCallout() : callout(NULL), priority(MRU_LOW) {} - SdcCallout(PRDcallout & mru, PRDpriority p) - : callout(mru), priority(p) + SdcCallout() : + callout(NULL), priority(MRU_LOW), gardState( NO_GARD ) {} - SdcCallout(TARGETING::TargetHandle_t i_pcalloutHandle , PRDpriority p) - : callout(i_pcalloutHandle), priority(p) + + SdcCallout(PRDcallout & mru, PRDpriority p, GARD_POLICY i_gardState ) + : callout(mru), priority(p), gardState( i_gardState ) + {} + + SdcCallout( TARGETING::TargetHandle_t i_calloutTgt, + PRDpriority p, GARD_POLICY i_gardState ) + : callout( i_calloutTgt ), priority( p ), gardState( i_gardState ) {} }; @@ -234,7 +265,8 @@ public: <br><b>Notes: </b> No implementation for Apache or Northstar </ul><br> */ - void SetCallout( PRDcallout mru, PRDpriority priority = MRU_MED ); + void SetCallout( PRDcallout mru, PRDpriority priority = MRU_MED, + GARD_POLICY i_gardState = GARD ); /** Add a change to the prd signature List diff --git a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C index 94995a5af..f7e436da6 100644 --- a/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C +++ b/src/usr/diag/prdf/common/framework/service/prdfRasServices_common.C @@ -493,70 +493,25 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, prdGardErrType = GardAction::NoGard; } - bool noGardForTodErr = false; - for( SDC_MRU_LIST::const_iterator it = mruList.begin(); - it < mruList.end(); ++it ) - { - if( PRDcalloutData::TYPE_TARGET == it->callout.getType() && - TYPE_OSC == getTargetType( it->callout.getTarget() )) - { - // FIXME Below is a part of workaround due to design limitation - // of hwsv in fips820. It shall be removed once RTC 103773, - // RTC 116192 and RTC 116134 gets integrated in to fips830. - - // We shall not gard TOD OSC or MDMT due to master path errors. - // There are problems associated with garding of TOD clock end - // points on proc and OSC side. Garding entire Proc or TOD OSC for - // a mere bad pin doesn't look appropriate. So, we callout FRUs - // on both ends of TOD OSC connection but don't gard it. - - noGardForTodErr = true; - break; - } - } - for ( SDC_MRU_LIST::const_iterator it = mruList.begin(); it < mruList.end(); ++it ) { thispriority = it->priority; thiscallout = it->callout; + HWAS::GARD_ErrorType tmpGard = gardErrType; + HWAS::DeconfigEnum tmpDeconfig = deconfigState; - if( PRDcalloutData::TYPE_TARGET == thiscallout.getType() ) + if( HWAS::GARD_NULL != gardErrType ) { - // FIXME Below is a part of workaround due to design limitation - // of hwsv in fips820. It shall be removed once RTC 103773, - // RTC 116192 and RTC 116134 gets integrated in to fips830. - - // We shall not gard TOD OSC or MDMT due to master path errors. - // There are problems associated with garding of TOD clock end - // points on proc and OSC side. Garding entire Proc or TOD OSC for - // a mere bad pin doesn't look appropriate. So, we callout FRUs - // on both ends of TOD OSC connection but don't gard it. - - HWAS::GARD_ErrorType tmpGard = gardErrType; - HWAS::DeconfigEnum tmpDeconfig = deconfigState; - - if( true == noGardForTodErr ) + if( NO_GARD == it->gardState ) { - TYPE targetType = getTargetType( thiscallout.getTarget()); - - //Due to design limitation in fips820, TOD OSC and MDMT should - //not be garded in case of error in master path. For an error in - //master path, we callout TOD OSC with high priority and MDMT - //with low priority. For an error in slave or internal path, - //a processor callout is done with medium level priority. TOD - //OSC is not blamed of those category of errors. - //So, in the code below, we try to find out if it is a case of - //an error in master path by looking at callout target type - //and priority. - - if(( TYPE_OSC == targetType ) || - ( TYPE_PROC == targetType && MRU_LOW == thispriority )) - { - tmpGard = HWAS::GARD_NULL; - tmpDeconfig = HWAS::NO_DECONFIG; - } + tmpGard = HWAS::GARD_NULL; + tmpDeconfig = HWAS::NO_DECONFIG; } + } + + if( PRDcalloutData::TYPE_TARGET == thiscallout.getType() ) + { PRDF_HW_ADD_CALLOUT(thiscallout.getTarget(), thispriority, @@ -573,8 +528,8 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, thiscallout.getTarget(), thiscallout.getType(), thispriority, - deconfigState, - gardErrType); + tmpDeconfig, + tmpGard); } else if ( PRDcalloutData::TYPE_MEMMRU == thiscallout.getType() ) { @@ -586,9 +541,9 @@ errlHndl_t ErrDataService::GenerateSrcPfa( ATTENTION_TYPE i_attnType, { PRDF_HW_ADD_CALLOUT( *it, thispriority, - deconfigState, + tmpDeconfig, iv_errl, - gardErrType, + tmpGard, severityParm, l_diagUpdate ); } @@ -857,6 +812,15 @@ void ErrDataService::initPfaData( const ServiceDataCollector & i_sdc, o_pfa.mruList[i].callout = mruList[i].callout.flatten(); o_pfa.mruList[i].type = mruList[i].callout.getType(); o_pfa.mruList[i].priority = (uint8_t)mruList[i].priority; + + if( NO_GARD == mruList[i].gardState ) + { + o_pfa.mruList[i].gardState = GardAction::NoGard; + } + else + { + o_pfa.mruList[i].gardState = i_prdGardType; + } } o_pfa.mruListCount = i; diff --git a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C index f4a66616d..963227971 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C +++ b/src/usr/diag/prdf/common/framework/service/prdfServiceDataCollector.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -124,7 +124,8 @@ inline TARGETING::TargetHandle_t buffer_getTarget( const uint8_t *&ptr ) //------------------------------------------------------------------------------ void ServiceDataCollector::SetCallout( PRDcallout mru, - PRDpriority priority ) + PRDpriority priority, + GARD_POLICY i_gardState ) { bool found = false; @@ -149,12 +150,17 @@ void ServiceDataCollector::SetCallout( PRDcallout mru, { i->priority = priority; } + + if( i_gardState > i->gardState ) + { + i->gardState = i_gardState; + } } } if ( found == false ) { - xMruList.push_back( SdcCallout(mru, priority) ); + xMruList.push_back( SdcCallout(mru, priority, i_gardState) ); } } @@ -259,6 +265,7 @@ uint32_t ServiceDataCollector::Flatten(uint8_t * i_buffer, uint32_t & io_size) c buffer_append( current_ptr, (uint32_t)i->callout.getType() ); buffer_append( current_ptr, i->callout.flatten() ); buffer_append( current_ptr, (uint32_t)i->priority ); + buffer_append( current_ptr, (uint32_t)i->gardState ); } buffer_append(current_ptr, iv_SignatureList.size()); @@ -331,9 +338,10 @@ ServiceDataCollector & ServiceDataCollector::operator=( MruType mt = (MruType) buffer_get32(i_flatdata); uint32_t mru = buffer_get32(i_flatdata); PRDpriority priority = (PRDpriority) buffer_get32(i_flatdata); + GARD_POLICY gardState = (GARD_POLICY) buffer_get32(i_flatdata); PRDcallout callout( mru, mt ); - xMruList.push_back( SdcCallout(callout, priority) ); + xMruList.push_back( SdcCallout(callout, priority, gardState) ); } ClearSignatureList(); diff --git a/src/usr/diag/prdf/common/plat/pegasus/CommonActions.rule b/src/usr/diag/prdf/common/plat/pegasus/CommonActions.rule index f93e6c00d..fa2b987b3 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/CommonActions.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/CommonActions.rule @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2012,2014 +# Contributors Listed Below - COPYRIGHT 2012,2015 # [+] International Business Machines Corp. # # @@ -151,6 +151,10 @@ actionclass callout2ndLvlLow actionclass calloutDmiBusSymFru { callout(procedure(MEMBUS_ERROR_ENUM), MRU_LOW); }; +/** Callout self with medium priority but don't gard it */ +actionclass calloutSelfMedNoGard +{ callout(MRU_MED, NO_GARD); }; + ################################################################################ # Callouts with thresholds # ################################################################################ @@ -163,7 +167,7 @@ actionclass calloutParentProcMedThr1 actionclass calloutParentProcHighThr1 { - callout(connected(TYPE_PROC),MRU_HIGH); + callout(connected(TYPE_PROC),MRU_HIGH ); threshold1; }; @@ -179,6 +183,12 @@ actionclass SelfMedThr1 threshold1; }; +actionclass SelfMedThr1NoGard +{ + calloutSelfMedNoGard; + threshold1; +}; + actionclass SelfHighThr1 { calloutSelfHigh; 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 e9ee54c04..85acc0b4f 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 @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2012,2014 +# Contributors Listed Below - COPYRIGHT 2012,2015 # [+] International Business Machines Corp. # # @@ -2947,9 +2947,8 @@ actionclass calloutConnPci0Th1NoGard /** Callout the connected PCI 1 controller, threshold 1, no garding */ actionclass calloutConnPci1Th1NoGard { - calloutConnPci1; + callout(connected(TYPE_PCI,1), MRU_MED, NO_GARD); threshold1; - gard(NoGard); }; /** Callout the connected PCI 2 controller, threshold 1, no garding */ diff --git a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule index 4ffe84e59..db6dfa77a 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Proc_acts_TP.rule @@ -1272,10 +1272,3 @@ actionclass selfCapThr32TopReConfig selfCaptThr32; funccall("requestTopologySwitch"); }; - -/** callouts Proc on first instance, but doesn't gard */ -actionclass SelfMedThr1NoGard -{ - SelfMedThr1; - gard(NoGard); -}; diff --git a/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C b/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C index 8ca90f038..689431bcc 100644 --- a/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C +++ b/src/usr/diag/prdf/common/plugins/prdfLogParse_common.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2014 */ +/* Contributors Listed Below - COPYRIGHT 2013,2015 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -537,32 +537,38 @@ bool parsePfaData( void * i_buffer, uint32_t i_buflen, snprintf( header, 25, " #%d %s", i+1, tmpStr ); snprintf( data, 50, "0x%08x ", pfa.mruList[i].callout ); + tmpStr = GardAction::ToString( pfa.mruList[i].gardState ); switch ( pfa.mruList[i].type ) { case PRDcalloutData::TYPE_MEMMRU: - strcat( data, "(MemoryMru)" ); + strcat( data, "(MemoryMru) " ); + strcat( data, tmpStr ); i_parser.PrintString( header, data ); parseMemMruData( i_parser, pfa.mruList[i].callout ); break; case PRDcalloutData::TYPE_SYMFRU: - strcat( data, "(SymbolicFru)" ); + strcat( data, "(SymbolicFru) " ); + strcat( data, tmpStr ); i_parser.PrintString( header, data ); break; case PRDcalloutData::TYPE_TARGET: - strcat( data, "(HUID)" ); + strcat( data, "(HUID) " ); + strcat( data, tmpStr ); i_parser.PrintString( header, data ); break; case PRDcalloutData::TYPE_PROCCLK: - strcat( data, "(PROCCLK)" ); + strcat( data, "(PROCCLK) " ); + strcat( data, tmpStr ); i_parser.PrintString( header, data ); break; case PRDcalloutData::TYPE_PCICLK: - strcat( data, "(PCICLK)" ); + strcat( data, "(PCICLK) " ); + strcat( data, tmpStr ); i_parser.PrintString( header, data ); break; diff --git a/src/usr/diag/prdf/common/plugins/prdfPfa5Data.h b/src/usr/diag/prdf/common/plugins/prdfPfa5Data.h index b5dd8d34b..a5ebf5d1d 100644 --- a/src/usr/diag/prdf/common/plugins/prdfPfa5Data.h +++ b/src/usr/diag/prdf/common/plugins/prdfPfa5Data.h @@ -98,18 +98,23 @@ struct PfaMruListStruct uint32_t callout; // 32-bit representation of HUID, MemoryMru, symbolic FRU uint8_t type; // See enum PRDcallout::MruType uint8_t priority; // See enum srciPriority (in srci/fsp/srci.H) + uint8_t gardState; friend UtilStream& operator<<( UtilStream& i_left, PfaMruListStruct& i_right ) { - i_left << i_right.callout << i_right.type << i_right.priority; + i_left << i_right.callout << i_right.type << i_right.priority + << i_right.gardState; + return i_left; }; friend UtilStream& operator>>( UtilStream& i_left, PfaMruListStruct& i_right ) { - i_left >> i_right.callout >> i_right.type >> i_right.priority; + i_left >> i_right.callout >> i_right.type >> i_right.priority + >> i_right.gardState; + return i_left; }; }; |