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 Spinlerstd::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