1 /**
2 * Copyright © 2019 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "severity.hpp"
17
18 namespace openpower
19 {
20 namespace pels
21 {
22
23 using LogSeverity = phosphor::logging::Entry::Level;
24
25 namespace
26 {
27
convertPELSeverityToOBMC(SeverityType pelSeverity)28 LogSeverity convertPELSeverityToOBMC(SeverityType pelSeverity)
29 {
30 LogSeverity logSeverity = LogSeverity::Error;
31
32 const std::map<SeverityType, LogSeverity> severities{
33 {SeverityType::nonError, LogSeverity::Informational},
34 {SeverityType::recovered, LogSeverity::Informational},
35 {SeverityType::predictive, LogSeverity::Warning},
36 {SeverityType::unrecoverable, LogSeverity::Error},
37 {SeverityType::critical, LogSeverity::Critical},
38 {SeverityType::diagnostic, LogSeverity::Error},
39 {SeverityType::symptom, LogSeverity::Warning}};
40
41 auto s = severities.find(pelSeverity);
42 if (s != severities.end())
43 {
44 logSeverity = s->second;
45 }
46
47 return logSeverity;
48 }
49
50 } // namespace
51
convertOBMCSeverityToPEL(LogSeverity severity)52 uint8_t convertOBMCSeverityToPEL(LogSeverity severity)
53 {
54 uint8_t pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
55 switch (severity)
56 {
57 case (LogSeverity::Notice):
58 case (LogSeverity::Informational):
59 case (LogSeverity::Debug):
60 pelSeverity = static_cast<uint8_t>(SeverityType::nonError);
61 break;
62
63 case (LogSeverity::Warning):
64 pelSeverity = static_cast<uint8_t>(SeverityType::predictive);
65 break;
66
67 case (LogSeverity::Critical):
68 pelSeverity = static_cast<uint8_t>(SeverityType::critical);
69 break;
70
71 case (LogSeverity::Emergency):
72 case (LogSeverity::Alert):
73 case (LogSeverity::Error):
74 pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
75 break;
76 }
77
78 return pelSeverity;
79 }
80
81 std::optional<LogSeverity>
fixupLogSeverity(LogSeverity obmcSeverity,SeverityType pelSeverity)82 fixupLogSeverity(LogSeverity obmcSeverity, SeverityType pelSeverity)
83 {
84 bool isNonErrPelSev = (pelSeverity == SeverityType::nonError) ||
85 (pelSeverity == SeverityType::recovered);
86
87 bool isNonErrObmcSev = (obmcSeverity == LogSeverity::Notice) ||
88 (obmcSeverity == LogSeverity::Informational) ||
89 (obmcSeverity == LogSeverity::Debug);
90
91 // If a nonError/recovered PEL, then the LogSeverity must be
92 // Notice/Informational/Debug, otherwise set it to Informational.
93 if (isNonErrPelSev && !isNonErrObmcSev)
94 {
95 return LogSeverity::Informational;
96 }
97
98 // If a Notice/Informational/Debug LogSeverity, then the PEL
99 // severity must be nonError/recovered, otherwise set it
100 // to an appropriate value based on the actual PEL severity.
101 if (isNonErrObmcSev && !isNonErrPelSev)
102 {
103 return convertPELSeverityToOBMC(pelSeverity);
104 }
105
106 // If PEL is critical, the LogSeverity should be as well.
107 if ((obmcSeverity != LogSeverity::Critical) &&
108 (pelSeverity == SeverityType::critical))
109 {
110 return LogSeverity::Critical;
111 }
112
113 return std::nullopt;
114 }
115
116 } // namespace pels
117 } // namespace openpower
118