summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2016-04-13 08:30:52 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2016-05-02 11:59:51 -0400
commitbd81810ed1cb2a9559fd14ae8babb63415b596e7 (patch)
tree85500afd151a50f73322b848c8304a47efde2609 /src/usr/diag/prdf
parent5158ff4eb76e7623d32579525012b5b3a4d4d4ed (diff)
downloadtalos-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')
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/register/prdfOperatorRegister.H80
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/register/prdfScanFacility.C10
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/register/prdfScanFacility.H12
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/Mba.rule86
-rw-r--r--src/usr/diag/prdf/common/rule/prdfRuleMetaData.C11
-rwxr-xr-xsrc/usr/diag/prdf/common/rule/prdrCommon.H1
-rwxr-xr-xsrc/usr/diag/prdf/common/rule/prdrCompile.lex1
-rw-r--r--src/usr/diag/prdf/common/rule/prdrCompile.y15
-rw-r--r--src/usr/diag/prdf/common/rule/prdrLoadChip.C1
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;
OpenPOWER on IntegriCloud