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