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