xref: /openbmc/phosphor-logging/extensions/openpower-pels/severity.cpp (revision 25291157927273a4ac459c6479c1d3090ddc6a16)
1711d51d8SMatt Spinler /**
2711d51d8SMatt Spinler  * Copyright © 2019 IBM Corporation
3711d51d8SMatt Spinler  *
4711d51d8SMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
5711d51d8SMatt Spinler  * you may not use this file except in compliance with the License.
6711d51d8SMatt Spinler  * You may obtain a copy of the License at
7711d51d8SMatt Spinler  *
8711d51d8SMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
9711d51d8SMatt Spinler  *
10711d51d8SMatt Spinler  * Unless required by applicable law or agreed to in writing, software
11711d51d8SMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
12711d51d8SMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13711d51d8SMatt Spinler  * See the License for the specific language governing permissions and
14711d51d8SMatt Spinler  * limitations under the License.
15711d51d8SMatt Spinler  */
168c686ccaSMatt Spinler #include "severity.hpp"
178c686ccaSMatt Spinler 
188c686ccaSMatt Spinler namespace openpower
198c686ccaSMatt Spinler {
208c686ccaSMatt Spinler namespace pels
218c686ccaSMatt Spinler {
228c686ccaSMatt Spinler 
238c686ccaSMatt Spinler using LogSeverity = phosphor::logging::Entry::Level;
248c686ccaSMatt Spinler 
258b81ec0eSMatt Spinler namespace
268b81ec0eSMatt Spinler {
278b81ec0eSMatt Spinler 
convertPELSeverityToOBMC(SeverityType pelSeverity)288b81ec0eSMatt Spinler LogSeverity convertPELSeverityToOBMC(SeverityType pelSeverity)
298b81ec0eSMatt Spinler {
308b81ec0eSMatt Spinler     LogSeverity logSeverity = LogSeverity::Error;
318b81ec0eSMatt Spinler 
328b81ec0eSMatt Spinler     const std::map<SeverityType, LogSeverity> severities{
338b81ec0eSMatt Spinler         {SeverityType::nonError, LogSeverity::Informational},
348b81ec0eSMatt Spinler         {SeverityType::recovered, LogSeverity::Informational},
358b81ec0eSMatt Spinler         {SeverityType::predictive, LogSeverity::Warning},
368b81ec0eSMatt Spinler         {SeverityType::unrecoverable, LogSeverity::Error},
378b81ec0eSMatt Spinler         {SeverityType::critical, LogSeverity::Critical},
388b81ec0eSMatt Spinler         {SeverityType::diagnostic, LogSeverity::Error},
398b81ec0eSMatt Spinler         {SeverityType::symptom, LogSeverity::Warning}};
408b81ec0eSMatt Spinler 
418b81ec0eSMatt Spinler     auto s = severities.find(pelSeverity);
428b81ec0eSMatt Spinler     if (s != severities.end())
438b81ec0eSMatt Spinler     {
448b81ec0eSMatt Spinler         logSeverity = s->second;
458b81ec0eSMatt Spinler     }
468b81ec0eSMatt Spinler 
478b81ec0eSMatt Spinler     return logSeverity;
488b81ec0eSMatt Spinler }
498b81ec0eSMatt Spinler 
508b81ec0eSMatt Spinler } // namespace
518b81ec0eSMatt Spinler 
convertOBMCSeverityToPEL(LogSeverity severity)528c686ccaSMatt Spinler uint8_t convertOBMCSeverityToPEL(LogSeverity severity)
538c686ccaSMatt Spinler {
54a7525aafSMatt Spinler     uint8_t pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
558c686ccaSMatt Spinler     switch (severity)
568c686ccaSMatt Spinler     {
578c686ccaSMatt Spinler         case (LogSeverity::Notice):
588c686ccaSMatt Spinler         case (LogSeverity::Informational):
598c686ccaSMatt Spinler         case (LogSeverity::Debug):
60a7525aafSMatt Spinler             pelSeverity = static_cast<uint8_t>(SeverityType::nonError);
618c686ccaSMatt Spinler             break;
628c686ccaSMatt Spinler 
638c686ccaSMatt Spinler         case (LogSeverity::Warning):
64a7525aafSMatt Spinler             pelSeverity = static_cast<uint8_t>(SeverityType::predictive);
658c686ccaSMatt Spinler             break;
668c686ccaSMatt Spinler 
678c686ccaSMatt Spinler         case (LogSeverity::Critical):
68a7525aafSMatt Spinler             pelSeverity = static_cast<uint8_t>(SeverityType::critical);
698c686ccaSMatt Spinler             break;
708c686ccaSMatt Spinler 
718c686ccaSMatt Spinler         case (LogSeverity::Emergency):
728c686ccaSMatt Spinler         case (LogSeverity::Alert):
738c686ccaSMatt Spinler         case (LogSeverity::Error):
74a7525aafSMatt Spinler             pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
758c686ccaSMatt Spinler             break;
768c686ccaSMatt Spinler     }
778c686ccaSMatt Spinler 
788c686ccaSMatt Spinler     return pelSeverity;
798c686ccaSMatt Spinler }
808b81ec0eSMatt Spinler 
fixupLogSeverity(LogSeverity obmcSeverity,SeverityType pelSeverity)81*25291157SPatrick Williams std::optional<LogSeverity> fixupLogSeverity(LogSeverity obmcSeverity,
82*25291157SPatrick Williams                                             SeverityType pelSeverity)
838b81ec0eSMatt Spinler {
848b81ec0eSMatt Spinler     bool isNonErrPelSev = (pelSeverity == SeverityType::nonError) ||
858b81ec0eSMatt Spinler                           (pelSeverity == SeverityType::recovered);
868b81ec0eSMatt Spinler 
878b81ec0eSMatt Spinler     bool isNonErrObmcSev = (obmcSeverity == LogSeverity::Notice) ||
888b81ec0eSMatt Spinler                            (obmcSeverity == LogSeverity::Informational) ||
898b81ec0eSMatt Spinler                            (obmcSeverity == LogSeverity::Debug);
908b81ec0eSMatt Spinler 
918b81ec0eSMatt Spinler     // If a nonError/recovered PEL, then the LogSeverity must be
928b81ec0eSMatt Spinler     // Notice/Informational/Debug, otherwise set it to Informational.
938b81ec0eSMatt Spinler     if (isNonErrPelSev && !isNonErrObmcSev)
948b81ec0eSMatt Spinler     {
958b81ec0eSMatt Spinler         return LogSeverity::Informational;
968b81ec0eSMatt Spinler     }
978b81ec0eSMatt Spinler 
988b81ec0eSMatt Spinler     // If a Notice/Informational/Debug LogSeverity, then the PEL
998b81ec0eSMatt Spinler     // severity must be nonError/recovered, otherwise set it
1008b81ec0eSMatt Spinler     // to an appropriate value based on the actual PEL severity.
1018b81ec0eSMatt Spinler     if (isNonErrObmcSev && !isNonErrPelSev)
1028b81ec0eSMatt Spinler     {
1038b81ec0eSMatt Spinler         return convertPELSeverityToOBMC(pelSeverity);
1048b81ec0eSMatt Spinler     }
1058b81ec0eSMatt Spinler 
1068b81ec0eSMatt Spinler     // If PEL is critical, the LogSeverity should be as well.
1078b81ec0eSMatt Spinler     if ((obmcSeverity != LogSeverity::Critical) &&
1088b81ec0eSMatt Spinler         (pelSeverity == SeverityType::critical))
1098b81ec0eSMatt Spinler     {
1108b81ec0eSMatt Spinler         return LogSeverity::Critical;
1118b81ec0eSMatt Spinler     }
1128b81ec0eSMatt Spinler 
1138b81ec0eSMatt Spinler     return std::nullopt;
1148b81ec0eSMatt Spinler }
1158b81ec0eSMatt Spinler 
1168c686ccaSMatt Spinler } // namespace pels
1178c686ccaSMatt Spinler } // namespace openpower
118