1 #include <stdio.h>
2 
3 #include <analyzer/plugins/plugin.hpp>
4 #include <analyzer/ras-data/ras-data-parser.hpp>
5 #include <hei_util.hpp>
6 #include <util/pdbg.hpp>
7 #include <util/trace.hpp>
8 
9 #include "gtest/gtest.h"
10 
11 using namespace analyzer;
12 
13 static const auto nodeId =
14     static_cast<libhei::NodeId_t>(libhei::hash<libhei::NodeId_t>("PLL_UNLOCK"));
15 
16 // Sub-test #1 - single PLL unlock attention on proc 1, clock 1
17 TEST(PllUnlock, TestSet1)
18 {
19     pdbg_targets_init(nullptr);
20 
21     libhei::Chip chip1{util::pdbg::getTrgt("/proc1"), P10_20};
22 
23     libhei::Signature sig11{chip1, nodeId, 0, 1, libhei::ATTN_TYPE_CHECKSTOP};
24 
25     libhei::IsolationData isoData{};
26     isoData.addSignature(sig11);
27     ServiceData sd{sig11, AnalysisType::SYSTEM_CHECKSTOP, isoData};
28 
29     RasDataParser rasData{};
30     rasData.getResolution(sig11)->resolve(sd);
31 
32     nlohmann::json j{};
33     std::string s{};
34 
35     // Callout list
36     j = sd.getCalloutList();
37     s = R"([
38     {
39         "Deconfigured": false,
40         "Guarded": false,
41         "LocationCode": "P0",
42         "Priority": "M"
43     },
44     {
45         "Deconfigured": false,
46         "Guarded": false,
47         "LocationCode": "/proc1",
48         "Priority": "M"
49     }
50 ])";
51     EXPECT_EQ(s, j.dump(4));
52 
53     // Callout FFDC
54     j = sd.getCalloutFFDC();
55     s = R"([
56     {
57         "Callout Type": "Clock Callout",
58         "Clock Type": "OSC_REF_CLOCK_1",
59         "Priority": "medium"
60     },
61     {
62         "Callout Type": "Hardware Callout",
63         "Guard": false,
64         "Priority": "medium",
65         "Target": "/proc1"
66     }
67 ])";
68     EXPECT_EQ(s, j.dump(4));
69 }
70 
71 // Sub-test #2 - PLL unlock attention on multiple procs and clocks. Isolating
72 //               only to proc 1 clock 0 PLL unlock attentions.
73 TEST(PllUnlock, TestSet2)
74 {
75     pdbg_targets_init(nullptr);
76 
77     libhei::Chip chip0{util::pdbg::getTrgt("/proc0"), P10_20};
78     libhei::Chip chip1{util::pdbg::getTrgt("/proc1"), P10_20};
79 
80     // PLL unlock signatures for each clock per processor.
81     libhei::Signature sig00{chip0, nodeId, 0, 0, libhei::ATTN_TYPE_CHECKSTOP};
82     libhei::Signature sig01{chip0, nodeId, 0, 1, libhei::ATTN_TYPE_CHECKSTOP};
83     libhei::Signature sig10{chip1, nodeId, 0, 0, libhei::ATTN_TYPE_CHECKSTOP};
84     libhei::Signature sig11{chip1, nodeId, 0, 1, libhei::ATTN_TYPE_CHECKSTOP};
85 
86     // Plugins for each processor.
87     auto plugin = PluginMap::getSingleton().get(chip1.getType(), "pll_unlock");
88 
89     libhei::IsolationData isoData{};
90     isoData.addSignature(sig00);
91     isoData.addSignature(sig01);
92     isoData.addSignature(sig10);
93     isoData.addSignature(sig11);
94     ServiceData sd{sig10, AnalysisType::SYSTEM_CHECKSTOP, isoData};
95 
96     // Call the PLL unlock plugin.
97     plugin(0, chip1, sd);
98 
99     nlohmann::json j{};
100     std::string s{};
101 
102     // Callout list
103     j = sd.getCalloutList();
104     s = R"([
105     {
106         "Deconfigured": false,
107         "Guarded": false,
108         "LocationCode": "P0",
109         "Priority": "H"
110     },
111     {
112         "Deconfigured": false,
113         "Guarded": false,
114         "LocationCode": "/proc0",
115         "Priority": "M"
116     },
117     {
118         "Deconfigured": false,
119         "Guarded": false,
120         "LocationCode": "/proc1",
121         "Priority": "M"
122     }
123 ])";
124     EXPECT_EQ(s, j.dump(4));
125 
126     // Callout FFDC
127     j = sd.getCalloutFFDC();
128     s = R"([
129     {
130         "Callout Type": "Clock Callout",
131         "Clock Type": "OSC_REF_CLOCK_0",
132         "Priority": "high"
133     },
134     {
135         "Callout Type": "Hardware Callout",
136         "Guard": false,
137         "Priority": "medium",
138         "Target": "/proc0"
139     },
140     {
141         "Callout Type": "Hardware Callout",
142         "Guard": false,
143         "Priority": "medium",
144         "Target": "/proc1"
145     }
146 ])";
147     EXPECT_EQ(s, j.dump(4));
148 }
149