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