11a4f0e70SCaleb Palmer #include <stdio.h>
21a4f0e70SCaleb Palmer
31a4f0e70SCaleb Palmer #include <analyzer/analyzer_main.hpp>
41a4f0e70SCaleb Palmer #include <analyzer/plugins/plugin.hpp>
51a4f0e70SCaleb Palmer #include <analyzer/ras-data/ras-data-parser.hpp>
61a4f0e70SCaleb Palmer #include <hei_util.hpp>
71a4f0e70SCaleb Palmer #include <util/pdbg.hpp>
81a4f0e70SCaleb Palmer #include <util/trace.hpp>
91a4f0e70SCaleb Palmer
101a4f0e70SCaleb Palmer #include "gtest/gtest.h"
111a4f0e70SCaleb Palmer
121a4f0e70SCaleb Palmer namespace analyzer
131a4f0e70SCaleb Palmer {
141a4f0e70SCaleb Palmer // Forward reference of filterRootCause
151a4f0e70SCaleb Palmer bool filterRootCause(AnalysisType i_type,
161a4f0e70SCaleb Palmer const libhei::IsolationData& i_isoData,
171a4f0e70SCaleb Palmer libhei::Signature& o_rootCause,
181a4f0e70SCaleb Palmer const RasDataParser& i_rasData);
191a4f0e70SCaleb Palmer } // namespace analyzer
201a4f0e70SCaleb Palmer
211a4f0e70SCaleb Palmer using namespace analyzer;
221a4f0e70SCaleb Palmer
23*c3038c03SCaleb Palmer // Processor side FIRs
241a4f0e70SCaleb Palmer static const auto eqCoreFir = static_cast<libhei::NodeId_t>(
251a4f0e70SCaleb Palmer libhei::hash<libhei::NodeId_t>("EQ_CORE_FIR"));
261a4f0e70SCaleb Palmer
27*c3038c03SCaleb Palmer static const auto mc_dstl_fir = static_cast<libhei::NodeId_t>(
28*c3038c03SCaleb Palmer libhei::hash<libhei::NodeId_t>("MC_DSTL_FIR"));
29*c3038c03SCaleb Palmer
30*c3038c03SCaleb Palmer // Explorer OCMB FIRs
311a4f0e70SCaleb Palmer static const auto rdfFir =
321a4f0e70SCaleb Palmer static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("RDFFIR"));
331a4f0e70SCaleb Palmer
34*c3038c03SCaleb Palmer // Odyssey OCMB FIRs
35*c3038c03SCaleb Palmer static const auto srq_fir =
36*c3038c03SCaleb Palmer static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("SRQ_FIR"));
37*c3038c03SCaleb Palmer
38*c3038c03SCaleb Palmer static const auto rdf_fir =
39*c3038c03SCaleb Palmer static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("RDF_FIR"));
40*c3038c03SCaleb Palmer
41*c3038c03SCaleb Palmer static const auto odp_fir =
42*c3038c03SCaleb Palmer static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("ODP_FIR"));
4351f8202cSCaleb Palmer
TEST(RootCauseFilter,Filter1)441a4f0e70SCaleb Palmer TEST(RootCauseFilter, Filter1)
451a4f0e70SCaleb Palmer {
461a4f0e70SCaleb Palmer pdbg_targets_init(nullptr);
471a4f0e70SCaleb Palmer
4851f8202cSCaleb Palmer RasDataParser rasData{};
4951f8202cSCaleb Palmer
5051f8202cSCaleb Palmer // Test 1: Test a checkstop with a UE root cause on an OCMB
5151f8202cSCaleb Palmer
521a4f0e70SCaleb Palmer // Checkstop signature on the proc
531a4f0e70SCaleb Palmer auto proc0 = util::pdbg::getTrgt("/proc0");
541a4f0e70SCaleb Palmer libhei::Chip procChip0{proc0, P10_20};
551a4f0e70SCaleb Palmer
561a4f0e70SCaleb Palmer // EQ_CORE_FIR[14]: ME = 0 checkstop
571a4f0e70SCaleb Palmer libhei::Signature checkstopSig{procChip0, eqCoreFir, 0, 14,
58adda0540SZane Shelley libhei::ATTN_TYPE_CHIP_CS};
591a4f0e70SCaleb Palmer
6051f8202cSCaleb Palmer // MC_DSTL_FIR[1]: AFU initiated Recoverable Attn on Subchannel A
6151f8202cSCaleb Palmer libhei::Signature reAttnSig{procChip0, mc_dstl_fir, 0, 1,
6251f8202cSCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE};
6351f8202cSCaleb Palmer
641a4f0e70SCaleb Palmer // Root cause signature on the ocmb
651a4f0e70SCaleb Palmer auto ocmb0 =
661a4f0e70SCaleb Palmer util::pdbg::getTrgt("proc0/pib/perv12/mc0/mi0/mcc0/omi0/ocmb0");
671a4f0e70SCaleb Palmer libhei::Chip ocmbChip0{ocmb0, EXPLORER_20};
681a4f0e70SCaleb Palmer
691a4f0e70SCaleb Palmer // RDFFIR[14]: Mainline read UE
701a4f0e70SCaleb Palmer libhei::Signature ueSig{ocmbChip0, rdfFir, 0, 14,
711a4f0e70SCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE};
721a4f0e70SCaleb Palmer
731a4f0e70SCaleb Palmer // Add the signatures to the isolation data
741a4f0e70SCaleb Palmer libhei::IsolationData isoData{};
751a4f0e70SCaleb Palmer isoData.addSignature(checkstopSig);
7651f8202cSCaleb Palmer isoData.addSignature(reAttnSig);
771a4f0e70SCaleb Palmer isoData.addSignature(ueSig);
781a4f0e70SCaleb Palmer
791a4f0e70SCaleb Palmer libhei::Signature rootCause;
801a4f0e70SCaleb Palmer bool attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
811a4f0e70SCaleb Palmer rootCause, rasData);
821a4f0e70SCaleb Palmer EXPECT_TRUE(attnFound);
831a4f0e70SCaleb Palmer EXPECT_EQ(ueSig.toUint32(), rootCause.toUint32());
8451f8202cSCaleb Palmer
8551f8202cSCaleb Palmer // Test 2: Test a checkstop with an unknown RE attn on an OCMB
8651f8202cSCaleb Palmer
8751f8202cSCaleb Palmer // Add the signatures to the isolation data
8851f8202cSCaleb Palmer isoData.flush();
8951f8202cSCaleb Palmer isoData.addSignature(checkstopSig);
9051f8202cSCaleb Palmer isoData.addSignature(reAttnSig);
9151f8202cSCaleb Palmer
9251f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
9351f8202cSCaleb Palmer rootCause, rasData);
9451f8202cSCaleb Palmer EXPECT_TRUE(attnFound);
9551f8202cSCaleb Palmer EXPECT_EQ(reAttnSig.toUint32(), rootCause.toUint32());
9651f8202cSCaleb Palmer
9751f8202cSCaleb Palmer // Test 3: Test a checkstop with an unknown UCS attn on an OCMB
9851f8202cSCaleb Palmer
9951f8202cSCaleb Palmer // MC_DSTL_FIR[0]: AFU initiated Checkstop on Subchannel A
10051f8202cSCaleb Palmer libhei::Signature ucsAttnSig{procChip0, mc_dstl_fir, 0, 0,
10151f8202cSCaleb Palmer libhei::ATTN_TYPE_UNIT_CS};
10251f8202cSCaleb Palmer
10351f8202cSCaleb Palmer isoData.flush();
10451f8202cSCaleb Palmer isoData.addSignature(checkstopSig);
10551f8202cSCaleb Palmer isoData.addSignature(ucsAttnSig);
10651f8202cSCaleb Palmer
10751f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
10851f8202cSCaleb Palmer rootCause, rasData);
10951f8202cSCaleb Palmer EXPECT_TRUE(attnFound);
11051f8202cSCaleb Palmer EXPECT_EQ(ucsAttnSig.toUint32(), rootCause.toUint32());
11151f8202cSCaleb Palmer
11251f8202cSCaleb Palmer // Test 4: Test a checkstop with a non-root cause recoverable from an OCMB
11351f8202cSCaleb Palmer
11451f8202cSCaleb Palmer // RDFFIR[42]: SCOM recoverable register parity error
11551f8202cSCaleb Palmer libhei::Signature reSig{ocmbChip0, rdfFir, 0, 42,
11651f8202cSCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE};
11751f8202cSCaleb Palmer
11851f8202cSCaleb Palmer isoData.flush();
11951f8202cSCaleb Palmer isoData.addSignature(checkstopSig);
12051f8202cSCaleb Palmer isoData.addSignature(reAttnSig);
12151f8202cSCaleb Palmer isoData.addSignature(reSig);
12251f8202cSCaleb Palmer
12351f8202cSCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
12451f8202cSCaleb Palmer rootCause, rasData);
12551f8202cSCaleb Palmer EXPECT_TRUE(attnFound);
12651f8202cSCaleb Palmer EXPECT_EQ(checkstopSig.toUint32(), rootCause.toUint32());
127*c3038c03SCaleb Palmer
128*c3038c03SCaleb Palmer // Test 5: Test a firmware initiated channel fail due to an IUE threshold on
129*c3038c03SCaleb Palmer // a Odyssey OCMB
130*c3038c03SCaleb Palmer libhei::Chip odyChip0{ocmb0, ODYSSEY_10};
131*c3038c03SCaleb Palmer
132*c3038c03SCaleb Palmer libhei::Signature fwInitChnlFail{odyChip0, srq_fir, 0, 46,
133*c3038c03SCaleb Palmer libhei::ATTN_TYPE_CHIP_CS};
134*c3038c03SCaleb Palmer libhei::Signature mainlineIue{odyChip0, rdf_fir, 0, 18,
135*c3038c03SCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE};
136*c3038c03SCaleb Palmer
137*c3038c03SCaleb Palmer isoData.flush();
138*c3038c03SCaleb Palmer isoData.addSignature(fwInitChnlFail);
139*c3038c03SCaleb Palmer isoData.addSignature(mainlineIue);
140*c3038c03SCaleb Palmer
141*c3038c03SCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
142*c3038c03SCaleb Palmer rootCause, rasData);
143*c3038c03SCaleb Palmer EXPECT_TRUE(attnFound);
144*c3038c03SCaleb Palmer EXPECT_EQ(mainlineIue.toUint32(), rootCause.toUint32());
145*c3038c03SCaleb Palmer
146*c3038c03SCaleb Palmer // Test 6: Test a UE that is the side effect of an ODP data corruption error
147*c3038c03SCaleb Palmer // on an Odyssey OCMB
148*c3038c03SCaleb Palmer libhei::Signature mainlineUe{odyChip0, rdf_fir, 0, 15,
149*c3038c03SCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE};
150*c3038c03SCaleb Palmer libhei::Signature odpRootCause{odyChip0, odp_fir, 0, 6,
151*c3038c03SCaleb Palmer libhei::ATTN_TYPE_RECOVERABLE};
152*c3038c03SCaleb Palmer
153*c3038c03SCaleb Palmer isoData.flush();
154*c3038c03SCaleb Palmer isoData.addSignature(mainlineUe);
155*c3038c03SCaleb Palmer isoData.addSignature(odpRootCause);
156*c3038c03SCaleb Palmer
157*c3038c03SCaleb Palmer attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
158*c3038c03SCaleb Palmer rootCause, rasData);
159*c3038c03SCaleb Palmer
160*c3038c03SCaleb Palmer EXPECT_TRUE(attnFound);
161*c3038c03SCaleb Palmer EXPECT_EQ(odpRootCause.toUint32(), rootCause.toUint32());
1621a4f0e70SCaleb Palmer }
163