xref: /openbmc/phosphor-logging/extensions/openpower-pels/pel_rules.cpp (revision 1369ad0df5bcc5fb3b26759e4f3dbc0fd0d80eba)
1*f1e85e20SMatt Spinler #include "pel_rules.hpp"
2*f1e85e20SMatt Spinler 
3*f1e85e20SMatt Spinler #include "pel_types.hpp"
4*f1e85e20SMatt Spinler 
5*f1e85e20SMatt Spinler #include <bitset>
6*f1e85e20SMatt Spinler 
7*f1e85e20SMatt Spinler namespace openpower
8*f1e85e20SMatt Spinler {
9*f1e85e20SMatt Spinler namespace pels
10*f1e85e20SMatt Spinler {
11*f1e85e20SMatt Spinler namespace pel_rules
12*f1e85e20SMatt Spinler {
13*f1e85e20SMatt Spinler 
check(uint16_t actionFlags,uint8_t eventType,uint8_t severity)14*f1e85e20SMatt Spinler std::tuple<uint16_t, uint8_t> check(uint16_t actionFlags, uint8_t eventType,
15*f1e85e20SMatt Spinler                                     uint8_t severity)
16*f1e85e20SMatt Spinler {
17*f1e85e20SMatt Spinler     std::bitset<16> newActionFlags{actionFlags};
18*f1e85e20SMatt Spinler     uint8_t newEventType = eventType;
19*f1e85e20SMatt Spinler     auto sevType = static_cast<SeverityType>(severity & 0xF0);
20*f1e85e20SMatt Spinler 
21*f1e85e20SMatt Spinler     // Always report, unless specifically told not to
22*f1e85e20SMatt Spinler     if (!newActionFlags.test(dontReportToHostFlagBit))
23*f1e85e20SMatt Spinler     {
24*f1e85e20SMatt Spinler         newActionFlags.set(reportFlagBit);
25*f1e85e20SMatt Spinler     }
26*f1e85e20SMatt Spinler     else
27*f1e85e20SMatt Spinler     {
28*f1e85e20SMatt Spinler         newActionFlags.reset(reportFlagBit);
29*f1e85e20SMatt Spinler     }
30*f1e85e20SMatt Spinler 
31*f1e85e20SMatt Spinler     // Call home by BMC not supported
32*f1e85e20SMatt Spinler     newActionFlags.reset(spCallHomeFlagBit);
33*f1e85e20SMatt Spinler 
34*f1e85e20SMatt Spinler     switch (sevType)
35*f1e85e20SMatt Spinler     {
36*f1e85e20SMatt Spinler         case SeverityType::nonError:
37*f1e85e20SMatt Spinler         {
38*f1e85e20SMatt Spinler             // Informational errors never need service actions or call home.
39*f1e85e20SMatt Spinler             newActionFlags.reset(serviceActionFlagBit);
40*f1e85e20SMatt Spinler             newActionFlags.reset(callHomeFlagBit);
41*f1e85e20SMatt Spinler 
42*f1e85e20SMatt Spinler             // Ensure event type isn't 'not applicable'
43*f1e85e20SMatt Spinler             if (newEventType == static_cast<uint8_t>(EventType::notApplicable))
44*f1e85e20SMatt Spinler             {
45*f1e85e20SMatt Spinler                 newEventType =
46*f1e85e20SMatt Spinler                     static_cast<uint8_t>(EventType::miscInformational);
47*f1e85e20SMatt Spinler             }
48*f1e85e20SMatt Spinler 
49*f1e85e20SMatt Spinler             // The misc info and tracing event types are always hidden.
50*f1e85e20SMatt Spinler             // For other event types, it's up to the creator.
51*f1e85e20SMatt Spinler             if ((newEventType ==
52*f1e85e20SMatt Spinler                  static_cast<uint8_t>(EventType::miscInformational)) ||
53*f1e85e20SMatt Spinler                 (newEventType == static_cast<uint8_t>(EventType::tracing)))
54*f1e85e20SMatt Spinler             {
55*f1e85e20SMatt Spinler                 newActionFlags.set(hiddenFlagBit);
56*f1e85e20SMatt Spinler             }
57*f1e85e20SMatt Spinler             break;
58*f1e85e20SMatt Spinler         }
59*f1e85e20SMatt Spinler         case SeverityType::recovered:
60*f1e85e20SMatt Spinler         {
61*f1e85e20SMatt Spinler             // Recovered errors are hidden, and by definition need no
62*f1e85e20SMatt Spinler             // service action or call home.
63*f1e85e20SMatt Spinler             newActionFlags.set(hiddenFlagBit);
64*f1e85e20SMatt Spinler             newActionFlags.reset(serviceActionFlagBit);
65*f1e85e20SMatt Spinler             newActionFlags.reset(callHomeFlagBit);
66*f1e85e20SMatt Spinler             break;
67*f1e85e20SMatt Spinler         }
68*f1e85e20SMatt Spinler         case SeverityType::predictive:
69*f1e85e20SMatt Spinler         case SeverityType::unrecoverable:
70*f1e85e20SMatt Spinler         case SeverityType::critical:
71*f1e85e20SMatt Spinler         case SeverityType::diagnostic:
72*f1e85e20SMatt Spinler         case SeverityType::symptom:
73*f1e85e20SMatt Spinler         {
74*f1e85e20SMatt Spinler             // Report these others as normal errors.
75*f1e85e20SMatt Spinler             newActionFlags.reset(hiddenFlagBit);
76*f1e85e20SMatt Spinler             newActionFlags.set(serviceActionFlagBit);
77*f1e85e20SMatt Spinler             newActionFlags.set(callHomeFlagBit);
78*f1e85e20SMatt Spinler             break;
79*f1e85e20SMatt Spinler         }
80*f1e85e20SMatt Spinler     }
81*f1e85e20SMatt Spinler 
82*f1e85e20SMatt Spinler     return {static_cast<uint16_t>(newActionFlags.to_ulong()), newEventType};
83*f1e85e20SMatt Spinler }
84*f1e85e20SMatt Spinler 
85*f1e85e20SMatt Spinler } // namespace pel_rules
86*f1e85e20SMatt Spinler } // namespace pels
87*f1e85e20SMatt Spinler } // namespace openpower
88