| #include "pel_rules.hpp" |
| |
| #include "pel_types.hpp" |
| |
| #include <bitset> |
| |
| namespace openpower |
| { |
| namespace pels |
| { |
| namespace pel_rules |
| { |
| |
| std::tuple<uint16_t, uint8_t> check(uint16_t actionFlags, uint8_t eventType, |
| uint8_t severity) |
| { |
| std::bitset<16> newActionFlags{actionFlags}; |
| uint8_t newEventType = eventType; |
| auto sevType = static_cast<SeverityType>(severity & 0xF0); |
| |
| // TODO: This code covers the most common cases. The final tweaking |
| // will be done with ibm-openbmc/dev#1333. |
| |
| // Always report, unless specifically told not to |
| if (!newActionFlags.test(dontReportToHostFlagBit)) |
| { |
| newActionFlags.set(reportFlagBit); |
| } |
| else |
| { |
| newActionFlags.reset(reportFlagBit); |
| } |
| |
| // Call home by BMC not supported |
| newActionFlags.reset(spCallHomeFlagBit); |
| |
| switch (sevType) |
| { |
| case SeverityType::nonError: |
| { |
| // Informational errors never need service actions or call home. |
| newActionFlags.reset(serviceActionFlagBit); |
| newActionFlags.reset(callHomeFlagBit); |
| |
| // Ensure event type isn't 'not applicable' |
| if (newEventType == static_cast<uint8_t>(EventType::notApplicable)) |
| { |
| newEventType = |
| static_cast<uint8_t>(EventType::miscInformational); |
| } |
| |
| // The misc info and tracing event types are always hidden. |
| // For other event types, it's up to the creator. |
| if ((newEventType == |
| static_cast<uint8_t>(EventType::miscInformational)) || |
| (newEventType == static_cast<uint8_t>(EventType::tracing))) |
| { |
| newActionFlags.set(hiddenFlagBit); |
| } |
| break; |
| } |
| case SeverityType::recovered: |
| { |
| // Recovered errors are hidden, and by definition need no |
| // service action or call home. |
| newActionFlags.set(hiddenFlagBit); |
| newActionFlags.reset(serviceActionFlagBit); |
| newActionFlags.reset(callHomeFlagBit); |
| break; |
| } |
| case SeverityType::predictive: |
| case SeverityType::unrecoverable: |
| case SeverityType::critical: |
| case SeverityType::diagnostic: |
| case SeverityType::symptom: |
| { |
| // Report these others as normal errors. |
| newActionFlags.reset(hiddenFlagBit); |
| newActionFlags.set(serviceActionFlagBit); |
| newActionFlags.set(callHomeFlagBit); |
| break; |
| } |
| } |
| |
| return {static_cast<uint16_t>(newActionFlags.to_ulong()), newEventType}; |
| } |
| |
| } // namespace pel_rules |
| } // namespace pels |
| } // namespace openpower |