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 
2951f8202cSCaleb Palmer static const auto mc_dstl_fir = static_cast<libhei::NodeId_t>(
3051f8202cSCaleb Palmer     libhei::hash<libhei::NodeId_t>("MC_DSTL_FIR"));
3151f8202cSCaleb Palmer 
321a4f0e70SCaleb Palmer TEST(RootCauseFilter, Filter1)
331a4f0e70SCaleb Palmer {
341a4f0e70SCaleb Palmer     pdbg_targets_init(nullptr);
351a4f0e70SCaleb Palmer 
3651f8202cSCaleb Palmer     RasDataParser rasData{};
3751f8202cSCaleb Palmer 
3851f8202cSCaleb Palmer     // Test 1: Test a checkstop with a UE root cause on an OCMB
3951f8202cSCaleb 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,
46*adda0540SZane Shelley                                    libhei::ATTN_TYPE_CHIP_CS};
471a4f0e70SCaleb Palmer 
4851f8202cSCaleb Palmer     // MC_DSTL_FIR[1]: AFU initiated Recoverable Attn on Subchannel A
4951f8202cSCaleb Palmer     libhei::Signature reAttnSig{procChip0, mc_dstl_fir, 0, 1,
5051f8202cSCaleb Palmer                                 libhei::ATTN_TYPE_RECOVERABLE};
5151f8202cSCaleb 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);
6451f8202cSCaleb 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());
7251f8202cSCaleb Palmer 
7351f8202cSCaleb Palmer     // Test 2: Test a checkstop with an unknown RE attn on an OCMB
7451f8202cSCaleb Palmer 
7551f8202cSCaleb Palmer     // Add the signatures to the isolation data
7651f8202cSCaleb Palmer     isoData.flush();
7751f8202cSCaleb Palmer     isoData.addSignature(checkstopSig);
7851f8202cSCaleb Palmer     isoData.addSignature(reAttnSig);
7951f8202cSCaleb Palmer 
8051f8202cSCaleb Palmer     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
8151f8202cSCaleb Palmer                                 rootCause, rasData);
8251f8202cSCaleb Palmer     EXPECT_TRUE(attnFound);
8351f8202cSCaleb Palmer     EXPECT_EQ(reAttnSig.toUint32(), rootCause.toUint32());
8451f8202cSCaleb Palmer 
8551f8202cSCaleb Palmer     // Test 3: Test a checkstop with an unknown UCS attn on an OCMB
8651f8202cSCaleb Palmer 
8751f8202cSCaleb Palmer     // MC_DSTL_FIR[0]: AFU initiated Checkstop on Subchannel A
8851f8202cSCaleb Palmer     libhei::Signature ucsAttnSig{procChip0, mc_dstl_fir, 0, 0,
8951f8202cSCaleb Palmer                                  libhei::ATTN_TYPE_UNIT_CS};
9051f8202cSCaleb Palmer 
9151f8202cSCaleb Palmer     isoData.flush();
9251f8202cSCaleb Palmer     isoData.addSignature(checkstopSig);
9351f8202cSCaleb Palmer     isoData.addSignature(ucsAttnSig);
9451f8202cSCaleb Palmer 
9551f8202cSCaleb Palmer     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
9651f8202cSCaleb Palmer                                 rootCause, rasData);
9751f8202cSCaleb Palmer     EXPECT_TRUE(attnFound);
9851f8202cSCaleb Palmer     EXPECT_EQ(ucsAttnSig.toUint32(), rootCause.toUint32());
9951f8202cSCaleb Palmer 
10051f8202cSCaleb Palmer     // Test 4: Test a checkstop with a non-root cause recoverable from an OCMB
10151f8202cSCaleb Palmer 
10251f8202cSCaleb Palmer     // RDFFIR[42]: SCOM recoverable register parity error
10351f8202cSCaleb Palmer     libhei::Signature reSig{ocmbChip0, rdfFir, 0, 42,
10451f8202cSCaleb Palmer                             libhei::ATTN_TYPE_RECOVERABLE};
10551f8202cSCaleb Palmer 
10651f8202cSCaleb Palmer     isoData.flush();
10751f8202cSCaleb Palmer     isoData.addSignature(checkstopSig);
10851f8202cSCaleb Palmer     isoData.addSignature(reAttnSig);
10951f8202cSCaleb Palmer     isoData.addSignature(reSig);
11051f8202cSCaleb Palmer 
11151f8202cSCaleb Palmer     attnFound = filterRootCause(AnalysisType::SYSTEM_CHECKSTOP, isoData,
11251f8202cSCaleb Palmer                                 rootCause, rasData);
11351f8202cSCaleb Palmer     EXPECT_TRUE(attnFound);
11451f8202cSCaleb Palmer     EXPECT_EQ(checkstopSig.toUint32(), rootCause.toUint32());
1151a4f0e70SCaleb Palmer }
116