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 
231a4f0e70SCaleb Palmer static const auto eqCoreFir = static_cast<libhei::NodeId_t>(
241a4f0e70SCaleb Palmer     libhei::hash<libhei::NodeId_t>("EQ_CORE_FIR"));
251a4f0e70SCaleb Palmer 
261a4f0e70SCaleb Palmer static const auto rdfFir =
271a4f0e70SCaleb Palmer     static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("RDFFIR"));
281a4f0e70SCaleb Palmer 
29*51f8202cSCaleb Palmer static const auto mc_dstl_fir = static_cast<libhei::NodeId_t>(
30*51f8202cSCaleb Palmer     libhei::hash<libhei::NodeId_t>("MC_DSTL_FIR"));
31*51f8202cSCaleb Palmer 
321a4f0e70SCaleb Palmer TEST(RootCauseFilter, Filter1)
331a4f0e70SCaleb Palmer {
341a4f0e70SCaleb Palmer     pdbg_targets_init(nullptr);
351a4f0e70SCaleb Palmer 
36*51f8202cSCaleb Palmer     RasDataParser rasData{};
37*51f8202cSCaleb Palmer 
38*51f8202cSCaleb Palmer     // Test 1: Test a checkstop with a UE root cause on an OCMB
39*51f8202cSCaleb Palmer 
401a4f0e70SCaleb Palmer     // Checkstop signature on the proc
411a4f0e70SCaleb Palmer     auto proc0 = util::pdbg::getTrgt("/proc0");
421a4f0e70SCaleb Palmer     libhei::Chip procChip0{proc0, P10_20};
431a4f0e70SCaleb Palmer 
441a4f0e70SCaleb Palmer     // EQ_CORE_FIR[14]: ME = 0 checkstop
451a4f0e70SCaleb Palmer     libhei::Signature checkstopSig{procChip0, eqCoreFir, 0, 14,
461a4f0e70SCaleb Palmer                                    libhei::ATTN_TYPE_CHECKSTOP};
471a4f0e70SCaleb Palmer 
48*51f8202cSCaleb Palmer     // MC_DSTL_FIR[1]: AFU initiated Recoverable Attn on Subchannel A
49*51f8202cSCaleb Palmer     libhei::Signature reAttnSig{procChip0, mc_dstl_fir, 0, 1,
50*51f8202cSCaleb Palmer                                 libhei::ATTN_TYPE_RECOVERABLE};
51*51f8202cSCaleb Palmer 
521a4f0e70SCaleb Palmer     // Root cause signature on the ocmb
531a4f0e70SCaleb Palmer     auto ocmb0 =
541a4f0e70SCaleb Palmer         util::pdbg::getTrgt("proc0/pib/perv12/mc0/mi0/mcc0/omi0/ocmb0");
551a4f0e70SCaleb Palmer     libhei::Chip ocmbChip0{ocmb0, EXPLORER_20};
561a4f0e70SCaleb Palmer 
571a4f0e70SCaleb Palmer     // RDFFIR[14]: Mainline read UE
581a4f0e70SCaleb Palmer     libhei::Signature ueSig{ocmbChip0, rdfFir, 0, 14,
591a4f0e70SCaleb Palmer                             libhei::ATTN_TYPE_RECOVERABLE};
601a4f0e70SCaleb Palmer 
611a4f0e70SCaleb Palmer     // Add the signatures to the isolation data
621a4f0e70SCaleb Palmer     libhei::IsolationData isoData{};
631a4f0e70SCaleb Palmer     isoData.addSignature(checkstopSig);
64*51f8202cSCaleb Palmer     isoData.addSignature(reAttnSig);
651a4f0e70SCaleb Palmer     isoData.addSignature(ueSig);
661a4f0e70SCaleb Palmer 
671a4f0e70SCaleb Palmer     libhei::Signature rootCause;
681a4f0e70SCaleb Palmer     bool attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
691a4f0e70SCaleb Palmer                                      rootCause, rasData);
701a4f0e70SCaleb Palmer     EXPECT_TRUE(attnFound);
711a4f0e70SCaleb Palmer     EXPECT_EQ(ueSig.toUint32(), rootCause.toUint32());
72*51f8202cSCaleb Palmer 
73*51f8202cSCaleb Palmer     // Test 2: Test a checkstop with an unknown RE attn on an OCMB
74*51f8202cSCaleb Palmer 
75*51f8202cSCaleb Palmer     // Add the signatures to the isolation data
76*51f8202cSCaleb Palmer     isoData.flush();
77*51f8202cSCaleb Palmer     isoData.addSignature(checkstopSig);
78*51f8202cSCaleb Palmer     isoData.addSignature(reAttnSig);
79*51f8202cSCaleb Palmer 
80*51f8202cSCaleb Palmer     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
81*51f8202cSCaleb Palmer                                 rootCause, rasData);
82*51f8202cSCaleb Palmer     EXPECT_TRUE(attnFound);
83*51f8202cSCaleb Palmer     EXPECT_EQ(reAttnSig.toUint32(), rootCause.toUint32());
84*51f8202cSCaleb Palmer 
85*51f8202cSCaleb Palmer     // Test 3: Test a checkstop with an unknown UCS attn on an OCMB
86*51f8202cSCaleb Palmer 
87*51f8202cSCaleb Palmer     // MC_DSTL_FIR[0]: AFU initiated Checkstop on Subchannel A
88*51f8202cSCaleb Palmer     libhei::Signature ucsAttnSig{procChip0, mc_dstl_fir, 0, 0,
89*51f8202cSCaleb Palmer                                  libhei::ATTN_TYPE_UNIT_CS};
90*51f8202cSCaleb Palmer 
91*51f8202cSCaleb Palmer     isoData.flush();
92*51f8202cSCaleb Palmer     isoData.addSignature(checkstopSig);
93*51f8202cSCaleb Palmer     isoData.addSignature(ucsAttnSig);
94*51f8202cSCaleb Palmer 
95*51f8202cSCaleb Palmer     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
96*51f8202cSCaleb Palmer                                 rootCause, rasData);
97*51f8202cSCaleb Palmer     EXPECT_TRUE(attnFound);
98*51f8202cSCaleb Palmer     EXPECT_EQ(ucsAttnSig.toUint32(), rootCause.toUint32());
99*51f8202cSCaleb Palmer 
100*51f8202cSCaleb Palmer     // Test 4: Test a checkstop with a non-root cause recoverable from an OCMB
101*51f8202cSCaleb Palmer 
102*51f8202cSCaleb Palmer     // RDFFIR[42]: SCOM recoverable register parity error
103*51f8202cSCaleb Palmer     libhei::Signature reSig{ocmbChip0, rdfFir, 0, 42,
104*51f8202cSCaleb Palmer                             libhei::ATTN_TYPE_RECOVERABLE};
105*51f8202cSCaleb Palmer 
106*51f8202cSCaleb Palmer     isoData.flush();
107*51f8202cSCaleb Palmer     isoData.addSignature(checkstopSig);
108*51f8202cSCaleb Palmer     isoData.addSignature(reAttnSig);
109*51f8202cSCaleb Palmer     isoData.addSignature(reSig);
110*51f8202cSCaleb Palmer 
111*51f8202cSCaleb Palmer     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
112*51f8202cSCaleb Palmer                                 rootCause, rasData);
113*51f8202cSCaleb Palmer     EXPECT_TRUE(attnFound);
114*51f8202cSCaleb Palmer     EXPECT_EQ(checkstopSig.toUint32(), rootCause.toUint32());
1151a4f0e70SCaleb Palmer }
116