diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2016-04-13 08:30:52 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2016-05-02 11:59:51 -0400 |
commit | bd81810ed1cb2a9559fd14ae8babb63415b596e7 (patch) | |
tree | 85500afd151a50f73322b848c8304a47efde2609 /src/usr/diag/prdf | |
parent | 5158ff4eb76e7623d32579525012b5b3a4d4d4ed (diff) | |
download | talos-hostboot-bd81810ed1cb2a9559fd14ae8babb63415b596e7.tar.gz talos-hostboot-bd81810ed1cb2a9559fd14ae8babb63415b596e7.zip |
PRD: Create Rule Summary Construct
Change-Id: I3cec3ff667250964c28faa37c520ef308f8ac8f5
RTC: 146125
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23205
Tested-by: Jenkins Server
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23806
Tested-by: FSP CI Jenkins
Diffstat (limited to 'src/usr/diag/prdf')
9 files changed, 148 insertions, 69 deletions
diff --git a/src/usr/diag/prdf/common/framework/register/prdfOperatorRegister.H b/src/usr/diag/prdf/common/framework/register/prdfOperatorRegister.H index b0513e483..c03136379 100755 --- a/src/usr/diag/prdf/common/framework/register/prdfOperatorRegister.H +++ b/src/usr/diag/prdf/common/framework/register/prdfOperatorRegister.H @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2004,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* [+] 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. */ @@ -89,6 +91,82 @@ class NotRegister : public SCAN_COMM_REGISTER_CLASS BitStringBuffer iv_iBS; }; +class SummaryRegister : public SCAN_COMM_REGISTER_CLASS +{ + public: + SummaryRegister() : + SCAN_COMM_REGISTER_CLASS( ), iv_child(NULL), iv_amount(0), iv_iBS(0) + { + iv_bs = &iv_iBS; + } + + SummaryRegister(SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_amount) : + SCAN_COMM_REGISTER_CLASS( ), iv_child(&i_arg), iv_amount(i_amount), + iv_iBS(i_arg.GetBitLength()) + { + iv_bs = &iv_iBS; + } + + SummaryRegister & operator=(const SummaryRegister & r) + { + iv_child = r.iv_child; + iv_amount = r.iv_amount; + iv_iBS = r.iv_iBS; + //iv_bs = r.iv_bs; <-- don't do this! + return *this; + } + + virtual uint32_t Read() const { return iv_child->Read(); } + virtual uint32_t Write() { return iv_child->Write(); } + + const BIT_STRING_CLASS * GetBitString( + ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const + { + iv_bs->Clear(); + + PRDF::BitString tmp = *iv_child->GetBitString(i_type); + + //if any bits are set in iv_child, then set the iv_amount bit + if (0 != tmp.GetSetCount()) + { + iv_bs->Set(0); + *iv_bs = *iv_bs >> iv_amount; + } + return iv_bs; + } + + virtual uint16_t GetId() const { return iv_child->GetId(); } + virtual void SetId(uint16_t i_id) {} + + bool operator==(const SummaryRegister & r) const + { return (r.iv_child == iv_child) && (r.iv_amount == iv_amount); } + + bool operator<(const SummaryRegister & r) const + { + if (iv_child == r.iv_child) + return iv_amount < r.iv_amount; + return iv_child < r.iv_child; + } + + bool operator>=(const SummaryRegister & r) const + { + if (iv_child == r.iv_child) + return iv_amount >= r.iv_amount; + return iv_child >= r.iv_child; + } + + protected: + BIT_STRING_CLASS & AccessBitString(void) { return iv_iBS; } + void SetBitString(const BIT_STRING_CLASS *) {} + + private: + SCAN_COMM_REGISTER_CLASS * iv_child; + uint16_t iv_amount; + + BitStringBuffer * iv_bs; + BitStringBuffer iv_iBS; +}; + class LeftShiftRegister : public SCAN_COMM_REGISTER_CLASS { public: diff --git a/src/usr/diag/prdf/common/framework/register/prdfScanFacility.C b/src/usr/diag/prdf/common/framework/register/prdfScanFacility.C index cc8ec8184..8e5252b94 100755 --- a/src/usr/diag/prdf/common/framework/register/prdfScanFacility.C +++ b/src/usr/diag/prdf/common/framework/register/prdfScanFacility.C @@ -110,6 +110,16 @@ SCAN_COMM_REGISTER_CLASS & ScanFacility::GetLeftShiftRegister( return iv_leftRegFw.get(r); } +//----------------------------------------------------------------------------- + +SCAN_COMM_REGISTER_CLASS & ScanFacility::GetSummaryRegister( + SCAN_COMM_REGISTER_CLASS & i_arg, + uint16_t i_bit ) +{ + SummaryRegister r(i_arg, i_bit); + return iv_sumRegFw.get(r); +} + //------------------------------------------------------------------------------ SCAN_COMM_REGISTER_CLASS & ScanFacility::GetRightShiftRegister( diff --git a/src/usr/diag/prdf/common/framework/register/prdfScanFacility.H b/src/usr/diag/prdf/common/framework/register/prdfScanFacility.H index 93945937f..917cefe3e 100755 --- a/src/usr/diag/prdf/common/framework/register/prdfScanFacility.H +++ b/src/usr/diag/prdf/common/framework/register/prdfScanFacility.H @@ -107,7 +107,15 @@ public: SCAN_COMM_REGISTER_CLASS & GetRightShiftRegister( SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_amount); - + /** + * @brief Get a register for the summary construct + * @param SCAN_COMM_REGISTER_CLASS source + * @param uint16_t i_bit bit to set if any attentions found in i_arg + * @post Only one instance of the register with this SCR parameter and + * amount will exist + */ + SCAN_COMM_REGISTER_CLASS & GetSummaryRegister( + SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_bit); /** * @brief Get a register that bit-wise ANDs the bitstring of two register @@ -197,6 +205,7 @@ private: // Data typedef FlyWeightS<NotRegister,50> NotRegisters; typedef FlyWeightS<LeftShiftRegister,10> LeftShiftRegisters; typedef FlyWeightS<RightShiftRegister, 10> RightShiftRegisters; + typedef FlyWeightS<SummaryRegister,10> SummaryRegisters; typedef FlyWeight<ConstantRegister, 10> ConstantRegisters; typedef FlyWeightS<ScomRegisterAccess, 10> PluginRegisters; @@ -206,6 +215,7 @@ private: // Data OrRegisters iv_orRegFw; NotRegisters iv_notRegFw; LeftShiftRegisters iv_leftRegFw; + SummaryRegisters iv_sumRegFw; RightShiftRegisters iv_rightRegFw; ConstantRegisters iv_constRegFw; PluginRegisters iv_pluginRegFw; diff --git a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule index e072aefe5..0692c5161 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/Mba.rule +++ b/src/usr/diag/prdf/common/plat/pegasus/Mba.rule @@ -396,77 +396,31 @@ chip Mba # though none of these registers will trigger a special attention. This # should change the hash enough to make a unique signature. -rule tmpMbaFir -{ - CHECK_STOP: MBAFIR & ~MBAFIR_MASK & ~MBAFIR_ACT0 & ~MBAFIR_ACT1; - UNIT_CS: MBAFIR & ~MBAFIR_MASK & ~MBAFIR_ACT0 & ~MBAFIR_ACT1; - RECOVERABLE: MBAFIR & ~MBAFIR_MASK & ~MBAFIR_ACT0 & MBAFIR_ACT1; - SPECIAL: MBAFIR; # See note above. -}; - -rule tmpMbaSecureFir -{ - # NOTE: This secure FIR will only report checkstop attentions. - CHECK_STOP: MBASECUREFIR; - UNIT_CS: MBASECUREFIR; - SPECIAL: MBASECUREFIR; # See note above. -}; - -rule tmpMbaCalFir -{ - CHECK_STOP: MBACALFIR & ~MBACALFIR_MASK & ~MBACALFIR_ACT0 & ~MBACALFIR_ACT1; - UNIT_CS: MBACALFIR & ~MBACALFIR_MASK & ~MBACALFIR_ACT0 & ~MBACALFIR_ACT1; - RECOVERABLE: MBACALFIR & ~MBACALFIR_MASK & ~MBACALFIR_ACT0 & MBACALFIR_ACT1; - SPECIAL: MBACALFIR; # See note above. -}; -rule tmpMbaDdrPhyFir +rule rMBA { - CHECK_STOP: - MBADDRPHYFIR & ~MBADDRPHYFIR_MASK & ~MBADDRPHYFIR_ACT0 & ~MBADDRPHYFIR_ACT1; - UNIT_CS: - MBADDRPHYFIR & ~MBADDRPHYFIR_MASK & ~MBADDRPHYFIR_ACT0 & ~MBADDRPHYFIR_ACT1; - RECOVERABLE: - MBADDRPHYFIR & ~MBADDRPHYFIR_MASK & ~MBADDRPHYFIR_ACT0 & MBADDRPHYFIR_ACT1; - SPECIAL: - MBADDRPHYFIR; # See note above. + CHECK_STOP: summary( 0, MbaFir ) | + summary( 1, MbaSecureFir ) | + summary( 2, MbaDdrPhyFir ) | + summary( 3, MbaCalFir ); + + UNIT_CS: summary( 0, MbaFir ) | + summary( 1, MbaSecureFir ) | + summary( 2, MbaDdrPhyFir ) | + summary( 3, MbaCalFir ); + + RECOVERABLE: summary( 0, MbaFir ) | + summary( 1, MbaSecureFir ) | + summary( 2, MbaDdrPhyFir ) | + summary( 3, MbaCalFir ); }; -group gMBA attntype CHECK_STOP, RECOVERABLE, UNIT_CS filter singlebit +group gMBA attntype CHECK_STOP, UNIT_CS, RECOVERABLE filter priority( 3 ) { - # MbaCalFir analyzed first to check for RCD parity error before potential - # side effects in MbaFir - (tmpMbaCalFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| - 10|11|12|13|14|15|16|17|18|19| - 20|21|22|23|24|25|26|27|28|29| - 30|31|32|33|34|35|36|37|38|39| - 40|41|42|43|44|45|46|47|48|49| - 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaCalFir); - - (tmpMbaFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| - 10|11|12|13|14|15|16|17|18|19| - 20|21|22|23|24|25|26|27|28|29| - 30|31|32|33|34|35|36|37|38|39| - 40|41|42|43|44|45|46|47|48|49| - 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaFir); - - (tmpMbaSecureFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| - 10|11|12|13|14|15|16|17|18|19| - 20|21|22|23|24|25|26|27|28|29| - 30|31|32|33|34|35|36|37|38|39| - 40|41|42|43|44|45|46|47|48|49| - 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaSecureFir); - - (tmpMbaDdrPhyFir, bit( 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| - 10|11|12|13|14|15|16|17|18|19| - 20|21|22|23|24|25|26|27|28|29| - 30|31|32|33|34|35|36|37|38|39| - 40|41|42|43|44|45|46|47|48|49| - 50|51|52|53|54|55|56|57|58|59| - 60|61|62|63 )) ? analyze(gMbaDdrPhyFir); + (rMBA, bit(0)) ? analyze(gMbaFir); + (rMBA, bit(1)) ? analyze(gMbaSecureFir); + (rMBA, bit(2)) ? analyze(gMbaDdrPhyFir); + (rMBA, bit(3)) ? analyze(gMbaCalFir); }; ################################################################################ diff --git a/src/usr/diag/prdf/common/rule/prdfRuleMetaData.C b/src/usr/diag/prdf/common/rule/prdfRuleMetaData.C index f086035a4..2aed6d8e2 100644 --- a/src/usr/diag/prdf/common/rule/prdfRuleMetaData.C +++ b/src/usr/diag/prdf/common/rule/prdfRuleMetaData.C @@ -723,6 +723,17 @@ SCAN_COMM_REGISTER_CLASS * RuleMetaData::createVirtualRegister( } break; + case Prdr::SUMMARY: + + l_arg[0] = createVirtualRegister(i_vReg->cv_value[1].p, i_data); + + l_tmp32 = i_vReg->cv_value[0].p->cv_value[0].i; + + l_rc = &i_data.cv_scanFactory.GetSummaryRegister(*l_arg[0], + l_tmp32); + + break; + } return l_rc; diff --git a/src/usr/diag/prdf/common/rule/prdrCommon.H b/src/usr/diag/prdf/common/rule/prdrCommon.H index a6560bb46..a34ce7030 100755 --- a/src/usr/diag/prdf/common/rule/prdrCommon.H +++ b/src/usr/diag/prdf/common/rule/prdrCommon.H @@ -129,6 +129,7 @@ namespace Prdr RULE = 'R', GROUP = 'G', ACTION = 'A', + SUMMARY = 'S', ATTNLINK = 'L', diff --git a/src/usr/diag/prdf/common/rule/prdrCompile.lex b/src/usr/diag/prdf/common/rule/prdrCompile.lex index 8ce3182ff..a47bd61eb 100755 --- a/src/usr/diag/prdf/common/rule/prdrCompile.lex +++ b/src/usr/diag/prdf/common/rule/prdrCompile.lex @@ -117,6 +117,7 @@ group { return PRDR_GROUP; } type { return PRDR_TYPE; } /* @jl04 a Add this for primary/secondary type.*/ actionclass { return PRDR_ACTIONCLASS; } rule { return PRDR_RULE; } +summary { return PRDR_SUMMARY; } threshold { return PRDR_ACT_THRESHOLD; } analyse { return PRDR_ACT_ANALYSE; } diff --git a/src/usr/diag/prdf/common/rule/prdrCompile.y b/src/usr/diag/prdf/common/rule/prdrCompile.y index 48120ec4b..a76df8e13 100644 --- a/src/usr/diag/prdf/common/rule/prdrCompile.y +++ b/src/usr/diag/prdf/common/rule/prdrCompile.y @@ -129,6 +129,7 @@ using namespace PRDR_COMPILER; %token PRDR_BIT_KW %token PRDR_OP_LEFTSHIFT %token PRDR_OP_RIGHTSHIFT +%token PRDR_SUMMARY %token PRDR_ACT_THRESHOLD %token PRDR_ACT_ANALYSE @@ -169,7 +170,7 @@ using namespace PRDR_COMPILER; %type <reg> register reglines regline %type <reg_mask> register_mask %type <chip> chiplines chipline -%type <expr> ruleexpr ruleexpr_small ruleexpr_shift ruleop1 ruleop2 +%type <expr> ruleexpr ruleexpr_small ruleexpr_shift ruleop1 ruleop2 summary %type <expr> bitgroup bitandlist bitorlist %type <expr> time_units %type <grp> grouplines groupline @@ -751,6 +752,18 @@ ruleexpr_small: '(' ruleexpr ')' { $$ = $2; } $$ = new ExprBitString(*$1); delete $1; } + | summary + { + $$ = $1; + } +; + +summary: PRDR_SUMMARY '(' PRDR_INTEGER ',' PRDR_ID ')' + { + $$ = new ExprOp2(Prdr::SUMMARY, new ExprInt($3, Prdr::INT_SHORT), + new ExprRef($5)); + g_references.push_front(RefPair("r", *$5)); + } ; ruleexpr_shift: ruleexpr_small PRDR_OP_LEFTSHIFT PRDR_INTEGER diff --git a/src/usr/diag/prdf/common/rule/prdrLoadChip.C b/src/usr/diag/prdf/common/rule/prdrLoadChip.C index b035b7571..48b942a1a 100644 --- a/src/usr/diag/prdf/common/rule/prdrLoadChip.C +++ b/src/usr/diag/prdf/common/rule/prdrLoadChip.C @@ -338,6 +338,7 @@ void ReadExpr(UtilStream & i_stream, Expr & o_expr) case XOR: case LSHIFT: case RSHIFT: + case SUMMARY: case ACT_TRY: o_expr.cv_value[0].p = new Expr(); o_expr.cv_deletePtr[0] = true; |