xref: /openbmc/phosphor-logging/extensions/openpower-pels/severity.cpp (revision 40fb54935ce7367636a7156039396ee91cc4d5e2)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3 
4 #include "severity.hpp"
5 
6 namespace openpower
7 {
8 namespace pels
9 {
10 
11 using LogSeverity = phosphor::logging::Entry::Level;
12 
13 namespace
14 {
15 
convertPELSeverityToOBMC(SeverityType pelSeverity)16 LogSeverity convertPELSeverityToOBMC(SeverityType pelSeverity)
17 {
18     LogSeverity logSeverity = LogSeverity::Error;
19 
20     const std::map<SeverityType, LogSeverity> severities{
21         {SeverityType::nonError, LogSeverity::Informational},
22         {SeverityType::recovered, LogSeverity::Informational},
23         {SeverityType::predictive, LogSeverity::Warning},
24         {SeverityType::unrecoverable, LogSeverity::Error},
25         {SeverityType::critical, LogSeverity::Critical},
26         {SeverityType::diagnostic, LogSeverity::Error},
27         {SeverityType::symptom, LogSeverity::Warning}};
28 
29     auto s = severities.find(pelSeverity);
30     if (s != severities.end())
31     {
32         logSeverity = s->second;
33     }
34 
35     return logSeverity;
36 }
37 
38 } // namespace
39 
convertOBMCSeverityToPEL(LogSeverity severity)40 uint8_t convertOBMCSeverityToPEL(LogSeverity severity)
41 {
42     uint8_t pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
43     switch (severity)
44     {
45         case (LogSeverity::Notice):
46         case (LogSeverity::Informational):
47         case (LogSeverity::Debug):
48             pelSeverity = static_cast<uint8_t>(SeverityType::nonError);
49             break;
50 
51         case (LogSeverity::Warning):
52             pelSeverity = static_cast<uint8_t>(SeverityType::predictive);
53             break;
54 
55         case (LogSeverity::Critical):
56             pelSeverity = static_cast<uint8_t>(SeverityType::critical);
57             break;
58 
59         case (LogSeverity::Emergency):
60         case (LogSeverity::Alert):
61         case (LogSeverity::Error):
62             pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
63             break;
64     }
65 
66     return pelSeverity;
67 }
68 
fixupLogSeverity(LogSeverity obmcSeverity,SeverityType pelSeverity)69 std::optional<LogSeverity> fixupLogSeverity(LogSeverity obmcSeverity,
70                                             SeverityType pelSeverity)
71 {
72     bool isNonErrPelSev = (pelSeverity == SeverityType::nonError) ||
73                           (pelSeverity == SeverityType::recovered);
74 
75     bool isNonErrObmcSev = (obmcSeverity == LogSeverity::Notice) ||
76                            (obmcSeverity == LogSeverity::Informational) ||
77                            (obmcSeverity == LogSeverity::Debug);
78 
79     // If a nonError/recovered PEL, then the LogSeverity must be
80     // Notice/Informational/Debug, otherwise set it to Informational.
81     if (isNonErrPelSev && !isNonErrObmcSev)
82     {
83         return LogSeverity::Informational;
84     }
85 
86     // If a Notice/Informational/Debug LogSeverity, then the PEL
87     // severity must be nonError/recovered, otherwise set it
88     // to an appropriate value based on the actual PEL severity.
89     if (isNonErrObmcSev && !isNonErrPelSev)
90     {
91         return convertPELSeverityToOBMC(pelSeverity);
92     }
93 
94     // If PEL is critical, the LogSeverity should be as well.
95     if ((obmcSeverity != LogSeverity::Critical) &&
96         (pelSeverity == SeverityType::critical))
97     {
98         return LogSeverity::Critical;
99     }
100 
101     return std::nullopt;
102 }
103 
104 } // namespace pels
105 } // namespace openpower
106